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@36:d0b628087ac8, 2018-02-14 (annotated)
- 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?
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 | 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 |