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: HP206C mbed WakeUp QMC5883L DHT22 DS1820
main.cpp
- Committer:
- raminou
- Date:
- 2018-10-22
- Revision:
- 6:865aa63f2106
- Parent:
- 5:d805b1c2dc1e
- Child:
- 7:036d9a2accff
File content as of revision 6:865aa63f2106:
#include "mbed.h"
#include "WakeUp.h"
#include "DHT22.h"
#include "HP20x_dev.h"
#include "DS1820.h"
#include "QMC5883L.h"
#define MESSAGE_SIZE 32
#define TRAME_SIZE 25
#define DEBUG 1
// #define SEND_SIGFOX 1
#ifdef DEBUG
Serial pc(USBTX, USBRX);
#endif
HP20x_dev capt_barometer(D4, D5);
QMC5883L capt_magnetometer(D4, D5);
DS1820 capt_ground_temperature(A1);
AnalogIn capt_ground_humidity(A0); // SEN0
DHT22 capt_thermo_air_humidity(D3); // DHT22
Serial sigfox(D1, D0);
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()
{
sigfox.printf("\r\n");
capt_magnetometer.init();
#ifdef DEBUG
pc.printf("\r\n\r\n\r\nInit...\r\n");
#endif
while(1) {
// Temperature Sol
capt_ground_temperature.convertTemperature(true, DS1820::all_devices);
ground_temperature = capt_ground_temperature.temperature();
// Humidite Sol
ground_humidity = capt_ground_humidity.read() * 100;
// 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;
}
// Pression
if(capt_barometer.isAvailable())
pressure = capt_barometer.ReadPressure();
// Magnetometre
magnetic_field[0] = capt_magnetometer.getMagXvalue();
magnetic_field[1] = capt_magnetometer.getMagYvalue();
magnetic_field[2] = capt_magnetometer.getMagZvalue();
// 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
sigfox.printf("%s", message);
#endif
// DEEPSLEEP
/*
WakeUp::set_ms(10000);
WakeUp::attach(&mycallback);
deepsleep();
*/
wait(5);
}
}
