Hallo zusammen,
ich habe ein -leider wie im Betreff angedeutet- sporadisches, nicht reproduzierbares Problem mit einem NodeMCU und vermeintlich UDP.read().
Vorab kurz zur Applikation: Bei dem Aufbau kommunizieren 4 NodeMCU mit Labview über UDP. Die 4 Controller erfassen die von 4 HX711-Messverstärkern aufbereiteten Signale von Dehnmessstreifen.
Der Sketch ist folgendermaßen:
/**************************LIBRARIES********************************/
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include "Arduino.h"
#include "HX711.h"
#define calibration_factor 975.0 //This value is obtained using the SparkFun_HX711_Calibration sketch
#define DOUT 0 // HX711 data pin (D3@ NodeMCU)
#define CLK 15 // HX711 clock pin (D8@ NodeMCU)
HX711 hx711(DOUT, CLK); // initialise HX711
/**************************VARIABLES********************************/
const char* ssid = "+++++++++++++";
const char* password = "123456789";
float DMS_value = 0;
char str_DMS[6];
long offset = 0;
// Wifi setting
WiFiUDP Udp;
// Parameters of the PC
IPAddress ip(192, 168, 1, 226); // Destination device IP (PC/Labview)
unsigned int localUdpPort = 90; // Local port to listen on (defined by me) - MASTER
int recPort = 91; // Reciever Port (defined by me) has to be set in Labview
const int UDP_PACKET_SIZE = 7;
byte packetBuffer[UDP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets
char incomingPacket[255]; // buffer for incoming packets
/*******************************************************************
++++++++++++++++++++++++++SETUP++++++++++++++++++++++++++++++++++++
********************************************************************/
void setup()
{
Serial.begin(115200);
// Initialize serial interface
#ifndef ESP8266
while (!Serial); // for Leonardo/Micro/Zero
#endif
Serial.println("---------------------------------------------------");
Serial.println("--- Implementing a HX711 strain gauge amplifier ---");
Serial.println("--- Communication via UDP-protocol ----------------");
Serial.println("--- features: read HX711 values and taring --------");
Serial.println("--- by Labview GUI --------------------------------");
Serial.println();
delay(2000);
// Set Wifi values
Serial.printf("Connecting the ESP8266 to %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println(" connected");
// UDP parameters
Udp.begin(localUdpPort);
Serial.printf("Now sending data from ESP8266 with IP %s & UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort);
Serial.println("Using HX711...");
hx711.set_scale(calibration_factor); //This value is obtained by using the SparkFun_HX711_Calibration sketch
hx711.tare(); //Assuming there is no weight on the scale at start up, reset the scale to 0
}
void loop()
{
DMS_value = hx711.get_units(5);
Serial.println(DMS_value);
dtostrf(DMS_value, 4, 2,str_DMS);
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// +++ Send data to defined port and IP adress (of the PC/Labview) ++++
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
sprintf((char*)packetBuffer,"%s",str_DMS); // set all bytes in the buffer to 0
Udp.beginPacket(ip, recPort);
Udp.write(packetBuffer,UDP_PACKET_SIZE);
Udp.endPacket();
memset(packetBuffer, 0, UDP_PACKET_SIZE);
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// +++ Recieve data from defined port and IP adress (of the microcontroller) ++++
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
int packetSize = Udp.parsePacket();
if (packetSize)
{
Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
int len = Udp.read(incomingPacket, 255);
if (len > 0)
{
incomingPacket[len] = 0;
}
Serial.printf("UDP packet contents: %s\n", incomingPacket);
Serial.println("Taring...");
hx711.tare(); //Assuming there is no weight on the scale at start up, reset the scale to 0
offset = hx711.get_offset();
Serial.printf("New offset: %i\n", offset);
}
}
Ich sende die Messwerte nach Labview (UDP.write) und empfange (über UDP.read) ein "Tastersignal" zum Nullen/Tarieren der 4 DMS.
Das funktioniert auch alles einwandfrei, bis auf folgenden Fall: Ab und zu empfängt der NodeMCU keine Werte mehr, d.h. ich kann keine Werte mehr von Labview zum Controller schicken, meine Messwerte kommen aber immer noch munter weiter. Das bedeutet für mich, dass die UDP-Verbindung noch steht und das Problem auf den Programmteil mit UDP.read() eingegrenzt werden kann...?
Die 4 Controller lassen sich über Stunden korrekt abnullen, dann taucht das Problem plötzlich auf und es lässt sich nichts mehr abnullen. Teilweise ist nur ein Controller betroffen, manchmal zwei, manchmal drei...
Vielleicht noch wichtig: In Labview schicke ich die Befehle (über den Labview-Befehl UDP.write) zum "nullen" auf die unterschiedlichen IP-Adressen der 4 Controller, aber alle auf denselben UDP-Port.
Das Problem kann -schlechte Lösung- über ein Reset des Controllers behoben werden, nach dem Neustart ist wieder alles in Ordnung. Meist für die nächsten Stunden, dann taucht es wieder auf. Leider kann ich keine Regelmäßigkeit erkennen.
Ich hoffe, ich konnte Euch mein Problem verdeutlichen. Vielleicht kann mir der Eine oder Andere auf die Sprünge helfen, oder mir einen Hinweis geben, wie ich das Problem eingrenzen kann.
Ich freue mich über jeden Tipp!
Euch allen schon einmal vielen Dank und wenn es soweit ist- schon einmal ein erholsames Wochenende!
Grüße
Bire