St-connect
Dependencies: HP206C mbed WakeUp QMC5883L DHT22 DS1820
- ST Conect Project Look how we did it : [Hackster](https://www.hackster.io/monginjulien/st-connect-dike-monitoring-534a32)
main.cpp
- Committer:
- raminou
- Date:
- 2018-11-26
- Revision:
- 9:2f31939caaf2
- Parent:
- 8:c4801ce16934
- Child:
- 10:c645f569b7ce
File content as of revision 9:2f31939caaf2:
#include "mbed.h" #include "WakeUp.h" #include "DHT22.h" #include "HP20x_dev.h" #include "DS1820.h" #include "QMC5883L.h" #define ENABLE_BAROMETER 1 #define ENABLE_MAGNETOMETER 1 #define ENABLE_GROUND_TEMPERATURE 1 #define ENABLE_GROUND_HUMIDITY 1 #define ENABLE_DHT22 1 #define MESSAGE_SIZE 32 #define TRAME_SIZE 25 #define DEBUG #define SEND_SIGFOX 1 #ifdef DEBUG Serial pc(USBTX, USBRX); #endif #ifdef ENABLE_BAROMETER HP20x_dev capt_barometer(D4, D5); #endif #ifdef ENABLE_MAGNETOMETER QMC5883L capt_magnetometer(D4, D5); #endif #ifdef ENABLE_GROUND_TEMPERATURE DS1820 capt_ground_temperature(A1); #endif #ifdef ENABLE_GROUND_HUMIDITY DigitalOut transistor_humidity(D12); AnalogIn capt_ground_humidity(A0); // SEN0 #endif #ifdef ENABLE_DHT22 DHT22 capt_thermo_air_humidity(D3); // DHT22 #endif Serial sigfox(D1, D0); DigitalInOut reset_sigfox(D9); DigitalOut myled(LED1); char message[MESSAGE_SIZE] = "AT$SF="; long pressure = 10000; float air_temperature = 20.0; float air_humidity = 50.0; float ground_temperature = 20.0; float ground_humidity = 0.5; int16_t magnetic_field[3] = {}; // x, y, z void mycallback() { } int16_t round(float f) { int16_t res = (int16_t)f; if (f - res > 1/2) res++; return res; } 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) { int16_t i_ground_temperature = (int16_t) round(v_ground_temperature * 10); int16_t i_air_temperature = (int16_t) round(v_air_temperature * 10); int16_t i_ground_humidity = (int16_t) round(v_ground_humidity); int16_t i_air_humidity = (int16_t) round(v_air_humidity); int32_t i_pressure = (int32_t) v_pressure; bool err[3] = {false, false, false}; // x,y,z // Checking if the values are in the range if(!(i_ground_temperature >= -512 && i_ground_temperature < 511)) i_ground_temperature = -512; if(!(i_air_temperature >= -512 && i_air_temperature < 511)) i_air_temperature = -512; if(!(i_ground_humidity <= 100)) i_ground_humidity = 127; if(!(i_air_humidity <= 100)) i_air_humidity = 127; if(!(i_pressure <= 131071)) i_pressure = 0; unsigned int i; for(i = 0; i < 3; i++) { if(!(v_magnetic_field[i] > -65536 && v_magnetic_field[i] < 65535)) err[i] = true; } snprintf(v_trame, TRAME_SIZE, "%02x", (char)(i_ground_temperature >> 2)); snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)((i_ground_temperature << 6) | ((i_air_temperature >> 4) & 0x3f))); snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)((i_air_temperature << 4) | ((i_ground_humidity >> 3) & 0x0f))); snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)((i_ground_humidity << 5) | ((i_air_humidity >> 2) & 0x1f))); snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)((i_air_humidity << 6) | ((i_pressure >> 11) & 0x3f))); snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)(i_pressure >> 3)); snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)((i_pressure << 5) | ((v_magnetic_field[0] >> 9) & 0x1f))); snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)(v_magnetic_field[0] >> 1)); snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)((v_magnetic_field[0] << 7) | ((v_magnetic_field[1] >> 7) & 0x7f))); snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)((v_magnetic_field[1] << 1) | ((v_magnetic_field[2] >> 13) & 0x01))); snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)(v_magnetic_field[2] >> 5)); snprintf(v_trame, TRAME_SIZE, "%s%02x", v_trame, (char)((v_magnetic_field[2] << 3) | (err[0] << 2) | (err[1] << 1) | (err[2]))); /* v_trame[0] = i_ground_temperature >> 2; v_trame[1] = (i_ground_temperature << 6) | ((i_air_temperature >> 4) & 0x3f); v_trame[2] = (i_air_temperature << 4) | ((i_ground_humidity >> 3) & 0x0f); v_trame[3] = (i_ground_humidity << 5) | ((i_air_humidity >> 2) & 0x1f); v_trame[4] = (i_air_humidity << 6) | ((i_pressure >> 11) & 0x3f); v_trame[5] = (i_pressure >> 3); v_trame[6] = (i_pressure << 5) | ((v_magnetic_field[0] >> 9) & 0x1f); v_trame[7] = (v_magnetic_field[0] >> 1); v_trame[8] = (v_magnetic_field[0] << 7) | ((v_magnetic_field[1] >> 7) & 0x7f); v_trame[9] = (v_magnetic_field[1] << 1) | ((v_magnetic_field[2] >> 13) & 0x01); v_trame[10] = (v_magnetic_field[2] >> 5); v_trame[11] = (v_magnetic_field[2] << 3) | (err[0] << 2) | (err[1] << 1) | (err[2]); */ } int main() { #ifdef DEBUG pc.printf("\r\n\r\n\r\nInit...\r\n"); #endif sigfox.printf("\r\n"); #ifdef ENABLE_MAGNETOMETER capt_magnetometer.init(); wait(5); #endif while(1) { #ifdef DEBUG myled = 1; wait(5); myled = 0; #endif #ifdef ENABLE_GROUND_HUMIDITY // Plug the ground humidity transistor_humidity = 1; #endif // Wake Up sigfox reset_sigfox.output(); reset_sigfox = 0; wait(5); // Set high impendance the sigfox reset pin reset_sigfox.input(); #ifdef ENABLE_GROUND_TEMPERATURE // Temperature Sol capt_ground_temperature.convertTemperature(true, DS1820::all_devices); ground_temperature = capt_ground_temperature.temperature(); #endif #ifdef ENABLE_GROUND_HUMIDITY // Humidite Sol ground_humidity = capt_ground_humidity.read() * 100; transistor_humidity = 0; #endif #ifdef ENABLE_DHT22 // Temperature et Humidite Air if(capt_thermo_air_humidity.sample()) { air_temperature = capt_thermo_air_humidity.getTemperature() / 10.0; air_humidity = capt_thermo_air_humidity.getHumidity() / 10.0; } #endif #ifdef ENABLE_BAROMETER // Pression if(capt_barometer.isAvailable()) { pressure = capt_barometer.ReadPressure(); } #endif #ifdef ENABLE_MAGNETOMETER // Magnetometre capt_magnetometer.init(); magnetic_field[0] = capt_magnetometer.getMagXvalue(); magnetic_field[1] = capt_magnetometer.getMagYvalue(); magnetic_field[2] = capt_magnetometer.getMagZvalue(); capt_magnetometer.standby(); #endif // Affichage pour debug #ifdef DEBUG pc.printf("\r\n"); pc.printf("Pressure: %f hPa\r\n", pressure/100.0); pc.printf("Ground Temperature: %f\t|\t", ground_temperature); pc.printf("Ground Humidity: %.1f\r\n", ground_humidity); pc.printf("Air Temperature: %.1f\t|\tAir Humidity: %.1f\r\n", air_temperature, air_humidity); pc.printf("Magnetic field: x: %hd, y: %hd, z: %hd\r\n", magnetic_field[0], magnetic_field[1], magnetic_field[2]); #endif // Envoie sigfox format(ground_temperature, air_temperature, ground_humidity, air_humidity, pressure, magnetic_field, &(message[6])); message[MESSAGE_SIZE-2] = '\r'; message[MESSAGE_SIZE-1] = '\n'; #ifdef DEBUG pc.printf("msg=%s", message); #endif #ifdef SEND_SIGFOX #ifdef DEBUG pc.printf("ENVOIE\r\n", message); #endif sigfox.printf("%s", message); wait(8); #endif // Sleep Sigfox sigfox.printf("AT$P=1\r\n"); #ifdef DEBUG pc.printf("Sleep"); myled = 1; wait(0.3); myled = 0; wait(0.3); myled = 1; wait(0.3); myled = 0; wait(0.3); myled = 1; wait(0.3); myled = 0; #endif // DEEPSLEEP WakeUp::set_ms(30000); WakeUp::attach(&mycallback); deepsleep(); } }