Jónar / Mbed OS Hopverkefni1

Dependencies:   X_NUCLEO_IKS01A1

Committer:
gesturandrei
Date:
Tue Jan 21 12:22:36 2020 +0000
Revision:
6:c4c88077923c
Parent:
5:dd52b4b8a40b
Child:
7:aa81a4060c62
21.1.2020

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");
gesturandrei 6:c4c88077923c 141 printf("Ýttu 1 sinni á takkann til að fá stöðu brettisins einu sinni. \r\n");
gesturandrei 6:c4c88077923c 142 printf("Ýttu 2 sinnum á takkann til að athuga hvort brettið sé upprétt einu sinni. \r\n");
gesturandrei 6:c4c88077923c 143 printf("Ýttu 3 sinnum á takkann til að fá stöðu brettisins í rauntíma. \r\n");
gesturandrei 6:c4c88077923c 144 printf("Ýttu 4 sinnum á takkann til að fara til baka. \r\n");
ivardor 3:8cbc430199af 145 //button1.mode(PullUp); // Activate pull-up
ivardor 3:8cbc430199af 146 button1.fall(callback(button1_onpressed_cb)); // Attach ISR to handle button press event
ivardor 3:8cbc430199af 147
ivardor 3:8cbc430199af 148 int idx = 0; // Just for printf below
ivardor 3:8cbc430199af 149
gesturandrei 6:c4c88077923c 150 while(1) {
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
gesturandrei 6:c4c88077923c 164 if (idx != 0) {
gesturandrei 6:c4c88077923c 165 printf("\r\n");
gesturandrei 6:c4c88077923c 166 printf("Þrýst á takkann %7ld sinnum \r\n", idx);
gesturandrei 6:c4c88077923c 167 }
gesturandrei 6:c4c88077923c 168
ivardor 3:8cbc430199af 169 if (idx == 1) {
gesturandrei 4:9b7d5033d0ef 170 char buffer1[32], buffer2[32];
gesturandrei 4:9b7d5033d0ef 171 int32_t axes[3];
gesturandrei 4:9b7d5033d0ef 172 accelerometer->get_x_axes(axes);
gesturandrei 4:9b7d5033d0ef 173 int max_1 = max(abs(axes[0]), abs(axes[1]));
gesturandrei 4:9b7d5033d0ef 174 max_1 = max(max_1, abs(axes[2]));
gesturandrei 4:9b7d5033d0ef 175
gesturandrei 4:9b7d5033d0ef 176 if (max_1 == abs(axes[0])) {
gesturandrei 4:9b7d5033d0ef 177 if (max_1 == axes[0]) {
gesturandrei 4:9b7d5033d0ef 178 printf("RIGHT \n");
gesturandrei 4:9b7d5033d0ef 179 } else {
gesturandrei 4:9b7d5033d0ef 180 printf("LEFT \n");
gesturandrei 4:9b7d5033d0ef 181 }
gesturandrei 4:9b7d5033d0ef 182 }
gesturandrei 4:9b7d5033d0ef 183 else if (max_1 == abs(axes[1])) {
gesturandrei 4:9b7d5033d0ef 184 if (max_1 == axes[1]) {
gesturandrei 4:9b7d5033d0ef 185 printf("TOP \n");
gesturandrei 4:9b7d5033d0ef 186 } else {
gesturandrei 4:9b7d5033d0ef 187 printf("BOTTOM \n");
gesturandrei 4:9b7d5033d0ef 188 }
gesturandrei 4:9b7d5033d0ef 189 }
gesturandrei 4:9b7d5033d0ef 190 else if (max_1 == abs(axes[2])) {
gesturandrei 4:9b7d5033d0ef 191 if (max_1 == axes[2]) {
gesturandrei 4:9b7d5033d0ef 192 printf("UP \n");
gesturandrei 4:9b7d5033d0ef 193 } else {
gesturandrei 4:9b7d5033d0ef 194 printf("DOWN \n");
gesturandrei 4:9b7d5033d0ef 195 }
gesturandrei 4:9b7d5033d0ef 196 }
ivardor 3:8cbc430199af 197 }
ivardor 3:8cbc430199af 198 else if (idx == 2) {
gesturandrei 4:9b7d5033d0ef 199 char buffer1[32], buffer2[32];
gesturandrei 4:9b7d5033d0ef 200 int32_t axes[3];
gesturandrei 4:9b7d5033d0ef 201 accelerometer->get_x_axes(axes);
gesturandrei 4:9b7d5033d0ef 202 int max_1 = max(abs(axes[0]), abs(axes[1]));
gesturandrei 4:9b7d5033d0ef 203 max_1 = max(max_1, abs(axes[2]));
gesturandrei 4:9b7d5033d0ef 204
gesturandrei 4:9b7d5033d0ef 205 if (max_1 == axes[2]) {
gesturandrei 4:9b7d5033d0ef 206 clock_t time = clock();
gesturandrei 4:9b7d5033d0ef 207 while ((clock() - time) / CLOCKS_PER_SEC < 2) {
gesturandrei 4:9b7d5033d0ef 208 led1 = true;
gesturandrei 4:9b7d5033d0ef 209 }
gesturandrei 4:9b7d5033d0ef 210 } else {
gesturandrei 4:9b7d5033d0ef 211 clock_t time = clock();
gesturandrei 4:9b7d5033d0ef 212 while ((clock() - time) / CLOCKS_PER_SEC < 2) {
gesturandrei 4:9b7d5033d0ef 213 led1 = !led1;
gesturandrei 4:9b7d5033d0ef 214 }
gesturandrei 4:9b7d5033d0ef 215 }
gesturandrei 4:9b7d5033d0ef 216 led1 = false;
ivardor 3:8cbc430199af 217 }
ivardor 3:8cbc430199af 218 else if (idx == 3) {
ivardor 5:dd52b4b8a40b 219 while(1){
gesturandrei 6:c4c88077923c 220 idx = 0;
gesturandrei 6:c4c88077923c 221 if (button1_pressed) { // Set when button is pressed
gesturandrei 6:c4c88077923c 222 button1_pressed = false;
gesturandrei 6:c4c88077923c 223 clock_t time = clock();
gesturandrei 6:c4c88077923c 224 idx++;
gesturandrei 6:c4c88077923c 225 while ((clock() - time) / CLOCKS_PER_SEC < 3) {
gesturandrei 6:c4c88077923c 226 if (button1_pressed) {
gesturandrei 6:c4c88077923c 227 button1_pressed = false;
gesturandrei 6:c4c88077923c 228 idx++;
gesturandrei 6:c4c88077923c 229 }
gesturandrei 6:c4c88077923c 230 }
gesturandrei 6:c4c88077923c 231 }
gesturandrei 6:c4c88077923c 232
gesturandrei 6:c4c88077923c 233 if (idx == 3) {
gesturandrei 6:c4c88077923c 234 led1 = 0;
gesturandrei 6:c4c88077923c 235 printf("Ýttu 1 sinni á takkann til að fá stöðu brettisins einu sinni. \r\n");
gesturandrei 6:c4c88077923c 236 printf("Ýttu 2 sinnum á takkann til að athuga hvort brettið sé upprétt einu sinni. \r\n");
gesturandrei 6:c4c88077923c 237 printf("Ýttu 3 sinnum á takkann til að fá stöðu brettisins í rauntíma. \r\n");
gesturandrei 6:c4c88077923c 238 printf("Ýttu 4 sinnum á takkann til að fara til baka. \r\n");
gesturandrei 6:c4c88077923c 239 break;
gesturandrei 6:c4c88077923c 240 }
gesturandrei 6:c4c88077923c 241
ivardor 5:dd52b4b8a40b 242 char buffer1[32], buffer2[32];
ivardor 5:dd52b4b8a40b 243 int32_t axes[3];
ivardor 5:dd52b4b8a40b 244 accelerometer->get_x_axes(axes);
ivardor 5:dd52b4b8a40b 245 int max_1 = max(abs(axes[0]), abs(axes[1]));
ivardor 5:dd52b4b8a40b 246 max_1 = max(max_1, abs(axes[2]));
gesturandrei 6:c4c88077923c 247
gesturandrei 6:c4c88077923c 248 if (max_1 == axes[2]) {
gesturandrei 6:c4c88077923c 249 led1 = 1;
gesturandrei 6:c4c88077923c 250 } else {
gesturandrei 6:c4c88077923c 251 led1 = !led1;
gesturandrei 6:c4c88077923c 252 wait(0.2);
ivardor 5:dd52b4b8a40b 253 }
ivardor 5:dd52b4b8a40b 254 }
ivardor 3:8cbc430199af 255 }
ivardor 3:8cbc430199af 256 else if (idx > 3) {
ivardor 3:8cbc430199af 257 break;
ivardor 3:8cbc430199af 258 }
ivardor 3:8cbc430199af 259 }
ivardor 3:8cbc430199af 260 }
ivardor 3:8cbc430199af 261
ivardor 3:8cbc430199af 262
ivardor 2:ff2d1e351302 263
ivardor 0:1ba5cfaab64e 264 /* Simple main function */
ivardor 0:1ba5cfaab64e 265 int main() {
ivardor 0:1ba5cfaab64e 266 uint8_t id;
ivardor 0:1ba5cfaab64e 267 float value1, value2;
ivardor 0:1ba5cfaab64e 268 char buffer1[32], buffer2[32];
ivardor 0:1ba5cfaab64e 269 int32_t axes[3];
ivardor 0:1ba5cfaab64e 270
ivardor 0:1ba5cfaab64e 271 printf("\r\n--- Starting new run ---\r\n");
ivardor 0:1ba5cfaab64e 272
ivardor 0:1ba5cfaab64e 273 humidity_sensor->read_id(&id);
ivardor 0:1ba5cfaab64e 274 printf("HTS221 humidity & temperature = 0x%X\r\n", id);
ivardor 0:1ba5cfaab64e 275 pressure_sensor->read_id(&id);
ivardor 0:1ba5cfaab64e 276 printf("LPS25H pressure & temperature = 0x%X\r\n", id);
ivardor 0:1ba5cfaab64e 277 magnetometer->read_id(&id);
ivardor 0:1ba5cfaab64e 278 printf("LIS3MDL magnetometer = 0x%X\r\n", id);
ivardor 0:1ba5cfaab64e 279 gyroscope->read_id(&id);
ivardor 0:1ba5cfaab64e 280 printf("LSM6DS0 accelerometer & gyroscope = 0x%X\r\n", id);
ivardor 0:1ba5cfaab64e 281
ivardor 5:dd52b4b8a40b 282 wait(1);
ivardor 0:1ba5cfaab64e 283
ivardor 0:1ba5cfaab64e 284 while(1) {
gesturandrei 1:ae01414cd891 285 int userInput;
ivardor 5:dd52b4b8a40b 286 cout << "Veldu tilfelli 1-3: " << endl;
gesturandrei 1:ae01414cd891 287 cin >> userInput;
ivardor 2:ff2d1e351302 288 switch(userInput) {
ivardor 2:ff2d1e351302 289 case 1: tilfelli1();
ivardor 3:8cbc430199af 290 break;
ivardor 2:ff2d1e351302 291 case 2: tilfelli2();
ivardor 3:8cbc430199af 292 break;
ivardor 3:8cbc430199af 293 case 3: tilfelli3();
ivardor 3:8cbc430199af 294 break;
ivardor 2:ff2d1e351302 295 default: break;
ivardor 2:ff2d1e351302 296 }
gesturandrei 1:ae01414cd891 297
ivardor 0:1ba5cfaab64e 298 }
ivardor 0:1ba5cfaab64e 299 }
ivardor 2:ff2d1e351302 300