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:
Thu Mar 08 14:19:48 2018 +0000
Revision:
47:c3707a4f69a7
Parent:
46:f545b8f7f242
Child:
48:a7ed665844cd
* version 2.7.5a	03-08-2018: DS18B20 problem discovered at line 42th ReadSensor.cpp;                                 Upload RTC time converted to epoch

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 41:6aed398adcc4 5 * version 2.5 02-14-2018: 3rd relay and remote time setting are added
DuyLionTran 41:6aed398adcc4 6 * version 2.6 02-14-2018: DO Sensor added, calibration is still on the way
DuyLionTran 41:6aed398adcc4 7 * version 2.6.3 02-19-2018: developing calibration. the average voltage is ok
DuyLionTran 41:6aed398adcc4 8 * version 2.6.5 02-21-2018: developing calibration. Sensor read is completely ok
DuyLionTran 41:6aed398adcc4 9 * version 2.6.8 02-27-2018: developing DO calibration. DS18B20 temperature sensor is added
DuyLionTran 42:3656e1b2f20a 10 * version 2.7 03-04-2018: DO calibration complete. IWDG is added
DuyLionTran 43:dcde0e66874a 11 * version 2.7.5 03-08-2018: DS18B20 & IWDG is being developed
DuyLionTran 45:92da959d624b 12 * version 2.7.5a 03-08-2018: DS18B20 problem discovered at line 42th ReadSensor.cpp
DuyLionTran 47:c3707a4f69a7 13 Upload RTC time converted to epoch
DuyLionTran 34:601effb7b7fe 14 */
DuyLionTran 32:8226837c56ae 15
DuyLionTran 32:8226837c56ae 16 /***************************************************************
DuyLionTran 32:8226837c56ae 17 * Includes
DuyLionTran 32:8226837c56ae 18 ***************************************************************/
DuyLionTran 32:8226837c56ae 19 #include "mbed.h"
DuyLionTran 32:8226837c56ae 20
DuyLionTran 32:8226837c56ae 21 #include "ReadSensor.h"
DuyLionTran 32:8226837c56ae 22 #include "SimpleMQTT.h"
DuyLionTran 33:5b90257d2d57 23 #include "CommandExecution.h"
DuyLionTran 32:8226837c56ae 24 #include "flash_programming.h"
DuyLionTran 32:8226837c56ae 25
DuyLionTran 41:6aed398adcc4 26 #include "stm32l4xx_hal_iwdg.h"
DuyLionTran 41:6aed398adcc4 27
DuyLionTran 32:8226837c56ae 28 /***************************************************************
DuyLionTran 32:8226837c56ae 29 * Definitions
DuyLionTran 32:8226837c56ae 30 ***************************************************************/
DuyLionTran 41:6aed398adcc4 31 //#define READ_ANALOG_SOFTTIMER
DuyLionTran 41:6aed398adcc4 32
DuyLionTran 33:5b90257d2d57 33 #define READ_SECOND 1 /* Read timer every 1 second(s) */
DuyLionTran 33:5b90257d2d57 34 #define INTERVAL_BETWEEN_EACH_UPLOAD_TYPE 5 /* The interval between each upload type in second */
DuyLionTran 33:5b90257d2d57 35 #define RECONNECT_WIFI 60 /* Try to reconnect to wifi */
DuyLionTran 41:6aed398adcc4 36 #ifdef READ_ANALOG_SOFTTIMER
DuyLionTran 41:6aed398adcc4 37 #define READ_ANALOG_MS 30
DuyLionTran 41:6aed398adcc4 38 #endif
DuyLionTran 41:6aed398adcc4 39 #define PROCESS_SENSOR_VALUE_S 2
DuyLionTran 41:6aed398adcc4 40 #define CALIB_STATE_CHANGE_PERIOD_S 5
DuyLionTran 32:8226837c56ae 41
DuyLionTran 32:8226837c56ae 42 /***************************************************************
DuyLionTran 32:8226837c56ae 43 * Variables
DuyLionTran 32:8226837c56ae 44 ***************************************************************/
DuyLionTran 32:8226837c56ae 45 bool isUploading = false;
DuyLionTran 46:f545b8f7f242 46 bool isSendingData = false;
DuyLionTran 47:c3707a4f69a7 47 uint8_t uploadType = SENSOR_VALUE;
DuyLionTran 41:6aed398adcc4 48 uint8_t currentCalibMode = 1;
DuyLionTran 41:6aed398adcc4 49 uint8_t calibStateCounter = 0;
DuyLionTran 32:8226837c56ae 50
DuyLionTran 33:5b90257d2d57 51 uint32_t lastRead = 0;
DuyLionTran 33:5b90257d2d57 52 uint32_t noWiFilastRead = 0;
DuyLionTran 33:5b90257d2d57 53 uint16_t intervalSecondCounter = 0;
DuyLionTran 33:5b90257d2d57 54 uint32_t uploadPeriodCounter = 0;
DuyLionTran 41:6aed398adcc4 55
DuyLionTran 41:6aed398adcc4 56 #ifdef READ_ANALOG_SOFTTIMER
DuyLionTran 41:6aed398adcc4 57 uint32_t lastReadAnalog = 0;
DuyLionTran 41:6aed398adcc4 58 #endif
DuyLionTran 32:8226837c56ae 59
DuyLionTran 33:5b90257d2d57 60 struct UploadValue DataStruct;
DuyLionTran 41:6aed398adcc4 61 IWDG_HandleTypeDef IwdgHandle;
DuyLionTran 32:8226837c56ae 62
DuyLionTran 36:d0b628087ac8 63 extern float doValue;
DuyLionTran 45:92da959d624b 64 extern float temperature;
DuyLionTran 41:6aed398adcc4 65 extern bool isCalibrating;
DuyLionTran 32:8226837c56ae 66
DuyLionTran 32:8226837c56ae 67 /***************************************************************
DuyLionTran 32:8226837c56ae 68 * Structs/Classess
DuyLionTran 32:8226837c56ae 69 ***************************************************************/
DuyLionTran 32:8226837c56ae 70 static Serial pc(SERIAL_TX, SERIAL_RX);
DuyLionTran 32:8226837c56ae 71
DuyLionTran 40:4356c209c58d 72 //DigitalOut myled(LED1);
DuyLionTran 40:4356c209c58d 73 DigitalOut myled(A6);
DuyLionTran 34:601effb7b7fe 74 DigitalOut espEn(D2);
DuyLionTran 34:601effb7b7fe 75 DigitalOut espRs(D7);
DuyLionTran 32:8226837c56ae 76
DuyLionTran 36:d0b628087ac8 77 Timer UploadTimer;
DuyLionTran 41:6aed398adcc4 78 #ifdef READ_ANALOG_SOFTTIMER
DuyLionTran 41:6aed398adcc4 79 Timer ReadAnalogTimer;
DuyLionTran 41:6aed398adcc4 80 #endif
DuyLionTran 41:6aed398adcc4 81 Ticker DisplayDO;
DuyLionTran 40:4356c209c58d 82
DuyLionTran 32:8226837c56ae 83 /***************************************************************
DuyLionTran 32:8226837c56ae 84 * Unity function definitions
DuyLionTran 32:8226837c56ae 85 ***************************************************************/
DuyLionTran 33:5b90257d2d57 86 void ReadAllFlashValues();
DuyLionTran 41:6aed398adcc4 87 void SensorRun();
DuyLionTran 40:4356c209c58d 88 void enableESP();
DuyLionTran 40:4356c209c58d 89
DuyLionTran 40:4356c209c58d 90 void BinkLEDStart();
DuyLionTran 41:6aed398adcc4 91
DuyLionTran 32:8226837c56ae 92 /***************************************************************
DuyLionTran 32:8226837c56ae 93 * Unity function declarations
DuyLionTran 32:8226837c56ae 94 ***************************************************************/
DuyLionTran 33:5b90257d2d57 95 void ReadAllFlashValues() {
DuyLionTran 47:c3707a4f69a7 96 DataStruct.ADC_TEMPVal = 0;
DuyLionTran 47:c3707a4f69a7 97 DataStruct.ADC_DOVal = 0;
DuyLionTran 47:c3707a4f69a7 98 DataStruct.SENSOR_TEMPVal = 0;
DuyLionTran 47:c3707a4f69a7 99 DataStruct.SENSOR_DOVal = 0;
DuyLionTran 43:dcde0e66874a 100 DataStruct.RELAY_State_1 = FP_ReadValue(RELAY1_ADDRESS);
DuyLionTran 43:dcde0e66874a 101 DataStruct.RELAY_State_2 = FP_ReadValue(RELAY2_ADDRESS);
DuyLionTran 43:dcde0e66874a 102 DataStruct.RELAY_State_3 = FP_ReadValue(RELAY3_ADDRESS);
DuyLionTran 43:dcde0e66874a 103 DataStruct.CONFIG_Mode = FP_ReadValue(MODE_ADDRESS);
DuyLionTran 43:dcde0e66874a 104 DataStruct.CONFIG_OxyThreshold = FP_ReadValue(OXY_THRES_ADDRESS);
DuyLionTran 43:dcde0e66874a 105 DataStruct.CONFIG_TemperatureThreshold = FP_ReadValue(TEMP_THRES_ADDRESS);
DuyLionTran 43:dcde0e66874a 106 DataStruct.CONFIG_UploadInterval = FP_ReadValue(UPLOAD_PERIOD_ADDRESS);
DuyLionTran 33:5b90257d2d57 107 printf("All values: %d %d %d %d %d %d\r\n", DataStruct.RELAY_State_1, DataStruct.RELAY_State_2,
DuyLionTran 43:dcde0e66874a 108 DataStruct.CONFIG_Mode, DataStruct.CONFIG_OxyThreshold,
DuyLionTran 43:dcde0e66874a 109 DataStruct.CONFIG_TemperatureThreshold, DataStruct.CONFIG_UploadInterval);
DuyLionTran 34:601effb7b7fe 110 CE_HandleRelays(DataStruct.RELAY_State_1, DataStruct.RELAY_State_2, DataStruct.RELAY_State_3);
DuyLionTran 33:5b90257d2d57 111 }
DuyLionTran 32:8226837c56ae 112
DuyLionTran 41:6aed398adcc4 113 void SensorRun() {
DuyLionTran 47:c3707a4f69a7 114 if (!isSendingData) {
DuyLionTran 47:c3707a4f69a7 115 for (uint8_t j = 0; j < SCOUNT; j++) {
DuyLionTran 47:c3707a4f69a7 116 SENSOR_AnalogRead();
DuyLionTran 47:c3707a4f69a7 117 }
DuyLionTran 47:c3707a4f69a7 118 SENSOR_GetDOValue();
DuyLionTran 47:c3707a4f69a7 119 DataStruct.SENSOR_DOVal = doValue;
DuyLionTran 47:c3707a4f69a7 120 DataStruct.SENSOR_TEMPVal = temperature;
DuyLionTran 47:c3707a4f69a7 121 if (isCalibrating) {
DuyLionTran 47:c3707a4f69a7 122 SENSOR_DoCalibration(currentCalibMode);
DuyLionTran 47:c3707a4f69a7 123 if (currentCalibMode == 3) {
DuyLionTran 47:c3707a4f69a7 124 currentCalibMode = 1;
DuyLionTran 47:c3707a4f69a7 125 isCalibrating = false;
DuyLionTran 47:c3707a4f69a7 126 }
DuyLionTran 47:c3707a4f69a7 127 calibStateCounter++;
DuyLionTran 47:c3707a4f69a7 128
DuyLionTran 47:c3707a4f69a7 129 /* Change calibration mode every PROCESS_SENSOR_VALUE_S*CALIB_STATE_CHANGE_PERIOD_S second(s) */
DuyLionTran 47:c3707a4f69a7 130 if ((calibStateCounter % CALIB_STATE_CHANGE_PERIOD_S) == 0) {
DuyLionTran 47:c3707a4f69a7 131 currentCalibMode++;
DuyLionTran 47:c3707a4f69a7 132 }
DuyLionTran 47:c3707a4f69a7 133 }
DuyLionTran 41:6aed398adcc4 134 }
DuyLionTran 47:c3707a4f69a7 135 else {
DuyLionTran 47:c3707a4f69a7 136 printf("No sensor reading because uploading data\r\n");
DuyLionTran 41:6aed398adcc4 137 }
DuyLionTran 36:d0b628087ac8 138 }
DuyLionTran 40:4356c209c58d 139
DuyLionTran 40:4356c209c58d 140 void enableESP() {
DuyLionTran 40:4356c209c58d 141 espEn = 1;
DuyLionTran 40:4356c209c58d 142 espRs = 1;
DuyLionTran 40:4356c209c58d 143 printf("ESP enabled\r\n");
DuyLionTran 40:4356c209c58d 144 }
DuyLionTran 40:4356c209c58d 145
DuyLionTran 40:4356c209c58d 146 void BinkLEDStart() {
DuyLionTran 40:4356c209c58d 147 myled = 1;
DuyLionTran 41:6aed398adcc4 148 for (uint8_t j = 0; j < 8; j++) {
DuyLionTran 41:6aed398adcc4 149 myled = !myled;
DuyLionTran 41:6aed398adcc4 150 wait(0.2);
DuyLionTran 41:6aed398adcc4 151 }
DuyLionTran 40:4356c209c58d 152 myled = 0;
DuyLionTran 40:4356c209c58d 153 }
DuyLionTran 32:8226837c56ae 154 /***************************************************************
DuyLionTran 32:8226837c56ae 155 * Main
DuyLionTran 32:8226837c56ae 156 ***************************************************************/
DuyLionTran 32:8226837c56ae 157 int main() {
DuyLionTran 32:8226837c56ae 158 pc.baud(115200);
DuyLionTran 43:dcde0e66874a 159 printf("PROGRAM STARTS\r\n");
DuyLionTran 40:4356c209c58d 160 enableESP();
DuyLionTran 32:8226837c56ae 161 UploadTimer.start();
DuyLionTran 41:6aed398adcc4 162
DuyLionTran 41:6aed398adcc4 163 #ifdef READ_ANALOG_SOFTTIMER
DuyLionTran 41:6aed398adcc4 164 ReadAnalogTimer.start();
DuyLionTran 41:6aed398adcc4 165 #endif
DuyLionTran 41:6aed398adcc4 166
DuyLionTran 40:4356c209c58d 167 BinkLEDStart();
DuyLionTran 40:4356c209c58d 168
DuyLionTran 32:8226837c56ae 169 lastRead = 0;
DuyLionTran 41:6aed398adcc4 170 pc.printf("\r\nViKa IoT Water Monitor mbed Application\r\n");
DuyLionTran 32:8226837c56ae 171 pc.printf("\r\nconnecting to AP\r\n");
DuyLionTran 36:d0b628087ac8 172
DuyLionTran 32:8226837c56ae 173 NetworkInterface* network = easy_connect(true);
DuyLionTran 32:8226837c56ae 174 if (!network) {
DuyLionTran 32:8226837c56ae 175 printf ("Error easy_connect\n\r");
DuyLionTran 36:d0b628087ac8 176 wifiConnected = false;
DuyLionTran 32:8226837c56ae 177 }
DuyLionTran 36:d0b628087ac8 178 printf ("ATTEMPT CONNECT\n\r");
DuyLionTran 36:d0b628087ac8 179 MQTTNetwork mqttNetwork(network);
DuyLionTran 36:d0b628087ac8 180 MQTT::Client<MQTTNetwork, Countdown, MQTT_MAX_PACKET_SIZE> client(mqttNetwork);
DuyLionTran 36:d0b628087ac8 181 MQTT_AttemptConnect(&client, &mqttNetwork, network, DataStruct);
DuyLionTran 36:d0b628087ac8 182 if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD) {
DuyLionTran 36:d0b628087ac8 183 printf ("---ERROR line : %d, error type %d\n\r", __LINE__, connack_rc);
DuyLionTran 36:d0b628087ac8 184 wifiConnected = false;
DuyLionTran 36:d0b628087ac8 185 // while (true)
DuyLionTran 36:d0b628087ac8 186 // wait(1.0); // Permanent failures - don't retry
DuyLionTran 36:d0b628087ac8 187 }
DuyLionTran 43:dcde0e66874a 188
DuyLionTran 43:dcde0e66874a 189 DisplayDO.attach(&SensorRun, PROCESS_SENSOR_VALUE_S);
DuyLionTran 33:5b90257d2d57 190 ReadAllFlashValues();
DuyLionTran 38:64e3e9acb49c 191 SENSOR_ReadDoCharacteristicValues();
DuyLionTran 40:4356c209c58d 192 myled = 1;
DuyLionTran 32:8226837c56ae 193 while (true) {
DuyLionTran 33:5b90257d2d57 194 time_t seconds = time(NULL);
DuyLionTran 41:6aed398adcc4 195 #ifdef READ_ANALOG_SOFTTIMER
DuyLionTran 41:6aed398adcc4 196 if ((uint32_t)(ReadAnalogTimer.read_ms() - lastReadAnalog) > READ_ANALOG_MS) {
DuyLionTran 41:6aed398adcc4 197 SENSOR_AnalogRead();
DuyLionTran 41:6aed398adcc4 198 lastReadAnalog = ReadAnalogTimer.read_ms();
DuyLionTran 41:6aed398adcc4 199 }
DuyLionTran 41:6aed398adcc4 200 #endif
DuyLionTran 33:5b90257d2d57 201 if (wifiConnected) {
DuyLionTran 33:5b90257d2d57 202 if(connected == true) {
DuyLionTran 33:5b90257d2d57 203 if ((uint32_t)(UploadTimer.read() - lastRead) >= READ_SECOND) { // Read timer every readSecond(s)
DuyLionTran 33:5b90257d2d57 204 printf("Upload time %ds\r\n", DataStruct.CONFIG_UploadInterval);
DuyLionTran 33:5b90257d2d57 205 if (!isUploading) {
DuyLionTran 33:5b90257d2d57 206 uploadPeriodCounter++;
DuyLionTran 33:5b90257d2d57 207 if (uploadPeriodCounter == DataStruct.CONFIG_UploadInterval) {
DuyLionTran 33:5b90257d2d57 208 uploadPeriodCounter = 0;
DuyLionTran 33:5b90257d2d57 209 isUploading = true;
DuyLionTran 33:5b90257d2d57 210 intervalSecondCounter = INTERVAL_BETWEEN_EACH_UPLOAD_TYPE;
DuyLionTran 33:5b90257d2d57 211 }
DuyLionTran 33:5b90257d2d57 212 }
DuyLionTran 33:5b90257d2d57 213 else {
DuyLionTran 33:5b90257d2d57 214 if (intervalSecondCounter == INTERVAL_BETWEEN_EACH_UPLOAD_TYPE) {
DuyLionTran 47:c3707a4f69a7 215 isSendingData = true;
DuyLionTran 33:5b90257d2d57 216 if (MQTT_PublishAll(&client, seconds, uploadType, DataStruct) == MQTT::SUCCESS) {
DuyLionTran 33:5b90257d2d57 217 myled = 1;
DuyLionTran 33:5b90257d2d57 218 uploadType++;
DuyLionTran 33:5b90257d2d57 219 if (uploadType > CONFIG_VALUE) {
DuyLionTran 33:5b90257d2d57 220 isUploading = false;
DuyLionTran 47:c3707a4f69a7 221 uploadType = SENSOR_VALUE;
DuyLionTran 33:5b90257d2d57 222 commandID++;
DuyLionTran 33:5b90257d2d57 223 UploadTimer.reset();
DuyLionTran 33:5b90257d2d57 224 }
DuyLionTran 33:5b90257d2d57 225 }
DuyLionTran 33:5b90257d2d57 226 else {
DuyLionTran 33:5b90257d2d57 227 myled = 0;
DuyLionTran 33:5b90257d2d57 228 client.disconnect();
DuyLionTran 33:5b90257d2d57 229 mqttNetwork.disconnect();
DuyLionTran 38:64e3e9acb49c 230 /* if we have lost the connection */
DuyLionTran 38:64e3e9acb49c 231 MQTT_AttemptConnect(&client, &mqttNetwork, network, DataStruct);
DuyLionTran 47:c3707a4f69a7 232 }
DuyLionTran 47:c3707a4f69a7 233 isSendingData = false;
DuyLionTran 33:5b90257d2d57 234 intervalSecondCounter = 0;
DuyLionTran 33:5b90257d2d57 235 }
DuyLionTran 33:5b90257d2d57 236 else {
DuyLionTran 33:5b90257d2d57 237 intervalSecondCounter++;
DuyLionTran 32:8226837c56ae 238 }
DuyLionTran 32:8226837c56ae 239 }
DuyLionTran 33:5b90257d2d57 240 lastRead = UploadTimer.read();
DuyLionTran 33:5b90257d2d57 241 }
DuyLionTran 38:64e3e9acb49c 242 /* allow the MQTT client to receive subscribe messages and manage keep alive */
DuyLionTran 38:64e3e9acb49c 243 client.yield(500);
DuyLionTran 33:5b90257d2d57 244 }
DuyLionTran 33:5b90257d2d57 245 else if (connected == false) {
DuyLionTran 33:5b90257d2d57 246 connected = true;
DuyLionTran 33:5b90257d2d57 247 }
DuyLionTran 33:5b90257d2d57 248 }
DuyLionTran 33:5b90257d2d57 249 else {
DuyLionTran 33:5b90257d2d57 250 if ((uint32_t)(UploadTimer.read() - noWiFilastRead) >= RECONNECT_WIFI) {
DuyLionTran 33:5b90257d2d57 251 wifiConnected = true;
DuyLionTran 33:5b90257d2d57 252 network = easy_connect(true);
DuyLionTran 33:5b90257d2d57 253 MQTT_AttemptConnect(&client, &mqttNetwork, network, DataStruct);
DuyLionTran 33:5b90257d2d57 254 if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD) {
DuyLionTran 33:5b90257d2d57 255 printf ("---ERROR line : %d, error type %d\n\r", __LINE__, connack_rc);
DuyLionTran 33:5b90257d2d57 256 wifiConnected = false;
DuyLionTran 33:5b90257d2d57 257 // while (true)
DuyLionTran 33:5b90257d2d57 258 // wait(1.0); // Permanent failures - don't retry
DuyLionTran 33:5b90257d2d57 259 }
DuyLionTran 33:5b90257d2d57 260 noWiFilastRead = UploadTimer.read();
DuyLionTran 33:5b90257d2d57 261 }
DuyLionTran 33:5b90257d2d57 262 }
DuyLionTran 32:8226837c56ae 263 }
DuyLionTran 32:8226837c56ae 264 }
DuyLionTran 44:8a99efffeb8e 265