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:59:35 2018 +0000
Revision:
46:f545b8f7f242
Parent:
45:92da959d624b
Child:
47:c3707a4f69a7
add sending data

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