Bonsoir ,
Je fais évoluer un peu ma station météo personnel pour la passer de "sur pile" à "sur battery avec charge par panneau solaire".
Il s'agit d'une carte ESP8266 NodeMCU et je me sers ce coup ci pour la temperature d'une sonde DS18B20.
Le tout fonctionne trés bien et je met à jour des dasboard grafana via un serveur Mosquito sur raspberry avec une base influxdb et l'utilisation de nodered comme passerelle.
Je suis heureux ...mais un ptit bug m'énerve. La sonde DS18B20 donne un coup sur deux une mesure fausse à 4095.9 . Aujourd'hui je filtre l'affichage pour pas que ça gène mais du coup ma fréquence de mesure n'est pas celle voulue...
voici mon code complet mais c'est uniquement la partie mesure de DS18b20 qui me pose probème.
Je suis preneur d'un ptit coup de main
merci
bert2713
code /
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#define mqtt_server "xxx.xxx.x.xx"
#define battery_topic "battery"
#define tempi_topic "tempi"
#define pressi_topic "pressi"
#define wifi_ssid "xxxxxxxxxxxxxxx"
#define wifi_password "xxxxxxxxxxxxxxxxxxxx"
#include <OneWire.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>
Adafruit_BMP085 bmp;
WiFiClient espClient;
PubSubClient client(espClient);
int analog =0;
float vout=0.0;
float vin=0.0;
float R1=100000.0;
float R2=10000.0;
int valeur=0;
const int ledPin = 14;
const int DS18B20_PIN=13;
const int DS18B20_ID=0x28;
OneWire ds(DS18B20_PIN);
float DS18B20_temperature;
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883); //Configuration de la connexion au serveur MQTT
pinMode(ledPin, OUTPUT);
Wire.begin(4, 5);
delay(2000);
bmp.begin();
delay(1000);
}
void loop() {
digitalWrite(ledPin, HIGH);
valeur = analogRead(analog);
vout = (valeur * 3.06) / 1024.0; vin = vout / (R2/(R1+R2));
if (vin<0.09) {vin=0.0;}
DS18B20_temperature =getTemperatureDS18b20();
float datapressure =bmp.readPressure()/100;
if (!client.connected()) {reconnect();}
Serial.print ("valeur voltage : "); Serial.println(vin);
Serial.print ("valeur temp : "); Serial.println(DS18B20_temperature);
Serial.print ("valeur pression : "); Serial.println(datapressure);
client.publish(battery_topic, String(vin).c_str(), true);
client.publish(tempi_topic, String(DS18B20_temperature).c_str(), true);
client.publish(pressi_topic, String(datapressure).c_str(), true);
digitalWrite(ledPin, LOW);
delay (300000);
}
//Connexion au r�seau WiFi------------------------------------------
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connexion a ");
Serial.println(wifi_ssid);
WiFi.begin(wifi_ssid, wifi_password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("Connexion WiFi etablie ");
Serial.print("=> Addresse IP : ");
Serial.println(WiFi.localIP());
}
//--------------------------------------------------------------------------------------
//Reconnexion --------------------------------------------------------------------------
void reconnect() {
//Boucle jusqu'� obtenur une reconnexion
while (!client.connected()) {
Serial.print("Connexion au serveur MQTT...");
// si MQTT s�curis� alors (client.connect("ESP8266Client", mqtt_user, mqtt_password)).
if (client.connect("ESP8266Client")) {
Serial.println("connected");
//Une fois connect�, on peut s'inscrire � un Topic
//par exemple : client.subscribe("outTopic/iotTopic")
}
else {
Serial.print("failed, erreur : ");
Serial.print(client.state());
Serial.println("5 secondes avant de recommencer");
delay(5000);
}
}
}
//-------------------------------------------------------------------------------------------
//lecture temperature-------------------------------------------------------------------------------------------
float getTemperatureDS18b20(){
byte i;
byte data[12];
byte addr[8];
float temp =0.0;
//Il n'y a qu'un seul capteur, donc on charge l'unique adresse.
ds.search(addr);
// Demander au capteur de mémoriser la température et lui laisser 850ms pour le faire (voir datasheet)
ds.reset();
ds.select(addr);
ds.write(0x44);
delay(850);
// Demander au capteur de nous envoyer la température mémorisé
ds.reset();
ds.select(addr);
ds.write(0xBE);
// Le MOT reçu du capteur fait 9 octets, on les charge donc un par un dans le tableau data[]
for ( i = 0; i < 9; i++) {
data = ds.read();
}
// Puis on converti la température (*0.0625 car la température est stockée sur 12 bits)
temp = ( (data[1] << 8) + data[0] )*0.0625;
return temp;
}
//------------------------------------------------------------------------------------------------------
/ code