Jónar / Mbed OS Hopverkefni1

Dependencies:   X_NUCLEO_IKS01A1

Committer:
ivardor
Date:
Tue Jan 21 10:37:49 2020 +0000
Revision:
5:dd52b4b8a40b
Parent:
4:9b7d5033d0ef
Child:
6:c4c88077923c
Tilfelli 3 komid

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ivardor 0:1ba5cfaab64e 1 /* Includes */
gesturandrei 1:ae01414cd891 2 #include <iostream>
gesturandrei 4:9b7d5033d0ef 3 #include <stdlib.h>
gesturandrei 4:9b7d5033d0ef 4 #include <algorithm>
gesturandrei 1:ae01414cd891 5 using namespace std;
ivardor 0:1ba5cfaab64e 6 #include "mbed.h"
ivardor 0:1ba5cfaab64e 7 #include "x_nucleo_iks01a1.h"
ivardor 3:8cbc430199af 8 #include <ctime>
ivardor 3:8cbc430199af 9
ivardor 3:8cbc430199af 10 //Skilgreiningar fyrir takka
ivardor 3:8cbc430199af 11 InterruptIn button1(USER_BUTTON);
ivardor 3:8cbc430199af 12 volatile bool button1_pressed = false; // Used in the main loop
ivardor 3:8cbc430199af 13 volatile bool button1_enabled = true; // Used for debouncing
ivardor 3:8cbc430199af 14 Timeout button1_timeout; // Used for debouncing
ivardor 3:8cbc430199af 15 DigitalOut led1(LED1);
ivardor 0:1ba5cfaab64e 16
ivardor 0:1ba5cfaab64e 17 /* Instantiate the expansion board */
ivardor 0:1ba5cfaab64e 18 static X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(D14, D15);
ivardor 0:1ba5cfaab64e 19
ivardor 0:1ba5cfaab64e 20 /* Retrieve the composing elements of the expansion board */
ivardor 0:1ba5cfaab64e 21 static GyroSensor *gyroscope = mems_expansion_board->GetGyroscope();
ivardor 0:1ba5cfaab64e 22 static MotionSensor *accelerometer = mems_expansion_board->GetAccelerometer();
ivardor 0:1ba5cfaab64e 23 static MagneticSensor *magnetometer = mems_expansion_board->magnetometer;
ivardor 0:1ba5cfaab64e 24 static HumiditySensor *humidity_sensor = mems_expansion_board->ht_sensor;
ivardor 0:1ba5cfaab64e 25 static PressureSensor *pressure_sensor = mems_expansion_board->pt_sensor;
ivardor 0:1ba5cfaab64e 26 static TempSensor *temp_sensor1 = mems_expansion_board->ht_sensor;
ivardor 0:1ba5cfaab64e 27 static TempSensor *temp_sensor2 = mems_expansion_board->pt_sensor;
ivardor 0:1ba5cfaab64e 28
ivardor 0:1ba5cfaab64e 29 /* Helper function for printing floats & doubles */
ivardor 0:1ba5cfaab64e 30 static char *printDouble(char* str, double v, int decimalDigits=2)
ivardor 0:1ba5cfaab64e 31 {
ivardor 0:1ba5cfaab64e 32 int i = 1;
ivardor 0:1ba5cfaab64e 33 int intPart, fractPart;
ivardor 0:1ba5cfaab64e 34 int len;
ivardor 0:1ba5cfaab64e 35 char *ptr;
ivardor 0:1ba5cfaab64e 36
ivardor 0:1ba5cfaab64e 37 /* prepare decimal digits multiplicator */
ivardor 0:1ba5cfaab64e 38 for (;decimalDigits!=0; i*=10, decimalDigits--);
ivardor 0:1ba5cfaab64e 39
ivardor 0:1ba5cfaab64e 40 /* calculate integer & fractinal parts */
ivardor 0:1ba5cfaab64e 41 intPart = (int)v;
ivardor 0:1ba5cfaab64e 42 fractPart = (int)((v-(double)(int)v)*i);
ivardor 0:1ba5cfaab64e 43
ivardor 0:1ba5cfaab64e 44 /* fill in integer part */
ivardor 0:1ba5cfaab64e 45 sprintf(str, "%i.", intPart);
ivardor 0:1ba5cfaab64e 46
ivardor 0:1ba5cfaab64e 47 /* prepare fill in of fractional part */
ivardor 0:1ba5cfaab64e 48 len = strlen(str);
ivardor 0:1ba5cfaab64e 49 ptr = &str[len];
ivardor 0:1ba5cfaab64e 50
ivardor 0:1ba5cfaab64e 51 /* fill in leading fractional zeros */
ivardor 0:1ba5cfaab64e 52 for (i/=10;i>1; i/=10, ptr++) {
ivardor 0:1ba5cfaab64e 53 if(fractPart >= i) break;
ivardor 0:1ba5cfaab64e 54 *ptr = '0';
ivardor 0:1ba5cfaab64e 55 }
ivardor 0:1ba5cfaab64e 56
ivardor 0:1ba5cfaab64e 57 /* fill in (rest of) fractional part */
ivardor 0:1ba5cfaab64e 58 sprintf(ptr, "%i", fractPart);
ivardor 0:1ba5cfaab64e 59
ivardor 0:1ba5cfaab64e 60 return str;
ivardor 0:1ba5cfaab64e 61 }
ivardor 0:1ba5cfaab64e 62
ivardor 0:1ba5cfaab64e 63
ivardor 2:ff2d1e351302 64
ivardor 2:ff2d1e351302 65
ivardor 2:ff2d1e351302 66
ivardor 2:ff2d1e351302 67
ivardor 2:ff2d1e351302 68 //lidur 3 og 5
ivardor 2:ff2d1e351302 69 /*
ivardor 2:ff2d1e351302 70 if (userInput == 1) {
ivardor 2:ff2d1e351302 71 printf("\r\n");
ivardor 2:ff2d1e351302 72
ivardor 2:ff2d1e351302 73 temp_sensor1->get_temperature(&value1);
ivardor 2:ff2d1e351302 74 humidity_sensor->get_humidity(&value2);
ivardor 2:ff2d1e351302 75 printf("HTS221: [temp] %7s°C, [hum] %s%%\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
ivardor 2:ff2d1e351302 76
ivardor 2:ff2d1e351302 77 temp_sensor2->get_fahrenheit(&value1);
ivardor 2:ff2d1e351302 78 pressure_sensor->get_pressure(&value2);
ivardor 2:ff2d1e351302 79 printf("LPS25H: [temp] %7s°F, [press] %smbar\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
ivardor 2:ff2d1e351302 80 } else if (userInput == 2) {
ivardor 2:ff2d1e351302 81 printf("---\r\n");
ivardor 2:ff2d1e351302 82
ivardor 2:ff2d1e351302 83 magnetometer->get_m_axes(axes);
ivardor 2:ff2d1e351302 84 printf("LIS3MDL [mag/mgauss]: %7ld, %7ld, %7ld\r\n", axes[0], axes[1], axes[2]);
ivardor 2:ff2d1e351302 85
ivardor 2:ff2d1e351302 86 accelerometer->get_x_axes(axes);
ivardor 2:ff2d1e351302 87 printf("LSM6DS0 [acc/mg]: %7ld, %7ld, %7ld\r\n", axes[0], axes[1], axes[2]);
ivardor 2:ff2d1e351302 88
ivardor 2:ff2d1e351302 89 gyroscope->get_g_axes(axes);
ivardor 2:ff2d1e351302 90 printf("LSM6DS0 [gyro/mdps]: %7ld, %7ld, %7ld\r\n", axes[0], axes[1], axes[2]);
ivardor 2:ff2d1e351302 91 }
ivardor 2:ff2d1e351302 92 */
ivardor 2:ff2d1e351302 93
ivardor 3:8cbc430199af 94 // Enables button when bouncing is over
ivardor 3:8cbc430199af 95 void button1_enabled_cb(void)
ivardor 3:8cbc430199af 96 {
ivardor 3:8cbc430199af 97 button1_enabled = true;
ivardor 3:8cbc430199af 98 }
ivardor 3:8cbc430199af 99
ivardor 3:8cbc430199af 100 // ISR handling button pressed event
ivardor 3:8cbc430199af 101 void button1_onpressed_cb(void)
ivardor 3:8cbc430199af 102 {
ivardor 3:8cbc430199af 103 if (button1_enabled) { // Disabled while the button is bouncing
ivardor 3:8cbc430199af 104 button1_enabled = false;
ivardor 3:8cbc430199af 105 button1_pressed = true; // To be read by the main loop
ivardor 3:8cbc430199af 106 button1_timeout.attach(callback(button1_enabled_cb), 0.3); // Debounce time 300 ms
ivardor 3:8cbc430199af 107 }
ivardor 3:8cbc430199af 108 }
ivardor 3:8cbc430199af 109
ivardor 2:ff2d1e351302 110 void tilfelli1() {
ivardor 2:ff2d1e351302 111 printf("\r\n");
ivardor 3:8cbc430199af 112 printf("Tilfelli 1 valið: \r\n");
ivardor 3:8cbc430199af 113 float value1, value2;
ivardor 3:8cbc430199af 114 char buffer1[32], buffer2[32];
ivardor 3:8cbc430199af 115 temp_sensor1->get_temperature(&value1);
ivardor 3:8cbc430199af 116 humidity_sensor->get_humidity(&value2);
ivardor 3:8cbc430199af 117 printf(" Hitastig: %7s°C\n Rakastig: %s%%\r\n Loftþrýstingur: %smbar\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2), printDouble(buffer2, value2));
ivardor 3:8cbc430199af 118 printf("\n");
ivardor 2:ff2d1e351302 119 }
ivardor 2:ff2d1e351302 120
ivardor 2:ff2d1e351302 121
ivardor 2:ff2d1e351302 122 void tilfelli2() {
ivardor 2:ff2d1e351302 123 printf("\r\n");
ivardor 3:8cbc430199af 124 printf("Tilfelli 2 valið: \r\n");
ivardor 3:8cbc430199af 125 char buffer1[32], buffer2[32];
ivardor 3:8cbc430199af 126 int32_t axes[3];
ivardor 3:8cbc430199af 127 magnetometer->get_m_axes(axes);
ivardor 3:8cbc430199af 128 printf(" Segulstefnur: %7ld, %7ld, %7ld\r\n", axes[0], axes[1], axes[2]);
ivardor 3:8cbc430199af 129
ivardor 3:8cbc430199af 130 accelerometer->get_x_axes(axes);
gesturandrei 4:9b7d5033d0ef 131 printf(" Hröðun: %7ld %7ld, %7ld\r\n", axes[0], axes[1], axes[2]);
ivardor 3:8cbc430199af 132
ivardor 3:8cbc430199af 133 gyroscope->get_g_axes(axes);
gesturandrei 4:9b7d5033d0ef 134 printf(" Hornhröðun: %7ld, %7ld, %7ld\r\n", axes[0], axes[1], axes[2]);
ivardor 3:8cbc430199af 135 printf("\n");
ivardor 2:ff2d1e351302 136 }
ivardor 2:ff2d1e351302 137
ivardor 3:8cbc430199af 138 void tilfelli3() {
gesturandrei 4:9b7d5033d0ef 139 printf("\r\n");
gesturandrei 4:9b7d5033d0ef 140 printf("Tilfelli 3 valið: \r\n");
ivardor 3:8cbc430199af 141 //button1.mode(PullUp); // Activate pull-up
ivardor 3:8cbc430199af 142 button1.fall(callback(button1_onpressed_cb)); // Attach ISR to handle button press event
ivardor 3:8cbc430199af 143
ivardor 3:8cbc430199af 144 int idx = 0; // Just for printf below
ivardor 3:8cbc430199af 145
ivardor 3:8cbc430199af 146 while(1) {
gesturandrei 4:9b7d5033d0ef 147 if (idx != 0) {
gesturandrei 4:9b7d5033d0ef 148 printf("\r\n");
gesturandrei 4:9b7d5033d0ef 149 printf("Þrýst á takkann %7ld sinnum \r\n", idx);
gesturandrei 4:9b7d5033d0ef 150 }
gesturandrei 4:9b7d5033d0ef 151 idx = 0;
ivardor 3:8cbc430199af 152 if (button1_pressed) { // Set when button is pressed
ivardor 3:8cbc430199af 153 button1_pressed = false;
ivardor 3:8cbc430199af 154 clock_t time = clock();
ivardor 3:8cbc430199af 155 idx++;
gesturandrei 4:9b7d5033d0ef 156 while ((clock() - time) / CLOCKS_PER_SEC < 3) {
ivardor 3:8cbc430199af 157 if (button1_pressed) {
ivardor 3:8cbc430199af 158 button1_pressed = false;
ivardor 3:8cbc430199af 159 idx++;
ivardor 3:8cbc430199af 160 }
ivardor 3:8cbc430199af 161 }
ivardor 3:8cbc430199af 162 }
ivardor 3:8cbc430199af 163
ivardor 3:8cbc430199af 164 if (idx == 1) {
gesturandrei 4:9b7d5033d0ef 165 char buffer1[32], buffer2[32];
gesturandrei 4:9b7d5033d0ef 166 int32_t axes[3];
gesturandrei 4:9b7d5033d0ef 167 accelerometer->get_x_axes(axes);
gesturandrei 4:9b7d5033d0ef 168 int max_1 = max(abs(axes[0]), abs(axes[1]));
gesturandrei 4:9b7d5033d0ef 169 max_1 = max(max_1, abs(axes[2]));
gesturandrei 4:9b7d5033d0ef 170
gesturandrei 4:9b7d5033d0ef 171 if (max_1 == abs(axes[0])) {
gesturandrei 4:9b7d5033d0ef 172 if (max_1 == axes[0]) {
gesturandrei 4:9b7d5033d0ef 173 printf("RIGHT \n");
gesturandrei 4:9b7d5033d0ef 174 } else {
gesturandrei 4:9b7d5033d0ef 175 printf("LEFT \n");
gesturandrei 4:9b7d5033d0ef 176 }
gesturandrei 4:9b7d5033d0ef 177 }
gesturandrei 4:9b7d5033d0ef 178 else if (max_1 == abs(axes[1])) {
gesturandrei 4:9b7d5033d0ef 179 if (max_1 == axes[1]) {
gesturandrei 4:9b7d5033d0ef 180 printf("TOP \n");
gesturandrei 4:9b7d5033d0ef 181 } else {
gesturandrei 4:9b7d5033d0ef 182 printf("BOTTOM \n");
gesturandrei 4:9b7d5033d0ef 183 }
gesturandrei 4:9b7d5033d0ef 184 }
gesturandrei 4:9b7d5033d0ef 185 else if (max_1 == abs(axes[2])) {
gesturandrei 4:9b7d5033d0ef 186 if (max_1 == axes[2]) {
gesturandrei 4:9b7d5033d0ef 187 printf("UP \n");
gesturandrei 4:9b7d5033d0ef 188 } else {
gesturandrei 4:9b7d5033d0ef 189 printf("DOWN \n");
gesturandrei 4:9b7d5033d0ef 190 }
gesturandrei 4:9b7d5033d0ef 191 }
ivardor 3:8cbc430199af 192 }
ivardor 3:8cbc430199af 193 else if (idx == 2) {
gesturandrei 4:9b7d5033d0ef 194 char buffer1[32], buffer2[32];
gesturandrei 4:9b7d5033d0ef 195 int32_t axes[3];
gesturandrei 4:9b7d5033d0ef 196 accelerometer->get_x_axes(axes);
gesturandrei 4:9b7d5033d0ef 197 int max_1 = max(abs(axes[0]), abs(axes[1]));
gesturandrei 4:9b7d5033d0ef 198 max_1 = max(max_1, abs(axes[2]));
gesturandrei 4:9b7d5033d0ef 199
gesturandrei 4:9b7d5033d0ef 200 if (max_1 == axes[2]) {
gesturandrei 4:9b7d5033d0ef 201 clock_t time = clock();
gesturandrei 4:9b7d5033d0ef 202 while ((clock() - time) / CLOCKS_PER_SEC < 2) {
gesturandrei 4:9b7d5033d0ef 203 led1 = true;
gesturandrei 4:9b7d5033d0ef 204 }
gesturandrei 4:9b7d5033d0ef 205 } else {
gesturandrei 4:9b7d5033d0ef 206 clock_t time = clock();
gesturandrei 4:9b7d5033d0ef 207 while ((clock() - time) / CLOCKS_PER_SEC < 2) {
gesturandrei 4:9b7d5033d0ef 208 led1 = !led1;
gesturandrei 4:9b7d5033d0ef 209 wait(0.2);
gesturandrei 4:9b7d5033d0ef 210 }
gesturandrei 4:9b7d5033d0ef 211 }
gesturandrei 4:9b7d5033d0ef 212 led1 = false;
ivardor 3:8cbc430199af 213 }
ivardor 3:8cbc430199af 214 else if (idx == 3) {
ivardor 5:dd52b4b8a40b 215 printf("Þrýst á takkann %7ld sinnum \r\n", idx);
ivardor 5:dd52b4b8a40b 216 while(1){
ivardor 5:dd52b4b8a40b 217 char buffer1[32], buffer2[32];
ivardor 5:dd52b4b8a40b 218 int32_t axes[3];
ivardor 5:dd52b4b8a40b 219 accelerometer->get_x_axes(axes);
ivardor 5:dd52b4b8a40b 220 int max_1 = max(abs(axes[0]), abs(axes[1]));
ivardor 5:dd52b4b8a40b 221 max_1 = max(max_1, abs(axes[2]));
ivardor 5:dd52b4b8a40b 222
ivardor 5:dd52b4b8a40b 223 if (max_1 == abs(axes[0])) {
ivardor 5:dd52b4b8a40b 224 if (max_1 == axes[0]) {
ivardor 5:dd52b4b8a40b 225 printf("RIGHT \n");
ivardor 5:dd52b4b8a40b 226 led1 = !led1;
ivardor 5:dd52b4b8a40b 227 wait(0.2);
ivardor 5:dd52b4b8a40b 228 } else {
ivardor 5:dd52b4b8a40b 229 printf("LEFT \n");
ivardor 5:dd52b4b8a40b 230 led1 = !led1;
ivardor 5:dd52b4b8a40b 231 wait(0.2);
ivardor 5:dd52b4b8a40b 232 }
ivardor 5:dd52b4b8a40b 233 }
ivardor 5:dd52b4b8a40b 234 else if (max_1 == abs(axes[1])) {
ivardor 5:dd52b4b8a40b 235 if (max_1 == axes[1]) {
ivardor 5:dd52b4b8a40b 236 printf("TOP \n");
ivardor 5:dd52b4b8a40b 237 led1 = !led1;
ivardor 5:dd52b4b8a40b 238 wait(0.2);
ivardor 5:dd52b4b8a40b 239 } else {
ivardor 5:dd52b4b8a40b 240 printf("BOTTOM \n");
ivardor 5:dd52b4b8a40b 241 led1 = !led1;
ivardor 5:dd52b4b8a40b 242 wait(0.2);
ivardor 5:dd52b4b8a40b 243 }
ivardor 5:dd52b4b8a40b 244 }
ivardor 5:dd52b4b8a40b 245 else if (max_1 == abs(axes[2])) {
ivardor 5:dd52b4b8a40b 246 if (max_1 == axes[2]) {
ivardor 5:dd52b4b8a40b 247 printf("UP \n");
ivardor 5:dd52b4b8a40b 248 led1 = 1;
ivardor 5:dd52b4b8a40b 249 wait(0.2);
ivardor 5:dd52b4b8a40b 250 } else {
ivardor 5:dd52b4b8a40b 251 printf("DOWN \n");
ivardor 5:dd52b4b8a40b 252 led1 = !led1;
ivardor 5:dd52b4b8a40b 253 wait(0.2);
ivardor 5:dd52b4b8a40b 254 }
ivardor 5:dd52b4b8a40b 255 }
ivardor 5:dd52b4b8a40b 256 }
ivardor 3:8cbc430199af 257 }
ivardor 3:8cbc430199af 258 else if (idx > 3) {
ivardor 3:8cbc430199af 259 break;
ivardor 3:8cbc430199af 260 }
ivardor 3:8cbc430199af 261 }
ivardor 3:8cbc430199af 262 }
ivardor 3:8cbc430199af 263
ivardor 3:8cbc430199af 264
ivardor 2:ff2d1e351302 265
ivardor 0:1ba5cfaab64e 266 /* Simple main function */
ivardor 0:1ba5cfaab64e 267 int main() {
ivardor 0:1ba5cfaab64e 268 uint8_t id;
ivardor 0:1ba5cfaab64e 269 float value1, value2;
ivardor 0:1ba5cfaab64e 270 char buffer1[32], buffer2[32];
ivardor 0:1ba5cfaab64e 271 int32_t axes[3];
ivardor 0:1ba5cfaab64e 272
ivardor 0:1ba5cfaab64e 273 printf("\r\n--- Starting new run ---\r\n");
ivardor 0:1ba5cfaab64e 274
ivardor 0:1ba5cfaab64e 275 humidity_sensor->read_id(&id);
ivardor 0:1ba5cfaab64e 276 printf("HTS221 humidity & temperature = 0x%X\r\n", id);
ivardor 0:1ba5cfaab64e 277 pressure_sensor->read_id(&id);
ivardor 0:1ba5cfaab64e 278 printf("LPS25H pressure & temperature = 0x%X\r\n", id);
ivardor 0:1ba5cfaab64e 279 magnetometer->read_id(&id);
ivardor 0:1ba5cfaab64e 280 printf("LIS3MDL magnetometer = 0x%X\r\n", id);
ivardor 0:1ba5cfaab64e 281 gyroscope->read_id(&id);
ivardor 0:1ba5cfaab64e 282 printf("LSM6DS0 accelerometer & gyroscope = 0x%X\r\n", id);
ivardor 0:1ba5cfaab64e 283
ivardor 5:dd52b4b8a40b 284 wait(1);
ivardor 0:1ba5cfaab64e 285
ivardor 0:1ba5cfaab64e 286 while(1) {
gesturandrei 1:ae01414cd891 287 int userInput;
ivardor 5:dd52b4b8a40b 288 cout << "Veldu tilfelli 1-3: " << endl;
gesturandrei 1:ae01414cd891 289 cin >> userInput;
ivardor 2:ff2d1e351302 290 switch(userInput) {
ivardor 2:ff2d1e351302 291 case 1: tilfelli1();
ivardor 3:8cbc430199af 292 break;
ivardor 2:ff2d1e351302 293 case 2: tilfelli2();
ivardor 3:8cbc430199af 294 break;
ivardor 3:8cbc430199af 295 case 3: tilfelli3();
ivardor 3:8cbc430199af 296 break;
ivardor 2:ff2d1e351302 297 default: break;
ivardor 2:ff2d1e351302 298 }
gesturandrei 1:ae01414cd891 299
ivardor 0:1ba5cfaab64e 300 }
ivardor 0:1ba5cfaab64e 301 }
ivardor 2:ff2d1e351302 302