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
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 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)
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
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
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'
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 ?
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"
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 )