FRDM-K64F + Application Shield + Grove Sensors(Sunlight, Water, PIR motion)

Dependencies:   C12832 SI1145 mbed-rtos mbed

Fork of FRDM_ApplicationShield_GroveSensors by Aleš Zoran

Committer:
zoran93
Date:
Thu Oct 20 10:39:16 2016 +0000
Revision:
2:f7710077a4b5
Parent:
1:0690e7540e7e
FRDM-K64F + Application Shield + Grove Sensors(Sunlight, Water, PIR motion)

Who changed what in which revision?

UserRevisionLine numberNew 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 1:0690e7540e7e 73
zoran93 0:17dc00c7db2b 74 if(0<=UV_real && UV_real<=2.9){
zoran93 0:17dc00c7db2b 75 risk = "Low";
zoran93 0:17dc00c7db2b 76 }else if(3<=UV_real && UV_real<=5.9){
zoran93 0:17dc00c7db2b 77 risk = "Moderate";
zoran93 0:17dc00c7db2b 78 }else if(6<=UV_real && UV_real<=7.9){
zoran93 0:17dc00c7db2b 79 risk = "High";
zoran93 0:17dc00c7db2b 80 }else if(8<=UV_real && UV_real<=10.9){
zoran93 0:17dc00c7db2b 81 risk = "Very high";
zoran93 0:17dc00c7db2b 82 }else{
zoran93 0:17dc00c7db2b 83 risk = "Extreme";
zoran93 0:17dc00c7db2b 84 }
zoran93 0:17dc00c7db2b 85
zoran93 0:17dc00c7db2b 86 Thread::wait(2000);
zoran93 0:17dc00c7db2b 87 }
zoran93 0:17dc00c7db2b 88 }
zoran93 0:17dc00c7db2b 89
zoran93 0:17dc00c7db2b 90 /* Water sensor thread */
zoran93 0:17dc00c7db2b 91 void water(void const *args)
zoran93 0:17dc00c7db2b 92 {
zoran93 0:17dc00c7db2b 93 while(1){
zoran93 0:17dc00c7db2b 94
zoran93 0:17dc00c7db2b 95 if(water_sensor == 0){
zoran93 0:17dc00c7db2b 96 water_state = "DETECTED";
zoran93 0:17dc00c7db2b 97 if(k == true){
zoran93 0:17dc00c7db2b 98 pc.printf("Water sensor detected!\n");
zoran93 0:17dc00c7db2b 99 k = false;
zoran93 0:17dc00c7db2b 100 }
zoran93 0:17dc00c7db2b 101 j = 2;
zoran93 0:17dc00c7db2b 102
zoran93 0:17dc00c7db2b 103 }
zoran93 0:17dc00c7db2b 104 if(j==0){
zoran93 0:17dc00c7db2b 105 water_state = "NOT DETECTED";
zoran93 0:17dc00c7db2b 106 j = 2;
zoran93 0:17dc00c7db2b 107 k = true;
zoran93 0:17dc00c7db2b 108 }
zoran93 0:17dc00c7db2b 109 j--;
zoran93 0:17dc00c7db2b 110
zoran93 0:17dc00c7db2b 111 Thread::wait(100);
zoran93 0:17dc00c7db2b 112 }
zoran93 0:17dc00c7db2b 113 }
zoran93 0:17dc00c7db2b 114
zoran93 0:17dc00c7db2b 115 void printMenu(int menuItem)
zoran93 0:17dc00c7db2b 116 {
zoran93 0:17dc00c7db2b 117 static char last_line1[30] = "", last_line2[30] = "";
zoran93 0:17dc00c7db2b 118 char line1[30] = "", line2[30] = "";
zoran93 0:17dc00c7db2b 119
zoran93 0:17dc00c7db2b 120 switch (menuItem)
zoran93 0:17dc00c7db2b 121 {
zoran93 0:17dc00c7db2b 122 case 0:
zoran93 0:17dc00c7db2b 123 sprintf(line1, "Sensor:");
zoran93 0:17dc00c7db2b 124 sprintf(line2, "%s", motion_state);
zoran93 0:17dc00c7db2b 125 break;
zoran93 0:17dc00c7db2b 126 case 1:
zoran93 0:17dc00c7db2b 127 sprintf(line1, "Water:");
zoran93 0:17dc00c7db2b 128 sprintf(line2, "%s", water_state);
zoran93 0:17dc00c7db2b 129 break;
zoran93 0:17dc00c7db2b 130 case 2:
zoran93 0:17dc00c7db2b 131 sprintf(line1, "Visible light:");
zoran93 0:17dc00c7db2b 132 sprintf(line2, "%d lm", vis);
zoran93 0:17dc00c7db2b 133 break;
zoran93 0:17dc00c7db2b 134 case 3:
zoran93 0:17dc00c7db2b 135 sprintf(line1, "IR light:");
zoran93 0:17dc00c7db2b 136 sprintf(line2, "%d lm", IR);
zoran93 0:17dc00c7db2b 137 break;
zoran93 0:17dc00c7db2b 138 case 4:
zoran93 0:17dc00c7db2b 139 sprintf(line1, "UV Index(Risk):");
zoran93 0:17dc00c7db2b 140 sprintf(line2, "%.2f (%s)", UV_real, risk);
zoran93 0:17dc00c7db2b 141 break;
zoran93 0:17dc00c7db2b 142 }
zoran93 0:17dc00c7db2b 143
zoran93 0:17dc00c7db2b 144 if (strcmp(line1, last_line1) != 0 || strcmp(line2, last_line2) != 0)
zoran93 0:17dc00c7db2b 145 {
zoran93 0:17dc00c7db2b 146 lcd.cls();
zoran93 0:17dc00c7db2b 147 lcd.locate(0, 0);
zoran93 0:17dc00c7db2b 148 lcd.printf(line1);
zoran93 0:17dc00c7db2b 149 strncpy(last_line1, line1, sizeof(last_line1));
zoran93 0:17dc00c7db2b 150
zoran93 0:17dc00c7db2b 151 lcd.locate(0,16);
zoran93 0:17dc00c7db2b 152 lcd.printf(line2);
zoran93 0:17dc00c7db2b 153 strncpy(last_line2, line2, sizeof(last_line2));
zoran93 0:17dc00c7db2b 154 }
zoran93 0:17dc00c7db2b 155 }
zoran93 0:17dc00c7db2b 156
zoran93 0:17dc00c7db2b 157
zoran93 0:17dc00c7db2b 158 void setMenu()
zoran93 0:17dc00c7db2b 159 {
zoran93 0:17dc00c7db2b 160
zoran93 0:17dc00c7db2b 161 if (Down)
zoran93 0:17dc00c7db2b 162 {
zoran93 0:17dc00c7db2b 163 joystickPos = "DOWN";
zoran93 0:17dc00c7db2b 164
zoran93 0:17dc00c7db2b 165 }
zoran93 0:17dc00c7db2b 166 else if (Left){
zoran93 0:17dc00c7db2b 167 joystickPos = "LEFT";
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 == 4)menuItem = -1;
zoran93 0:17dc00c7db2b 180 printMenu(++menuItem);
zoran93 0:17dc00c7db2b 181 }
zoran93 0:17dc00c7db2b 182 else
zoran93 0:17dc00c7db2b 183 joystickPos = "CENTRE";
zoran93 0:17dc00c7db2b 184 }
zoran93 0:17dc00c7db2b 185
zoran93 0:17dc00c7db2b 186 void menu_loop(void const *args)
zoran93 0:17dc00c7db2b 187 {
zoran93 0:17dc00c7db2b 188 int count = 0;
zoran93 0:17dc00c7db2b 189 while(true)
zoran93 0:17dc00c7db2b 190 {
zoran93 0:17dc00c7db2b 191 setMenu();
zoran93 0:17dc00c7db2b 192 if (++count % 5 == 0)
zoran93 0:17dc00c7db2b 193 printMenu(menuItem);
zoran93 0:17dc00c7db2b 194 Thread::wait(100);
zoran93 0:17dc00c7db2b 195 }
zoran93 0:17dc00c7db2b 196 }
zoran93 0:17dc00c7db2b 197
zoran93 0:17dc00c7db2b 198 int main()
zoran93 0:17dc00c7db2b 199 {
zoran93 0:17dc00c7db2b 200 /* Turn off leds */
zoran93 0:17dc00c7db2b 201 r = 1;
zoran93 0:17dc00c7db2b 202 g = 1;
zoran93 0:17dc00c7db2b 203 b = 1;
zoran93 0:17dc00c7db2b 204
zoran93 0:17dc00c7db2b 205 lcd.set_font((unsigned char*) Arial12x12); // Set a nice font for the LCD screen
zoran93 0:17dc00c7db2b 206
zoran93 0:17dc00c7db2b 207 led2 = LED2_OFF; // K64F: turn off the main board LED
zoran93 0:17dc00c7db2b 208
zoran93 0:17dc00c7db2b 209 pir_motion.rise(&pir_release);
zoran93 0:17dc00c7db2b 210
zoran93 0:17dc00c7db2b 211 Thread motion1(motion);
zoran93 0:17dc00c7db2b 212 Thread sunlight1(sunlight);
zoran93 0:17dc00c7db2b 213 Thread water1(water);
zoran93 0:17dc00c7db2b 214 Thread menu_thread(menu_loop);
zoran93 0:17dc00c7db2b 215
zoran93 0:17dc00c7db2b 216 while (true){}
zoran93 0:17dc00c7db2b 217
zoran93 0:17dc00c7db2b 218 }