serialArduino.ino 3.17 KB
/***************************************************************************
  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 <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <SoftwareSerial.h>

#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;
}