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:
Fri Apr 11 12:49:30 2014 +0000
Revision:
9:43c339533f7f
Parent:
8:2d462919519e
Child:
10:1a0fe96381b0
Dry Run -> Working

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