serialArduino.ino
3.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/***************************************************************************
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;
}