Bonjour,
j'ai encore besoin de vos conseils, j'utilise un esp8266 qui transmet les données issues d'un HX711, d'une part, via le Wifi à ThingSpeak, d'autre part, via udp à une base influxdb sur un raspberry local ce qui me permet de disposer de deux dispositifs graphiques d'analyse de mes données indépendants.
Quand je n'utilise que l'une des procédures, ça marche sans problème, mais quand j'utilise les deux, ça plante au niveau de thingspeak de manière erratique, par exemple, 6 heures sans souci puis plus de données ou plutôt la dernière mesure qui se répète.
J'ai tenté d'introduire des fonctions yield de manière à m'assurer que les procédures vont au bout de leur tâche, sans succès.
La solution provisoire consiste à couper l'alim toutes les 6 heures (pendant un quart d'heure au moyen d'un programmateur) ce qui revient à faire un hard reboot. Ça marche mais question élégance...
Voilà la partie de code en question :
void setup() {
Serial.begin(115200);
DS18B20.begin();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(50);
Serial.println("Addresse ip: ");
Serial.println(WiFi.localIP());
Serial.println();
delay(100);
Serial.print("connexion à ");
Serial.println(host);
scale.set_scale();
//scale.tare(); //Remet la balance a zero. Attention à chaque redemarrage il reinitialise la tare
long zero_factor = scale.read_average(); //Get a baseline reading
Serial.print("Zero factor: "); //This can be used to remove the need to tare the scale. Useful in permanent scale projects.
Serial.println(zero_factor);
scale.set_offset(-250794); //fixe le zero (la tare) a partir d'un zero_factor
}
scale.set_scale(calibration_factor); //ajuste la calibration
poidsPrecedent = scale.get_units();
}
void loop() {
//Enregistrement de la temperature
DS18B20.requestTemperatures();
delay(50);
temperature = DS18B20.getTempC(Capteur); // enregistre les températures
//Enregistrement de la pesée
poids = scale.get_units();
Serial.print("Lecture: ");
Serial.print(poids);
Serial.print(" kg");
Serial.print(" calibration: ");
Serial.print(calibration_factor);
Serial.println();
//Enregistrement de la température
Serial.print("temperature : ");
Serial.println(temperature);
if (Serial.available())
{
char temp = Serial.read();
if (temp == '+' || temp == 'a')
calibration_factor += 10;
else if (temp == '-' || temp == 'z')
calibration_factor -= 10;
else if (temp == 's')
calibration_factor += 100;
else if (temp == 'x')
calibration_factor -= 100;
else if (temp == 'd')
calibration_factor += 1000;
else if (temp == 'c')
calibration_factor -= 1000;
else if (temp == 'f')
calibration_factor += 10000;
else if (temp == 'v')
calibration_factor -= 10000;
else if (temp == 't')
scale.tare(); //Remet la balance a zero
}
// Mesure la force du signal de la connexion WiFi (RSSI)
long int rssi = WiFi.RSSI();
if (!client.connect(host, port)) {
Serial.println("erreur de connexion");
Serial.println("attente x sec...");
delay(250);
return;
}
StrPoids = "";
// print RSSI of packet
Serial.print("' with RSSI ");
rssi = WiFi.RSSI();
//Transmission UDP
if ( millis() - previousMillis >= interval) { //interval = 3 minutes
previousMillis = millis();
sendUdp();
}
Renvoi = millis();
// if (poids != 0) { // Elimine les valeurs nulles
if (poids <= (poidsPrecedent - 0.150)) { // si changement brutal de la valeur, remplace valeur aberrante par valeur précédente
poids = poidsPrecedent;
}
if (poids >= (poidsPrecedent + 0.150)) {
poids = poidsPrecedent;
}
// prépare la requête GET à ThingSpeak
String url = "/update?key=";
url += thingspeak_key;
url += "&field1=";
url += String(rssi);
url += "&field2=";
url += String(temperature);
url += "&field3=";
url += String(poids);
// envoie la requête GET au serveur
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
client.stop();
// } // Fin de condition "Elimination des données aberrantes"
delay(postingInterval); //posting Interval = 15 minutes
} // Fin de boucle
//***************************************************************
void sendUdp() {
udp.begin(localport);
String line, grenier; // définit le nom de la série de données
if (poids != 0) { //pour éliminer les valeurs nulles et absentes
line = String("temperature value=" + String(temperature));
Serial.println(line);
Serial.println("Sending UDP packet...");
Serial.print("localport :");
Serial.println(localport);
udp.beginPacket(host2, localport);
udp.print(line);
udp.endPacket();
delay(200);
line = String("poids value=" + String(poids));
Serial.println(line);
// send the packet
Serial.print("localport :");
Serial.println(localport);
Serial.println("Sending UDP packet...");
udp.beginPacket(host2, localport);
udp.print(line);
udp.endPacket();
delay(200);
}
}
Deux pistes possibles, comme je le disais un problème de procédure, les différentes opérations liées à une action ne sont pas achevées que l'action suivante est lancée.
l'autre voie est le timing, les données udp sont envoyées toutes les 3 mn via millis alors que le timing global de l'envoi des données est de 15 mn (via delay)
merci d'avance pour vos coups de main.