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:
Sat Apr 12 06:35:04 2014 +0000
Revision:
11:f9ffd5ab7e94
Parent:
10:1a0fe96381b0
Child:
12:b3137bb72ef7
Fixed type error in soil humidity.cpp ;

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 8:2d462919519e 29 //SERIAL
umairaftab 8:2d462919519e 30 Serial bluetooth(PTA2, PTA1); // tx, rx
umairaftab 8:2d462919519e 31 Serial printer(PTC4,PTC3); // tx, rx
umairaftab 8:2d462919519e 32 //TICKERS
umairaftab 1:9ef26efedcea 33 Ticker timer1ms;
umairaftab 8:2d462919519e 34 Ticker clock_mine;
umairaftab 11:f9ffd5ab7e94 35 Timer lcd_timeout;
umairaftab 8:2d462919519e 36 //FLAGS
umairaftab 8:2d462919519e 37 bool startup_flag=true;
umairaftab 9:43c339533f7f 38 bool watered_plant1 = false;
umairaftab 9:43c339533f7f 39 int watered_plant1_time = 0;
umairaftab 9:43c339533f7f 40 bool watered_plant2 = false;
umairaftab 9:43c339533f7f 41 int watered_plant2_time = 0;
umairaftab 8:2d462919519e 42
umairaftab 8:2d462919519e 43 //SETPOINTS
umairaftab 8:2d462919519e 44 float setpoint_air_humidity = 30.00 ;
umairaftab 8:2d462919519e 45 float setpoint_soil_humid1 = 0.3 ;
umairaftab 8:2d462919519e 46 float setpoint_soil_humid2 = 0.3 ;
umairaftab 8:2d462919519e 47
umairaftab 11:f9ffd5ab7e94 48 int setpoint_red_lights;
umairaftab 11:f9ffd5ab7e94 49 int setpoint_blue_lights;
umairaftab 11:f9ffd5ab7e94 50 int setpoint_green_lights;
umairaftab 8:2d462919519e 51 //WINDOWING
umairaftab 9:43c339533f7f 52 float window_f = 5 ;
umairaftab 8:2d462919519e 53 int window_i =2 ;
umairaftab 8:2d462919519e 54
umairaftab 8:2d462919519e 55 //GLOBAL VARS
umairaftab 8:2d462919519e 56 float current_water_level = 0;
umairaftab 11:f9ffd5ab7e94 57 bool screen_timeout=false;
umairaftab 8:2d462919519e 58 //SAFETY LIMITS
umairaftab 8:2d462919519e 59 const float max_peltier_temp = 68 ; //CELCIUS
umairaftab 9:43c339533f7f 60 const int MAX_WATERING_TIME_GAP = 20;
umairaftab 9:43c339533f7f 61 const int CYCLE_AIR_TIME = 2;
umairaftab 8:2d462919519e 62 //**************************FUNCTION TO READ SENSORS **********************************************
umairaftab 8:2d462919519e 63 void read_sensors(){
umairaftab 8:2d462919519e 64
umairaftab 8:2d462919519e 65 //Read values for AIR
umairaftab 8:2d462919519e 66
umairaftab 8:2d462919519e 67 //OUTSIDE
umairaftab 8:2d462919519e 68 outside_humidity = get_air_humid_outside();
umairaftab 8:2d462919519e 69 outside_temp = get_air_temp_outside(temp_unit);
umairaftab 8:2d462919519e 70 outside_dewpoint = get_air_dewpoint_outside();
umairaftab 8:2d462919519e 71
umairaftab 8:2d462919519e 72 //INSIDE
umairaftab 8:2d462919519e 73 inside_humidity = get_air_humid_inside();
umairaftab 8:2d462919519e 74 inside_temp = get_air_temp_inside(temp_unit);
umairaftab 8:2d462919519e 75 inside_dewpoint = get_air_dewpoint_inside();
umairaftab 8:2d462919519e 76
umairaftab 8:2d462919519e 77 //Read value for soil
umairaftab 8:2d462919519e 78 read_soil_humidity();
umairaftab 8:2d462919519e 79 calc_soil_humid_values(); //values in soil1_humid and soil2_humid perecentages
umairaftab 11:f9ffd5ab7e94 80 soil1_humidity = soil1_humid ;
umairaftab 11:f9ffd5ab7e94 81 soil2_humidity = soil2_humid ;
umairaftab 11:f9ffd5ab7e94 82 printf("%4.2f \n\r",soil1_humidity);
umairaftab 8:2d462919519e 83 }
umairaftab 8:2d462919519e 84
umairaftab 8:2d462919519e 85 //****************************Functions that perform tasks**************************************
umairaftab 9:43c339533f7f 86 //Water Plants
umairaftab 8:2d462919519e 87 void waterplants(){
umairaftab 8:2d462919519e 88
umairaftab 8:2d462919519e 89
umairaftab 9:43c339533f7f 90 if(startup_flag == true){
umairaftab 9:43c339533f7f 91 //call for pump function
umairaftab 9:43c339533f7f 92 watered_plant1 = true;
umairaftab 9:43c339533f7f 93 watered_plant1_time = hour ;
umairaftab 9:43c339533f7f 94 watered_plant2 = true;
umairaftab 9:43c339533f7f 95 watered_plant2_time = hour ;
umairaftab 9:43c339533f7f 96 }
umairaftab 9:43c339533f7f 97 else{
umairaftab 9:43c339533f7f 98
umairaftab 10:1a0fe96381b0 99 if( (soil1_humid < setpoint_soil_humid1) || (watered_plant1 == false) ){
umairaftab 9:43c339533f7f 100 //enable pump1
umairaftab 9:43c339533f7f 101 watered_plant1 = true;
umairaftab 9:43c339533f7f 102 watered_plant1_time = hour ;
umairaftab 9:43c339533f7f 103 }
umairaftab 10:1a0fe96381b0 104 if( (soil2_humid < setpoint_soil_humid2) || (watered_plant2 == false) ){
umairaftab 9:43c339533f7f 105 //enable pump2
umairaftab 9:43c339533f7f 106 watered_plant2 = true;
umairaftab 9:43c339533f7f 107 watered_plant2_time = hour ;
umairaftab 9:43c339533f7f 108 }
umairaftab 9:43c339533f7f 109 }
umairaftab 10:1a0fe96381b0 110 //Make sure it is watered at least every x hours in case soil humid doesnt work
umairaftab 9:43c339533f7f 111 if (watered_plant1 == true){
umairaftab 9:43c339533f7f 112 if(abs(hour-watered_plant1_time)>MAX_WATERING_TIME_GAP){
umairaftab 9:43c339533f7f 113 watered_plant1 = false;
umairaftab 9:43c339533f7f 114 }
umairaftab 9:43c339533f7f 115 }
umairaftab 9:43c339533f7f 116 if (watered_plant2 == true){
umairaftab 9:43c339533f7f 117 if(abs(hour-watered_plant2_time)>MAX_WATERING_TIME_GAP){
umairaftab 9:43c339533f7f 118 watered_plant2 = false;
umairaftab 9:43c339533f7f 119 }
umairaftab 9:43c339533f7f 120 }
umairaftab 9:43c339533f7f 121
umairaftab 9:43c339533f7f 122 }
umairaftab 9:43c339533f7f 123
umairaftab 9:43c339533f7f 124 // Air Humidity Level
umairaftab 9:43c339533f7f 125 void airhumidity(){
umairaftab 9:43c339533f7f 126
umairaftab 11:f9ffd5ab7e94 127 if( !( (setpoint_air_humidity+window_f > inside_humidity) && (setpoint_air_humidity-window_f < inside_humidity) ) ){
umairaftab 9:43c339533f7f 128
umairaftab 9:43c339533f7f 129 //Turn on Air humidity fan
umairaftab 9:43c339533f7f 130 wait(5);
umairaftab 9:43c339533f7f 131 //Turn off Air humisity fan
umairaftab 9:43c339533f7f 132 }
umairaftab 9:43c339533f7f 133 }
umairaftab 9:43c339533f7f 134
umairaftab 9:43c339533f7f 135 //CYCLE AIR
umairaftab 9:43c339533f7f 136 void cycleair(){
umairaftab 9:43c339533f7f 137
umairaftab 9:43c339533f7f 138 //Turn on fan
umairaftab 9:43c339533f7f 139 wait(CYCLE_AIR_TIME);
umairaftab 9:43c339533f7f 140 //turn of fan
umairaftab 8:2d462919519e 141
umairaftab 8:2d462919519e 142 }
umairaftab 8:2d462919519e 143 //***************************PLACEHOLDER FUNCTION TO DISABLE EVERYTHING **********************
umairaftab 8:2d462919519e 144 void disable_everything(){
umairaftab 8:2d462919519e 145
umairaftab 10:1a0fe96381b0 146 //Disable peltier,vac,fans,pumps,lights.
umairaftab 8:2d462919519e 147
umairaftab 8:2d462919519e 148 }
umairaftab 8:2d462919519e 149
umairaftab 8:2d462919519e 150
umairaftab 8:2d462919519e 151 //*********************************************************************************************
umairaftab 8:2d462919519e 152 //* *
umairaftab 8:2d462919519e 153 //* *
umairaftab 8:2d462919519e 154 //* *
umairaftab 8:2d462919519e 155 //* *
umairaftab 8:2d462919519e 156 //* MAIN ROUTINE *
umairaftab 8:2d462919519e 157 //* *
umairaftab 8:2d462919519e 158 //* DO NOT MODIFY WITHOUT TELLING UMAIR *
umairaftab 8:2d462919519e 159 //* *
umairaftab 8:2d462919519e 160 //* *
umairaftab 8:2d462919519e 161 //*********************************************************************************************
umairaftab 1:9ef26efedcea 162
umairaftab 1:9ef26efedcea 163 int main(void)
umairaftab 1:9ef26efedcea 164 {
umairaftab 8:2d462919519e 165
umairaftab 8:2d462919519e 166 //call function that disables everything.
umairaftab 8:2d462919519e 167 disable_everything();
umairaftab 8:2d462919519e 168
umairaftab 8:2d462919519e 169
umairaftab 9:43c339533f7f 170
umairaftab 8:2d462919519e 171 //FOR INTERNAL CLOCK
umairaftab 8:2d462919519e 172 clock_mine.attach(&sec_inc, 1.0);
umairaftab 8:2d462919519e 173 char keypad_value;
umairaftab 11:f9ffd5ab7e94 174 int ui_current_screen = 1;
umairaftab 10:1a0fe96381b0 175 //************************************BOOT SEQUENCE*********************
umairaftab 8:2d462919519e 176 //call LCD boot
umairaftab 8:2d462919519e 177 ui_startup();
umairaftab 9:43c339533f7f 178 wait(2);
umairaftab 8:2d462919519e 179 //SET TIME
umairaftab 8:2d462919519e 180 rtcimp_settime(6,0);
umairaftab 8:2d462919519e 181 //call function that reads values
umairaftab 9:43c339533f7f 182
umairaftab 9:43c339533f7f 183 /* FOR CRTITICALITY
umairaftab 9:43c339533f7f 184 NVIC_DisableIRQ(TIMER3_IRQn);
umairaftab 9:43c339533f7f 185
umairaftab 9:43c339533f7f 186 // critical section
umairaftab 9:43c339533f7f 187
umairaftab 9:43c339533f7f 188 NVIC_EnableIRQ(TIMER3_IRQn);
umairaftab 9:43c339533f7f 189 */
umairaftab 9:43c339533f7f 190 lcd.cls();
umairaftab 9:43c339533f7f 191 lcd.locate(0,0);
umairaftab 9:43c339533f7f 192 lcd.printf("Reading Sensors");
umairaftab 9:43c339533f7f 193
umairaftab 8:2d462919519e 194 read_sensors();
umairaftab 8:2d462919519e 195
umairaftab 9:43c339533f7f 196 wait(2);
umairaftab 9:43c339533f7f 197 lcd.cls();
umairaftab 9:43c339533f7f 198 lcd.locate(0,0);
umairaftab 9:43c339533f7f 199 lcd.printf("Done Reading Sensors");
umairaftab 8:2d462919519e 200 //call function that performs functions.
umairaftab 8:2d462919519e 201
umairaftab 9:43c339533f7f 202 wait(2);
umairaftab 9:43c339533f7f 203 lcd.cls();
umairaftab 9:43c339533f7f 204 lcd.locate(0,0);
umairaftab 9:43c339533f7f 205 lcd.printf("Watering Plants");
umairaftab 9:43c339533f7f 206
umairaftab 9:43c339533f7f 207 waterplants();
umairaftab 9:43c339533f7f 208
umairaftab 9:43c339533f7f 209 wait(2);
umairaftab 9:43c339533f7f 210 lcd.cls();
umairaftab 9:43c339533f7f 211 lcd.locate(0,0);
umairaftab 9:43c339533f7f 212 lcd.printf("Air Humidity");
umairaftab 9:43c339533f7f 213
umairaftab 9:43c339533f7f 214 airhumidity();
umairaftab 9:43c339533f7f 215
umairaftab 9:43c339533f7f 216 wait(2);
umairaftab 9:43c339533f7f 217 lcd.cls();
umairaftab 9:43c339533f7f 218 lcd.locate(0,0);
umairaftab 9:43c339533f7f 219 lcd.printf("Cycling Air");
umairaftab 9:43c339533f7f 220
umairaftab 9:43c339533f7f 221 cycleair();
umairaftab 9:43c339533f7f 222
umairaftab 11:f9ffd5ab7e94 223 wait(2);
umairaftab 11:f9ffd5ab7e94 224 lcd.cls();
umairaftab 11:f9ffd5ab7e94 225 lcd.locate(0,0);
umairaftab 11:f9ffd5ab7e94 226 lcd.printf("Testing Lights");
umairaftab 11:f9ffd5ab7e94 227 //led_test();
umairaftab 11:f9ffd5ab7e94 228
umairaftab 11:f9ffd5ab7e94 229
umairaftab 9:43c339533f7f 230 wait(5);
umairaftab 9:43c339533f7f 231 ui_screen1();
umairaftab 9:43c339533f7f 232 wait(5);
umairaftab 8:2d462919519e 233
umairaftab 8:2d462919519e 234 startup_flag = false ;
umairaftab 1:9ef26efedcea 235 while(1) {
umairaftab 8:2d462919519e 236
umairaftab 8:2d462919519e 237 wait(1.5);
umairaftab 9:43c339533f7f 238 //FOR BUZZER
umairaftab 9:43c339533f7f 239 timer1ms.attach(&timer1, 0.001); //interrupt attached function(timer) with interval (1 ms)
umairaftab 8:2d462919519e 240 keypad_value = Keypad();
umairaftab 11:f9ffd5ab7e94 241 //timer1ms.detach();
umairaftab 11:f9ffd5ab7e94 242
umairaftab 11:f9ffd5ab7e94 243
umairaftab 8:2d462919519e 244 }//WHILE END
umairaftab 8:2d462919519e 245
umairaftab 8:2d462919519e 246
umairaftab 8:2d462919519e 247 }
umairaftab 8:2d462919519e 248
umairaftab 8:2d462919519e 249