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 13:16:44 2018 +0000
Revision:
44:8a99efffeb8e
Parent:
43:dcde0e66874a
Child:
45:92da959d624b
nothing new

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