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 03:34:02 2014 +0000
Revision:
38:9f4107db1bff
Parent:
14:72176f1e4907
Child:
41:f484ea386062
Peltier Functions Updated; DS18B20 Multiple sensors added.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
umairaftab 7:1d691f81d455 1 #include "mbed.h"
umairaftab 7:1d691f81d455 2
umairaftab 7:1d691f81d455 3 #include "TextLCD.h"
umairaftab 38:9f4107db1bff 4 //#include "DS18B20.h"
umairaftab 38:9f4107db1bff 5 #include "peltier.h"
umairaftab 38:9f4107db1bff 6 //----------------------------------
umairaftab 7:1d691f81d455 7 #include "DS18B20.h"
umairaftab 38:9f4107db1bff 8 #include "OneWireDefs.h"
umairaftab 38:9f4107db1bff 9
umairaftab 38:9f4107db1bff 10 #define THERMOMETER DS18B20
umairaftab 38:9f4107db1bff 11
umairaftab 38:9f4107db1bff 12 float temp;
umairaftab 38:9f4107db1bff 13 float dsen_temp_in;
umairaftab 38:9f4107db1bff 14 float dsen_temp_out;
umairaftab 38:9f4107db1bff 15 // device( mbed pin )
umairaftab 38:9f4107db1bff 16 THERMOMETER device(PTE0);
umairaftab 38:9f4107db1bff 17
umairaftab 38:9f4107db1bff 18
umairaftab 38:9f4107db1bff 19 //-----------------------------------
umairaftab 7:1d691f81d455 20 //Serial pc(USBTX, USBRX); // tx, rx
umairaftab 7:1d691f81d455 21
umairaftab 7:1d691f81d455 22 unsigned int peltier_hot_pulsewidth=1000;
umairaftab 7:1d691f81d455 23 unsigned int peltier_cold_pulsewidth=1000;
umairaftab 7:1d691f81d455 24 unsigned int peltier_period =1000;
umairaftab 7:1d691f81d455 25 unsigned int peltier_pulsewidth = 0;
umairaftab 7:1d691f81d455 26 unsigned int peltier_step = 10;
umairaftab 7:1d691f81d455 27
umairaftab 7:1d691f81d455 28 bool alarm_hi_temp_in=false;
umairaftab 7:1d691f81d455 29 bool alarm_lo_temp_in=false;
umairaftab 7:1d691f81d455 30 bool alarm_hi_temp_out=false;
umairaftab 7:1d691f81d455 31 bool alarm_lo_temp_out=false;
umairaftab 7:1d691f81d455 32
umairaftab 7:1d691f81d455 33 //TextLCD lcd(PTE29, PTE30, PTC12, PTD0, PTD5, PTA13, TextLCD::LCD20x2); // rs, e, d4-d7 ok
umairaftab 38:9f4107db1bff 34 //DigitalOut backlight(PTD6);
umairaftab 7:1d691f81d455 35 //unsigned int peltier_hot_pulsewidth=1000;
umairaftab 7:1d691f81d455 36 //unsigned int peltier_cold_pulsewidth=1000;
umairaftab 7:1d691f81d455 37 //unsigned int peltier_period =1000;
umairaftab 7:1d691f81d455 38 //unsigned int peltier_pulsewidth = 0;
umairaftab 7:1d691f81d455 39 //unsigned int peltier_step = 10;
umairaftab 7:1d691f81d455 40 //bool alarm_hi_temp_in=false;
umairaftab 7:1d691f81d455 41 //bool alarm_lo_temp_in=false;
umairaftab 7:1d691f81d455 42 //bool alarm_hi_temp_out=false;
umairaftab 7:1d691f81d455 43 //bool alarm_lo_temp_out=false;
umairaftab 7:1d691f81d455 44 float dsen_temp;
umairaftab 7:1d691f81d455 45
umairaftab 38:9f4107db1bff 46 void readTemp(int deviceNum)
umairaftab 38:9f4107db1bff 47 {
umairaftab 38:9f4107db1bff 48 temp = device.readTemperature(deviceNum);
umairaftab 38:9f4107db1bff 49 // pc.printf("Device %d is %f\n\r",deviceNum, temp);
umairaftab 38:9f4107db1bff 50 wait(0.5);
umairaftab 38:9f4107db1bff 51 }
umairaftab 38:9f4107db1bff 52 void tempinit(void)
umairaftab 38:9f4107db1bff 53 {
umairaftab 38:9f4107db1bff 54 while (!device.initialize()); // keep calling until it works
umairaftab 38:9f4107db1bff 55
umairaftab 38:9f4107db1bff 56 int deviceCount = device.getDeviceCount();
umairaftab 38:9f4107db1bff 57 //printf("Found %d sensors\n\r",deviceCount);
umairaftab 38:9f4107db1bff 58
umairaftab 38:9f4107db1bff 59 device.setResolution(twelveBit);
umairaftab 38:9f4107db1bff 60 }
umairaftab 7:1d691f81d455 61 unsigned int pwm_cold_peltier(int brightness )
umairaftab 7:1d691f81d455 62 {
umairaftab 7:1d691f81d455 63 if (brightness==1) {
umairaftab 7:1d691f81d455 64 peltier_cold_pulsewidth=peltier_cold_pulsewidth+peltier_step;
umairaftab 7:1d691f81d455 65 peltier_cold.pulsewidth_us(peltier_cold_pulsewidth);
umairaftab 7:1d691f81d455 66 };
umairaftab 7:1d691f81d455 67 if (brightness==0) {
umairaftab 7:1d691f81d455 68 peltier_cold_pulsewidth=peltier_cold_pulsewidth-peltier_step;
umairaftab 7:1d691f81d455 69 peltier_cold.pulsewidth_us(peltier_cold_pulsewidth);
umairaftab 7:1d691f81d455 70 };
umairaftab 7:1d691f81d455 71 return peltier_cold_pulsewidth;
umairaftab 7:1d691f81d455 72 }
umairaftab 7:1d691f81d455 73 unsigned int pwm_hot_peltier(int brightness)
umairaftab 7:1d691f81d455 74 {
umairaftab 7:1d691f81d455 75 if (brightness==1) {
umairaftab 7:1d691f81d455 76 peltier_hot_pulsewidth=peltier_hot_pulsewidth+peltier_step;
umairaftab 7:1d691f81d455 77 peltier_hot.pulsewidth_us(peltier_hot_pulsewidth);
umairaftab 7:1d691f81d455 78 }
umairaftab 7:1d691f81d455 79 if (brightness==0) {
umairaftab 7:1d691f81d455 80 peltier_hot_pulsewidth=peltier_hot_pulsewidth-peltier_step;
umairaftab 7:1d691f81d455 81 peltier_hot.pulsewidth_us(peltier_hot_pulsewidth);
umairaftab 7:1d691f81d455 82 }
umairaftab 7:1d691f81d455 83 return peltier_hot_pulsewidth;
umairaftab 7:1d691f81d455 84 }
umairaftab 7:1d691f81d455 85 void peltier(bool fan_in,bool fan_out,bool cold,bool hot,int pwm_procent)
umairaftab 7:1d691f81d455 86 {
umairaftab 38:9f4107db1bff 87 //tempinit();
umairaftab 14:72176f1e4907 88 //sensor.mode(PullUp);
umairaftab 38:9f4107db1bff 89 // readTemp(1);
umairaftab 38:9f4107db1bff 90 // dsen_temp_in=temp;
umairaftab 7:1d691f81d455 91 // ROM_Code_t ROM_Code = ReadROM();
umairaftab 7:1d691f81d455 92 // lcd.setCursor(TextLCD::CurOff_BlkOn);
umairaftab 7:1d691f81d455 93 // lcd.locate(0,0);
umairaftab 7:1d691f81d455 94 // lcd.printf("Family code: 0x%X\n\r", ROM_Code.BYTES.familyCode);
umairaftab 7:1d691f81d455 95 // wait(5.0);
umairaftab 7:1d691f81d455 96
umairaftab 7:1d691f81d455 97 en_drv1=0;//disable
umairaftab 7:1d691f81d455 98 en_drv2=0;//disable
umairaftab 7:1d691f81d455 99 fan_in_peltier=0;//disable
umairaftab 7:1d691f81d455 100 fan_out_peltier=0;//disable
umairaftab 7:1d691f81d455 101
umairaftab 7:1d691f81d455 102
umairaftab 7:1d691f81d455 103 if(fan_in==true) {
umairaftab 7:1d691f81d455 104 fan_in_peltier=1;//enable
umairaftab 7:1d691f81d455 105 }
umairaftab 7:1d691f81d455 106 if(fan_out==true) {
umairaftab 7:1d691f81d455 107 fan_out_peltier=1;//enable
umairaftab 7:1d691f81d455 108 }
umairaftab 7:1d691f81d455 109 if ((cold==true)||(hot==true)) {
umairaftab 7:1d691f81d455 110 en_drv1=1;
umairaftab 7:1d691f81d455 111 en_drv2=1;
umairaftab 7:1d691f81d455 112 }
umairaftab 7:1d691f81d455 113
umairaftab 7:1d691f81d455 114 if ((cold==true)&&(hot==false)) {
umairaftab 7:1d691f81d455 115
umairaftab 7:1d691f81d455 116 peltier_cold.period_us(peltier_period);
umairaftab 7:1d691f81d455 117 peltier_cold_pulsewidth=pwm_procent*10;
umairaftab 7:1d691f81d455 118 peltier_cold.pulsewidth_us(peltier_cold_pulsewidth);
umairaftab 7:1d691f81d455 119 }
umairaftab 7:1d691f81d455 120 if ((hot==true)&&(cold==false)) {
umairaftab 7:1d691f81d455 121
umairaftab 7:1d691f81d455 122 peltier_hot.period_us(peltier_period);
umairaftab 7:1d691f81d455 123 peltier_hot_pulsewidth=pwm_procent*10;
umairaftab 7:1d691f81d455 124 peltier_hot.pulsewidth_us(peltier_hot_pulsewidth);
umairaftab 7:1d691f81d455 125 }
umairaftab 38:9f4107db1bff 126
umairaftab 38:9f4107db1bff 127 readTemp(1);
umairaftab 38:9f4107db1bff 128 dsen_temp_in=temp;
umairaftab 38:9f4107db1bff 129 readTemp(0);
umairaftab 38:9f4107db1bff 130 dsen_temp_out=temp;
umairaftab 38:9f4107db1bff 131 // printf("inside Temp is %2.1fC, outside temp plate is %2.1fC\n\r", dsen_temp_in,dsen_temp_out);
umairaftab 38:9f4107db1bff 132 //lcd.cls();
umairaftab 38:9f4107db1bff 133 // lcd.locate(0,1);
umairaftab 38:9f4107db1bff 134 // lcd.printf("Temp is %2.1fC\n\r", dsen_temp_in);
umairaftab 7:1d691f81d455 135
umairaftab 7:1d691f81d455 136 }
umairaftab 7:1d691f81d455 137 void pel_c(int pwm)
umairaftab 7:1d691f81d455 138 {
umairaftab 7:1d691f81d455 139 peltier_cold.period_us(peltier_period);
umairaftab 7:1d691f81d455 140 peltier_cold_pulsewidth=pwm*10;
umairaftab 7:1d691f81d455 141 peltier_cold.pulsewidth_us(peltier_cold_pulsewidth);
umairaftab 7:1d691f81d455 142
umairaftab 7:1d691f81d455 143 }
umairaftab 7:1d691f81d455 144 void pel_h(int pwm)
umairaftab 7:1d691f81d455 145 {
umairaftab 7:1d691f81d455 146 peltier_hot.period_us(peltier_period);
umairaftab 7:1d691f81d455 147 peltier_hot_pulsewidth=pwm*10;
umairaftab 7:1d691f81d455 148 peltier_hot.pulsewidth_us(peltier_hot_pulsewidth);
umairaftab 7:1d691f81d455 149 }
umairaftab 38:9f4107db1bff 150 void peltier_auto(float degree){
umairaftab 38:9f4107db1bff 151 //tempinit();
umairaftab 38:9f4107db1bff 152
umairaftab 38:9f4107db1bff 153 // backlight=1;
umairaftab 38:9f4107db1bff 154
umairaftab 7:1d691f81d455 155 en_drv1=1;
umairaftab 7:1d691f81d455 156 en_drv2=1;
umairaftab 7:1d691f81d455 157 fan_in_peltier=1;//enable
umairaftab 7:1d691f81d455 158 fan_out_peltier=1;//enable
umairaftab 7:1d691f81d455 159 while(1) {
umairaftab 7:1d691f81d455 160
umairaftab 38:9f4107db1bff 161 readTemp(1);
umairaftab 38:9f4107db1bff 162 dsen_temp_in=temp;
umairaftab 7:1d691f81d455 163
umairaftab 38:9f4107db1bff 164 /* (degree>dsen_temp) {
umairaftab 7:1d691f81d455 165 pel_h(0);
umairaftab 38:9f4107db1bff 166 pel_c(90);
umairaftab 38:9f4107db1bff 167 }*/
umairaftab 38:9f4107db1bff 168 if (degree<dsen_temp_in) {
umairaftab 7:1d691f81d455 169 pel_c(0);
umairaftab 38:9f4107db1bff 170 pel_h(90);
umairaftab 7:1d691f81d455 171
umairaftab 7:1d691f81d455 172 }
umairaftab 38:9f4107db1bff 173 if (degree==dsen_temp_in) {
umairaftab 7:1d691f81d455 174 pel_c(0);
umairaftab 7:1d691f81d455 175 pel_h(0);
umairaftab 7:1d691f81d455 176
umairaftab 7:1d691f81d455 177 }
umairaftab 7:1d691f81d455 178
umairaftab 38:9f4107db1bff 179 //lcd.cls();
umairaftab 38:9f4107db1bff 180 //lcd.locate(0,1);
umairaftab 38:9f4107db1bff 181
umairaftab 38:9f4107db1bff 182 readTemp(1);
umairaftab 38:9f4107db1bff 183 dsen_temp_in=temp;
umairaftab 38:9f4107db1bff 184 readTemp(0);
umairaftab 38:9f4107db1bff 185 dsen_temp_out=temp;
umairaftab 38:9f4107db1bff 186 //pc.printf("Temp is %2.1fC,dsen temp= %2.1f , outchamber plate temp =%2.1fC\n\r", dsen_temp_in,degree,dsen_temp_out);
umairaftab 38:9f4107db1bff 187 // lcd.printf("Temp is %2.1fC\n\r", dsen_temp);
umairaftab 7:1d691f81d455 188
umairaftab 7:1d691f81d455 189
umairaftab 7:1d691f81d455 190
umairaftab 7:1d691f81d455 191 //peltier_hot.period_us(peltier_period);
umairaftab 7:1d691f81d455 192 //peltier_hot_pulsewidth=1000;//at 50%
umairaftab 7:1d691f81d455 193 //pwm_hot_peltier(1);
umairaftab 7:1d691f81d455 194 // wait(1.0);
umairaftab 7:1d691f81d455 195
umairaftab 7:1d691f81d455 196
umairaftab 7:1d691f81d455 197
umairaftab 7:1d691f81d455 198 /* peltier_cold.period_us(peltier_period);
umairaftab 7:1d691f81d455 199 peltier_cold_pulsewidth=peltier_pulsewidth;
umairaftab 7:1d691f81d455 200 for (int i=1; i<=100; i++) {
umairaftab 7:1d691f81d455 201 pwm_cold_peltier(1);
umairaftab 7:1d691f81d455 202 wait (0.1);
umairaftab 7:1d691f81d455 203 }
umairaftab 7:1d691f81d455 204 for (int i=1; i<=100; i++) {
umairaftab 7:1d691f81d455 205 pwm_cold_peltier(0);
umairaftab 7:1d691f81d455 206 wait (0.1);
umairaftab 7:1d691f81d455 207 }
umairaftab 7:1d691f81d455 208 peltier_cold_pulsewidth=10; // set to 0
umairaftab 7:1d691f81d455 209 pwm_cold_peltier(0); // set to 0
umairaftab 7:1d691f81d455 210
umairaftab 7:1d691f81d455 211 peltier_hot.period_us(peltier_period);
umairaftab 7:1d691f81d455 212 peltier_hot_pulsewidth=peltier_pulsewidth;
umairaftab 7:1d691f81d455 213 for (int i=1; i<=100; i++) {
umairaftab 7:1d691f81d455 214 pwm_hot_peltier(1);
umairaftab 7:1d691f81d455 215 wait (0.1);
umairaftab 7:1d691f81d455 216 }
umairaftab 7:1d691f81d455 217 for (int i=1; i<=100; i++) {
umairaftab 7:1d691f81d455 218 pwm_hot_peltier(0);
umairaftab 7:1d691f81d455 219 wait (0.1);
umairaftab 7:1d691f81d455 220 }
umairaftab 7:1d691f81d455 221 peltier_hot_pulsewidth=10; // set to 0
umairaftab 7:1d691f81d455 222 pwm_hot_peltier(0); // set to 0
umairaftab 7:1d691f81d455 223 */
umairaftab 7:1d691f81d455 224 }
umairaftab 7:1d691f81d455 225
umairaftab 7:1d691f81d455 226 }