FRDM-K64F + Application Shield + Grove Sensors(Sunlight, Water, PIR motion)
Dependencies: C12832 SI1145 mbed-rtos mbed
Fork of FRDM_ApplicationShield_GroveSensors by
main.cpp@0:17dc00c7db2b, 2016-10-20 (annotated)
- Committer:
- zoran93
- Date:
- Thu Oct 20 10:30:07 2016 +0000
- Revision:
- 0:17dc00c7db2b
- Child:
- 1:0690e7540e7e
FRDM-K64F + Application Shield + Grove Sensors
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
zoran93 | 0:17dc00c7db2b | 1 | /****************************************************************************** |
zoran93 | 0:17dc00c7db2b | 2 | - izpis vrednosti PIR motion senzorja, water sensor in sunlight senzorja na LCD |
zoran93 | 0:17dc00c7db2b | 3 | - izpis PIR motion senzorja in Water senzorja na zaslon(serijska povezava z pc) |
zoran93 | 0:17dc00c7db2b | 4 | - sprememba menijev z joystick LEFT in RIGHT |
zoran93 | 0:17dc00c7db2b | 5 | - PIR motion senzor povezan na pin D2 |
zoran93 | 0:17dc00c7db2b | 6 | - water sensor povezan na D0 |
zoran93 | 0:17dc00c7db2b | 7 | - sunlight senzor povezan na D14(SDA), D15(SCL) |
zoran93 | 0:17dc00c7db2b | 8 | *******************************************************************************/ |
zoran93 | 0:17dc00c7db2b | 9 | |
zoran93 | 0:17dc00c7db2b | 10 | #include "C12832.h" |
zoran93 | 0:17dc00c7db2b | 11 | #include "Arial12x12.h" |
zoran93 | 0:17dc00c7db2b | 12 | #include "rtos.h" |
zoran93 | 0:17dc00c7db2b | 13 | #include "SI1145.h" |
zoran93 | 0:17dc00c7db2b | 14 | #include "K64F.h" |
zoran93 | 0:17dc00c7db2b | 15 | #include "mbed.h" |
zoran93 | 0:17dc00c7db2b | 16 | |
zoran93 | 0:17dc00c7db2b | 17 | |
zoran93 | 0:17dc00c7db2b | 18 | int retryAttempt = 0; |
zoran93 | 0:17dc00c7db2b | 19 | int menuItem = 0; |
zoran93 | 0:17dc00c7db2b | 20 | |
zoran93 | 0:17dc00c7db2b | 21 | char* joystickPos = "CENTRE"; |
zoran93 | 0:17dc00c7db2b | 22 | int blink_interval = 0; |
zoran93 | 0:17dc00c7db2b | 23 | |
zoran93 | 0:17dc00c7db2b | 24 | char* motion_state = "NOT DETECTED"; |
zoran93 | 0:17dc00c7db2b | 25 | char* water_state = "NOT DETECTED"; |
zoran93 | 0:17dc00c7db2b | 26 | char* risk = ""; |
zoran93 | 0:17dc00c7db2b | 27 | bool motion_detected=0; |
zoran93 | 0:17dc00c7db2b | 28 | bool k = true; |
zoran93 | 0:17dc00c7db2b | 29 | |
zoran93 | 0:17dc00c7db2b | 30 | |
zoran93 | 0:17dc00c7db2b | 31 | int i=5, j=2; |
zoran93 | 0:17dc00c7db2b | 32 | int vis = 0; |
zoran93 | 0:17dc00c7db2b | 33 | int IR = 0; |
zoran93 | 0:17dc00c7db2b | 34 | float UV = 0; |
zoran93 | 0:17dc00c7db2b | 35 | float UV_real = 0; |
zoran93 | 0:17dc00c7db2b | 36 | |
zoran93 | 0:17dc00c7db2b | 37 | /* PIR sensor interrupt*/ |
zoran93 | 0:17dc00c7db2b | 38 | void pir_release(void) |
zoran93 | 0:17dc00c7db2b | 39 | { |
zoran93 | 0:17dc00c7db2b | 40 | motion_detected=1; |
zoran93 | 0:17dc00c7db2b | 41 | } |
zoran93 | 0:17dc00c7db2b | 42 | |
zoran93 | 0:17dc00c7db2b | 43 | |
zoran93 | 0:17dc00c7db2b | 44 | /* Motion thread */ |
zoran93 | 0:17dc00c7db2b | 45 | void motion(void const *args) |
zoran93 | 0:17dc00c7db2b | 46 | { |
zoran93 | 0:17dc00c7db2b | 47 | while(1){ |
zoran93 | 0:17dc00c7db2b | 48 | if(motion_detected==1){ |
zoran93 | 0:17dc00c7db2b | 49 | motion_state = "DETECTED"; |
zoran93 | 0:17dc00c7db2b | 50 | pc.printf("Motion sensor detected!\n"); |
zoran93 | 0:17dc00c7db2b | 51 | motion_detected=0; |
zoran93 | 0:17dc00c7db2b | 52 | i = 5; |
zoran93 | 0:17dc00c7db2b | 53 | } |
zoran93 | 0:17dc00c7db2b | 54 | if(i==0){ |
zoran93 | 0:17dc00c7db2b | 55 | motion_state = "NOT DETECTED"; |
zoran93 | 0:17dc00c7db2b | 56 | i = 5; |
zoran93 | 0:17dc00c7db2b | 57 | } |
zoran93 | 0:17dc00c7db2b | 58 | i--; |
zoran93 | 0:17dc00c7db2b | 59 | |
zoran93 | 0:17dc00c7db2b | 60 | Thread::wait(100); |
zoran93 | 0:17dc00c7db2b | 61 | } |
zoran93 | 0:17dc00c7db2b | 62 | } |
zoran93 | 0:17dc00c7db2b | 63 | |
zoran93 | 0:17dc00c7db2b | 64 | /* Sunlight sensor thread */ |
zoran93 | 0:17dc00c7db2b | 65 | void sunlight(void const *args) |
zoran93 | 0:17dc00c7db2b | 66 | { |
zoran93 | 0:17dc00c7db2b | 67 | while(1){ |
zoran93 | 0:17dc00c7db2b | 68 | |
zoran93 | 0:17dc00c7db2b | 69 | vis = sensor.getVIS(); |
zoran93 | 0:17dc00c7db2b | 70 | IR = sensor.getIR(); |
zoran93 | 0:17dc00c7db2b | 71 | UV = sensor.getUV(); |
zoran93 | 0:17dc00c7db2b | 72 | UV_real = UV/100; |
zoran93 | 0:17dc00c7db2b | 73 | if(0<=UV_real && UV_real<=2.9){ |
zoran93 | 0:17dc00c7db2b | 74 | risk = "Low"; |
zoran93 | 0:17dc00c7db2b | 75 | }else if(3<=UV_real && UV_real<=5.9){ |
zoran93 | 0:17dc00c7db2b | 76 | risk = "Moderate"; |
zoran93 | 0:17dc00c7db2b | 77 | }else if(6<=UV_real && UV_real<=7.9){ |
zoran93 | 0:17dc00c7db2b | 78 | risk = "High"; |
zoran93 | 0:17dc00c7db2b | 79 | }else if(8<=UV_real && UV_real<=10.9){ |
zoran93 | 0:17dc00c7db2b | 80 | risk = "Very high"; |
zoran93 | 0:17dc00c7db2b | 81 | }else{ |
zoran93 | 0:17dc00c7db2b | 82 | risk = "Extreme"; |
zoran93 | 0:17dc00c7db2b | 83 | } |
zoran93 | 0:17dc00c7db2b | 84 | |
zoran93 | 0:17dc00c7db2b | 85 | Thread::wait(2000); |
zoran93 | 0:17dc00c7db2b | 86 | } |
zoran93 | 0:17dc00c7db2b | 87 | } |
zoran93 | 0:17dc00c7db2b | 88 | |
zoran93 | 0:17dc00c7db2b | 89 | /* Water sensor thread */ |
zoran93 | 0:17dc00c7db2b | 90 | void water(void const *args) |
zoran93 | 0:17dc00c7db2b | 91 | { |
zoran93 | 0:17dc00c7db2b | 92 | while(1){ |
zoran93 | 0:17dc00c7db2b | 93 | |
zoran93 | 0:17dc00c7db2b | 94 | if(water_sensor == 0){ |
zoran93 | 0:17dc00c7db2b | 95 | water_state = "DETECTED"; |
zoran93 | 0:17dc00c7db2b | 96 | if(k == true){ |
zoran93 | 0:17dc00c7db2b | 97 | pc.printf("Water sensor detected!\n"); |
zoran93 | 0:17dc00c7db2b | 98 | k = false; |
zoran93 | 0:17dc00c7db2b | 99 | } |
zoran93 | 0:17dc00c7db2b | 100 | j = 2; |
zoran93 | 0:17dc00c7db2b | 101 | |
zoran93 | 0:17dc00c7db2b | 102 | } |
zoran93 | 0:17dc00c7db2b | 103 | if(j==0){ |
zoran93 | 0:17dc00c7db2b | 104 | water_state = "NOT DETECTED"; |
zoran93 | 0:17dc00c7db2b | 105 | j = 2; |
zoran93 | 0:17dc00c7db2b | 106 | k = true; |
zoran93 | 0:17dc00c7db2b | 107 | } |
zoran93 | 0:17dc00c7db2b | 108 | j--; |
zoran93 | 0:17dc00c7db2b | 109 | |
zoran93 | 0:17dc00c7db2b | 110 | Thread::wait(100); |
zoran93 | 0:17dc00c7db2b | 111 | } |
zoran93 | 0:17dc00c7db2b | 112 | } |
zoran93 | 0:17dc00c7db2b | 113 | |
zoran93 | 0:17dc00c7db2b | 114 | void printMenu(int menuItem) |
zoran93 | 0:17dc00c7db2b | 115 | { |
zoran93 | 0:17dc00c7db2b | 116 | static char last_line1[30] = "", last_line2[30] = ""; |
zoran93 | 0:17dc00c7db2b | 117 | char line1[30] = "", line2[30] = ""; |
zoran93 | 0:17dc00c7db2b | 118 | |
zoran93 | 0:17dc00c7db2b | 119 | switch (menuItem) |
zoran93 | 0:17dc00c7db2b | 120 | { |
zoran93 | 0:17dc00c7db2b | 121 | case 0: |
zoran93 | 0:17dc00c7db2b | 122 | sprintf(line1, "Sensor:"); |
zoran93 | 0:17dc00c7db2b | 123 | sprintf(line2, "%s", motion_state); |
zoran93 | 0:17dc00c7db2b | 124 | break; |
zoran93 | 0:17dc00c7db2b | 125 | case 1: |
zoran93 | 0:17dc00c7db2b | 126 | sprintf(line1, "Water:"); |
zoran93 | 0:17dc00c7db2b | 127 | sprintf(line2, "%s", water_state); |
zoran93 | 0:17dc00c7db2b | 128 | break; |
zoran93 | 0:17dc00c7db2b | 129 | case 2: |
zoran93 | 0:17dc00c7db2b | 130 | sprintf(line1, "Visible light:"); |
zoran93 | 0:17dc00c7db2b | 131 | sprintf(line2, "%d lm", vis); |
zoran93 | 0:17dc00c7db2b | 132 | break; |
zoran93 | 0:17dc00c7db2b | 133 | case 3: |
zoran93 | 0:17dc00c7db2b | 134 | sprintf(line1, "IR light:"); |
zoran93 | 0:17dc00c7db2b | 135 | sprintf(line2, "%d lm", IR); |
zoran93 | 0:17dc00c7db2b | 136 | break; |
zoran93 | 0:17dc00c7db2b | 137 | case 4: |
zoran93 | 0:17dc00c7db2b | 138 | sprintf(line1, "UV Index(Risk):"); |
zoran93 | 0:17dc00c7db2b | 139 | sprintf(line2, "%.2f (%s)", UV_real, risk); |
zoran93 | 0:17dc00c7db2b | 140 | break; |
zoran93 | 0:17dc00c7db2b | 141 | } |
zoran93 | 0:17dc00c7db2b | 142 | |
zoran93 | 0:17dc00c7db2b | 143 | if (strcmp(line1, last_line1) != 0 || strcmp(line2, last_line2) != 0) |
zoran93 | 0:17dc00c7db2b | 144 | { |
zoran93 | 0:17dc00c7db2b | 145 | lcd.cls(); |
zoran93 | 0:17dc00c7db2b | 146 | lcd.locate(0, 0); |
zoran93 | 0:17dc00c7db2b | 147 | lcd.printf(line1); |
zoran93 | 0:17dc00c7db2b | 148 | strncpy(last_line1, line1, sizeof(last_line1)); |
zoran93 | 0:17dc00c7db2b | 149 | |
zoran93 | 0:17dc00c7db2b | 150 | lcd.locate(0,16); |
zoran93 | 0:17dc00c7db2b | 151 | lcd.printf(line2); |
zoran93 | 0:17dc00c7db2b | 152 | strncpy(last_line2, line2, sizeof(last_line2)); |
zoran93 | 0:17dc00c7db2b | 153 | } |
zoran93 | 0:17dc00c7db2b | 154 | } |
zoran93 | 0:17dc00c7db2b | 155 | |
zoran93 | 0:17dc00c7db2b | 156 | |
zoran93 | 0:17dc00c7db2b | 157 | void setMenu() |
zoran93 | 0:17dc00c7db2b | 158 | { |
zoran93 | 0:17dc00c7db2b | 159 | |
zoran93 | 0:17dc00c7db2b | 160 | if (Down) |
zoran93 | 0:17dc00c7db2b | 161 | { |
zoran93 | 0:17dc00c7db2b | 162 | joystickPos = "DOWN"; |
zoran93 | 0:17dc00c7db2b | 163 | |
zoran93 | 0:17dc00c7db2b | 164 | } |
zoran93 | 0:17dc00c7db2b | 165 | else if (Left){ |
zoran93 | 0:17dc00c7db2b | 166 | joystickPos = "LEFT"; |
zoran93 | 0:17dc00c7db2b | 167 | // if (menuItem <= 4 && menuItem > 0) |
zoran93 | 0:17dc00c7db2b | 168 | if(menuItem == 0)menuItem = 5; |
zoran93 | 0:17dc00c7db2b | 169 | printMenu(--menuItem); |
zoran93 | 0:17dc00c7db2b | 170 | } |
zoran93 | 0:17dc00c7db2b | 171 | else if (Click) |
zoran93 | 0:17dc00c7db2b | 172 | joystickPos = "CLICK"; |
zoran93 | 0:17dc00c7db2b | 173 | else if (Up) |
zoran93 | 0:17dc00c7db2b | 174 | { |
zoran93 | 0:17dc00c7db2b | 175 | joystickPos = "UP"; |
zoran93 | 0:17dc00c7db2b | 176 | } |
zoran93 | 0:17dc00c7db2b | 177 | else if (Right){ |
zoran93 | 0:17dc00c7db2b | 178 | joystickPos = "RIGHT"; |
zoran93 | 0:17dc00c7db2b | 179 | // if (menuItem >= 0 && menuItem < 4) |
zoran93 | 0:17dc00c7db2b | 180 | if(menuItem == 4)menuItem = -1; |
zoran93 | 0:17dc00c7db2b | 181 | printMenu(++menuItem); |
zoran93 | 0:17dc00c7db2b | 182 | } |
zoran93 | 0:17dc00c7db2b | 183 | else |
zoran93 | 0:17dc00c7db2b | 184 | joystickPos = "CENTRE"; |
zoran93 | 0:17dc00c7db2b | 185 | } |
zoran93 | 0:17dc00c7db2b | 186 | |
zoran93 | 0:17dc00c7db2b | 187 | void menu_loop(void const *args) |
zoran93 | 0:17dc00c7db2b | 188 | { |
zoran93 | 0:17dc00c7db2b | 189 | int count = 0; |
zoran93 | 0:17dc00c7db2b | 190 | while(true) |
zoran93 | 0:17dc00c7db2b | 191 | { |
zoran93 | 0:17dc00c7db2b | 192 | setMenu(); |
zoran93 | 0:17dc00c7db2b | 193 | if (++count % 5 == 0) |
zoran93 | 0:17dc00c7db2b | 194 | printMenu(menuItem); |
zoran93 | 0:17dc00c7db2b | 195 | Thread::wait(100); |
zoran93 | 0:17dc00c7db2b | 196 | } |
zoran93 | 0:17dc00c7db2b | 197 | } |
zoran93 | 0:17dc00c7db2b | 198 | |
zoran93 | 0:17dc00c7db2b | 199 | int main() |
zoran93 | 0:17dc00c7db2b | 200 | { |
zoran93 | 0:17dc00c7db2b | 201 | /* Turn off leds */ |
zoran93 | 0:17dc00c7db2b | 202 | r = 1; |
zoran93 | 0:17dc00c7db2b | 203 | g = 1; |
zoran93 | 0:17dc00c7db2b | 204 | b = 1; |
zoran93 | 0:17dc00c7db2b | 205 | |
zoran93 | 0:17dc00c7db2b | 206 | lcd.set_font((unsigned char*) Arial12x12); // Set a nice font for the LCD screen |
zoran93 | 0:17dc00c7db2b | 207 | |
zoran93 | 0:17dc00c7db2b | 208 | led2 = LED2_OFF; // K64F: turn off the main board LED |
zoran93 | 0:17dc00c7db2b | 209 | |
zoran93 | 0:17dc00c7db2b | 210 | pir_motion.rise(&pir_release); |
zoran93 | 0:17dc00c7db2b | 211 | |
zoran93 | 0:17dc00c7db2b | 212 | Thread motion1(motion); |
zoran93 | 0:17dc00c7db2b | 213 | Thread sunlight1(sunlight); |
zoran93 | 0:17dc00c7db2b | 214 | Thread water1(water); |
zoran93 | 0:17dc00c7db2b | 215 | Thread menu_thread(menu_loop); |
zoran93 | 0:17dc00c7db2b | 216 | |
zoran93 | 0:17dc00c7db2b | 217 | while (true){} |
zoran93 | 0:17dc00c7db2b | 218 | |
zoran93 | 0:17dc00c7db2b | 219 | } |