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:
Mon Apr 14 00:52:14 2014 +0000
Revision:
37:892872c3fa96
Parent:
36:ce0ca02a8253
Child:
38:9f4107db1bff
All functions enbaled Dry run pass.

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