See: https://github.com/EEEManchester/Food-Computer
Dependencies: DHT DS1820 MODSERIAL ModbusSlave232 SoftSerial TSL2561_I2C mbed millis
Fork of ModbusRTU-RS232 by
main.cpp@7:bd9f91d2698f, 2016-08-11 (annotated)
- Committer:
- AfdhalAtiffTan
- Date:
- Thu Aug 11 13:50:38 2016 +0000
- Revision:
- 7:bd9f91d2698f
- Parent:
- 5:4503f4d054ba
Got light sensor working.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AfdhalAtiffTan | 1:77e7cf856fae | 1 | #include "includes.h" |
AfdhalAtiffTan | 0:74eb078d4846 | 2 | |
AfdhalAtiffTan | 1:77e7cf856fae | 3 | float get_EC(float temperature); |
AfdhalAtiffTan | 1:77e7cf856fae | 4 | float get_pH(); |
AfdhalAtiffTan | 0:74eb078d4846 | 5 | |
AfdhalAtiffTan | 1:77e7cf856fae | 6 | void update_modbus() //check for request and update relays |
AfdhalAtiffTan | 1:77e7cf856fae | 7 | { |
AfdhalAtiffTan | 1:77e7cf856fae | 8 | led1 = !led1; //for debug |
AfdhalAtiffTan | 4:796586b35695 | 9 | if (mbs.update(regs, MB_REGS)) |
AfdhalAtiffTan | 4:796586b35695 | 10 | {led3 = !led3;} |
AfdhalAtiffTan | 0:74eb078d4846 | 11 | |
AfdhalAtiffTan | 1:77e7cf856fae | 12 | R0 = (regs[MB_9] & (0x0001<<0)); |
AfdhalAtiffTan | 1:77e7cf856fae | 13 | R1 = (regs[MB_9] & (0x0001<<1)); |
AfdhalAtiffTan | 1:77e7cf856fae | 14 | R2 = (regs[MB_9] & (0x0001<<2)); |
AfdhalAtiffTan | 1:77e7cf856fae | 15 | R3 = (regs[MB_9] & (0x0001<<3)); |
AfdhalAtiffTan | 1:77e7cf856fae | 16 | R4 = (regs[MB_9] & (0x0001<<4)); |
AfdhalAtiffTan | 1:77e7cf856fae | 17 | R5 = (regs[MB_9] & (0x0001<<5)); |
AfdhalAtiffTan | 1:77e7cf856fae | 18 | R6 = (regs[MB_9] & (0x0001<<6)); |
AfdhalAtiffTan | 1:77e7cf856fae | 19 | R7 = (regs[MB_9] & (0x0001<<7)); |
AfdhalAtiffTan | 0:74eb078d4846 | 20 | } |
AfdhalAtiffTan | 0:74eb078d4846 | 21 | |
AfdhalAtiffTan | 0:74eb078d4846 | 22 | int main() |
AfdhalAtiffTan | 5:4503f4d054ba | 23 | { |
AfdhalAtiffTan | 5:4503f4d054ba | 24 | //force all relay off |
AfdhalAtiffTan | 5:4503f4d054ba | 25 | R0 = 1; R1 = 1; R2 = 1; R3 = 1; R4 = 1; R5 = 1; R6 = 1; R7 = 1; |
AfdhalAtiffTan | 5:4503f4d054ba | 26 | regs[MB_9] = 0xFFFF; |
AfdhalAtiffTan | 5:4503f4d054ba | 27 | |
AfdhalAtiffTan | 0:74eb078d4846 | 28 | startMillis(); // milliseconds (arduino like) |
AfdhalAtiffTan | 1:77e7cf856fae | 29 | mbs.configure(SLAVE, BAUD, PARITY); |
AfdhalAtiffTan | 1:77e7cf856fae | 30 | |
AfdhalAtiffTan | 1:77e7cf856fae | 31 | CO2sensor.baud(9600); |
AfdhalAtiffTan | 1:77e7cf856fae | 32 | CO2sensor.printf("\nK 2\r\n"); //set the sensor into polling mode |
AfdhalAtiffTan | 5:4503f4d054ba | 33 | CO2sensor.scanf(" %[^\n]", &co2string); //dummy - blocking call |
AfdhalAtiffTan | 1:77e7cf856fae | 34 | |
AfdhalAtiffTan | 1:77e7cf856fae | 35 | lux_sensor.enablePower(); |
AfdhalAtiffTan | 1:77e7cf856fae | 36 | window_switch.mode(PullUp); |
AfdhalAtiffTan | 1:77e7cf856fae | 37 | shell_switch.mode(PullUp); |
AfdhalAtiffTan | 1:77e7cf856fae | 38 | |
AfdhalAtiffTan | 1:77e7cf856fae | 39 | modbus_updater.attach(&update_modbus, 0.1); //visit modbus every 100ms |
AfdhalAtiffTan | 0:74eb078d4846 | 40 | |
AfdhalAtiffTan | 1:77e7cf856fae | 41 | while (true) //main thread (updates sensors' status) |
AfdhalAtiffTan | 1:77e7cf856fae | 42 | { |
AfdhalAtiffTan | 1:77e7cf856fae | 43 | led2 = !led2; //for debug |
AfdhalAtiffTan | 1:77e7cf856fae | 44 | |
AfdhalAtiffTan | 1:77e7cf856fae | 45 | dht22.readData(); |
AfdhalAtiffTan | 5:4503f4d054ba | 46 | water_temp.convertTemperature(true, DS1820::all_devices); //Start temperature conversion, wait until ready |
AfdhalAtiffTan | 5:4503f4d054ba | 47 | water_temperature = water_temp.temperature(); |
AfdhalAtiffTan | 1:77e7cf856fae | 48 | |
AfdhalAtiffTan | 1:77e7cf856fae | 49 | CO2sensor.printf("Z\r\n"); //request CO2 reading |
AfdhalAtiffTan | 1:77e7cf856fae | 50 | //see: http://stackoverflow.com/questions/16447759/scanf-inside-while-loop-working-only-one-time |
AfdhalAtiffTan | 1:77e7cf856fae | 51 | CO2sensor.scanf(" %[^\n]", &co2string); //store it in a buffer (blocking call) |
AfdhalAtiffTan | 1:77e7cf856fae | 52 | sscanf(co2string, "%*c %d", &CO2_PPM); |
AfdhalAtiffTan | 1:77e7cf856fae | 53 | |
AfdhalAtiffTan | 1:77e7cf856fae | 54 | regs[MB_0] = CO2_PPM; //air_co2 |
AfdhalAtiffTan | 5:4503f4d054ba | 55 | regs[MB_1]= (int)(100.0f*dht22.ReadHumidity()); //air_humidity |
AfdhalAtiffTan | 5:4503f4d054ba | 56 | regs[MB_2]= (int)(100.0f*dht22.ReadTemperature(CELCIUS)); //air_temp |
AfdhalAtiffTan | 5:4503f4d054ba | 57 | regs[MB_3] = (int)(100.0f*water_temperature);//water_temp in celcius |
AfdhalAtiffTan | 5:4503f4d054ba | 58 | regs[MB_4] = (int)(100.0f*get_EC(water_temperature)); //water_ec |
AfdhalAtiffTan | 5:4503f4d054ba | 59 | regs[MB_5] = (int)(100.0f*get_pH()); //water_ph |
AfdhalAtiffTan | 7:bd9f91d2698f | 60 | regs[MB_6] = lux_sensor.getVisibleAndIR(); //light_lux |
AfdhalAtiffTan | 1:77e7cf856fae | 61 | regs[MB_7]= window_switch.read(); //window_switch |
AfdhalAtiffTan | 1:77e7cf856fae | 62 | regs[MB_8] = shell_switch.read(); //shell_switch |
AfdhalAtiffTan | 1:77e7cf856fae | 63 | } |
AfdhalAtiffTan | 1:77e7cf856fae | 64 | } |
AfdhalAtiffTan | 0:74eb078d4846 | 65 | |
AfdhalAtiffTan | 1:77e7cf856fae | 66 | //For water pH level. Taken from http://www.dfrobot.com/wiki/index.php?title=PH_meter(SKU:_SEN0161) |
AfdhalAtiffTan | 1:77e7cf856fae | 67 | float get_pH() |
AfdhalAtiffTan | 1:77e7cf856fae | 68 | { |
AfdhalAtiffTan | 1:77e7cf856fae | 69 | float avgValue_; //Store the average value of the sensor feedback |
AfdhalAtiffTan | 1:77e7cf856fae | 70 | float buf_[10],temp_; |
AfdhalAtiffTan | 1:77e7cf856fae | 71 | float phValue_; |
AfdhalAtiffTan | 0:74eb078d4846 | 72 | |
AfdhalAtiffTan | 1:77e7cf856fae | 73 | for(int i=0;i<10;i++) //Get 10 sample value from the sensor for smooth the value |
AfdhalAtiffTan | 1:77e7cf856fae | 74 | { |
AfdhalAtiffTan | 1:77e7cf856fae | 75 | buf_[i]=water_pH.read(); |
AfdhalAtiffTan | 1:77e7cf856fae | 76 | wait_ms(10); |
AfdhalAtiffTan | 1:77e7cf856fae | 77 | } |
AfdhalAtiffTan | 1:77e7cf856fae | 78 | for(int i=0;i<9;i++) //sort the analog from small to large |
AfdhalAtiffTan | 1:77e7cf856fae | 79 | { |
AfdhalAtiffTan | 1:77e7cf856fae | 80 | for(int j=i+1;j<10;j++) |
AfdhalAtiffTan | 1:77e7cf856fae | 81 | { |
AfdhalAtiffTan | 1:77e7cf856fae | 82 | if(buf_[i]>buf_[j]) |
AfdhalAtiffTan | 1:77e7cf856fae | 83 | { |
AfdhalAtiffTan | 1:77e7cf856fae | 84 | temp_=buf_[i]; |
AfdhalAtiffTan | 1:77e7cf856fae | 85 | buf_[i]=buf_[j]; |
AfdhalAtiffTan | 1:77e7cf856fae | 86 | buf_[j]=temp_; |
AfdhalAtiffTan | 1:77e7cf856fae | 87 | } |
AfdhalAtiffTan | 1:77e7cf856fae | 88 | } |
AfdhalAtiffTan | 1:77e7cf856fae | 89 | } |
AfdhalAtiffTan | 1:77e7cf856fae | 90 | avgValue_ = 0.0f; |
AfdhalAtiffTan | 1:77e7cf856fae | 91 | for(int i=2;i<8;i++) //take the average value of 6 center sample |
AfdhalAtiffTan | 1:77e7cf856fae | 92 | avgValue_ += buf_[i]; |
AfdhalAtiffTan | 0:74eb078d4846 | 93 | |
AfdhalAtiffTan | 1:77e7cf856fae | 94 | phValue_= avgValue_*5.0f/6.0f; //convert the analog into millivolt |
AfdhalAtiffTan | 1:77e7cf856fae | 95 | return 3.5f*phValue_; |
AfdhalAtiffTan | 1:77e7cf856fae | 96 | } |
AfdhalAtiffTan | 1:77e7cf856fae | 97 | |
AfdhalAtiffTan | 1:77e7cf856fae | 98 | |
AfdhalAtiffTan | 1:77e7cf856fae | 99 | //Water Electrical Conductivity Sensor. Taken from http://www.dfrobot.com/wiki/index.php/Analog_EC_Meter_SKU:DFR0300 |
AfdhalAtiffTan | 1:77e7cf856fae | 100 | float get_EC(float temperature) |
AfdhalAtiffTan | 1:77e7cf856fae | 101 | { |
AfdhalAtiffTan | 1:77e7cf856fae | 102 | float avgValue_; //Store the average value of the sensor feedback |
AfdhalAtiffTan | 1:77e7cf856fae | 103 | float buf_[10], temp_; |
AfdhalAtiffTan | 1:77e7cf856fae | 104 | float ECcurrent_; |
AfdhalAtiffTan | 1:77e7cf856fae | 105 | |
AfdhalAtiffTan | 1:77e7cf856fae | 106 | for(int i=0;i<10;i++) //Get 10 sample value from the sensor for smooth the value |
AfdhalAtiffTan | 1:77e7cf856fae | 107 | { |
AfdhalAtiffTan | 1:77e7cf856fae | 108 | buf_[i]=water_EC.read(); |
AfdhalAtiffTan | 1:77e7cf856fae | 109 | wait_ms(10); |
AfdhalAtiffTan | 1:77e7cf856fae | 110 | } |
AfdhalAtiffTan | 1:77e7cf856fae | 111 | |
AfdhalAtiffTan | 1:77e7cf856fae | 112 | for(int i=0;i<9;i++) //sort the analog from small to large |
AfdhalAtiffTan | 1:77e7cf856fae | 113 | { |
AfdhalAtiffTan | 1:77e7cf856fae | 114 | for(int j=i+1;j<10;j++) |
AfdhalAtiffTan | 1:77e7cf856fae | 115 | { |
AfdhalAtiffTan | 1:77e7cf856fae | 116 | if(buf_[i]>buf_[j]) |
AfdhalAtiffTan | 1:77e7cf856fae | 117 | { |
AfdhalAtiffTan | 1:77e7cf856fae | 118 | temp_=buf_[i]; |
AfdhalAtiffTan | 1:77e7cf856fae | 119 | buf_[i]=buf_[j]; |
AfdhalAtiffTan | 1:77e7cf856fae | 120 | buf_[j]=temp_; |
AfdhalAtiffTan | 1:77e7cf856fae | 121 | } |
AfdhalAtiffTan | 0:74eb078d4846 | 122 | } |
AfdhalAtiffTan | 1:77e7cf856fae | 123 | } |
AfdhalAtiffTan | 1:77e7cf856fae | 124 | |
AfdhalAtiffTan | 1:77e7cf856fae | 125 | avgValue_ = 0.0f; for(int i=2;i<8;i++) {avgValue_ += buf_[i];} //take the average value of 6 center sample (don't forget to divide!) |
AfdhalAtiffTan | 1:77e7cf856fae | 126 | |
AfdhalAtiffTan | 1:77e7cf856fae | 127 | float averageVoltage = avgValue_ * 5000.0f / 6.0f; //divide by 6 because to get average value |
AfdhalAtiffTan | 1:77e7cf856fae | 128 | float TempCoefficient_ = 1.0f + 0.0185f*(temperature - 25.0f); //temperature compensation formula: fFinalResult(25^C) = fFinalResult(current)/(1.0+0.0185*(fTP-25.0)); |
AfdhalAtiffTan | 1:77e7cf856fae | 129 | float CoefficientVoltage_ = averageVoltage / TempCoefficient_; |
AfdhalAtiffTan | 1:77e7cf856fae | 130 | |
AfdhalAtiffTan | 1:77e7cf856fae | 131 | if (CoefficientVoltage_ <= 448.0f) {ECcurrent_ = 6.84f*CoefficientVoltage_ - 64.320f;} //1ms/cm<EC<=3ms/cm |
AfdhalAtiffTan | 1:77e7cf856fae | 132 | else if (CoefficientVoltage_ <= 1457.0f) {ECcurrent_ = 6.98f*CoefficientVoltage_ - 127.00f;} //3ms/cm<EC<=10ms/cm |
AfdhalAtiffTan | 1:77e7cf856fae | 133 | else {ECcurrent_ = 5.30f*CoefficientVoltage_ + 2278.0f;} //10ms/cm<EC<20ms/cm |
AfdhalAtiffTan | 1:77e7cf856fae | 134 | |
AfdhalAtiffTan | 1:77e7cf856fae | 135 | return ECcurrent_/=1000.0f; //convert us/cm to ms/cm |
AfdhalAtiffTan | 0:74eb078d4846 | 136 | } |