Project Autus - Automated Plant Chamber

Dependencies:   TextLCD mbed

Fork of keypad_test by Plamen Totev

Autus

This is the codebase accompanying the project Autus.

Autus is an automated growth chamber for plants.

Features

Control Humidity inside chamber wrt to external humidity. Control Temperature inside chamber. ( Peltier Heaters/Coolers ) Water and shower plants. Control soil humidity. Monitor water tanks level (Load Cell) /media/uploads/umairaftab/frdm_-_new_page1.png

Code Base Features

Fixed timing and CRC for DHT-11 Sensor. Fixed OneWire bug for ds18b20

Cyclic Executive Scheduler with Priority. Async IPC framework for PC App over bluetooth

Fake RTC systick, I was having some trouble with the on board rtc.

/media/uploads/umairaftab/download.png

Committer:
umairaftab
Date:
Sun Apr 13 09:06:37 2014 +0000
Revision:
36:ce0ca02a8253
Parent:
35:8bea464c2028
Child:
37:892872c3fa96
Cycle Air Functions,Definitions,Callbacks added.; Keypad Map Adjusted.; Bluetooth Serial Interrupt Callback Method added.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
umairaftab 8:2d462919519e 1
umairaftab 8:2d462919519e 2 //QUICK REFS:
umairaftab 8:2d462919519e 3 // TICKER is using timer 1 for buzzer.
umairaftab 8:2d462919519e 4
umairaftab 1:9ef26efedcea 5 #include "mbed.h"
umairaftab 3:087ce66714c0 6
umairaftab 1:9ef26efedcea 7 #include "keypad.h"
umairaftab 1:9ef26efedcea 8 #include "buzz.h"
umairaftab 7:1d691f81d455 9
umairaftab 7:1d691f81d455 10 #include "pindefs.h" //led pin definitions
umairaftab 3:087ce66714c0 11 #include "led_lights.h"
umairaftab 7:1d691f81d455 12
umairaftab 3:087ce66714c0 13 #include "peltier.h"
umairaftab 7:1d691f81d455 14 #include "peltier_pindefs.h"
umairaftab 7:1d691f81d455 15
umairaftab 7:1d691f81d455 16 #include "pumps.h"
umairaftab 7:1d691f81d455 17 #include "pumps_pindefs.h"
umairaftab 7:1d691f81d455 18
umairaftab 7:1d691f81d455 19 #include "airhumidity.h"
umairaftab 7:1d691f81d455 20 #include "soilmoisture.h"
umairaftab 7:1d691f81d455 21 #include "soilmoisture_pindefs.h"
umairaftab 8:2d462919519e 22
umairaftab 7:1d691f81d455 23 #include "ui.h"
umairaftab 7:1d691f81d455 24 #include "ui_pindefs.h"
umairaftab 7:1d691f81d455 25 #include "TextLCD.h"
umairaftab 7:1d691f81d455 26
umairaftab 8:2d462919519e 27 #include "rtcimp.h"
umairaftab 8:2d462919519e 28
umairaftab 14:72176f1e4907 29 #include "weight.h"
umairaftab 14:72176f1e4907 30 #include "weight_pindefs.h"
umairaftab 14:72176f1e4907 31
umairaftab 36:ce0ca02a8253 32 #include "cycleair.h"
umairaftab 36:ce0ca02a8253 33 #include "cycleair_pindef.h"
umairaftab 36:ce0ca02a8253 34
umairaftab 12:b3137bb72ef7 35 #include <string>
umairaftab 12:b3137bb72ef7 36 using namespace std;
umairaftab 12:b3137bb72ef7 37
umairaftab 8:2d462919519e 38 //SERIAL
umairaftab 36:ce0ca02a8253 39 Serial bluetooth_dev(PTA2, PTA1); // tx, rx
umairaftab 8:2d462919519e 40 Serial printer(PTC4,PTC3); // tx, rx
umairaftab 8:2d462919519e 41 //TICKERS
umairaftab 1:9ef26efedcea 42 Ticker timer1ms;
umairaftab 8:2d462919519e 43 Ticker clock_mine;
umairaftab 11:f9ffd5ab7e94 44 Timer lcd_timeout;
umairaftab 8:2d462919519e 45 //FLAGS
umairaftab 8:2d462919519e 46 bool startup_flag=true;
umairaftab 9:43c339533f7f 47 bool watered_plant1 = false;
umairaftab 9:43c339533f7f 48 int watered_plant1_time = 0;
umairaftab 9:43c339533f7f 49 bool watered_plant2 = false;
umairaftab 9:43c339533f7f 50 int watered_plant2_time = 0;
umairaftab 8:2d462919519e 51
umairaftab 8:2d462919519e 52 //SETPOINTS
umairaftab 8:2d462919519e 53 float setpoint_air_humidity = 30.00 ;
umairaftab 8:2d462919519e 54 float setpoint_soil_humid1 = 0.3 ;
umairaftab 8:2d462919519e 55 float setpoint_soil_humid2 = 0.3 ;
umairaftab 8:2d462919519e 56
umairaftab 12:b3137bb72ef7 57 float setpoint_MAX_air_temp = 45;
umairaftab 12:b3137bb72ef7 58
umairaftab 11:f9ffd5ab7e94 59 int setpoint_red_lights;
umairaftab 11:f9ffd5ab7e94 60 int setpoint_blue_lights;
umairaftab 11:f9ffd5ab7e94 61 int setpoint_green_lights;
umairaftab 12:b3137bb72ef7 62
umairaftab 8:2d462919519e 63 //WINDOWING
umairaftab 9:43c339533f7f 64 float window_f = 5 ;
umairaftab 8:2d462919519e 65 int window_i =2 ;
umairaftab 8:2d462919519e 66
umairaftab 8:2d462919519e 67 //GLOBAL VARS
umairaftab 8:2d462919519e 68 float current_water_level = 0;
umairaftab 12:b3137bb72ef7 69 bool lcd_timeout_flag=false;
umairaftab 12:b3137bb72ef7 70
umairaftab 8:2d462919519e 71 //SAFETY LIMITS
umairaftab 8:2d462919519e 72 const float max_peltier_temp = 68 ; //CELCIUS
umairaftab 12:b3137bb72ef7 73 const int MAX_WATERING_TIME_GAP = 20; //Number of Hours
umairaftab 12:b3137bb72ef7 74 const int CYCLE_AIR_TIME = 2; //Wait between on and off seconds
umairaftab 12:b3137bb72ef7 75 const int LCD_TIMEOUT_VALUE = 30; //Number of seconds
umairaftab 36:ce0ca02a8253 76 const char status = 'F'; //For bluetooth Serial
umairaftab 36:ce0ca02a8253 77
umairaftab 36:ce0ca02a8253 78 //*************************FUNCTION CALLBACK FOR SERIAL INTTERUPTS********************************
umairaftab 36:ce0ca02a8253 79 void callback_bluetooth() {
umairaftab 36:ce0ca02a8253 80 // Note: you need to actually read from the serial to clear the RX interrupt
umairaftab 36:ce0ca02a8253 81 if(bluetooth_dev.getc()=='S'){
umairaftab 36:ce0ca02a8253 82
umairaftab 36:ce0ca02a8253 83 printf("Info %c %4.2f %4.2f %4.2f %4.2f %4.2f %4.2f %4.2f %4.2f \n\r", status,outside_temp,inside_temp,inside_humidity,outside_humidity,inside_dewpoint,outside_dewpoint,soil1_humid,soil2_humid) ;
umairaftab 36:ce0ca02a8253 84
umairaftab 36:ce0ca02a8253 85 //myled = !myled;
umairaftab 36:ce0ca02a8253 86 }
umairaftab 36:ce0ca02a8253 87 //printf("%c\n\r", device.getc());
umairaftab 36:ce0ca02a8253 88
umairaftab 36:ce0ca02a8253 89 }
umairaftab 12:b3137bb72ef7 90
umairaftab 12:b3137bb72ef7 91
umairaftab 8:2d462919519e 92 //**************************FUNCTION TO READ SENSORS **********************************************
umairaftab 8:2d462919519e 93 void read_sensors(){
umairaftab 8:2d462919519e 94
umairaftab 8:2d462919519e 95 //Read values for AIR
umairaftab 8:2d462919519e 96
umairaftab 8:2d462919519e 97 //OUTSIDE
umairaftab 8:2d462919519e 98 outside_humidity = get_air_humid_outside();
umairaftab 8:2d462919519e 99 outside_temp = get_air_temp_outside(temp_unit);
umairaftab 8:2d462919519e 100 outside_dewpoint = get_air_dewpoint_outside();
umairaftab 8:2d462919519e 101
umairaftab 8:2d462919519e 102 //INSIDE
umairaftab 8:2d462919519e 103 inside_humidity = get_air_humid_inside();
umairaftab 8:2d462919519e 104 inside_temp = get_air_temp_inside(temp_unit);
umairaftab 8:2d462919519e 105 inside_dewpoint = get_air_dewpoint_inside();
umairaftab 8:2d462919519e 106
umairaftab 8:2d462919519e 107 //Read value for soil
umairaftab 8:2d462919519e 108 read_soil_humidity();
umairaftab 8:2d462919519e 109 calc_soil_humid_values(); //values in soil1_humid and soil2_humid perecentages
umairaftab 11:f9ffd5ab7e94 110 soil1_humidity = soil1_humid ;
umairaftab 11:f9ffd5ab7e94 111 soil2_humidity = soil2_humid ;
umairaftab 14:72176f1e4907 112 //printf("%4.2f \n\r",soil1_humidity);
umairaftab 14:72176f1e4907 113 //READ LOAD SENSOR
umairaftab 14:72176f1e4907 114 read_weight();
umairaftab 14:72176f1e4907 115 calc_weight();
umairaftab 14:72176f1e4907 116 weight_sensor = weight1;
umairaftab 8:2d462919519e 117 }
umairaftab 8:2d462919519e 118
umairaftab 8:2d462919519e 119 //****************************Functions that perform tasks**************************************
umairaftab 9:43c339533f7f 120 //Water Plants
umairaftab 8:2d462919519e 121 void waterplants(){
umairaftab 8:2d462919519e 122
umairaftab 8:2d462919519e 123
umairaftab 9:43c339533f7f 124 if(startup_flag == true){
umairaftab 14:72176f1e4907 125 //call for pump function
umairaftab 14:72176f1e4907 126
umairaftab 9:43c339533f7f 127 watered_plant1 = true;
umairaftab 9:43c339533f7f 128 watered_plant1_time = hour ;
umairaftab 9:43c339533f7f 129 watered_plant2 = true;
umairaftab 9:43c339533f7f 130 watered_plant2_time = hour ;
umairaftab 14:72176f1e4907 131 pumps(true,true,true,false);
umairaftab 14:72176f1e4907 132 wait(5.0);
umairaftab 14:72176f1e4907 133 pumps(false,false,false,false);
umairaftab 9:43c339533f7f 134 }
umairaftab 9:43c339533f7f 135 else{
umairaftab 9:43c339533f7f 136
umairaftab 10:1a0fe96381b0 137 if( (soil1_humid < setpoint_soil_humid1) || (watered_plant1 == false) ){
umairaftab 9:43c339533f7f 138 //enable pump1
umairaftab 9:43c339533f7f 139 watered_plant1 = true;
umairaftab 9:43c339533f7f 140 watered_plant1_time = hour ;
umairaftab 14:72176f1e4907 141 pumps(true,true,true,false);
umairaftab 14:72176f1e4907 142 wait(5.0);
umairaftab 14:72176f1e4907 143 pumps(false,false,false,false);
umairaftab 9:43c339533f7f 144 }
umairaftab 10:1a0fe96381b0 145 if( (soil2_humid < setpoint_soil_humid2) || (watered_plant2 == false) ){
umairaftab 9:43c339533f7f 146 //enable pump2
umairaftab 9:43c339533f7f 147 watered_plant2 = true;
umairaftab 9:43c339533f7f 148 watered_plant2_time = hour ;
umairaftab 14:72176f1e4907 149 pumps(true,true,true,false);
umairaftab 14:72176f1e4907 150 wait(5.0);
umairaftab 14:72176f1e4907 151 pumps(false,false,false,false);
umairaftab 9:43c339533f7f 152 }
umairaftab 9:43c339533f7f 153 }
umairaftab 10:1a0fe96381b0 154 //Make sure it is watered at least every x hours in case soil humid doesnt work
umairaftab 9:43c339533f7f 155 if (watered_plant1 == true){
umairaftab 9:43c339533f7f 156 if(abs(hour-watered_plant1_time)>MAX_WATERING_TIME_GAP){
umairaftab 9:43c339533f7f 157 watered_plant1 = false;
umairaftab 9:43c339533f7f 158 }
umairaftab 9:43c339533f7f 159 }
umairaftab 9:43c339533f7f 160 if (watered_plant2 == true){
umairaftab 9:43c339533f7f 161 if(abs(hour-watered_plant2_time)>MAX_WATERING_TIME_GAP){
umairaftab 9:43c339533f7f 162 watered_plant2 = false;
umairaftab 9:43c339533f7f 163 }
umairaftab 9:43c339533f7f 164 }
umairaftab 9:43c339533f7f 165
umairaftab 9:43c339533f7f 166 }
umairaftab 9:43c339533f7f 167
umairaftab 9:43c339533f7f 168 // Air Humidity Level
umairaftab 9:43c339533f7f 169 void airhumidity(){
umairaftab 9:43c339533f7f 170
umairaftab 11:f9ffd5ab7e94 171 if( !( (setpoint_air_humidity+window_f > inside_humidity) && (setpoint_air_humidity-window_f < inside_humidity) ) ){
umairaftab 9:43c339533f7f 172
umairaftab 9:43c339533f7f 173 //Turn on Air humidity fan
umairaftab 14:72176f1e4907 174 pumps(false,false,false,true);
umairaftab 9:43c339533f7f 175 wait(5);
umairaftab 9:43c339533f7f 176 //Turn off Air humisity fan
umairaftab 14:72176f1e4907 177 pumps(false,false,false,false);
umairaftab 9:43c339533f7f 178 }
umairaftab 9:43c339533f7f 179 }
umairaftab 9:43c339533f7f 180
umairaftab 9:43c339533f7f 181 //CYCLE AIR
umairaftab 9:43c339533f7f 182 void cycleair(){
umairaftab 9:43c339533f7f 183
umairaftab 9:43c339533f7f 184 //Turn on fan
umairaftab 36:ce0ca02a8253 185 cycle_air_on();
umairaftab 9:43c339533f7f 186 wait(CYCLE_AIR_TIME);
umairaftab 9:43c339533f7f 187 //turn of fan
umairaftab 36:ce0ca02a8253 188 cycle_air_off();
umairaftab 8:2d462919519e 189
umairaftab 8:2d462919519e 190 }
umairaftab 14:72176f1e4907 191 //**********************************LCD TIMEOUT FUNCTION*********************************
umairaftab 12:b3137bb72ef7 192 void lcd_timeout_check(){
umairaftab 12:b3137bb72ef7 193
umairaftab 12:b3137bb72ef7 194 if(lcd_timeout.read()>LCD_TIMEOUT_VALUE){
umairaftab 12:b3137bb72ef7 195 lcd_timeout_flag = true;
umairaftab 12:b3137bb72ef7 196 }
umairaftab 12:b3137bb72ef7 197
umairaftab 12:b3137bb72ef7 198 }
umairaftab 26:2f59456a7bad 199 void settings_submenu(int counter_menu){
umairaftab 26:2f59456a7bad 200
umairaftab 26:2f59456a7bad 201 char key_value2;
umairaftab 26:2f59456a7bad 202 bool break_flag = false;
umairaftab 26:2f59456a7bad 203 switch(counter_menu){
umairaftab 26:2f59456a7bad 204 case 0:
umairaftab 26:2f59456a7bad 205 lcd.cls();
umairaftab 26:2f59456a7bad 206 lcd.locate(0,0);
umairaftab 26:2f59456a7bad 207 lcd.printf("Not Authorised");
umairaftab 26:2f59456a7bad 208 wait(5);
umairaftab 26:2f59456a7bad 209 break;
umairaftab 26:2f59456a7bad 210 case 1:
umairaftab 26:2f59456a7bad 211 break_flag = false;
umairaftab 26:2f59456a7bad 212 lcd.cls();
umairaftab 26:2f59456a7bad 213 lcd.locate(0,0);
umairaftab 26:2f59456a7bad 214 lcd.printf("Cur Air Humidity Lvl");
umairaftab 26:2f59456a7bad 215 //lcd.locate(0,1);
umairaftab 26:2f59456a7bad 216 //lcd.printf("%3.1f",setpoint_air_humidity);
umairaftab 26:2f59456a7bad 217 while(!break_flag){
umairaftab 26:2f59456a7bad 218 lcd.locate(0,1);
umairaftab 26:2f59456a7bad 219 lcd.printf("%3.1f",setpoint_air_humidity);
umairaftab 26:2f59456a7bad 220 key_value2 = Keypad();
umairaftab 26:2f59456a7bad 221 wait(0.2);
umairaftab 36:ce0ca02a8253 222 if(key_value2 == 74){setpoint_air_humidity++;}
umairaftab 36:ce0ca02a8253 223 else if(key_value2 == 71){setpoint_air_humidity--;}
umairaftab 26:2f59456a7bad 224 else if(key_value2 == 75){break_flag=true;} //enter
umairaftab 26:2f59456a7bad 225 if (setpoint_air_humidity <0 || setpoint_air_humidity >99) {setpoint_air_humidity=30.00;}
umairaftab 26:2f59456a7bad 226 }
umairaftab 26:2f59456a7bad 227
umairaftab 26:2f59456a7bad 228 lcd.cls();
umairaftab 26:2f59456a7bad 229 lcd.locate(0,0);
umairaftab 26:2f59456a7bad 230 lcd.printf("NEW Air Humid Setpoint");
umairaftab 26:2f59456a7bad 231 lcd.locate(0,1);
umairaftab 26:2f59456a7bad 232 lcd.printf("%3.1f",setpoint_air_humidity);
umairaftab 26:2f59456a7bad 233 wait(5);
umairaftab 26:2f59456a7bad 234
umairaftab 26:2f59456a7bad 235 break;
umairaftab 26:2f59456a7bad 236 case 2:
umairaftab 26:2f59456a7bad 237 break_flag = false;
umairaftab 26:2f59456a7bad 238 lcd.cls();
umairaftab 26:2f59456a7bad 239 lcd.locate(0,0);
umairaftab 26:2f59456a7bad 240 lcd.printf("Soil Humidity Setpoint");
umairaftab 26:2f59456a7bad 241
umairaftab 26:2f59456a7bad 242 while(!break_flag){
umairaftab 26:2f59456a7bad 243 lcd.locate(0,1);
umairaftab 26:2f59456a7bad 244 lcd.printf("S1: %4.2f",setpoint_soil_humid1);
umairaftab 26:2f59456a7bad 245 lcd.printf(" S2: %4.2f",setpoint_soil_humid2);
umairaftab 26:2f59456a7bad 246 key_value2 = Keypad();
umairaftab 26:2f59456a7bad 247 wait(0.2);
umairaftab 36:ce0ca02a8253 248 if(key_value2 == 62){ //up
umairaftab 26:2f59456a7bad 249 setpoint_soil_humid1++;
umairaftab 26:2f59456a7bad 250 setpoint_soil_humid2++;
umairaftab 26:2f59456a7bad 251 }
umairaftab 36:ce0ca02a8253 252 else if(key_value2 == 59){//down
umairaftab 26:2f59456a7bad 253 setpoint_soil_humid1--;
umairaftab 26:2f59456a7bad 254 setpoint_soil_humid2--;
umairaftab 26:2f59456a7bad 255 }
umairaftab 26:2f59456a7bad 256 else if(key_value2 == 75){break_flag=true;}//enterkey
umairaftab 26:2f59456a7bad 257 //if (setpoint_air_humidity <0 || setpoint_air_humidity >99) {setpoint_air_humidity=30.00;}
umairaftab 26:2f59456a7bad 258 }
umairaftab 26:2f59456a7bad 259
umairaftab 26:2f59456a7bad 260 lcd.cls();
umairaftab 26:2f59456a7bad 261 lcd.locate(0,0);
umairaftab 26:2f59456a7bad 262 lcd.printf("New Soil Setpoints:");
umairaftab 26:2f59456a7bad 263 lcd.locate(0,1);
umairaftab 26:2f59456a7bad 264 lcd.printf("S1: %4.2f",setpoint_soil_humid1);
umairaftab 26:2f59456a7bad 265 lcd.printf(" S2: %4.2f",setpoint_soil_humid2);
umairaftab 26:2f59456a7bad 266 wait(5);
umairaftab 26:2f59456a7bad 267 break;
umairaftab 26:2f59456a7bad 268 case 3:
umairaftab 26:2f59456a7bad 269
umairaftab 26:2f59456a7bad 270 break_flag = false;
umairaftab 26:2f59456a7bad 271 lcd.cls();
umairaftab 26:2f59456a7bad 272 lcd.locate(0,0);
umairaftab 26:2f59456a7bad 273 lcd.printf("Cur Air Tmp Setpoint");
umairaftab 26:2f59456a7bad 274 while(!break_flag){
umairaftab 26:2f59456a7bad 275 lcd.locate(0,1);
umairaftab 26:2f59456a7bad 276 lcd.printf("%3.1f",setpoint_MAX_air_temp);
umairaftab 26:2f59456a7bad 277 key_value2 = Keypad();
umairaftab 26:2f59456a7bad 278 wait(0.2);
umairaftab 36:ce0ca02a8253 279 if(key_value2 == 74){setpoint_MAX_air_temp++;}
umairaftab 36:ce0ca02a8253 280 else if(key_value2 == 71){setpoint_MAX_air_temp--;}
umairaftab 26:2f59456a7bad 281 else if(key_value2 == 75){break_flag=true;}
umairaftab 26:2f59456a7bad 282 if (setpoint_MAX_air_temp <0 || setpoint_MAX_air_temp >99) {setpoint_MAX_air_temp=45.0;}
umairaftab 26:2f59456a7bad 283 }
umairaftab 26:2f59456a7bad 284
umairaftab 26:2f59456a7bad 285 lcd.cls();
umairaftab 26:2f59456a7bad 286 lcd.locate(0,0);
umairaftab 26:2f59456a7bad 287 lcd.printf("NEW Air Tmp Setpoint");
umairaftab 26:2f59456a7bad 288 lcd.locate(0,1);
umairaftab 26:2f59456a7bad 289 lcd.printf("%3.1f",setpoint_MAX_air_temp);
umairaftab 26:2f59456a7bad 290 wait(5);
umairaftab 26:2f59456a7bad 291 break;
umairaftab 26:2f59456a7bad 292 }//switch end
umairaftab 26:2f59456a7bad 293
umairaftab 26:2f59456a7bad 294 }
umairaftab 14:72176f1e4907 295 //***************************************SETTINGS UI*************************************
umairaftab 12:b3137bb72ef7 296 void ui_settings(){
umairaftab 12:b3137bb72ef7 297
umairaftab 12:b3137bb72ef7 298 lcd.cls();
umairaftab 12:b3137bb72ef7 299 lcd.locate(0,0);
umairaftab 12:b3137bb72ef7 300 lcd.printf("Autus Settings");
umairaftab 12:b3137bb72ef7 301 lcd.locate(0,1);
umairaftab 12:b3137bb72ef7 302 lcd.printf("Performing Checks");
umairaftab 12:b3137bb72ef7 303 char key_value;
umairaftab 12:b3137bb72ef7 304 bool exit_settings=false;
umairaftab 12:b3137bb72ef7 305
umairaftab 12:b3137bb72ef7 306 //disable peltier
umairaftab 14:72176f1e4907 307 peltier(false,false,false,false,0);
umairaftab 12:b3137bb72ef7 308
umairaftab 12:b3137bb72ef7 309 wait(2);
umairaftab 32:d8b232481ec5 310 string menu[5];
umairaftab 12:b3137bb72ef7 311 menu[0]= "1.LED Brightness";
umairaftab 12:b3137bb72ef7 312 menu[1]= "2.Air Humidty Lvl";
umairaftab 12:b3137bb72ef7 313 menu[2]= "3.Soil Moisture Lvl";
umairaftab 12:b3137bb72ef7 314 menu[3]= "4.Air Temperature";
umairaftab 32:d8b232481ec5 315 menu[4]= " ";
umairaftab 12:b3137bb72ef7 316 lcd.cls();
umairaftab 12:b3137bb72ef7 317 int counter_menu =0 ;
umairaftab 29:b712f073a397 318 bool overflow_menu = false;
umairaftab 12:b3137bb72ef7 319 while(!exit_settings){
umairaftab 26:2f59456a7bad 320
umairaftab 12:b3137bb72ef7 321 key_value = Keypad();
umairaftab 35:8bea464c2028 322 printf("Key %d\n\r",key_value);
umairaftab 27:24478764d4b2 323 wait(0.1);
umairaftab 25:a6d1eaf2041c 324 if(key_value == 150){
umairaftab 12:b3137bb72ef7 325 lcd.locate(0,0);
umairaftab 12:b3137bb72ef7 326 lcd.printf(">%s",menu[counter_menu].c_str());
umairaftab 12:b3137bb72ef7 327 lcd.locate(0,1);
umairaftab 32:d8b232481ec5 328 if(counter_menu ==4){
umairaftab 25:a6d1eaf2041c 329 counter_menu = 0;
umairaftab 29:b712f073a397 330 overflow_menu=true;
umairaftab 25:a6d1eaf2041c 331 lcd.printf(" %s",menu[counter_menu].c_str());
umairaftab 12:b3137bb72ef7 332 }
umairaftab 12:b3137bb72ef7 333 else{
umairaftab 25:a6d1eaf2041c 334 lcd.printf(" %s",menu[counter_menu+1].c_str());
umairaftab 12:b3137bb72ef7 335 }
umairaftab 26:2f59456a7bad 336 //wait(0.2);
umairaftab 12:b3137bb72ef7 337 }//No Press If Block
umairaftab 36:ce0ca02a8253 338 else if(key_value == 68){//Down Key Pressed if block
umairaftab 12:b3137bb72ef7 339 lcd.cls();
umairaftab 29:b712f073a397 340 if(overflow_menu==false){
umairaftab 32:d8b232481ec5 341 counter_menu++;
umairaftab 33:d1b04f1a792a 342 //printf("CounterOverflow)");
umairaftab 32:d8b232481ec5 343 }
umairaftab 29:b712f073a397 344 else{overflow_menu=false;}
umairaftab 32:d8b232481ec5 345
umairaftab 12:b3137bb72ef7 346 }//Down Key Pressed if block end
umairaftab 36:ce0ca02a8253 347 else if(key_value == 65){ //OK Key Pressed if block
umairaftab 26:2f59456a7bad 348 settings_submenu(counter_menu);
umairaftab 33:d1b04f1a792a 349 lcd.cls();
umairaftab 12:b3137bb72ef7 350 } //OK button if block
umairaftab 36:ce0ca02a8253 351 else if(key_value == 75){ //ENTR Button
umairaftab 12:b3137bb72ef7 352 exit_settings = true;
umairaftab 12:b3137bb72ef7 353 lcd.cls();
umairaftab 12:b3137bb72ef7 354 lcd.printf("SAVE Config");
umairaftab 12:b3137bb72ef7 355 wait(2);
umairaftab 12:b3137bb72ef7 356 }
umairaftab 12:b3137bb72ef7 357
umairaftab 12:b3137bb72ef7 358 }//While settings loop exit
umairaftab 12:b3137bb72ef7 359 lcd.cls();
umairaftab 12:b3137bb72ef7 360 lcd.printf("Exit Settings");
umairaftab 25:a6d1eaf2041c 361 wait(5);
umairaftab 12:b3137bb72ef7 362 }
umairaftab 26:2f59456a7bad 363
umairaftab 26:2f59456a7bad 364
umairaftab 12:b3137bb72ef7 365 //Function to process keypad inputs
umairaftab 12:b3137bb72ef7 366 void process_user_input(char keypad_value_in, int ui_current_screen_in){
umairaftab 12:b3137bb72ef7 367
umairaftab 18:7ec1691d0d9d 368 if(keypad_value_in == 61){
umairaftab 12:b3137bb72ef7 369 if(lcd_timeout_flag == false){
umairaftab 12:b3137bb72ef7 370 switch (ui_current_screen_in){
umairaftab 12:b3137bb72ef7 371 case 1:
umairaftab 12:b3137bb72ef7 372 ui_screen2();
umairaftab 12:b3137bb72ef7 373 ui_current_screen_in =2;
umairaftab 12:b3137bb72ef7 374 break;
umairaftab 12:b3137bb72ef7 375 case 2:
umairaftab 12:b3137bb72ef7 376 ui_screen3();
umairaftab 12:b3137bb72ef7 377 ui_current_screen_in =3;
umairaftab 12:b3137bb72ef7 378 break;
umairaftab 12:b3137bb72ef7 379 case 3:
umairaftab 12:b3137bb72ef7 380 ui_screen4();
umairaftab 12:b3137bb72ef7 381 ui_current_screen_in =4;
umairaftab 12:b3137bb72ef7 382 break;
umairaftab 12:b3137bb72ef7 383 }//switch block current ui screen
umairaftab 12:b3137bb72ef7 384 lcd_timeout.reset();
umairaftab 12:b3137bb72ef7 385 lcd_timeout.start();
umairaftab 12:b3137bb72ef7 386 wait(2);
umairaftab 12:b3137bb72ef7 387 }// if block lcdflag
umairaftab 12:b3137bb72ef7 388 else{
umairaftab 12:b3137bb72ef7 389 ui_screen1();
umairaftab 12:b3137bb72ef7 390 wait(5);
umairaftab 12:b3137bb72ef7 391 }
umairaftab 12:b3137bb72ef7 392 }// if block 36 end
umairaftab 12:b3137bb72ef7 393
umairaftab 12:b3137bb72ef7 394 // check for setting screen press enter
umairaftab 18:7ec1691d0d9d 395 if(keypad_value_in == 58){
umairaftab 12:b3137bb72ef7 396 //Disable peltier
umairaftab 12:b3137bb72ef7 397 ui_settings();
umairaftab 12:b3137bb72ef7 398 wait(5);
umairaftab 12:b3137bb72ef7 399 }
umairaftab 14:72176f1e4907 400
umairaftab 14:72176f1e4907 401 if(keypad_value_in ==100){
umairaftab 14:72176f1e4907 402 ui_screen1();
umairaftab 17:0ff7385db570 403 wait(0.2);
umairaftab 14:72176f1e4907 404 }
umairaftab 12:b3137bb72ef7 405 }
umairaftab 12:b3137bb72ef7 406
umairaftab 12:b3137bb72ef7 407
umairaftab 12:b3137bb72ef7 408
umairaftab 12:b3137bb72ef7 409
umairaftab 8:2d462919519e 410 //***************************PLACEHOLDER FUNCTION TO DISABLE EVERYTHING **********************
umairaftab 8:2d462919519e 411 void disable_everything(){
umairaftab 8:2d462919519e 412
umairaftab 10:1a0fe96381b0 413 //Disable peltier,vac,fans,pumps,lights.
umairaftab 14:72176f1e4907 414 pumps(false,false,false,false);
umairaftab 14:72176f1e4907 415 peltier(false,false,false,false,0);
umairaftab 8:2d462919519e 416 }
umairaftab 8:2d462919519e 417
umairaftab 8:2d462919519e 418
umairaftab 8:2d462919519e 419 //*********************************************************************************************
umairaftab 8:2d462919519e 420 //* *
umairaftab 8:2d462919519e 421 //* *
umairaftab 8:2d462919519e 422 //* *
umairaftab 8:2d462919519e 423 //* *
umairaftab 8:2d462919519e 424 //* MAIN ROUTINE *
umairaftab 8:2d462919519e 425 //* *
umairaftab 8:2d462919519e 426 //* DO NOT MODIFY WITHOUT TELLING UMAIR *
umairaftab 8:2d462919519e 427 //* *
umairaftab 8:2d462919519e 428 //* *
umairaftab 8:2d462919519e 429 //*********************************************************************************************
umairaftab 1:9ef26efedcea 430
umairaftab 1:9ef26efedcea 431 int main(void)
umairaftab 1:9ef26efedcea 432 {
umairaftab 8:2d462919519e 433
umairaftab 8:2d462919519e 434 //call function that disables everything.
umairaftab 8:2d462919519e 435 disable_everything();
umairaftab 8:2d462919519e 436
umairaftab 8:2d462919519e 437
umairaftab 31:a90b72ae9835 438 lcd_backlight_on();
umairaftab 8:2d462919519e 439 //FOR INTERNAL CLOCK
umairaftab 33:d1b04f1a792a 440 clock_mine.attach(&sec_inc, 1.0);
umairaftab 36:ce0ca02a8253 441
umairaftab 8:2d462919519e 442 char keypad_value;
umairaftab 11:f9ffd5ab7e94 443 int ui_current_screen = 1;
umairaftab 10:1a0fe96381b0 444 //************************************BOOT SEQUENCE*********************
umairaftab 8:2d462919519e 445 //call LCD boot
umairaftab 8:2d462919519e 446 ui_startup();
umairaftab 9:43c339533f7f 447 wait(2);
umairaftab 8:2d462919519e 448 //SET TIME
umairaftab 8:2d462919519e 449 rtcimp_settime(6,0);
umairaftab 8:2d462919519e 450 //call function that reads values
umairaftab 9:43c339533f7f 451
umairaftab 9:43c339533f7f 452 /* FOR CRTITICALITY
umairaftab 9:43c339533f7f 453 NVIC_DisableIRQ(TIMER3_IRQn);
umairaftab 9:43c339533f7f 454
umairaftab 9:43c339533f7f 455 // critical section
umairaftab 9:43c339533f7f 456
umairaftab 9:43c339533f7f 457 NVIC_EnableIRQ(TIMER3_IRQn);
umairaftab 9:43c339533f7f 458 */
umairaftab 9:43c339533f7f 459 lcd.cls();
umairaftab 9:43c339533f7f 460 lcd.locate(0,0);
umairaftab 9:43c339533f7f 461 lcd.printf("Reading Sensors");
umairaftab 9:43c339533f7f 462
umairaftab 8:2d462919519e 463 read_sensors();
umairaftab 8:2d462919519e 464
umairaftab 9:43c339533f7f 465 wait(2);
umairaftab 9:43c339533f7f 466 lcd.cls();
umairaftab 9:43c339533f7f 467 lcd.locate(0,0);
umairaftab 9:43c339533f7f 468 lcd.printf("Done Reading Sensors");
umairaftab 8:2d462919519e 469 //call function that performs functions.
umairaftab 8:2d462919519e 470
umairaftab 9:43c339533f7f 471 wait(2);
umairaftab 9:43c339533f7f 472 lcd.cls();
umairaftab 9:43c339533f7f 473 lcd.locate(0,0);
umairaftab 9:43c339533f7f 474 lcd.printf("Watering Plants");
umairaftab 9:43c339533f7f 475
umairaftab 24:03e27d9e7aaa 476 //waterplants();
umairaftab 9:43c339533f7f 477
umairaftab 9:43c339533f7f 478 wait(2);
umairaftab 9:43c339533f7f 479 lcd.cls();
umairaftab 9:43c339533f7f 480 lcd.locate(0,0);
umairaftab 9:43c339533f7f 481 lcd.printf("Air Humidity");
umairaftab 9:43c339533f7f 482
umairaftab 24:03e27d9e7aaa 483 //airhumidity();
umairaftab 9:43c339533f7f 484
umairaftab 9:43c339533f7f 485 wait(2);
umairaftab 9:43c339533f7f 486 lcd.cls();
umairaftab 9:43c339533f7f 487 lcd.locate(0,0);
umairaftab 9:43c339533f7f 488 lcd.printf("Cycling Air");
umairaftab 9:43c339533f7f 489
umairaftab 9:43c339533f7f 490 cycleair();
umairaftab 9:43c339533f7f 491
umairaftab 11:f9ffd5ab7e94 492 wait(2);
umairaftab 11:f9ffd5ab7e94 493 lcd.cls();
umairaftab 11:f9ffd5ab7e94 494 lcd.locate(0,0);
umairaftab 11:f9ffd5ab7e94 495 lcd.printf("Testing Lights");
umairaftab 11:f9ffd5ab7e94 496 //led_test();
umairaftab 11:f9ffd5ab7e94 497
umairaftab 11:f9ffd5ab7e94 498
umairaftab 36:ce0ca02a8253 499 //INTILIZE SERIAL PARAMETERS
umairaftab 36:ce0ca02a8253 500 wait(2);
umairaftab 36:ce0ca02a8253 501 lcd.cls();
umairaftab 36:ce0ca02a8253 502 lcd.locate(0,0);
umairaftab 36:ce0ca02a8253 503 lcd.printf("Initialize Bluetooth");
umairaftab 36:ce0ca02a8253 504 bluetooth_dev.baud(9600);
umairaftab 36:ce0ca02a8253 505 bluetooth_dev.attach(&callback_bluetooth);
umairaftab 36:ce0ca02a8253 506
umairaftab 36:ce0ca02a8253 507
umairaftab 9:43c339533f7f 508 wait(5);
umairaftab 36:ce0ca02a8253 509 lcd.cls();
umairaftab 12:b3137bb72ef7 510 ui_current_screen = 1;
umairaftab 9:43c339533f7f 511 ui_screen1();
umairaftab 12:b3137bb72ef7 512 lcd_timeout.reset();
umairaftab 9:43c339533f7f 513 wait(5);
umairaftab 8:2d462919519e 514
umairaftab 14:72176f1e4907 515 startup_flag = false ;
umairaftab 14:72176f1e4907 516 timer1ms.attach(&timer1, 0.001); //interrupt attached function(timer) with interval (1 ms)
umairaftab 25:a6d1eaf2041c 517 led_blue_pulsewidth=50;
umairaftab 25:a6d1eaf2041c 518 led_blue.period_us(1000);
umairaftab 25:a6d1eaf2041c 519
umairaftab 1:9ef26efedcea 520 while(1) {
umairaftab 8:2d462919519e 521
umairaftab 14:72176f1e4907 522
umairaftab 9:43c339533f7f 523 //FOR BUZZER
umairaftab 14:72176f1e4907 524
umairaftab 8:2d462919519e 525 keypad_value = Keypad();
umairaftab 17:0ff7385db570 526 wait(0.1);
umairaftab 25:a6d1eaf2041c 527
umairaftab 19:4313ad838fef 528 //lcd_timeout_check();
umairaftab 19:4313ad838fef 529 //process_user_input(keypad_value,ui_current_screen);
umairaftab 25:a6d1eaf2041c 530
umairaftab 36:ce0ca02a8253 531 //Press down arrow to change menu
umairaftab 36:ce0ca02a8253 532 if ( (keypad_value==68) && (ui_current_screen==1) ) {
umairaftab 19:4313ad838fef 533 ui_screen2();
umairaftab 25:a6d1eaf2041c 534 ui_current_screen=2;
umairaftab 22:7a1962d8af68 535 wait(5);
umairaftab 33:d1b04f1a792a 536 lcd.cls();
umairaftab 25:a6d1eaf2041c 537 //led_blue_pulsewidth=led_blue_pulsewidth+100;
umairaftab 25:a6d1eaf2041c 538 //led_blue.pulsewidth_us(led_blue_pulsewidth);
umairaftab 25:a6d1eaf2041c 539 //printf("%c\n\r",keypad_value);
umairaftab 19:4313ad838fef 540 }
umairaftab 36:ce0ca02a8253 541 else if ( (keypad_value==68) && (ui_current_screen==2)) {
umairaftab 19:4313ad838fef 542 ui_screen3();
umairaftab 33:d1b04f1a792a 543 ui_current_screen=3;
umairaftab 22:7a1962d8af68 544 wait(5);
umairaftab 33:d1b04f1a792a 545 lcd.cls();
umairaftab 25:a6d1eaf2041c 546 //printf("%c\n\r",keypad_value);
umairaftab 25:a6d1eaf2041c 547 }
umairaftab 36:ce0ca02a8253 548 else if ( (keypad_value==68) && (ui_current_screen==3)) {
umairaftab 25:a6d1eaf2041c 549 ui_screen4();
umairaftab 25:a6d1eaf2041c 550 ui_current_screen=1;
umairaftab 25:a6d1eaf2041c 551 wait(5);
umairaftab 33:d1b04f1a792a 552 lcd.cls();
umairaftab 25:a6d1eaf2041c 553 //printf("%c\n\r",keypad_value);
umairaftab 25:a6d1eaf2041c 554 }
umairaftab 36:ce0ca02a8253 555 else if ( (keypad_value==75) ) { //Press Enter for settings
umairaftab 25:a6d1eaf2041c 556 ui_settings();
umairaftab 25:a6d1eaf2041c 557 ui_current_screen=1;
umairaftab 33:d1b04f1a792a 558 lcd.cls();
umairaftab 25:a6d1eaf2041c 559 //wait(5);
umairaftab 25:a6d1eaf2041c 560 //printf("%c\n\r",keypad_value);
umairaftab 19:4313ad838fef 561 }
umairaftab 19:4313ad838fef 562 else {
umairaftab 19:4313ad838fef 563 ui_screen1();
umairaftab 25:a6d1eaf2041c 564 wait(0.1);
umairaftab 19:4313ad838fef 565 }
umairaftab 30:417e8ba439ff 566
umairaftab 36:ce0ca02a8253 567 if (keypad_value == 73 ){ //Backlight red up
umairaftab 30:417e8ba439ff 568 lcd_backlight_on();
umairaftab 30:417e8ba439ff 569 }
umairaftab 36:ce0ca02a8253 570 if (keypad_value == 70 ){ //Backlight red down
umairaftab 30:417e8ba439ff 571 lcd_backlight_off();
umairaftab 30:417e8ba439ff 572 }
umairaftab 21:592b7112bbba 573 printf("%d\n\r",keypad_value);
umairaftab 12:b3137bb72ef7 574 // -> Key pressed
umairaftab 11:f9ffd5ab7e94 575
umairaftab 8:2d462919519e 576 }//WHILE END
umairaftab 8:2d462919519e 577
umairaftab 8:2d462919519e 578
umairaftab 8:2d462919519e 579 }
umairaftab 8:2d462919519e 580
umairaftab 8:2d462919519e 581