Go Down

Topic: Liaison série entre mega et esp8266 (carte Mega + WiFi R3 ATmega2560 + ESP8266) (Read 104 times) previous topic - next topic

hugo580

Bonjour,

Je sollicite vos lumières car je suis bloqué dans un projet d'automatisation.

J'ai acheté une carte Mega + WiFi R3 ATmega2560 + ESP8266 (https://www.banggood.com/fr/Geekcreit-Mega-+WiFi-R3-Module-ATmega2560+ESP8266-32Mb-Memory-USB-TTL-CH340G-p-1205437.html??cur_warehouse=CN).

J'ai besoin de récupérer des données (capteurs de température) de d'ATmega (qui gère les pin) et de les envoyer à l'ESP8266 pour pouvoir ensuite les enregistrer et les consulter par internet.

J'arrive à faire fonctionner chaque module séparément (l'ATmega allume des leds, récupère des températures..., l'ESP8266 se connecte au wifi), j'arrive également à envoyer des données de l'ESP vers l'ATmega via la liaison série mais je n'arrive pas à faire l'inverse (envoyer des données de l'ATmega vers l'ESP).

Après des heures de recherches sur internet, de tutos, etc. je ne trouve pas la solution. :(
Il me semble avoir à peu près compris le fonctionnement des dip switch sans en être totalement certain.
Je place 1, 2, 3 et 4 sur ON et les autres sur OFF. Et le switch sur "RXD3/TXD3".
Si j'ai bien compris, la liaison série "1" permet la communication entre l'ATmega et le PC (via USB) et la liaison série "3" permet la communication entre ATmega et ESP8266 (et c'est cela qui ne semble fonctionner que dans un seul sens).

Voici mes codes que j'ai simplifiés pour essayer d'isoler le problème : 

Sur l'ATmega : 
Code: [Select]
void setup() {

  Serial.begin(115200);
  Serial3.begin(115200);

}

void loop() {
 
  delay(2000);
  Serial3.println("coucou du mega");

}

void serialEvent3() {
  while (Serial3.available()) {
    char inChar=Serial3.read();
    Serial.print(inChar);
   
  }
}


Sur l'ESP : 
Code: [Select]
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>


void setup() {
 
  Serial.begin(115200);

}

void loop() {
  delay(3000);
  Serial.println("coucou de l'ESP");

}

void serialEvent() {
  while (Serial.available()) {
    char inChar=Serial.read();
    Serial.print(inChar);
  }
}


Résultat : j'obtiens des "coucou de l'ESP" toutes les 3s dans le moniteur série mais je n'ai jamais les "coucou du mega".

Merci beaucoup à ceux qui voudront bien essayer de m'aider. 

al1fch

Bonsoir
Quote
je n'arrive pas à faire l'inverse (envoyer des données de l'ATmega vers l'ESP).
Code: [Select]
void serialEvent() {......
J'ai un doute (pas de certitude) sur la possibilité de réception série asynchrone sur ESP8266, ce dernier étant, il me semble,  dépourvu de possibilité d'interruption par arrivée de donnée dans l'UART.

la doc de référence sur Serial sur ESP8266 est içi : https://arduino-esp8266.readthedocs.io/en/2.7.4_a/reference.html#serial

Que se passe -t-il en mettant la boucle while() de réception série (côté ESP8266) dans loop() ?

hugo580

A priori ça devrait être possible car sur la page de description de la carte ils mettent une double flèche pour désigner la communication entre les deux modules.

En mettant dans la boucle while, la compilation ne fonctionne même pas : 
Code: [Select]
ESP_debug:17:22: error: a function-definition is not allowed here before '{' token
   void serialEvent() {



al1fch

Oui la communication série dans le sens ESP8266 -> Mega est possible !!

Je mets juste en doute, côté ESP8266,  la réception asynchrone =  serialEvent()
Je doute (sans certitude) que sur ESP8266 une arrivée de données puisse appeler spontanément la fonction serial.event()

Donner ici le code qui provoque l'erreur à la compilation qui contient une erreur de syntaxe

tester  ça dans loop() :
Code: [Select]
  while (Serial.available()) {
    char inChar=Serial.read();
    Serial.print(inChar);
    }

le Mega2560 devrait recevoir en echo les caractères qu'il a envoyé.

hugo580

Merci !!! 
C'est moi qui avais mal compris, j'avais mis toute la fonction serialEvent() dans loop(), d'où le bug à la compilation !
Ca marche maintenant, j'obtiens bien mon "coucou du mega", merci encore !

al1fch

OK
ceci dit je n'ai peut être pas compris 'intimement' le fonctionnement de serial.Event() ;)

hugo580

A ce que j'ai compris, c'est une fonction qui est appelée automatiquement à chaque fin de passage dans loop s'il y a quelque chose dans le buffer de la liaison série.
Peut-être que cette fonction n'est tout simplement pas reconnue par l'ESP8266.
Je débute alors je ne suis pas vraiment sûr de ce que je dis...

Go Up