Communicatie tussen Arduino en esp8266 Nodemcu

Ik zou me willen verdiepen in de communicatie tussen een Arduino en een ESP8266 Nodemcu.

De bedoeling is om een LED te laten branden die ik met een drukknop kan bedienen, daarnaast moet de waarde van een LDR worden verzonden.

Ik ben nu bezig met de communicatie tussen de Arduino en de ESP8266 Nodemcu. Is het mogelijk om via de library <SoftwareSerial.h> een twee- richtingscommunicatie te verkrijgen, dat ik zowel op de Arduino en op de ESP8266 kan zenden en onvangen? Hieronder mijn code voor beide bordjes. Het resultaat is dat ik in de Serial monitor (mijn geval COM41) van de Nodemcu enkel de waarde te zien krijg en niet de tekst "Waarde binnengekomen op ESP:". Op de Seriele monitor van de Arduino (mijn geval COM42) komt wel te staan "Verstuurd door Arduino:"

De verbinden zijn getripple-checked.

avr asm code:


//Code voor de ESP8266 (Ontvanger)

String incoming;

void setup() {
// Open serial communications and wait for port to open:
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
}
void loop() { // run over and over

if (Serial.available()) {
//Serial.write(Serial.read());
incoming = Serial.read();
Serial.print ("Waarde binnengekomen op ESP: ");
Serial.println (incoming);
}
else {
  Serial.println ("Geen inkomende data....");
}

}

avr asm code:



//Code voor Arduino (Zender)

#include <SoftwareSerial.h>

SoftwareSerial espSerial(5, 6);
String str;
int number;

void setup(){
Serial.begin(115200);
espSerial.begin(9600);
delay(2000);
}


void loop()
{
number = random(100);
Serial.print("Verstuurd door Arduino : ");
Serial.print(number);
Serial.println();
str =String(number);
espSerial.println(str);
delay(1000);
}

Ik begin eerst met een communicatie van Arduino naar ESP8266 en daarna probeer ik de communicatie bidirectioneel te maken. De waarde van de LDr is in een later stadium.

De jacht is mooier dan de vangst....
benleentje

Golden Member

van de Nodemcu enkel de waarde te zien krijg en niet de tekst "Waarde binnengekomen op ESP:"

Dat kan haast niet in de voorbeeld hier staat alles goed en de tekst zou gewoon te zien moeten zijn.
Maak er anders even een println van en maak de tekst wat korter.

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.

Wat is de reden dat je die extra Arduino wilt gebruiken? Die led en zo kan toch direct aan de ESP?

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein

je gebruikt 2 baudrates!

c code:

Serial.begin(115200);
espSerial.begin(9600);

dus de Serial is de USB<->Serieel omzetter van de Arduino, de espSerial is de softwarematige serial op pennen 5 en 6.

de ESP heeft maar 1 seriele poort (Serial) en die zet jij op een andere baudrate!

code:

           arduino                                                     nodemcu

+------------------------------------+                     +---------------------------------------+
|                                    |                     |                                       |
|                                    |                     |                                       |
|      +-----------------------+     |                     |         +----------------------+      |
|      |                       |     |                     |         |                      |      |
|      |              ESPSerial|     |                     |         |                      |      |
|      |              Baud=9600|     |                     |         |     esp8266          |      |
|      |    atmega             +----------------+          |         |                      |      |
|      |                       |     |          |          |         |                      |      |
|      |                       |     |          |          |         |                      |      |
|      |    Serial             |     |          |          |         |      Serial          |      |
|      |    Baud=115200        |     |          |          |         |      Baud=115200     |      |
|      +----------+------------+     |          |          |         +-----------^----------+      |
|                 |                  |          |          |                     |                 |
|                 |                  |          +------------------------------->+                 |
|                 |                  |                     |                     |                 |
|      +----------v------------+     |                     |         +-----------v---------+       |
|      |                       |     |                     |         |                     |       |
|      |      fdti usb-serial  |     |                     |         |    fdti usb serial  |       |
|      |      baud=115200      |     |                     |         |    baud=9600        |       |
+------+-----------------------+-----+                     +---------+---------------------+-------+

Het resultaat is dat ik in de Serial monitor (mijn geval COM41) van de Nodemcu enkel de waarde te zien krijg en niet de tekst "Waarde binnengekomen op ESP:". Op de Seriele monitor van de Arduino (mijn geval COM42) komt wel te staan "Verstuurd door Arduino:"

dit klopt, je krijgt op de Seriele monitor direct te zien wat de arduino zendt. de ESP luistert op dezelfde poort, maar ontvangt het bericht niet, omdat hij op een andere baudrate werkt.
(de ESP heeft een 2e seriele poort,"Serial1" maar die kan enkel zenden)

GMT+1

Op 16 augustus 2020 16:08:05 schreef flipflop:
Wat is de reden dat je die extra Arduino wilt gebruiken? Die led en zo kan toch direct aan de ESP?

Omdat ik we wil verdiepen hoe het een en ander werkt voor een uitbreiding te maken met dit project.

Op 16 augustus 2020 16:09:39 schreef Progger:
je gebruikt 2 baudrates!

Ik heb de baudrates aangepast |:( , de tekst van de ESP ingekort en dit is het resultaat:

De jacht is mooier dan de vangst....

Op 16 augustus 2020 17:41:50 schreef Vovpvi:
de tekst van de ESP ingekort en dit is het resultaat:
[bijlage]

probeer het eens met de arduino losgekoppeld. je zou op zn minst "Geen inkomende data..." verwachten.

als de frequentie niet klopt (van het kristal), kan je ook andere baudrates proberen (4800 en 19200)

GMT+1

Met de Arduino losgekoppeld verschijnt er op COM41 : "Geen inkomde data..."

Ik heb verschillende baudrates getest en nog steeds niet het gewenste resultaat. Wat me wel opvalt is dat bij de Arduino nu wel de lege lijn wordt weergegeven:

De jacht is mooier dan de vangst....
buckfast_beekeeper

Golden Member

Aan levelshift gedacht? Of draait de avr op 3V3? Een weerstandsdeler zou dat moeten oplossen. Een AVR zal 3V3 normaal wel als een hoog zien.

Van Lambiek wordt goede geuze gemaakt.

Levelshift is uitgevoerd met de weerstandjes.

Op de monitor moet toch komen "ESP" ofwel "Geen inkomende data..." ?

De jacht is mooier dan de vangst....

Op 16 augustus 2020 18:44:15 schreef Vovpvi: Wat me wel opvalt is dat bij de Arduino nu wel de lege lijn wordt weergegeven:

er zit ook een 2e PrintLn tussen in je nieuwe screenshot.

draai de Tx en Rx eens om, volgens mij zit het nu zo:

code:

            +------------------------------------------------------------------------------+
            |NodeMcu bordje                                                                |
            |                 +----------------------------------+                         |
            |                 |                                  |                         |
            |                 |          ESP                     |                         |
            |                 |                                  |                         |
            |                 |                                  |                         |
            |                 |      Tx              Rx          |                         |
            |                 |                                  |                         |
van arduino |                 +-------+---------------+----------+                         |
  Tx        |                         |               ^                                    |
   +--------------------------------->+               |                                    |
            |                         |               |                                    |
            |                         |               |                                    |
            |                         v               |                                    |
            |            +------------+---------------+--------------+                     |
            |            |           Rx              Tx              |                     |
            |            |               FTDI                        |                     |
            |            |                                           |                     |
            +------------+-------------------------------------------+---------------------+

dus ziet jouw ESP nooit de boodschap vanaf de Arduino...

GMT+1
buckfast_beekeeper

Golden Member

Op 16 augustus 2020 19:01:15 schreef Vovpvi:
Levelshift is uitgevoerd met de weerstandjes.

[...]

En waar staan die in je schema? Ik zie wel een blokschema maar niet de uitwerking er van.

Van Lambiek wordt goede geuze gemaakt.

c code:

if (Serial.available()) {
//Serial.write(Serial.read());
incoming = Serial.read();
Serial.print ("Waarde binnengekomen op ESP: ");
Serial.println (incoming);
}
else {
  Serial.println ("Geen inkomende data....");
}

Dat gaat in ieder geval niet werken. Telkens wanneer je één byte ontvangt, stuur je over dezelfde seriële verbinding een best wel lange string weg. In plaats van Serial.read() zou je dus espSerial.read() moeten gebruiken, en je ervan vergewissen dat Serial factoren sneller loopt dan espSerial.

Een betere oplossing zou zijn om helemaal niet via seriëel te debuggen, maar bijvoorbeeld via een programmer/debugger of door de waarde op een parallelle bus te zetten om het zo eenvoudig terug te kunnen lezen zonder je seriële verbinding te storen.

Meep! Meep!

De "espserial" zit toch in de arduino(=zender)?

Kan ik überhaupt een seriële verbinding gebruiken om te zenden en ontvangen, dus tweerichtingsverkeer opzetten?

De jacht is mooier dan de vangst....

Zie mijn laatste bericht, seriele poort kan best zenden zonder zijn eigen data terug te lezen.

heb je de Tx en Rx van de nodeMcu al omgedraait?

GMT+1

Testen gaat veel handiger als je een van beide modules aansluit op een gewone PC, via een USB-serial convertertje (kosten 1,-). Zorg dat je ook hier de levels goed hebt. Met bv HTerm weet je zeker dat die kant vd kabel goed is, en kun je debuggen aan de andere kant (Arduino of ESP). Nu heb je 2 onbekenden.

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein

Op 17 augustus 2020 18:50:56 schreef Progger:
Zie mijn laatste bericht, seriele poort kan best zenden zonder zijn eigen data terug te lezen.

heb je de Tx en Rx van de nodeMcu al omgedraait?

Ja, ik heb de Tx en de Rx al gewisseld. Dan krijg ik getallen die de Arduino verzend. Voor de zekerheid:

code:


----------------                -----------------
-           Tx --------->-------- Tx            -
-              -                -               -
-      ESP     -                -    Arduino    -
-              -                -               -
-           Rx --------->-------- Rx            -
----------------                -----------------

Als ik de Rx(ESP8266) verbind met de Tx(Arduino) en de Tx(ESP8266) verbind met de Rx(Arduino) dan is dit het resultaat. De waardes kloppen niet want ik heb in de arduino de random-waarde gewijzigd.

EDIT:
Als ik de Tx van de Arduino aan 0V leg, dan heb ik op de Rx van de ESP8266 via de weerstandjes nog steeds 1,923 VDC staan. Zou dat een oorzaak kunnen zijn?

De jacht is mooier dan de vangst....

Ja, ik heb de Tx en de Rx al gewisseld. Dan krijg ik getallen die de Arduino verzend.

dat was toch de bedoeling?? dan werkt het!

jij stuurt een "2" met de volgende code:

c code:


number = random(5);
str =String(number);
espSerial.println(str);

number is in dit geval decimaal 2.
str zet decimaal 2 (0x02) om in ascii "2"
println voegt een cariage return / linefeed toe. (regeleinde)

dus wat stuurt de arduino:
"2 <CR> <LF>"
pakken we de ascii tabel erbij:
https://commons.wikimedia.org/wiki/File:ASCII-Table.svg
ascii 2 heeft de decimale waarde 51! (hex 31)
"0x31 0x0D 0x0A"

vervolgens leest jouw ESP die 3 bytes en toont ze als integer. dat is niet de bedoeling, want je declareert incoming als string. maak er eens een byte van?

GMT+1

Op 17 augustus 2020 21:05:59 schreef Progger:
[...]
dat was toch de bedoeling?? dan werkt het!

Progger je bent een genie _/-\o_ en ik een domme gans 8)7

Ik heb de code aangepast om de <CR> en de <LF> eruit te halen.
Voor de volledigheid hier de uiteindelijke code.

Ik ga nu proberen om ook getallen van de ESP naar de Arduino te zenden, ik hou jullie op de hoogte. Alvast bedankt voor het meedenken....

[Bericht gewijzigd door Vovpvi op maandag 17 augustus 2020 21:42:58 (36%)

De jacht is mooier dan de vangst....

Het is intussen gelukt om een verbinding te maken tussen een UNO en een MEGA in beide richtingen. Elk bordje heeft een drukknop en een led. Als ik op de drukknop van de UNO druk, dan gaat de led branden bij de MEGA en als ik op de drukknop druk bij de MEGA, dan gaat de led branden bij de UNO. Hieronder de code. Volgende stap is de MEGA (ipv de UNO) aansluiten op de ESP8266 nodemcu om hier ook in 2 richtingen te communiceren.

code:


//Code voor Arduino UNO en Arduino MEGA (beide dezelfde software
/* Arduino UNO pin 10 > Arduino MEGA pin 11
* Arduino UNO pin 11 > Arduino MEGA pin 10
* Drukknoppen op pin 2; zijn naar 0VDC geschakeld (via interne pull-up
* LED op pin 3
* Beide GND met elkaar verbonden
*/
#include <SoftwareSerial.h>
SoftwareSerial ARD_serial(10,11); // recieve pin=10, transmit pin=11
const int Drukknop = 2; // input pin
const int LED = 3; // output pin
void setup() {
pinMode(Drukknop, INPUT_PULLUP);
pinMode(LED, OUTPUT);
ARD_serial.begin(9600); // set baudrate
Serial.begin(9600);
}
void loop() {
// ontvangen
if (ARD_serial.available() > 0) {
byte incomingByte = 0;
incomingByte = ARD_serial.read();
if (incomingByte != -1) {
Serial.print ("Ontvangen : ");
Serial.println(incomingByte);
digitalWrite(LED, incomingByte); // LED on/off
}
}
// zenden
ARD_serial.write(!digitalRead(Drukknop)); // Drukknop inlezen en status
versturen
Serial.print ("Verstuurd : ");
Serial.println(!digitalRead(Drukknop));
delay(250); // delay voor stabiliteit
}
De jacht is mooier dan de vangst....