Arduino ET ESP8266 - get Wifi

Bonjour à tous,

J'ai automatisé la gestion des conditions météo d'une serre et j'aimerais pouvoir les visualiser sur Internet.

Pour ce faire, j'ai fait l'acquisition d'un module ESP8266 afin que mon Arduino Mega puisse se connecter à Colrysis qui fait office de database + visualisation des données.

Je pensais pouvoir connecter l'ESP8266 tel un simple module mais il s'avère que c'est un vrai petit controleur. La majorité des tuto ne parlent que d'utiliser directement ce controleur et de les connecter à internet et ne parlent pas de comment donner accès à internet à un Arduino combiné à ce module.

Mon problème est qu'ici j'ai besoin de mon Arduino Mega (vu le nombre d'I/O).
Quelle est selon vous la meilleure manière, et surtout la plus simple, pour connecter mon Mega à internet à partir de ce module ?

Le plus simple étant pour moi de pouvoir lancer toutes les commandes directement depuis le Mega

Merci !

Bonjour,
l'ESP1 est fait pour cela, il faut aussi le cas échéant gérer la différence de tension si ton mega fonctionne sous 5 volts

Bonsoir,
merci pour cette réponse.

J'ai donc établi une première connexion serial avec l'ESP1

Les commandes AT fonctionnent bien si je fais attention à passer en baud 115200.

Seulement les commandes serial fonctionnent bien quand elles sont directement envoyée par le serial, si j'essaie d'intégrer le code pour une communication automatisée, cela ne passe plus :

#include <SoftwareSerial.h>
SoftwareSerial ESP8266(15, 14);// 1st point is Rx connection, second point is Tx connection
String NomduReseauWifi = "baudelre"; // Name of Wifi server
String MotDePasse      = "cestunsecret"; // Name of password
/****************************************************************/
/*                             INIT                             */
/****************************************************************/
void setup()
{
  Serial.begin(9600);
  ESP8266.begin(115200);  
  envoieAuESP8266("AT+CIOBAUD=9600"); // modify the baud rate of the Wifi (which can be 115200 instead of 9600)
  recoitDuESP8266(4000);

  ESP8266.begin(9600);  
  initESP8266();
}
/****************************************************************/
/*                        BOUCLE INFINIE                        */
/****************************************************************/
void loop()
{
   while(ESP8266.available())
   {    
     Serial.println(ESP8266.readString());
   }   
}
/****************************************************************/
/*                Fonction qui initialise l'ESP8266             */
/****************************************************************/
void initESP8266()
{  
  Serial.println("**********************************************************");  
  Serial.println("**************** DEBUT DE L'INITIALISATION ***************");
  Serial.println("**********************************************************");  
  envoieAuESP8266("AT+RST");
  recoitDuESP8266(2000);
  Serial.println("**********************************************************");
  envoieAuESP8266("AT+CWMODE=3");
  recoitDuESP8266(5000);
  Serial.println("**********************************************************");
  envoieAuESP8266("AT+CWJAP=\""+ NomduReseauWifi + "\",\"" + MotDePasse +"\"");
  recoitDuESP8266(10000);
  Serial.println("**********************************************************");
  envoieAuESP8266("AT+CIFSR");
  recoitDuESP8266(1000);
  Serial.println("**********************************************************");
  envoieAuESP8266("AT+CIPMUX=1");   
  recoitDuESP8266(1000);
  Serial.println("**********************************************************");
  envoieAuESP8266("AT+CIPSERVER=1,80");
  recoitDuESP8266(1000);
  Serial.println("**********************************************************");
  Serial.println("***************** INITIALISATION TERMINEE ****************");
  Serial.println("**********************************************************");
  Serial.println("");  
}
/****************************************************************/
/*        Fonction qui envoie une commande à l'ESP8266          */
/****************************************************************/
void envoieAuESP8266(String commande)
{  
  ESP8266.println(commande);
}
/****************************************************************/
/*Fonction qui lit et affiche les messages envoyés par l'ESP8266*/
/****************************************************************/
void recoitDuESP8266(const int timeout)
{
  String reponse = "";
  long int time = millis();
  while( (time+timeout) > millis())
  {
    while(ESP8266.available())
    {
      char c = ESP8266.read();
      reponse+=c;
    }
  }
  Serial.print(reponse);   
}

Je me suis basé sur ceci

https://www.les-electroniciens.com/videos/arduino-ep16-installation-du-module-wifi-esp8266

Je ne comprend pas pourquoi cela ne fonctionne plus : je n'ai aucune réponse de la part du ESP.
As-tu une idée du pourquoi ?
Pour infomration, ici le Rx est placé sur la pin 15 et le Tx sur la pin 14 (contrairement aux commandes direct où c'était placé respectivement sur les pins 0 et 1)

Merci pour toute aide !

Bonsoir

Je me suis basé sur ceci

https://www.les-electroniciens.com/videos/arduino-ep16-installation-du-module-wifi-esp8266

Je ne comprend pas pourquoi cela ne fonctionne plus : je n'ai aucune réponse de la part du ESP.

Cet article néglige deux données importantes fournies par Espressif, fabricant de la puce ESP8266

  1. un ESP8266 en WIFi a par moment besoin d'un courant d'alimentation dépassant les 300mA, valeur qu'il est impossible d'obternir sur une sortie 3,3V de carte UNO ou MEGA

  2. il n'est pas garantit par Espressif qu'un ESP8266 accepte longtemps un niveau 5V sur son entrée Rx
    si ça lâche il ne faut pas se plaindre ..... même si pour d'autres ça a tenu !

L'article cité est un exemple de montage qui peut "tomber en marche' un certain temps , puis cesser de fonctionner par non respect des consignes du fabricant. ... d'où peut être le 'ça ne fonctionne plus'

Les montages fiables associant une puce ESP8266 et une carte 5V (Uno, Mega...)
-ajoutent un régulateur 3,3V 500 mA pour alimenter correctement l'ESP8266 en fonctionnement WiFI
-ajoutent une adaptation de niveau pour que l'entrée RX de l'ESP8266 ne reçoive pas plus de 3,3V

De plus SofwareSerial à 115200 bauds n'est pas fiable.
Pourquoi fragiliser la liaison série Mega/ESP en passant par SoftwareSerial alors de la carte Mega possède plusieurs 'vrais ' ports série ?

Finalement associer, de manière fiable, un ESP8266 à une carte UNO ou MEGA n'est pas aussi simple que ça... et comme en plus ça 'bride' l'ESP8266 en firmware AT... il n'est pas étonnant que nombre d'utilisateurs qui passsent aux ESP9266 et ESP32 "en solo'

Un tutoriel,de J-M-L , sur ce forum montre une association Mega + ESP01 dans les règles de l'art
https://forum.arduino.cc/index.php?topic=501923.0

Merci pour ta réponse.

En effet, j'ai pu remarquer que c'était risqué dû aux problèmes d'alimentation et de tension pour la communication serial.

Cependant si ca marche avec la commande direct dans le panneau serial à partir de mon IDE, cela devrait aussi fonctionner par le biais de la loop Arduino. Or, ce n'est pas le cas.

Etrange...

Merci pour le tuto, je m'y penche dessus

Y a-t-il une manière plus simple d'envoyer des données sur internet que par ESP8266 ?

La discussion Serial fonctionnant très bien, cela ne vient sans doute pas des problèmes d'alimentation mais plutot du code.

Quelqu'un a-t-il une idée de quelle serait la source du problème ?

Bonne journée,

Bog

Finalement, j'ai oublié les commandes AT et je pars tout desuite sur la libraire WIFIEsp.
Cela fonctionne sans soucis pour le moment même si ce n'est pas l'idéal cette comm 3.3V <-> 5V.

Je suis confus cependant sur la communication a entreprendre pour envoyer les informations sur une database en ligne (INFLUXDB)

J'essaie de réutiliser le code fourni dans la librairie WifiEsp pour envoyer des datas en ligne

En l'adaptant à mon cas où je souhaite envoyer un post de ce type en curl :
curl -i -XPOST 'https://corlysis.com:8086/write?db=Vertical Farm' -u token:Secret --data-binary "meas_test,place=garden value=20.64"

Voilà ce que j'introduit comme code ( basé sur le forum arduino uno - Problem with sending a POST request using the WiFiEsp library - Arduino Stack Exchange
L'exemple présenté :

if (client.connect(server, 80)) {
  Serial.println("Connected to server");
  // Make the HTTP request
  int value = 2.5;  // an arbitrary value for testing
  String content = "{\"JSON_key\": " + String(value) + "}";
  client.println("POST /some/uri HTTP/1.1");
  client.println("Host: things.ubidots.com");
  client.println("Accept: */*");
  client.println("Content-Length: " + String(content.length()));
  client.println("Content-Type: application/json");
  client.println();
  client.println(content);
}

Mon adaptation ci-dessous :s
Je capte pas du tout cette communication donc cela va peut-être vous sembler absurde.
Quelqu'un peut il me dire à quoi correspond "/some/uri HTTP/1.1"?

server= https://corlysis.com:8086/write?db=Vertical Farm 

if (client.connect(server, 8086)) {
  Serial.println("Connected to server");
  // Make the HTTP request
  temperaturevalue = 2.5;  // an arbitrary value for testing
  String content = "{\"temperaturevalue=": " + String(value) + "}";
  client.println("POST /some/uri HTTP/1.1");
  client.println("Host:https://corlysis.com:8086/write?db=Vertical Farm");
  client.println("Accept: */*");
  client.println("Content-Length: " + String(content.length()));
  client.println("Content-Type: application/json");
  client.println();
  client.println(content);
}

Est-il possible également d'envoyer plusieurs informations au sein d'un même message ? Tel que information de T° (telle que "temperature"= temperaturevalue; "humidité"=humidityvalue )