Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: easy-connect-v16 Watchdog FP MQTTPacket RecordType-v-16 watersenor_and_temp_code
Application/main.cpp@40:4356c209c58d, 2018-02-27 (annotated)
- 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?
| User | Revision | Line number | New 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 |