St-connect

Dependencies:   HP206C mbed WakeUp QMC5883L DHT22 DS1820

  1. ST Conect Project Look how we did it : [Hackster](https://www.hackster.io/monginjulien/st-connect-dike-monitoring-534a32)
Committer:
raminou
Date:
Tue Jan 08 15:23:11 2019 +0000
Revision:
13:8cbc053fdca1
Parent:
12:41fa5a145a22
empty callback

Who changed what in which revision?

UserRevisionLine numberNew contents of line
raminou 0:1c266599e07b 1 #include "mbed.h"
raminou 0:1c266599e07b 2 #include "WakeUp.h"
raminou 0:1c266599e07b 3 #include "DHT22.h"
raminou 0:1c266599e07b 4 #include "HP20x_dev.h"
raminou 5:d805b1c2dc1e 5 #include "DS1820.h"
raminou 5:d805b1c2dc1e 6 #include "QMC5883L.h"
raminou 8:c4801ce16934 7
raminou 11:e48bb5d44808 8 // Time during the deepsleep in ms
raminou 12:41fa5a145a22 9 #define DEEPSLEEP_TIME (1*60000)
raminou 8:c4801ce16934 10
raminou 11:e48bb5d44808 11 // Enabling components
raminou 11:e48bb5d44808 12 #define ENABLE_BAROMETER 1
raminou 11:e48bb5d44808 13 #define ENABLE_MAGNETOMETER 1
raminou 11:e48bb5d44808 14 #define ENABLE_GROUND_TEMPERATURE 1
raminou 11:e48bb5d44808 15 #define ENABLE_GROUND_HUMIDITY 1
raminou 11:e48bb5d44808 16 #define ENABLE_DHT22 1
raminou 11:e48bb5d44808 17
raminou 11:e48bb5d44808 18 // Sigfox constants
raminou 6:865aa63f2106 19 #define MESSAGE_SIZE 32
raminou 6:865aa63f2106 20 #define TRAME_SIZE 25
raminou 5:d805b1c2dc1e 21
raminou 11:e48bb5d44808 22 // Enable the debug
raminou 12:41fa5a145a22 23 #define DEBUG
raminou 11:e48bb5d44808 24
raminou 11:e48bb5d44808 25 // Enable the sending over Sigfox
raminou 8:c4801ce16934 26 #define SEND_SIGFOX 1
raminou 0:1c266599e07b 27
raminou 11:e48bb5d44808 28 // Object initializations
raminou 0:1c266599e07b 29 #ifdef DEBUG
raminou 0:1c266599e07b 30 Serial pc(USBTX, USBRX);
raminou 11:e48bb5d44808 31 DigitalOut myled(LED1);
raminou 0:1c266599e07b 32 #endif
raminou 0:1c266599e07b 33
raminou 7:036d9a2accff 34 #ifdef ENABLE_BAROMETER
raminou 7:036d9a2accff 35 HP20x_dev capt_barometer(D4, D5);
raminou 7:036d9a2accff 36 #endif
raminou 7:036d9a2accff 37
raminou 7:036d9a2accff 38 #ifdef ENABLE_MAGNETOMETER
raminou 7:036d9a2accff 39 QMC5883L capt_magnetometer(D4, D5);
raminou 7:036d9a2accff 40 #endif
raminou 7:036d9a2accff 41
raminou 7:036d9a2accff 42 #ifdef ENABLE_GROUND_TEMPERATURE
raminou 7:036d9a2accff 43 DS1820 capt_ground_temperature(A1);
raminou 7:036d9a2accff 44 #endif
raminou 7:036d9a2accff 45
raminou 7:036d9a2accff 46 #ifdef ENABLE_GROUND_HUMIDITY
raminou 9:2f31939caaf2 47 DigitalOut transistor_humidity(D12);
raminou 7:036d9a2accff 48 AnalogIn capt_ground_humidity(A0); // SEN0
raminou 7:036d9a2accff 49 #endif
raminou 7:036d9a2accff 50
raminou 7:036d9a2accff 51 #ifdef ENABLE_DHT22
raminou 7:036d9a2accff 52 DHT22 capt_thermo_air_humidity(D3); // DHT22
raminou 7:036d9a2accff 53 #endif
raminou 7:036d9a2accff 54
raminou 11:e48bb5d44808 55 // Pin to disable deepsleep
raminou 11:e48bb5d44808 56 DigitalIn disable_deep(D6);
raminou 11:e48bb5d44808 57
raminou 0:1c266599e07b 58 Serial sigfox(D1, D0);
raminou 11:e48bb5d44808 59
raminou 11:e48bb5d44808 60 // Pin to control the transistor
raminou 8:c4801ce16934 61 DigitalInOut reset_sigfox(D9);
raminou 11:e48bb5d44808 62
raminou 0:1c266599e07b 63
raminou 6:865aa63f2106 64 char message[MESSAGE_SIZE] = "AT$SF=";
raminou 0:1c266599e07b 65
raminou 11:e48bb5d44808 66 // Default values at the init
raminou 5:d805b1c2dc1e 67 long pressure = 10000;
raminou 5:d805b1c2dc1e 68 float air_temperature = 20.0;
raminou 5:d805b1c2dc1e 69 float air_humidity = 50.0;
raminou 5:d805b1c2dc1e 70 float ground_temperature = 20.0;
raminou 5:d805b1c2dc1e 71 float ground_humidity = 0.5;
raminou 5:d805b1c2dc1e 72 int16_t magnetic_field[3] = {}; // x, y, z
raminou 0:1c266599e07b 73
raminou 13:8cbc053fdca1 74 /*
raminou 13:8cbc053fdca1 75 * Empty callback of the deepsleep because in this version of mbed, the wakeup
raminou 13:8cbc053fdca1 76 * does not work without it.
raminou 13:8cbc053fdca1 77 * But the code inside it is not executed !
raminou 13:8cbc053fdca1 78 */
raminou 0:1c266599e07b 79 void mycallback()
raminou 0:1c266599e07b 80 {
raminou 0:1c266599e07b 81 }
raminou 0:1c266599e07b 82
raminou 11:e48bb5d44808 83 /*
raminou 11:e48bb5d44808 84 * Round the float f
raminou 11:e48bb5d44808 85 */
raminou 6:865aa63f2106 86 int16_t round(float f)
raminou 6:865aa63f2106 87 {
raminou 6:865aa63f2106 88 int16_t res = (int16_t)f;
raminou 6:865aa63f2106 89 if (f - res > 1/2)
raminou 6:865aa63f2106 90 res++;
raminou 6:865aa63f2106 91
raminou 6:865aa63f2106 92 return res;
raminou 6:865aa63f2106 93 }
raminou 6:865aa63f2106 94
raminou 11:e48bb5d44808 95 /*
raminou 11:e48bb5d44808 96 * Format the trame to send over Sigfox
raminou 11:e48bb5d44808 97 * Put the trame in *v_trame
raminou 11:e48bb5d44808 98 */
raminou 6:865aa63f2106 99 void format(float v_ground_temperature, float v_air_temperature, float v_ground_humidity, float v_air_humidity, long v_pressure, int16_t* v_magnetic_field, char* v_trame)
raminou 6:865aa63f2106 100 {
raminou 11:e48bb5d44808 101 // Converting our data to use as few bits as possible
raminou 6:865aa63f2106 102 int16_t i_ground_temperature = (int16_t) round(v_ground_temperature * 10);
raminou 6:865aa63f2106 103 int16_t i_air_temperature = (int16_t) round(v_air_temperature * 10);
raminou 6:865aa63f2106 104 int16_t i_ground_humidity = (int16_t) round(v_ground_humidity);
raminou 6:865aa63f2106 105 int16_t i_air_humidity = (int16_t) round(v_air_humidity);
raminou 6:865aa63f2106 106 int32_t i_pressure = (int32_t) v_pressure;
raminou 11:e48bb5d44808 107 bool err[3] = {false, false, false}; // magnetic field error x,y,z
raminou 6:865aa63f2106 108
raminou 6:865aa63f2106 109 // Checking if the values are in the range
raminou 6:865aa63f2106 110 if(!(i_ground_temperature >= -512 && i_ground_temperature < 511))
raminou 6:865aa63f2106 111 i_ground_temperature = -512;
raminou 6:865aa63f2106 112
raminou 6:865aa63f2106 113 if(!(i_air_temperature >= -512 && i_air_temperature < 511))
raminou 6:865aa63f2106 114 i_air_temperature = -512;
raminou 6:865aa63f2106 115
raminou 6:865aa63f2106 116 if(!(i_ground_humidity <= 100))
raminou 6:865aa63f2106 117 i_ground_humidity = 127;
raminou 6:865aa63f2106 118
raminou 6:865aa63f2106 119 if(!(i_air_humidity <= 100))
raminou 6:865aa63f2106 120 i_air_humidity = 127;
raminou 6:865aa63f2106 121
raminou 6:865aa63f2106 122 if(!(i_pressure <= 131071))
raminou 6:865aa63f2106 123 i_pressure = 0;
raminou 6:865aa63f2106 124
raminou 6:865aa63f2106 125 unsigned int i;
raminou 6:865aa63f2106 126 for(i = 0; i < 3; i++)
raminou 6:865aa63f2106 127 {
raminou 6:865aa63f2106 128 if(!(v_magnetic_field[i] > -65536 && v_magnetic_field[i] < 65535))
raminou 6:865aa63f2106 129 err[i] = true;
raminou 6:865aa63f2106 130 }
raminou 6:865aa63f2106 131
raminou 11:e48bb5d44808 132 // Putting them in the trame
raminou 6:865aa63f2106 133 snprintf(v_trame, TRAME_SIZE, "%02x", (char)(i_ground_temperature >> 2));
raminou 6:865aa63f2106 134 snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)((i_ground_temperature << 6) | ((i_air_temperature >> 4) & 0x3f)));
raminou 6:865aa63f2106 135 snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)((i_air_temperature << 4) | ((i_ground_humidity >> 3) & 0x0f)));
raminou 6:865aa63f2106 136 snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)((i_ground_humidity << 5) | ((i_air_humidity >> 2) & 0x1f)));
raminou 6:865aa63f2106 137 snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)((i_air_humidity << 6) | ((i_pressure >> 11) & 0x3f)));
raminou 6:865aa63f2106 138 snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)(i_pressure >> 3));
raminou 6:865aa63f2106 139 snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)((i_pressure << 5) | ((v_magnetic_field[0] >> 9) & 0x1f)));
raminou 6:865aa63f2106 140 snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)(v_magnetic_field[0] >> 1));
raminou 6:865aa63f2106 141 snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)((v_magnetic_field[0] << 7) | ((v_magnetic_field[1] >> 7) & 0x7f)));
raminou 6:865aa63f2106 142 snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)((v_magnetic_field[1] << 1) | ((v_magnetic_field[2] >> 13) & 0x01)));
raminou 6:865aa63f2106 143 snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)(v_magnetic_field[2] >> 5));
raminou 6:865aa63f2106 144 snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)((v_magnetic_field[2] << 3) | (err[0] << 2) | (err[1] << 1) | (err[2])));
raminou 6:865aa63f2106 145 }
raminou 6:865aa63f2106 146
raminou 0:1c266599e07b 147 int main()
raminou 0:1c266599e07b 148 {
raminou 0:1c266599e07b 149 #ifdef DEBUG
raminou 0:1c266599e07b 150 pc.printf("\r\n\r\n\r\nInit...\r\n");
raminou 0:1c266599e07b 151 #endif
raminou 0:1c266599e07b 152
raminou 8:c4801ce16934 153 sigfox.printf("\r\n");
raminou 8:c4801ce16934 154
raminou 11:e48bb5d44808 155 #ifdef ENABLE_BAROMETER
raminou 11:e48bb5d44808 156 if(capt_barometer.isAvailable())
raminou 11:e48bb5d44808 157 pressure = capt_barometer.ReadPressure();
raminou 11:e48bb5d44808 158 #endif
raminou 11:e48bb5d44808 159
raminou 8:c4801ce16934 160 #ifdef ENABLE_MAGNETOMETER
raminou 8:c4801ce16934 161 capt_magnetometer.init();
raminou 8:c4801ce16934 162 #endif
raminou 8:c4801ce16934 163
raminou 11:e48bb5d44808 164 wait(5);
raminou 11:e48bb5d44808 165
raminou 11:e48bb5d44808 166 // Main loop
raminou 0:1c266599e07b 167 while(1) {
raminou 9:2f31939caaf2 168 #ifdef DEBUG
raminou 9:2f31939caaf2 169 myled = 1;
raminou 9:2f31939caaf2 170 wait(5);
raminou 9:2f31939caaf2 171 myled = 0;
raminou 9:2f31939caaf2 172 #endif
raminou 9:2f31939caaf2 173
raminou 9:2f31939caaf2 174 #ifdef ENABLE_GROUND_HUMIDITY
raminou 9:2f31939caaf2 175 // Plug the ground humidity
raminou 9:2f31939caaf2 176 transistor_humidity = 1;
raminou 9:2f31939caaf2 177 #endif
raminou 9:2f31939caaf2 178
raminou 8:c4801ce16934 179 // Wake Up sigfox
raminou 8:c4801ce16934 180 reset_sigfox.output();
raminou 8:c4801ce16934 181 reset_sigfox = 0;
raminou 8:c4801ce16934 182 wait(5);
raminou 8:c4801ce16934 183
raminou 8:c4801ce16934 184 // Set high impendance the sigfox reset pin
raminou 8:c4801ce16934 185 reset_sigfox.input();
raminou 8:c4801ce16934 186
raminou 7:036d9a2accff 187 #ifdef ENABLE_GROUND_TEMPERATURE
raminou 11:e48bb5d44808 188 // Ground Temperature
raminou 7:036d9a2accff 189 capt_ground_temperature.convertTemperature(true, DS1820::all_devices);
raminou 7:036d9a2accff 190 ground_temperature = capt_ground_temperature.temperature();
raminou 7:036d9a2accff 191 #endif
raminou 0:1c266599e07b 192
raminou 7:036d9a2accff 193 #ifdef ENABLE_GROUND_HUMIDITY
raminou 11:e48bb5d44808 194 // Ground Humidity
raminou 7:036d9a2accff 195 ground_humidity = capt_ground_humidity.read() * 100;
raminou 9:2f31939caaf2 196 transistor_humidity = 0;
raminou 7:036d9a2accff 197 #endif
raminou 0:1c266599e07b 198
raminou 7:036d9a2accff 199 #ifdef ENABLE_DHT22
raminou 11:e48bb5d44808 200 // Air temperature and humidity
raminou 7:036d9a2accff 201 if(capt_thermo_air_humidity.sample())
raminou 7:036d9a2accff 202 {
raminou 7:036d9a2accff 203 air_temperature = capt_thermo_air_humidity.getTemperature() / 10.0;
raminou 7:036d9a2accff 204 air_humidity = capt_thermo_air_humidity.getHumidity() / 10.0;
raminou 7:036d9a2accff 205 }
raminou 7:036d9a2accff 206 #endif
raminou 0:1c266599e07b 207
raminou 7:036d9a2accff 208 #ifdef ENABLE_BAROMETER
raminou 11:e48bb5d44808 209 // Pressure
raminou 7:036d9a2accff 210 if(capt_barometer.isAvailable())
raminou 7:036d9a2accff 211 pressure = capt_barometer.ReadPressure();
raminou 7:036d9a2accff 212 #endif
raminou 0:1c266599e07b 213
raminou 7:036d9a2accff 214 #ifdef ENABLE_MAGNETOMETER
raminou 11:e48bb5d44808 215 // Magnetometer
raminou 9:2f31939caaf2 216 capt_magnetometer.init();
raminou 7:036d9a2accff 217 magnetic_field[0] = capt_magnetometer.getMagXvalue();
raminou 7:036d9a2accff 218 magnetic_field[1] = capt_magnetometer.getMagYvalue();
raminou 7:036d9a2accff 219 magnetic_field[2] = capt_magnetometer.getMagZvalue();
raminou 9:2f31939caaf2 220 capt_magnetometer.standby();
raminou 7:036d9a2accff 221 #endif
raminou 0:1c266599e07b 222
raminou 0:1c266599e07b 223 #ifdef DEBUG
raminou 11:e48bb5d44808 224 // Display to check your values
raminou 5:d805b1c2dc1e 225 pc.printf("\r\n");
raminou 5:d805b1c2dc1e 226 pc.printf("Pressure: %f hPa\r\n", pressure/100.0);
raminou 5:d805b1c2dc1e 227 pc.printf("Ground Temperature: %f\t|\t", ground_temperature);
raminou 6:865aa63f2106 228 pc.printf("Ground Humidity: %.1f\r\n", ground_humidity);
raminou 0:1c266599e07b 229 pc.printf("Air Temperature: %.1f\t|\tAir Humidity: %.1f\r\n", air_temperature, air_humidity);
raminou 5:d805b1c2dc1e 230 pc.printf("Magnetic field: x: %hd, y: %hd, z: %hd\r\n", magnetic_field[0], magnetic_field[1], magnetic_field[2]);
raminou 0:1c266599e07b 231 #endif
raminou 0:1c266599e07b 232
raminou 11:e48bb5d44808 233 // Creating your sigfox trame
raminou 6:865aa63f2106 234 format(ground_temperature, air_temperature, ground_humidity, air_humidity, pressure, magnetic_field, &(message[6]));
raminou 6:865aa63f2106 235 message[MESSAGE_SIZE-2] = '\r';
raminou 6:865aa63f2106 236 message[MESSAGE_SIZE-1] = '\n';
raminou 0:1c266599e07b 237 #ifdef DEBUG
raminou 6:865aa63f2106 238 pc.printf("msg=%s", message);
raminou 0:1c266599e07b 239 #endif
raminou 0:1c266599e07b 240
raminou 11:e48bb5d44808 241 // Sending over sigfox
raminou 5:d805b1c2dc1e 242 #ifdef SEND_SIGFOX
raminou 5:d805b1c2dc1e 243 sigfox.printf("%s", message);
raminou 11:e48bb5d44808 244 wait(8); // Time during the sigfox module is sending, do not stop the sigfox before !
raminou 8:c4801ce16934 245 #endif
raminou 9:2f31939caaf2 246
raminou 9:2f31939caaf2 247 // Sleep Sigfox
raminou 8:c4801ce16934 248 sigfox.printf("AT$P=1\r\n");
raminou 11:e48bb5d44808 249
raminou 8:c4801ce16934 250 #ifdef DEBUG
raminou 11:e48bb5d44808 251 // Detect that the system is going in sleep mode
raminou 8:c4801ce16934 252 pc.printf("Sleep");
raminou 9:2f31939caaf2 253 myled = 1;
raminou 9:2f31939caaf2 254 wait(0.3);
raminou 9:2f31939caaf2 255 myled = 0;
raminou 9:2f31939caaf2 256 wait(0.3);
raminou 9:2f31939caaf2 257 myled = 1;
raminou 9:2f31939caaf2 258 wait(0.3);
raminou 9:2f31939caaf2 259 myled = 0;
raminou 9:2f31939caaf2 260 wait(0.3);
raminou 9:2f31939caaf2 261 myled = 1;
raminou 9:2f31939caaf2 262 wait(0.3);
raminou 9:2f31939caaf2 263 myled = 0;
raminou 5:d805b1c2dc1e 264 #endif
raminou 9:2f31939caaf2 265
raminou 11:e48bb5d44808 266 // Deepsleep
raminou 11:e48bb5d44808 267 if(disable_deep == 0)
raminou 11:e48bb5d44808 268 {
raminou 11:e48bb5d44808 269 WakeUp::set_ms(DEEPSLEEP_TIME);
raminou 11:e48bb5d44808 270 WakeUp::attach(&mycallback);
raminou 11:e48bb5d44808 271 deepsleep();
raminou 11:e48bb5d44808 272 }
raminou 0:1c266599e07b 273 }
raminou 6:865aa63f2106 274 }