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:
Wed Feb 14 14:45:35 2018 +0000
Revision:
36:d0b628087ac8
Parent:
35:fc800d35c1ba
Child:
38:64e3e9acb49c
* version 2.6 	02-14-2017: DO Sensor added, calibration is still on the way

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