/*************************************************************************** This is a library for the BME280 humidity, temperature & pressure sensor Designed specifically to work with the Adafruit BME280 Breakout ----> http://www.adafruit.com/products/2650 These sensors use I2C or SPI to communicate, 2 or 4 pins are required to interface. The device's I2C address is either 0x76 or 0x77. Adafruit invests time and resources providing this open source code, please support Adafruit andopen-source hardware by purchasing products from Adafruit! Written by Limor Fried & Kevin Townsend for Adafruit Industries. BSD license, all text above must be included in any redistribution ***************************************************************************/ byte requestBytes[3]; // for incoming xBee data byte answerBytes[3]; #include #include #include #include #include #define BME_SCK 13 #define BME_MISO 12 #define BME_MOSI 11 #define BME_CS 10 //Adafruit_BME280 bme; // I2C //Adafruit_BME280 bme(BME_CS); // hardware SPI Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI //on crée la liaison xBee SoftwareSerial xBee(2, 3); int luxPin = A0; float rawRange = 1024; float logRange = 5.0; void setup() { xBee.begin(9600); analogReference(EXTERNAL); char requestBytes[3]; //tableau d'octets contenant les données byte answerBytes[4]; bme.begin(); } void loop() { if (xBee.available() <= 3 && xBee.available() >= 1 ) { xBee.readBytes(requestBytes,3); if(requestBytes[0] == 'G' && requestBytes[1] == 'E' && requestBytes[2] == 'T') //Si 3 octets correspondant à G,E et T sont envoyé on envoie les données météo { //on charge les donnée dans la chaîne de bytes d'envoi (modélisé par un tableau) answerBytes[0] = pressureToByte(bme.readPressure()); answerBytes[1] = tempToByte(bme.readTemperature()); answerBytes[2] = humidityToByte(bme.readHumidity()); answerBytes[3] = luxToByte(getLux()); //On envoie le buffer constituée des 4 donnée xBee.write(answerBytes,4); //on vide le buffer série pour éviter un décalage des requêtes while(xBee.available() > 0) xBee.read(); } } // printValues(); } int arrondiSuperieur(float val) { int newVal = 0; //arrondi supérieur if(val-(int)val >= 0.5) newVal = (int)val+1; else newVal = (int)val; return newVal; } //Ces fonctions convertissent chaque donnée en un seul octet byte pressureToByte(float pressure) { return (byte)(arrondiSuperieur(pressure/100.0)-845); } byte tempToByte(float temp) { return (byte)arrondiSuperieur(temp); } byte humidityToByte(float humidity) { return (byte)arrondiSuperieur(humidity); } byte luxToByte(float lux) { return (byte)(lux*255/10000); } //https://cdn-learn.adafruit.com/downloads/pdf/adafruit-ga1a12s202-log-scale-analog-light-sensor.pdf float getLux() { int raw = analogRead(luxPin); float logLux = raw * logRange / rawRange; float res = pow(10, logLux); if(res > 10000.0) { res = 10000.0; } return res; }