Hallöle.
Ich mal wieder mit nem Problem.
Folgender Aufbau: in einem Roboter gibt es ein NodeMCU und einen Arduino Nano.
Aufgabenteilung: NodeMCU empfängt Kommandos von einem Mobilgerät, steuert anhand der Berfehle Motortreiber-> das funktioniert.
Zusätzlich reicht der NodeMCU die erhaltenen Befehle an den Nano per I2C weiter, der steuert einen RGB-Strip entsprechend. Das passiert sekündlich.
Ausserdem liest der Nano von Zeit zu Zeit einen Analogpin aus (da hängt ein Spannungsteiler dran-> Akkuüberwachung) und speichert das Ergebnis.
Wiederum von Zeit zu Zeit (alle paar Sekunden) fragt der NodeMCU den Nano nach diesem Wert- woraufhin der ihn auch sendet.
Das Problem ist: ab und zu scheint sich der I2C-Bus aufzuhängen.
Manchmal (aber nich immer) kommen am NodeMCU Werte an, die der Nano nich gesendet hat, aber oft passiert auf der Leitung einfach gar nix mehr.
Merkwürdig ist: weder der Nano noch der NodeMCU bleiben wirklich stehen- es scheint nur I2C betroffen zu sein....
Da teilweise unrichtige Werte als "AkkuStand" beim NodeMCU ankommen, teilweise auch gar nichts (nach nem Neustart wiederum geht es, erstmal), gehe ich von einem Puffer-Problem (Überlauf oder ähnlich) aus.....
So fragt der NodeMCU den Akkustand ab:
void frageAkku() //******************* Akkustand vom Nano abfragen *********************************
{
Serial.println("Frage Akku ab");
Wire.beginTransmission(18); // Kontaktaufnahme zum Nano
Wire.write(99); // Code 99 senden = Akkufüllstand
Wire.endTransmission(); // und abschicken
Wire.requestFrom(18,1); // Akkufüllstand abfragen, nur ein Byte
while ( Wire.available() )
{
akkuProzent = Wire.read();
Serial.print("Akku: ");
Serial.println(akkuProzent);
String Akku=String(akkuProzent);
// server.send ( 200, "text/plain",Akku);
}
Bis zur ersten seriellen Ausgabe funktioniert es immer.
Die Fahrbefehle werden so an den Nano weiter gereicht (das passiert sekündlich):
void sendeFahren() //********************** Fahrkommando via I2C an Nano senden *************
{
if(nanoTipAlt!=nanoTip) // nur bei neuem Fahrkommando
{
Wire.beginTransmission(18); // Nano hat Adresse 18
Wire.write(nanoTip); // Fahrbefehl weiterreichen
Wire.endTransmission();
Serial.println(nanoTip);
nanoTipAlt=nanoTip;
}
Der Nano handlet die ganze Geschichte so:
void wasEmpfangen()
{
if (Wire.available())
{
byte x = Wire.read(); // Zahl lesen
Serial.print("Kommando: ");
Serial.println(x);
if(x<20)
{
fahrKommando=x;
}
else
{
anFrage=x;
}
}
}
void datenAnfrage()
{
if(anFrage==99)
{
Wire.write(akkuProzent);
Serial.print("Antworte: ");
Serial.println(akkuProzent);
}
}
Der NodeMCU schickt nur Zahlen von 1-99..
Habe ich die serielle Konsole vom NodeMCU offen, sehe ich, wie er offenbar die Anfrage zum Nano schickt.
Meist kommt einige Male die Antwort zurück, dann nicht mehr. Mitunter jedoch eine falsche...
Die Konsole vom Nano zeigt an, dass, so lange es einwandfrei geht, alles funktioniert- aber irgendwann empfängt er offenbar keine Kommandos mehr.
Jemand eine Idee, was da los ist, und wie man das in Griff bekommen kann?