Guten Morgen,
ich komme aus der SPS Welt und habe noch relativ wenig Erfahrung im Umgang mit dem Arduino.
In letzter Zeit habe ich jedoch durch rumprobieren schon einige Dinge erfolgreich umgesetzt.
Ein letztes Puzzleteil fehlt mir allerdings noch. Ich möchte einen Integer Wert vom Arduino Mega auf einen ESP8266 zur weiterverarbeitung senden. Hierfür habe ich ein WeMOS Mega + WiFi R3 ATmega2560 Board, die Dipschalter Stellung ist bekannt, es geht eher um den Code. Ich habe schon stunden bei google verbracht um das mit Serial Read und Write in den griff zu bekommen.
Der Gedanke wäre Beispielhaft vom Mega auf Serial1 eine "99" zu schreiben und diese am ESP8266 auszulesen.
Code Mega_
Serial.write(2);
Code Esp8266:
if (Serial.available() > 0) {
incomingByte = Serial.read();
Serial.println(incomingByte);
Könnt ihr mir hier etwas Hilfestellung geben? ich denke es scheitert mal wieder an den Basics 
Da brauchst du nicht viel googeln.
Die Beispiele dazu findest du auch in den Beispielen der IDE.
a) zu den Basics: da kann man dir helfen, mach mal das Tutorial Serial Input Basics durch. Das erklärt gut wie man Daten über die Serielle Schnittstelle empfängt.
b) Eigentlich, ja eigentlich solltest du was auch immer du vorhast anders machen. Gib die ganze Programm-Logik auf den ESP und nutze den Mega nur mehr als Port-Expander zum Schalten und Einlesen von GPIOs.
Lass den ESP den Mega ansteuern, und nutze I2C zum übertragen der Werte (ESP Master, Mega Slave)
Für die I2C-Kopplung mit einem UNO/Nano habe ich mal ein Beispiel geschrieben.
I2C-Pegelwandler nicht vergessen!
Gruß Tommy
Vielen Dank für die schnellen Antworten...
Das Problem ist, ich habe noch ein Can Shield auf dem Aduino laufen, sowie ein LCD Display. Zwecks Can benötige ich den Arduino.
Ich schreibe auf meinem Mega folgendes:
Serial1.begin(115200);
Serial1.write(A);
auf dem Esp:
if(Serial.available());
webPage += Serial.read()
der Webserver etc. läuft alles leider bekomme ich auf der Website immer nur "-1" was ja soviel ich weiss, "keinen Wert" bedeutet.
Seht ihr hier einen grundlegenden Fehler? Kann ich einfach auf Serial 1 schreiben und auf Serial lesen? Oder muss ich da noch was beachten?
Am Ende soll ein Can Signal per Wifi auf eine SPS übertragen werden, alle anderen Sachen funktionieren bereits, ich muss nur einen Wert (später der Can Wert) "rüber" zum ESP 8266 bekommen.
speedevil:
Zwecks Can benötige ich den Arduino.
Warum soll das Canshield nicht auch am NodeMCU laufen? Außerdem, bei CAN und ESP, würde ich den ESP32 nehmen, der schon mit CAN kommt.
Ich schreibe auf meinem Mega folgendes:
Serial1.begin(115200);
Serial1.write(A);
auf dem Esp:
if(Serial.available());
webPage += Serial.read()
der Webserver etc. läuft alles leider bekomme ich auf der Website immer nur "-1" was ja soviel ich weiss, "keinen Wert" bedeutet.
Seht ihr hier einen grundlegenden Fehler? Kann ich einfach auf Serial 1 schreiben und auf Serial lesen? Oder muss ich da noch was beachten?
zeig mal deine Verkabelung - sowohl als Schaltplan wie auch als Echtbild.
Danke,
da es schon am Arduino selbst funktioniert hat wollte ich hier nichts neues probieren.
Es ist ein Wemos Mega Wifi Board, hier ist der ESP schon mit eingebaut und wird per Dipschalter mit dem Mega verbunden, daher vermute ich das der Fehler eher im Code liegt.
Mittlerweile funktioniert der Datenaustausch, allerdings verzweifle ich nun am nächsten Problem :-D..
Ich lese eine Drehzahl über den Can, dies funktioniert und wird auf dem seriellen Monitor korrekt ausgegeben.
Nun möchte ich diese zum Webserver des ESP8266 schicken, per Serieller Verbindung. Leider funktioniert das nur wenn ich auf die Variable "value" einen festen Wert schreibe. Soblad ich Value = Integer Wert vom Can schreibe, kommt nur eine 0 an.
(/8 kommt daher das mein Drehzahlwert in 0,25 Auflösung kommt...)
Könnt ihr mir helfen?
Mega (Sender zu ESP8266)
//Can
int converted;
void loop()
{
int value= ((converted/8));
Serial.println(value);
// firstByte = höherwertig, secondByte = niedrigerwertig
byte firstByte = byte(value >> 8);
byte secondByte = byte(value & 0x00FF);
Serial3.write(firstByte);
Serial3.write(secondByte);
delay(100); //allows all serial sent to be received together
//Can Daten verarbeiten
if (!mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK) {
for (int i = 0; i < 2; i++) // print the data
//Byte A und B tauschen und in Integer wandeln
{
byte a = (canMsg.data[0]);
byte b = (canMsg.data[1]);
converted = int(a << 8) + int(b);
}
Lass Dir doch auch mal converted ausgeben.
Gruß Tommy
Habe ich schon, mit Serial Print kommt die korrekte Zahl im Seriellen Monitor.
Wenn ich die Variable fix mit einem Wert beschreibe kommt sie auch an, nur wenn der Wert über die For Schleife kommt dann nicht. Ich denke hier liegt der Fehler. Die For Schleife wird ja immer 0 bis 1 hochgezählt und beginnt neu oder? Wenn der Compiler aus der For Schleife rauspringt was passiert dann in diesem Moment mit den Variablen?
Anbei noch der Code der Empfängerseite (Ohne den ganzen Webserver Teil). Val gibt dann die Drehzahl aus.
byte b1=0;
byte b2=0;
int val;
while(Serial.available() < 2);
b1 = Serial.read();
b2 = Serial.read();
val = int(b1 << 8) + int(b2);
Mit können hat da kaum was zu tun.
Mach zwei kompilierbare Sketche die dein Problem zeigen - reduziert auf das notwendigste aber kompilierbar. Dann wird dir vieleicht jemanden helfen wollen.
Nur mit Codefetzen ist das sinnarm.
while(Serial.available() < 2);
b1 = Serial.read();
b2 = Serial.read();
Da muss man zweimal hinsehen, um zu merken, dass du das vermutlich tatsächlich so haben willst: "Wenn (fast) alles gelesen ist, sich tot stellen." Warum?
for (int i = 0; i < 2; i++) // print the data
//Byte A und B tauschen und in Integer wandeln
{
byte a = (canMsg.data[0]);
byte b = (canMsg.data[1]);
converted = int(a << 8) + int(b);
}
converted wird zweimal gleich berechnet. Warum?
Und was soll der Kommentar "print the data" bedeuten?