Duy tran / Mbed OS iot_water_monitor_v2

Dependencies:   easy-connect-v16 Watchdog FP MQTTPacket RecordType-v-16 watersenor_and_temp_code

Committer:
DuyLionTran
Date:
Tue Feb 27 14:51:18 2018 +0000
Revision:
40:4356c209c58d
Parent:
39:a5ee98bd0050
Child:
41:6aed398adcc4
* version 2.6.8 	02-27-2017: developing DO calibration. DS18B20 temperature sensor is added

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DuyLionTran 34:601effb7b7fe 1 /**
DuyLionTran 34:601effb7b7fe 2 * Revision
DuyLionTran 34:601effb7b7fe 3 * version 1.0
DuyLionTran 34:601effb7b7fe 4 * ....
DuyLionTran 36:d0b628087ac8 5 * version 2.5 02-14-2017: 3rd relay and remote time setting are added
DuyLionTran 36:d0b628087ac8 6 * version 2.6 02-14-2017: DO Sensor added, calibration is still on the way
DuyLionTran 38:64e3e9acb49c 7 * version 2.6.3 02-19-2017: developing calibration. the average voltage is ok
DuyLionTran 39:a5ee98bd0050 8 * version 2.6.5 02-21-2017: developing calibration. Sensor read is completely ok
DuyLionTran 40:4356c209c58d 9 * version 2.6.8 02-27-2017: developing DO calibration. DS18B20 temperature sensor is added
DuyLionTran 34:601effb7b7fe 10 */
DuyLionTran 32:8226837c56ae 11
DuyLionTran 32:8226837c56ae 12 /***************************************************************
DuyLionTran 32:8226837c56ae 13 * Includes
DuyLionTran 32:8226837c56ae 14 ***************************************************************/
DuyLionTran 32:8226837c56ae 15 #include "mbed.h"
DuyLionTran 32:8226837c56ae 16
DuyLionTran 32:8226837c56ae 17 #include "ReadSensor.h"
DuyLionTran 32:8226837c56ae 18 #include "SimpleMQTT.h"
DuyLionTran 33:5b90257d2d57 19 #include "CommandExecution.h"
DuyLionTran 32:8226837c56ae 20 #include "flash_programming.h"
DuyLionTran 32:8226837c56ae 21
DuyLionTran 32:8226837c56ae 22 /***************************************************************
DuyLionTran 32:8226837c56ae 23 * Definitions
DuyLionTran 32:8226837c56ae 24 ***************************************************************/
DuyLionTran 33:5b90257d2d57 25 #define READ_SECOND 1 /* Read timer every 1 second(s) */
DuyLionTran 33:5b90257d2d57 26 #define INTERVAL_BETWEEN_EACH_UPLOAD_TYPE 5 /* The interval between each upload type in second */
DuyLionTran 33:5b90257d2d57 27 #define RECONNECT_WIFI 60 /* Try to reconnect to wifi */
DuyLionTran 32:8226837c56ae 28
DuyLionTran 36:d0b628087ac8 29 #define READ_ANALOG_MS 30
DuyLionTran 36:d0b628087ac8 30 #define PROCESS_DO_VALUE_S 1
DuyLionTran 32:8226837c56ae 31 /***************************************************************
DuyLionTran 32:8226837c56ae 32 * Variables
DuyLionTran 32:8226837c56ae 33 ***************************************************************/
DuyLionTran 32:8226837c56ae 34 bool isUploading = false;
DuyLionTran 32:8226837c56ae 35 uint8_t uploadType = ADC_VALUE;
DuyLionTran 32:8226837c56ae 36
DuyLionTran 33:5b90257d2d57 37 uint32_t lastRead = 0;
DuyLionTran 33:5b90257d2d57 38 uint32_t noWiFilastRead = 0;
DuyLionTran 33:5b90257d2d57 39 uint16_t intervalSecondCounter = 0;
DuyLionTran 33:5b90257d2d57 40 uint32_t uploadPeriodCounter = 0;
DuyLionTran 36:d0b628087ac8 41 uint32_t lastReadAnalog = 0;
DuyLionTran 32:8226837c56ae 42
DuyLionTran 33:5b90257d2d57 43 struct UploadValue DataStruct;
DuyLionTran 32:8226837c56ae 44
DuyLionTran 36:d0b628087ac8 45 extern float doValue;
DuyLionTran 32:8226837c56ae 46
DuyLionTran 32:8226837c56ae 47 /***************************************************************
DuyLionTran 32:8226837c56ae 48 * Structs/Classess
DuyLionTran 32:8226837c56ae 49 ***************************************************************/
DuyLionTran 32:8226837c56ae 50 static Serial pc(SERIAL_TX, SERIAL_RX);
DuyLionTran 32:8226837c56ae 51
DuyLionTran 40:4356c209c58d 52 //DigitalOut myled(LED1);
DuyLionTran 40:4356c209c58d 53 DigitalOut myled(A6);
DuyLionTran 34:601effb7b7fe 54 DigitalOut espEn(D2);
DuyLionTran 34:601effb7b7fe 55 DigitalOut espRs(D7);
DuyLionTran 32:8226837c56ae 56
DuyLionTran 36:d0b628087ac8 57 Timer UploadTimer;
DuyLionTran 36:d0b628087ac8 58 Timer ReadAnalogTimer;
DuyLionTran 40:4356c209c58d 59
DuyLionTran 36:d0b628087ac8 60 Ticker DisplayDO;
DuyLionTran 32:8226837c56ae 61 /***************************************************************
DuyLionTran 32:8226837c56ae 62 * Unity function definitions
DuyLionTran 32:8226837c56ae 63 ***************************************************************/
DuyLionTran 33:5b90257d2d57 64 void ReadAllFlashValues();
DuyLionTran 36:d0b628087ac8 65 void ProcessDOVal();
DuyLionTran 40:4356c209c58d 66 void enableESP();
DuyLionTran 40:4356c209c58d 67
DuyLionTran 40:4356c209c58d 68 void BinkLEDStart();
DuyLionTran 32:8226837c56ae 69 /***************************************************************
DuyLionTran 32:8226837c56ae 70 * Unity function declarations
DuyLionTran 32:8226837c56ae 71 ***************************************************************/
DuyLionTran 33:5b90257d2d57 72 void ReadAllFlashValues() {
DuyLionTran 33:5b90257d2d57 73 DataStruct.ADC_PHVal = 0.85;
DuyLionTran 33:5b90257d2d57 74 DataStruct.ADC_DOVal = 0.95;
DuyLionTran 33:5b90257d2d57 75 DataStruct.SENSOR_PHVal = 17.8;
DuyLionTran 36:d0b628087ac8 76 DataStruct.SENSOR_DOVal = 18.9;
DuyLionTran 33:5b90257d2d57 77 DataStruct.RELAY_State_1 = FP_ReadValue(RELAY1_ADDRESS);
DuyLionTran 33:5b90257d2d57 78 DataStruct.RELAY_State_2 = FP_ReadValue(RELAY2_ADDRESS);
DuyLionTran 36:d0b628087ac8 79 DataStruct.RELAY_State_3 = FP_ReadValue(RELAY3_ADDRESS);
DuyLionTran 33:5b90257d2d57 80 DataStruct.CONFIG_Mode = FP_ReadValue(MODE_ADDRESS);
DuyLionTran 33:5b90257d2d57 81 DataStruct.CONFIG_MinOxi = FP_ReadValue(MIN_OXI_ADDRESS);
DuyLionTran 33:5b90257d2d57 82 DataStruct.CONFIG_MaxOxi = FP_ReadValue(MAX_OXI_ADDRESS);
DuyLionTran 33:5b90257d2d57 83 DataStruct.CONFIG_UploadInterval = FP_ReadValue(UPLOAD_PERIOD_ADDRESS);
DuyLionTran 33:5b90257d2d57 84 printf("All values: %d %d %d %d %d %d\r\n", DataStruct.RELAY_State_1, DataStruct.RELAY_State_2,
DuyLionTran 33:5b90257d2d57 85 DataStruct.CONFIG_Mode, DataStruct.CONFIG_MinOxi,
DuyLionTran 33:5b90257d2d57 86 DataStruct.CONFIG_MaxOxi, DataStruct.CONFIG_UploadInterval);
DuyLionTran 34:601effb7b7fe 87 CE_HandleRelays(DataStruct.RELAY_State_1, DataStruct.RELAY_State_2, DataStruct.RELAY_State_3);
DuyLionTran 33:5b90257d2d57 88 }
DuyLionTran 32:8226837c56ae 89
DuyLionTran 36:d0b628087ac8 90 void ProcessDOVal() {
DuyLionTran 36:d0b628087ac8 91 SENSOR_GetDOValue();
DuyLionTran 36:d0b628087ac8 92 DataStruct.SENSOR_DOVal = doValue;
DuyLionTran 36:d0b628087ac8 93 }
DuyLionTran 40:4356c209c58d 94
DuyLionTran 40:4356c209c58d 95 void enableESP() {
DuyLionTran 40:4356c209c58d 96 espEn = 1;
DuyLionTran 40:4356c209c58d 97 espRs = 1;
DuyLionTran 40:4356c209c58d 98 printf("ESP enabled\r\n");
DuyLionTran 40:4356c209c58d 99 }
DuyLionTran 40:4356c209c58d 100
DuyLionTran 40:4356c209c58d 101 void BinkLEDStart() {
DuyLionTran 40:4356c209c58d 102 myled = 0;
DuyLionTran 40:4356c209c58d 103 wait(0.2);
DuyLionTran 40:4356c209c58d 104 myled = 1;
DuyLionTran 40:4356c209c58d 105 wait(0.2);
DuyLionTran 40:4356c209c58d 106 myled = 0;
DuyLionTran 40:4356c209c58d 107 wait(0.2);
DuyLionTran 40:4356c209c58d 108 myled = 1;
DuyLionTran 40:4356c209c58d 109 wait(0.2);
DuyLionTran 40:4356c209c58d 110 myled = 0;
DuyLionTran 40:4356c209c58d 111 wait(0.2);
DuyLionTran 40:4356c209c58d 112 myled = 1;
DuyLionTran 40:4356c209c58d 113 wait(0.2);
DuyLionTran 40:4356c209c58d 114 myled = 0;
DuyLionTran 40:4356c209c58d 115 }
DuyLionTran 32:8226837c56ae 116 /***************************************************************
DuyLionTran 32:8226837c56ae 117 * Main
DuyLionTran 32:8226837c56ae 118 ***************************************************************/
DuyLionTran 32:8226837c56ae 119 int main() {
DuyLionTran 32:8226837c56ae 120 pc.baud(115200);
DuyLionTran 40:4356c209c58d 121 enableESP();
DuyLionTran 32:8226837c56ae 122 UploadTimer.start();
DuyLionTran 36:d0b628087ac8 123 ReadAnalogTimer.start();
DuyLionTran 36:d0b628087ac8 124 DisplayDO.attach(&ProcessDOVal, PROCESS_DO_VALUE_S);
DuyLionTran 40:4356c209c58d 125 BinkLEDStart();
DuyLionTran 40:4356c209c58d 126
DuyLionTran 32:8226837c56ae 127 lastRead = 0;
DuyLionTran 32:8226837c56ae 128 pc.printf("\r\nX-NUCLEO-IDW01M1 mbed Application\r\n");
DuyLionTran 32:8226837c56ae 129 pc.printf("\r\nconnecting to AP\r\n");
DuyLionTran 36:d0b628087ac8 130
DuyLionTran 32:8226837c56ae 131 NetworkInterface* network = easy_connect(true);
DuyLionTran 32:8226837c56ae 132 if (!network) {
DuyLionTran 32:8226837c56ae 133 printf ("Error easy_connect\n\r");
DuyLionTran 36:d0b628087ac8 134 wifiConnected = false;
DuyLionTran 32:8226837c56ae 135 }
DuyLionTran 36:d0b628087ac8 136 printf ("ATTEMPT CONNECT\n\r");
DuyLionTran 36:d0b628087ac8 137 MQTTNetwork mqttNetwork(network);
DuyLionTran 36:d0b628087ac8 138 MQTT::Client<MQTTNetwork, Countdown, MQTT_MAX_PACKET_SIZE> client(mqttNetwork);
DuyLionTran 36:d0b628087ac8 139 MQTT_AttemptConnect(&client, &mqttNetwork, network, DataStruct);
DuyLionTran 36:d0b628087ac8 140 if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD) {
DuyLionTran 36:d0b628087ac8 141 printf ("---ERROR line : %d, error type %d\n\r", __LINE__, connack_rc);
DuyLionTran 36:d0b628087ac8 142 wifiConnected = false;
DuyLionTran 36:d0b628087ac8 143 // while (true)
DuyLionTran 36:d0b628087ac8 144 // wait(1.0); // Permanent failures - don't retry
DuyLionTran 36:d0b628087ac8 145 }
DuyLionTran 36:d0b628087ac8 146
DuyLionTran 33:5b90257d2d57 147 ReadAllFlashValues();
DuyLionTran 38:64e3e9acb49c 148 SENSOR_ReadDoCharacteristicValues();
DuyLionTran 40:4356c209c58d 149 myled = 1;
DuyLionTran 32:8226837c56ae 150 while (true) {
DuyLionTran 33:5b90257d2d57 151 time_t seconds = time(NULL);
DuyLionTran 36:d0b628087ac8 152 if ((uint32_t)(ReadAnalogTimer.read_ms() - lastReadAnalog) > READ_ANALOG_MS) {
DuyLionTran 36:d0b628087ac8 153 SENSOR_AnalogRead();
DuyLionTran 36:d0b628087ac8 154 lastReadAnalog = ReadAnalogTimer.read_ms();
DuyLionTran 36:d0b628087ac8 155 }
DuyLionTran 33:5b90257d2d57 156 if (wifiConnected) {
DuyLionTran 33:5b90257d2d57 157 if(connected == true) {
DuyLionTran 33:5b90257d2d57 158 if ((uint32_t)(UploadTimer.read() - lastRead) >= READ_SECOND) { // Read timer every readSecond(s)
DuyLionTran 33:5b90257d2d57 159 printf("Upload time %ds\r\n", DataStruct.CONFIG_UploadInterval);
DuyLionTran 33:5b90257d2d57 160 if (!isUploading) {
DuyLionTran 33:5b90257d2d57 161 uploadPeriodCounter++;
DuyLionTran 33:5b90257d2d57 162 if (uploadPeriodCounter == DataStruct.CONFIG_UploadInterval) {
DuyLionTran 33:5b90257d2d57 163 uploadPeriodCounter = 0;
DuyLionTran 33:5b90257d2d57 164 isUploading = true;
DuyLionTran 33:5b90257d2d57 165 intervalSecondCounter = INTERVAL_BETWEEN_EACH_UPLOAD_TYPE;
DuyLionTran 33:5b90257d2d57 166 }
DuyLionTran 33:5b90257d2d57 167 }
DuyLionTran 33:5b90257d2d57 168 else {
DuyLionTran 33:5b90257d2d57 169 if (intervalSecondCounter == INTERVAL_BETWEEN_EACH_UPLOAD_TYPE) {
DuyLionTran 33:5b90257d2d57 170 if (MQTT_PublishAll(&client, seconds, uploadType, DataStruct) == MQTT::SUCCESS) {
DuyLionTran 33:5b90257d2d57 171 myled = 1;
DuyLionTran 33:5b90257d2d57 172 uploadType++;
DuyLionTran 33:5b90257d2d57 173 if (uploadType > CONFIG_VALUE) {
DuyLionTran 33:5b90257d2d57 174 isUploading = false;
DuyLionTran 33:5b90257d2d57 175 uploadType = ADC_VALUE;
DuyLionTran 33:5b90257d2d57 176 commandID++;
DuyLionTran 33:5b90257d2d57 177 UploadTimer.reset();
DuyLionTran 33:5b90257d2d57 178 }
DuyLionTran 33:5b90257d2d57 179 }
DuyLionTran 33:5b90257d2d57 180 else {
DuyLionTran 33:5b90257d2d57 181 myled = 0;
DuyLionTran 33:5b90257d2d57 182 client.disconnect();
DuyLionTran 33:5b90257d2d57 183 mqttNetwork.disconnect();
DuyLionTran 38:64e3e9acb49c 184 /* if we have lost the connection */
DuyLionTran 38:64e3e9acb49c 185 MQTT_AttemptConnect(&client, &mqttNetwork, network, DataStruct);
DuyLionTran 33:5b90257d2d57 186 }
DuyLionTran 33:5b90257d2d57 187 intervalSecondCounter = 0;
DuyLionTran 33:5b90257d2d57 188 }
DuyLionTran 33:5b90257d2d57 189 else {
DuyLionTran 33:5b90257d2d57 190 intervalSecondCounter++;
DuyLionTran 32:8226837c56ae 191 }
DuyLionTran 32:8226837c56ae 192 }
DuyLionTran 33:5b90257d2d57 193 lastRead = UploadTimer.read();
DuyLionTran 33:5b90257d2d57 194 }
DuyLionTran 38:64e3e9acb49c 195 /* allow the MQTT client to receive subscribe messages and manage keep alive */
DuyLionTran 38:64e3e9acb49c 196 client.yield(500);
DuyLionTran 33:5b90257d2d57 197 }
DuyLionTran 33:5b90257d2d57 198 else if (connected == false) {
DuyLionTran 33:5b90257d2d57 199 connected = true;
DuyLionTran 33:5b90257d2d57 200 }
DuyLionTran 33:5b90257d2d57 201 }
DuyLionTran 33:5b90257d2d57 202 else {
DuyLionTran 33:5b90257d2d57 203 if ((uint32_t)(UploadTimer.read() - noWiFilastRead) >= RECONNECT_WIFI) {
DuyLionTran 33:5b90257d2d57 204 wifiConnected = true;
DuyLionTran 33:5b90257d2d57 205 network = easy_connect(true);
DuyLionTran 33:5b90257d2d57 206 MQTT_AttemptConnect(&client, &mqttNetwork, network, DataStruct);
DuyLionTran 33:5b90257d2d57 207 if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD) {
DuyLionTran 33:5b90257d2d57 208 printf ("---ERROR line : %d, error type %d\n\r", __LINE__, connack_rc);
DuyLionTran 33:5b90257d2d57 209 wifiConnected = false;
DuyLionTran 33:5b90257d2d57 210 // while (true)
DuyLionTran 33:5b90257d2d57 211 // wait(1.0); // Permanent failures - don't retry
DuyLionTran 33:5b90257d2d57 212 }
DuyLionTran 33:5b90257d2d57 213 noWiFilastRead = UploadTimer.read();
DuyLionTran 33:5b90257d2d57 214 }
DuyLionTran 33:5b90257d2d57 215 }
DuyLionTran 32:8226837c56ae 216 }
DuyLionTran 32:8226837c56ae 217 }
DuyLionTran 32:8226837c56ae 218