Station Météo sous panneau solaire ESP8266 NodeMCU & DS18B20

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

Bonjour

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

Demander au moderateur le déplacement du message au bon endroit (lien Report to moderator)
ET insérer le code entre les balises appropiées. (c'est expliqué dans les messages épinglés)

Ce sous forum est exclusivement résevré à la publication de projets terminés et complets, les question sont à poser dans le forum principal comme l'indiquent les Règles du Forum Francophone.

Un code bien balisé sera dépourvu de signes cabalistiques, de smileys...
Il apparaïtra dans un bloc de ce type

mon code...