first commit
This commit is contained in:
195
ESP8266_DEEP_SLEEP2/ESP8266_DEEP_SLEEP2.ino
Executable file
195
ESP8266_DEEP_SLEEP2/ESP8266_DEEP_SLEEP2.ino
Executable file
@@ -0,0 +1,195 @@
|
||||
/*********************************************************************
|
||||
Capteur de pression atmosphérique et de température BMP180 /BMP085
|
||||
Programme de test pour Arduino sans librairie externe
|
||||
www.projetsdiy.fr
|
||||
|
||||
Version originale de Leo Nutz, www.ALTDuino.de
|
||||
|
||||
**********************************************************/
|
||||
|
||||
#include <Wire.h>
|
||||
|
||||
#define ADDRESS_SENSOR 0x77 // Addresse du capteur
|
||||
|
||||
int16_t ac1, ac2, ac3, b1, b2, mb, mc, md; // Store sensor PROM values from BMP180
|
||||
uint16_t ac4, ac5, ac6; // Store sensor PROM values from BMP180
|
||||
// Ultra Low Power OSS = 0, OSD = 5ms
|
||||
// Standard OSS = 1, OSD = 8ms
|
||||
// High OSS = 2, OSD = 14ms
|
||||
// Ultra High Resolution OSS = 3, OSD = 26ms
|
||||
const uint8_t oss = 3; // Set oversampling setting
|
||||
const uint8_t osd = 26; // with corresponding oversampling delay
|
||||
|
||||
float T, P; // Variables globales pour la température et la pression
|
||||
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(115200);
|
||||
while(!Serial){;} // On attend que le port série soit disponible
|
||||
delay(5000);
|
||||
Wire.begin(); // Active le bus I2C
|
||||
init_SENSOR(); // Initialise les variables
|
||||
delay(100);
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
int32_t b5;
|
||||
|
||||
b5 = temperature(); // Lit et calcule la température (T)
|
||||
|
||||
Serial.print("Temperature: ");
|
||||
Serial.print(T, 2);
|
||||
Serial.print("*C, ");
|
||||
|
||||
P = pressure(b5); // Lit et calcule la pressure (P)
|
||||
|
||||
Serial.print("Pression: ");
|
||||
Serial.print(P, 2);
|
||||
Serial.print(" mbar, ");
|
||||
Serial.print(P * 0.75006375541921, 2);
|
||||
Serial.println(" mmHg");
|
||||
Serial.println("");
|
||||
|
||||
delay(1000); // Délai d'une seconde chaque mesure
|
||||
}
|
||||
|
||||
/**********************************************
|
||||
Initialise les variables du capteur
|
||||
**********************************************/
|
||||
void init_SENSOR()
|
||||
{
|
||||
ac1 = read_2_bytes(0xAA);
|
||||
ac2 = read_2_bytes(0xAC);
|
||||
ac3 = read_2_bytes(0xAE);
|
||||
ac4 = read_2_bytes(0xB0);
|
||||
ac5 = read_2_bytes(0xB2);
|
||||
ac6 = read_2_bytes(0xB4);
|
||||
b1 = read_2_bytes(0xB6);
|
||||
b2 = read_2_bytes(0xB8);
|
||||
mb = read_2_bytes(0xBA);
|
||||
mc = read_2_bytes(0xBC);
|
||||
md = read_2_bytes(0xBE);
|
||||
|
||||
Serial.println("");
|
||||
Serial.println("Données de calibration du capteur :");
|
||||
Serial.print(F("AC1 = ")); Serial.println(ac1);
|
||||
Serial.print(F("AC2 = ")); Serial.println(ac2);
|
||||
Serial.print(F("AC3 = ")); Serial.println(ac3);
|
||||
Serial.print(F("AC4 = ")); Serial.println(ac4);
|
||||
Serial.print(F("AC5 = ")); Serial.println(ac5);
|
||||
Serial.print(F("AC6 = ")); Serial.println(ac6);
|
||||
Serial.print(F("B1 = ")); Serial.println(b1);
|
||||
Serial.print(F("B2 = ")); Serial.println(b2);
|
||||
Serial.print(F("MB = ")); Serial.println(mb);
|
||||
Serial.print(F("MC = ")); Serial.println(mc);
|
||||
Serial.print(F("MD = ")); Serial.println(md);
|
||||
Serial.println("");
|
||||
}
|
||||
|
||||
/**********************************************
|
||||
Calcul de la pressure
|
||||
**********************************************/
|
||||
float pressure(int32_t b5)
|
||||
{
|
||||
int32_t x1, x2, x3, b3, b6, p, UP;
|
||||
uint32_t b4, b7;
|
||||
|
||||
UP = read_pressure(); // Lecture de la pression renvoyée par le capteur
|
||||
|
||||
b6 = b5 - 4000;
|
||||
x1 = (b2 * (b6 * b6 >> 12)) >> 11;
|
||||
x2 = ac2 * b6 >> 11;
|
||||
x3 = x1 + x2;
|
||||
b3 = (((ac1 * 4 + x3) << oss) + 2) >> 2;
|
||||
x1 = ac3 * b6 >> 13;
|
||||
x2 = (b1 * (b6 * b6 >> 12)) >> 16;
|
||||
x3 = ((x1 + x2) + 2) >> 2;
|
||||
b4 = (ac4 * (uint32_t)(x3 + 32768)) >> 15;
|
||||
b7 = ((uint32_t)UP - b3) * (50000 >> oss);
|
||||
if(b7 < 0x80000000) { p = (b7 << 1) / b4; } else { p = (b7 / b4) << 1; } // ou p = b7 < 0x80000000 ? (b7 * 2) / b4 : (b7 / b4) * 2;
|
||||
x1 = (p >> 8) * (p >> 8);
|
||||
x1 = (x1 * 3038) >> 16;
|
||||
x2 = (-7357 * p) >> 16;
|
||||
return (p + ((x1 + x2 + 3791) >> 4)) / 100.0f; // Retourne la pression en mbar
|
||||
}
|
||||
|
||||
/**********************************************
|
||||
Lecture de la température (non compensée)
|
||||
**********************************************/
|
||||
int32_t temperature()
|
||||
{
|
||||
int32_t x1, x2, b5, UT;
|
||||
|
||||
Wire.beginTransmission(ADDRESS_SENSOR); // Début de transmission avec l'Arduino
|
||||
Wire.write(0xf4); // Envoi l'adresse de registre
|
||||
Wire.write(0x2e); // Ecrit la donnée
|
||||
Wire.endTransmission(); // Fin de transmission
|
||||
delay(5);
|
||||
|
||||
UT = read_2_bytes(0xf6); // Lecture de la valeur de la TEMPERATURE
|
||||
|
||||
// Calcule la vrai température
|
||||
x1 = (UT - (int32_t)ac6) * (int32_t)ac5 >> 15;
|
||||
x2 = ((int32_t)mc << 11) / (x1 + (int32_t)md);
|
||||
b5 = x1 + x2;
|
||||
T = (b5 + 8) >> 4;
|
||||
T = T / 10.0; // Retourne la température in celsius
|
||||
return b5;
|
||||
}
|
||||
|
||||
/**********************************************
|
||||
Lecture de la pression
|
||||
**********************************************/
|
||||
int32_t read_pressure()
|
||||
{
|
||||
int32_t value;
|
||||
Wire.beginTransmission(ADDRESS_SENSOR); // Début de transmission avec l'Arduino
|
||||
Wire.write(0xf4); // Envoi l'adresse de registre
|
||||
Wire.write(0x34 + (oss << 6)); // Ecrit la donnée
|
||||
Wire.endTransmission(); // Fin de transmission
|
||||
delay(osd);
|
||||
Wire.beginTransmission(ADDRESS_SENSOR);
|
||||
Wire.write(0xf6);
|
||||
Wire.endTransmission();
|
||||
Wire.requestFrom(ADDRESS_SENSOR, 3);
|
||||
if(Wire.available() >= 3)
|
||||
{
|
||||
value = (((int32_t)Wire.read() << 16) | ((int32_t)Wire.read() << 8) | ((int32_t)Wire.read())) >> (8 - oss);
|
||||
}
|
||||
return value; // Renvoie la valeur
|
||||
}
|
||||
|
||||
/**********************************************
|
||||
Lecture d'un byte sur la capteur BMP
|
||||
**********************************************/
|
||||
uint8_t read_1_byte(uint8_t code)
|
||||
{
|
||||
uint8_t value;
|
||||
Wire.beginTransmission(ADDRESS_SENSOR);
|
||||
Wire.write(code);
|
||||
Wire.endTransmission();
|
||||
Wire.requestFrom(ADDRESS_SENSOR, 1);
|
||||
if(Wire.available() >= 1)
|
||||
{
|
||||
value = Wire.read();
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
/**********************************************
|
||||
Lecture de 2 bytes sur la capteur BMP
|
||||
**********************************************/
|
||||
uint16_t read_2_bytes(uint8_t code)
|
||||
{
|
||||
uint16_t value;
|
||||
Wire.beginTransmission(ADDRESS_SENSOR);
|
||||
Wire.write(code);
|
||||
Wire.endTransmission();
|
||||
Wire.requestFrom(ADDRESS_SENSOR, 2);
|
||||
if(Wire.available() >= 2)
|
||||
{
|
||||
value = (Wire.read() << 8) | Wire.read(); // Récupère 2 bytes de données
|
||||
}
|
||||
return value; // Renvoie la valeur
|
||||
}
|
||||
Reference in New Issue
Block a user