Einfachste Übertragung einer Zahl (0-9) von Nano auf Uno?

Hallo,
eigentlich wohl ne ganz einfache Frage, leider nicht für einen Unerfahrenen wie mich:
Bei mir sammelt ein NANO ein paar Sensordaten ein und berechnet daraus einen Status mit einem von max. 10 möglichen Werten, also 0 bis 9. Diesen numerischen Wert soll er nun bitte auf möglichst einfache Weise an den daneben befindlichen UNO übermitteln.

Geht das am einfachsten mit der oft erwähnten kreuzweisen Rx/Tx Verbindung zwischen den Boards, die Pins habe ich hierfür per Design freigehalten?
Die Rahmenbedingungen sind denkbar einfach und alles andere als zeitkritisch:
Der NANO kann frühestens nach eine Minute einen neuen Statuswert senden, es kann aber auch vorkommen, dass sich über Stunden der Status nicht ändert, also findet auch keine neue Übertragung statt. Der UNO dagegen, der entsprechend der Statusmeldung die Aktoren steuert, fragt ca. einmal pro Minute ab, ob was Neues angekommen ist: wenn nicht, dann nicht.

Bitte, falls jemand ein Beispiel für so eine Lösung in seinen Archiven hat, es fiele bei mir auf sehr fruchtbaren Boden :smiley:
Schon jetzt vielen Dank und viele Grüße,
Ralf

Ich hab's befürchtet: an beiden Modulen hängen bereits Displays am I2C, wird durch die Rechnerverbindung über die gleiche Schnittstelle die Sache wieder komplizierter?

Dann nimm serial per SoftwareSerial oder Funk.

Was heißt daneben? mm, cm, Meter oder km? Weil wenn nur ein paar cm, frage ich mich gerade wozu der ganze Aufwand mit 2 Microcontrollern? Reicht für die Aufgaben nicht auch einer?

Ja.
Wenn Du nur auf einem senden und auf einem empfangen willst, ohne ACK braucht es sogar nur eine TX -> RX Verbindung und GND.
Fertig.

den Sensor gleich am UNO anschließen und den NANO für etwas anderes nutzen.
Das ex NANO LCD mit einer anderen I2C Adresse ausstatten und auch am UNO anschließen.

"Der UNO hat zu wenige Pins" ... erweitere mit einem I2C Portexpander
"Der UNO hat keinen Speicher mehr" ... zeige beide Sketche, dann findet sich sicher auch eine Lösung.

Genauso ist es! Der NANO soll nur eine Zahl in den Buffer des UNO schreiben und sich wieder um seine Sensoren kümmern. Es ist auch sichergestellt, dass der Buffer gelesen wird bevor ein neues Schreiben erfolgt. Der Abstand beider Platinen liegt bei ca. 3 cm,
zwei Drahtbrücken wären daher der absolut geringste Zusatzaufwand.
Der Uno muss sich um alle Interrupts kümmern und bedient auch einige Relais und Aktoren über eine ordentliche Anzahl an Portleitungen (muss ggf. auch für später noch erweiterbar bleiben).

Jetzt brauchte ich nur noch ein paar Zeilen Code und wäre glücklich!
Vielen Dank!

Hallo,

Hausaufgabe durcharbeiten und verstehen lernen.
... kombiniert mit SoftSerial.
Oder mit I2C. Einer Master und der andere Slave.
Musst du wissen was für dich einfacher ist.
Was gern komplett übersehen wird ist, dass die IDE auch für sowas Bsp. mitbringt.

Könnte...
Sender:

#include <SoftwareSerial.h>
constexpr byte rxPin {10};
constexpr byte txPin {11};
SoftwareSerial mySerial(rxPin, txPin);

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start...."));
  mySerial.begin(2400);
}

void  loop()
{
  if (Serial.available())
  {
    char myChar = Serial.read();
    if (myChar >= '0' && myChar <= '9')
    {
      mySerial.print(myChar);       // Variante 1: versendet das ZEICHEN
      mySerial.print(myChar - 48);  // Variante 2: versendet den Wert
    }
  }
}

Empänger:

#include <SoftwareSerial.h>
constexpr byte rxPin {10};
constexpr byte txPin {11};
SoftwareSerial mySerial(rxPin, txPin);

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start...."));
  mySerial.begin(2400);
}

void  loop()
{
  if (mySerial.available())
  {
    byte myByte = mySerial.read();
    // Variante 1:
    Serial.print(char(myByte));       // Variante 1: zeigt das ZEICHEN
    // Variante 2:
    Serial.println(myByte);           // Variante 2: zeigt den Wert
  }
}

Nur die jeweiligen Softwareserialpins anpassen.
Auf dem Sender kannst Du dann im SerialMonitor einen Wert eingeben.
Der muss dann auf dem anderen wieder raus kommen...
Bitte dazu selbst die entsprechende Variante auswählen und die andere auskommentieren!

Wenn ich keinen ernsthaften Fehler gemacht habe, sollte das gehen...

1 Like

Serial, I2C - finde ich ein wenig übertrieben für das Problem.

Ein Draht und etwas Port-Wackelei mit einem Format analog zum DCF77-Signal.
Die Pulse müssen ja keine Sekunde lang sein und es müssen auch nicht 60 sein. Startkennung, vier "Bit" und Endekennung reichen.

oder eine Arduino Mega nehmen, wenn Portpins Mangelware sind.

Das finde ich eher overdone, also Fahrrad neu zu erfinden. Aber wenn es Spaß macht, ...
Nur ob der TO Spaß daran hat, das zu implementieren, wage ich zu bezweifeln.

Gruß Tommy

Ich fände übertrieben, die serielle Übertragung eines Bytes nochmal neu zu erfinden.

Wenn ich den Anfang richtig verstanden habe, wird der Status nur bei Änderung übertragen. Das macht es etwas komplizierter als unbedingt nötig.

Ich sollte vielleicht noch etwas erklären: bei mir liegen inzwischen ca. 10 Breadboards mit Unos und Nanos herum, jedes für eine "Spezialanwendung" bestückt, mit der das Hndling und die Auswertung verschiedener Sensoren im Laufe des letzten Jahres hobbymäßig untersucht wurden, daher kam ich bislang auch über leicht modifizierte Beispielsketches nicht hinaus. Daneben hab ich auch noch eine Kiste mit original verpackten Modulen aus Italien und China im Bestand, locker 10 Nanos und Unos und ebensoviele verschiedene Displays bis hin zu einem ESP32-Cam, den ich im Handy sehen kann.

Also Hardware ist kein Thema, C++ schon eher. Nach den ganzen Basteleien steht nun aber die Aufgabe an, eine konkrete Anwendung für die Haustechnik innerhalb eines Hutschienengehäuses zu erstellen. Von Sensoren und Aktoren kommt im Schaltkasten ein unterarmdicker Kabelbaum an, den es über Klemmleisten und Interfaces mit den Controllern zu verbinden gilt - auch noch ein Thema für sich...

Und ja, ich mache - wie empfohlen - gerade die seriellen "Hausaufgaben", bin aber dennoch dankbar für das Codebeispiel von my_xy_project, auf dem ich aufbauen werde DANKE! :grinning:

Dass es natürlich für eine solche "Aufgabe" unterschiedliche Lösungswege geben wird, war eigentlich absehbar und jeder hat hier - basierend auf seinen eigenen Erfahrungen, auch ganz eigene Lösungsvorschläge (bis hin zum DCF77-Protokoll), auch dafür vielen Dank!
Wie gesagt, es gibt nun eine Reihe von Hausaufgaben zu lösen, Langeweile hab ich keine und der Fernseher bleibt aus... - es gibt aber definitiv was zu lernen :wink:
Besten Dank in die Runde,
Ralf

Das ist perfekt, genau das, was ich mir gewünscht habe (und fehlerfrei) !!!
Toll, dass es so einfach funktioniert!
Im Moment wird jedoch das Ergebnis immer doppelt auf 2 aufeinander folgenden Zeilen angezeigt, ideal wäre natürlich, dass der Empfangsbuffer nach dem ersten Auslesen gelöscht würde, oder wird der String (Tastatureingabe am Sender) etwa tatsächlich zweimal gesendet? Egal, auch so kann ich natürlich die Empfängersoftware darauf einstellen, dass der zweite (doppelte) Wert ignoriert wird.
Edit: nach dem Auskommentieren (wie empfohlen!) der nicht benötigten Varianten wird jetzt auch nur noch einmal der Character 0-bis 9 übertragen - traumhaft!

So langsam fangen die Arduinos an Spaß zu machen - das Wochenende ist gerettet!
Ich schicke auch gerne eine Packung Merci (aber nicht nach China)... :smiley:

Beste Grüße,
Ralf

1 Like

Der TO hat es doch schon längst herausbekommen…
Hat er doch geschrieben.

2 Likes

Sehr schön.
Freut mich für Dich und herzlich willkommen in den Untiefen des ArduinoUniversum.

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.