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 Dec 04 15:02:02 2018 +0000
Revision:
10:c645f569b7ce
Parent:
9:2f31939caaf2
Child:
11:e48bb5d44808
All components in sleep

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 10:c645f569b7ce 8 // #define ENABLE_BAROMETER 1
raminou 10:c645f569b7ce 9 // #define ENABLE_MAGNETOMETER 1
raminou 10:c645f569b7ce 10 // #define ENABLE_GROUND_TEMPERATURE 1
raminou 10:c645f569b7ce 11 // #define ENABLE_GROUND_HUMIDITY 1
raminou 10:c645f569b7ce 12 // #define ENABLE_DHT22 1
raminou 8:c4801ce16934 13
raminou 6:865aa63f2106 14 #define MESSAGE_SIZE 32
raminou 6:865aa63f2106 15 #define TRAME_SIZE 25
raminou 5:d805b1c2dc1e 16
raminou 7:036d9a2accff 17 #define DEBUG
raminou 8:c4801ce16934 18 #define SEND_SIGFOX 1
raminou 0:1c266599e07b 19
raminou 0:1c266599e07b 20 #ifdef DEBUG
raminou 0:1c266599e07b 21 Serial pc(USBTX, USBRX);
raminou 0:1c266599e07b 22 #endif
raminou 0:1c266599e07b 23
raminou 7:036d9a2accff 24 #ifdef ENABLE_BAROMETER
raminou 7:036d9a2accff 25 HP20x_dev capt_barometer(D4, D5);
raminou 7:036d9a2accff 26 #endif
raminou 7:036d9a2accff 27
raminou 7:036d9a2accff 28 #ifdef ENABLE_MAGNETOMETER
raminou 7:036d9a2accff 29 QMC5883L capt_magnetometer(D4, D5);
raminou 7:036d9a2accff 30 #endif
raminou 7:036d9a2accff 31
raminou 7:036d9a2accff 32 #ifdef ENABLE_GROUND_TEMPERATURE
raminou 7:036d9a2accff 33 DS1820 capt_ground_temperature(A1);
raminou 7:036d9a2accff 34 #endif
raminou 7:036d9a2accff 35
raminou 7:036d9a2accff 36 #ifdef ENABLE_GROUND_HUMIDITY
raminou 9:2f31939caaf2 37 DigitalOut transistor_humidity(D12);
raminou 7:036d9a2accff 38 AnalogIn capt_ground_humidity(A0); // SEN0
raminou 7:036d9a2accff 39 #endif
raminou 7:036d9a2accff 40
raminou 7:036d9a2accff 41 #ifdef ENABLE_DHT22
raminou 7:036d9a2accff 42 DHT22 capt_thermo_air_humidity(D3); // DHT22
raminou 7:036d9a2accff 43 #endif
raminou 7:036d9a2accff 44
raminou 0:1c266599e07b 45 Serial sigfox(D1, D0);
raminou 8:c4801ce16934 46 DigitalInOut reset_sigfox(D9);
raminou 9:2f31939caaf2 47 DigitalOut myled(LED1);
raminou 0:1c266599e07b 48
raminou 6:865aa63f2106 49 char message[MESSAGE_SIZE] = "AT$SF=";
raminou 0:1c266599e07b 50
raminou 5:d805b1c2dc1e 51 long pressure = 10000;
raminou 5:d805b1c2dc1e 52 float air_temperature = 20.0;
raminou 5:d805b1c2dc1e 53 float air_humidity = 50.0;
raminou 5:d805b1c2dc1e 54 float ground_temperature = 20.0;
raminou 5:d805b1c2dc1e 55 float ground_humidity = 0.5;
raminou 5:d805b1c2dc1e 56 int16_t magnetic_field[3] = {}; // x, y, z
raminou 0:1c266599e07b 57
raminou 0:1c266599e07b 58 void mycallback()
raminou 0:1c266599e07b 59 {
raminou 0:1c266599e07b 60 }
raminou 0:1c266599e07b 61
raminou 6:865aa63f2106 62 int16_t round(float f)
raminou 6:865aa63f2106 63 {
raminou 6:865aa63f2106 64 int16_t res = (int16_t)f;
raminou 6:865aa63f2106 65 if (f - res > 1/2)
raminou 6:865aa63f2106 66 res++;
raminou 6:865aa63f2106 67
raminou 6:865aa63f2106 68 return res;
raminou 6:865aa63f2106 69 }
raminou 6:865aa63f2106 70
raminou 6:865aa63f2106 71 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 72 {
raminou 6:865aa63f2106 73 int16_t i_ground_temperature = (int16_t) round(v_ground_temperature * 10);
raminou 6:865aa63f2106 74 int16_t i_air_temperature = (int16_t) round(v_air_temperature * 10);
raminou 6:865aa63f2106 75 int16_t i_ground_humidity = (int16_t) round(v_ground_humidity);
raminou 6:865aa63f2106 76 int16_t i_air_humidity = (int16_t) round(v_air_humidity);
raminou 6:865aa63f2106 77 int32_t i_pressure = (int32_t) v_pressure;
raminou 6:865aa63f2106 78 bool err[3] = {false, false, false}; // x,y,z
raminou 6:865aa63f2106 79
raminou 6:865aa63f2106 80 // Checking if the values are in the range
raminou 6:865aa63f2106 81 if(!(i_ground_temperature >= -512 && i_ground_temperature < 511))
raminou 6:865aa63f2106 82 i_ground_temperature = -512;
raminou 6:865aa63f2106 83
raminou 6:865aa63f2106 84 if(!(i_air_temperature >= -512 && i_air_temperature < 511))
raminou 6:865aa63f2106 85 i_air_temperature = -512;
raminou 6:865aa63f2106 86
raminou 6:865aa63f2106 87 if(!(i_ground_humidity <= 100))
raminou 6:865aa63f2106 88 i_ground_humidity = 127;
raminou 6:865aa63f2106 89
raminou 6:865aa63f2106 90 if(!(i_air_humidity <= 100))
raminou 6:865aa63f2106 91 i_air_humidity = 127;
raminou 6:865aa63f2106 92
raminou 6:865aa63f2106 93 if(!(i_pressure <= 131071))
raminou 6:865aa63f2106 94 i_pressure = 0;
raminou 6:865aa63f2106 95
raminou 6:865aa63f2106 96 unsigned int i;
raminou 6:865aa63f2106 97 for(i = 0; i < 3; i++)
raminou 6:865aa63f2106 98 {
raminou 6:865aa63f2106 99 if(!(v_magnetic_field[i] > -65536 && v_magnetic_field[i] < 65535))
raminou 6:865aa63f2106 100 err[i] = true;
raminou 6:865aa63f2106 101 }
raminou 6:865aa63f2106 102
raminou 6:865aa63f2106 103 snprintf(v_trame, TRAME_SIZE, "%02x", (char)(i_ground_temperature >> 2));
raminou 6:865aa63f2106 104 snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)((i_ground_temperature << 6) | ((i_air_temperature >> 4) & 0x3f)));
raminou 6:865aa63f2106 105 snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)((i_air_temperature << 4) | ((i_ground_humidity >> 3) & 0x0f)));
raminou 6:865aa63f2106 106 snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)((i_ground_humidity << 5) | ((i_air_humidity >> 2) & 0x1f)));
raminou 6:865aa63f2106 107 snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)((i_air_humidity << 6) | ((i_pressure >> 11) & 0x3f)));
raminou 6:865aa63f2106 108 snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)(i_pressure >> 3));
raminou 6:865aa63f2106 109 snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)((i_pressure << 5) | ((v_magnetic_field[0] >> 9) & 0x1f)));
raminou 6:865aa63f2106 110 snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)(v_magnetic_field[0] >> 1));
raminou 6:865aa63f2106 111 snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)((v_magnetic_field[0] << 7) | ((v_magnetic_field[1] >> 7) & 0x7f)));
raminou 6:865aa63f2106 112 snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)((v_magnetic_field[1] << 1) | ((v_magnetic_field[2] >> 13) & 0x01)));
raminou 6:865aa63f2106 113 snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)(v_magnetic_field[2] >> 5));
raminou 6:865aa63f2106 114 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 115 /*
raminou 6:865aa63f2106 116 v_trame[0] = i_ground_temperature >> 2;
raminou 6:865aa63f2106 117 v_trame[1] = (i_ground_temperature << 6) | ((i_air_temperature >> 4) & 0x3f);
raminou 6:865aa63f2106 118 v_trame[2] = (i_air_temperature << 4) | ((i_ground_humidity >> 3) & 0x0f);
raminou 6:865aa63f2106 119 v_trame[3] = (i_ground_humidity << 5) | ((i_air_humidity >> 2) & 0x1f);
raminou 6:865aa63f2106 120 v_trame[4] = (i_air_humidity << 6) | ((i_pressure >> 11) & 0x3f);
raminou 6:865aa63f2106 121 v_trame[5] = (i_pressure >> 3);
raminou 6:865aa63f2106 122 v_trame[6] = (i_pressure << 5) | ((v_magnetic_field[0] >> 9) & 0x1f);
raminou 6:865aa63f2106 123 v_trame[7] = (v_magnetic_field[0] >> 1);
raminou 6:865aa63f2106 124 v_trame[8] = (v_magnetic_field[0] << 7) | ((v_magnetic_field[1] >> 7) & 0x7f);
raminou 6:865aa63f2106 125 v_trame[9] = (v_magnetic_field[1] << 1) | ((v_magnetic_field[2] >> 13) & 0x01);
raminou 6:865aa63f2106 126 v_trame[10] = (v_magnetic_field[2] >> 5);
raminou 6:865aa63f2106 127 v_trame[11] = (v_magnetic_field[2] << 3) | (err[0] << 2) | (err[1] << 1) | (err[2]);
raminou 6:865aa63f2106 128 */
raminou 6:865aa63f2106 129 }
raminou 6:865aa63f2106 130
raminou 0:1c266599e07b 131 int main()
raminou 0:1c266599e07b 132 {
raminou 0:1c266599e07b 133 #ifdef DEBUG
raminou 0:1c266599e07b 134 pc.printf("\r\n\r\n\r\nInit...\r\n");
raminou 0:1c266599e07b 135 #endif
raminou 0:1c266599e07b 136
raminou 8:c4801ce16934 137 sigfox.printf("\r\n");
raminou 8:c4801ce16934 138
raminou 8:c4801ce16934 139 #ifdef ENABLE_MAGNETOMETER
raminou 8:c4801ce16934 140 capt_magnetometer.init();
raminou 9:2f31939caaf2 141 wait(5);
raminou 8:c4801ce16934 142 #endif
raminou 8:c4801ce16934 143
raminou 0:1c266599e07b 144 while(1) {
raminou 9:2f31939caaf2 145 #ifdef DEBUG
raminou 9:2f31939caaf2 146 myled = 1;
raminou 9:2f31939caaf2 147 wait(5);
raminou 9:2f31939caaf2 148 myled = 0;
raminou 9:2f31939caaf2 149 #endif
raminou 9:2f31939caaf2 150
raminou 9:2f31939caaf2 151 #ifdef ENABLE_GROUND_HUMIDITY
raminou 9:2f31939caaf2 152 // Plug the ground humidity
raminou 9:2f31939caaf2 153 transistor_humidity = 1;
raminou 9:2f31939caaf2 154 #endif
raminou 9:2f31939caaf2 155
raminou 8:c4801ce16934 156 // Wake Up sigfox
raminou 8:c4801ce16934 157 reset_sigfox.output();
raminou 8:c4801ce16934 158 reset_sigfox = 0;
raminou 8:c4801ce16934 159 wait(5);
raminou 8:c4801ce16934 160
raminou 8:c4801ce16934 161 // Set high impendance the sigfox reset pin
raminou 8:c4801ce16934 162 reset_sigfox.input();
raminou 8:c4801ce16934 163
raminou 7:036d9a2accff 164 #ifdef ENABLE_GROUND_TEMPERATURE
raminou 7:036d9a2accff 165 // Temperature Sol
raminou 7:036d9a2accff 166 capt_ground_temperature.convertTemperature(true, DS1820::all_devices);
raminou 7:036d9a2accff 167 ground_temperature = capt_ground_temperature.temperature();
raminou 7:036d9a2accff 168 #endif
raminou 0:1c266599e07b 169
raminou 7:036d9a2accff 170 #ifdef ENABLE_GROUND_HUMIDITY
raminou 7:036d9a2accff 171 // Humidite Sol
raminou 7:036d9a2accff 172 ground_humidity = capt_ground_humidity.read() * 100;
raminou 9:2f31939caaf2 173 transistor_humidity = 0;
raminou 7:036d9a2accff 174 #endif
raminou 0:1c266599e07b 175
raminou 7:036d9a2accff 176 #ifdef ENABLE_DHT22
raminou 7:036d9a2accff 177 // Temperature et Humidite Air
raminou 7:036d9a2accff 178 if(capt_thermo_air_humidity.sample())
raminou 7:036d9a2accff 179 {
raminou 7:036d9a2accff 180 air_temperature = capt_thermo_air_humidity.getTemperature() / 10.0;
raminou 7:036d9a2accff 181 air_humidity = capt_thermo_air_humidity.getHumidity() / 10.0;
raminou 7:036d9a2accff 182 }
raminou 7:036d9a2accff 183 #endif
raminou 0:1c266599e07b 184
raminou 7:036d9a2accff 185 #ifdef ENABLE_BAROMETER
raminou 7:036d9a2accff 186 // Pression
raminou 7:036d9a2accff 187 if(capt_barometer.isAvailable())
raminou 8:c4801ce16934 188 {
raminou 7:036d9a2accff 189 pressure = capt_barometer.ReadPressure();
raminou 8:c4801ce16934 190 }
raminou 7:036d9a2accff 191 #endif
raminou 0:1c266599e07b 192
raminou 7:036d9a2accff 193 #ifdef ENABLE_MAGNETOMETER
raminou 7:036d9a2accff 194 // Magnetometre
raminou 9:2f31939caaf2 195 capt_magnetometer.init();
raminou 7:036d9a2accff 196 magnetic_field[0] = capt_magnetometer.getMagXvalue();
raminou 7:036d9a2accff 197 magnetic_field[1] = capt_magnetometer.getMagYvalue();
raminou 7:036d9a2accff 198 magnetic_field[2] = capt_magnetometer.getMagZvalue();
raminou 9:2f31939caaf2 199 capt_magnetometer.standby();
raminou 7:036d9a2accff 200 #endif
raminou 0:1c266599e07b 201
raminou 0:1c266599e07b 202 // Affichage pour debug
raminou 0:1c266599e07b 203 #ifdef DEBUG
raminou 5:d805b1c2dc1e 204 pc.printf("\r\n");
raminou 5:d805b1c2dc1e 205 pc.printf("Pressure: %f hPa\r\n", pressure/100.0);
raminou 5:d805b1c2dc1e 206 pc.printf("Ground Temperature: %f\t|\t", ground_temperature);
raminou 6:865aa63f2106 207 pc.printf("Ground Humidity: %.1f\r\n", ground_humidity);
raminou 0:1c266599e07b 208 pc.printf("Air Temperature: %.1f\t|\tAir Humidity: %.1f\r\n", air_temperature, air_humidity);
raminou 5:d805b1c2dc1e 209 pc.printf("Magnetic field: x: %hd, y: %hd, z: %hd\r\n", magnetic_field[0], magnetic_field[1], magnetic_field[2]);
raminou 0:1c266599e07b 210 #endif
raminou 0:1c266599e07b 211
raminou 0:1c266599e07b 212 // Envoie sigfox
raminou 6:865aa63f2106 213 format(ground_temperature, air_temperature, ground_humidity, air_humidity, pressure, magnetic_field, &(message[6]));
raminou 6:865aa63f2106 214 message[MESSAGE_SIZE-2] = '\r';
raminou 6:865aa63f2106 215 message[MESSAGE_SIZE-1] = '\n';
raminou 0:1c266599e07b 216 #ifdef DEBUG
raminou 6:865aa63f2106 217 pc.printf("msg=%s", message);
raminou 0:1c266599e07b 218 #endif
raminou 0:1c266599e07b 219
raminou 5:d805b1c2dc1e 220 #ifdef SEND_SIGFOX
raminou 8:c4801ce16934 221 #ifdef DEBUG
raminou 8:c4801ce16934 222 pc.printf("ENVOIE\r\n", message);
raminou 8:c4801ce16934 223 #endif
raminou 5:d805b1c2dc1e 224 sigfox.printf("%s", message);
raminou 9:2f31939caaf2 225 wait(8);
raminou 8:c4801ce16934 226 #endif
raminou 9:2f31939caaf2 227
raminou 9:2f31939caaf2 228 // Sleep Sigfox
raminou 8:c4801ce16934 229 sigfox.printf("AT$P=1\r\n");
raminou 8:c4801ce16934 230 #ifdef DEBUG
raminou 8:c4801ce16934 231 pc.printf("Sleep");
raminou 9:2f31939caaf2 232 myled = 1;
raminou 9:2f31939caaf2 233 wait(0.3);
raminou 9:2f31939caaf2 234 myled = 0;
raminou 9:2f31939caaf2 235 wait(0.3);
raminou 9:2f31939caaf2 236 myled = 1;
raminou 9:2f31939caaf2 237 wait(0.3);
raminou 9:2f31939caaf2 238 myled = 0;
raminou 9:2f31939caaf2 239 wait(0.3);
raminou 9:2f31939caaf2 240 myled = 1;
raminou 9:2f31939caaf2 241 wait(0.3);
raminou 9:2f31939caaf2 242 myled = 0;
raminou 5:d805b1c2dc1e 243 #endif
raminou 9:2f31939caaf2 244
raminou 0:1c266599e07b 245 // DEEPSLEEP
raminou 8:c4801ce16934 246 WakeUp::set_ms(30000);
raminou 0:1c266599e07b 247 WakeUp::attach(&mycallback);
raminou 0:1c266599e07b 248 deepsleep();
raminou 0:1c266599e07b 249 }
raminou 6:865aa63f2106 250 }