Les échanges peuvent se réaliser grâce à l’interface série.
ESP01 :
Il convient d’adapter les niveaux logiques entre les deux cartes. En effet le niveau logique de l’ARDUINO étant 5v et celui de l’ESP 3.3v il est nécessaire de réduire la tension dans le sens Arduino->ESP et l’augmenter dans le sens inverse (quoique dans ce sens il semble exister une tolérance).
Idéalement il faut utiliser un « level converter » exemple 3.3V 5V TTL Bi-directional Logic Level Converter For Arduino :
On connectera RX Arduino sur HV/RX et TX Arduino sur HV/TX et RX ESP sur LV/TX et TX ESP sur LV/RX
En l’absence de carte de conversion vous pouvez utilisez deux résistances connectées de la manière suivante
Les valeurs des résistances sont données par le site : https://www.abelectronics.co.uk/tools/resistor-voltage-divider.aspx#
Le meilleur moyen de tester la communication est le sketch exemple suivant fonctionnant avec une carte MEGA :
//-- SERIAL1: RXESP->TX1
//-- TXESP->RX1
void setup() {
// initialize both serial ports:
Serial.begin(9600);
Serial1.begin(9600);
}
void loop() {
// read from port 1, send to port 0:
if (Serial1.available()) {
int inByte = Serial1.read();
Serial.write(inByte);
}
// read from port 0, send to port 1:
if (Serial.available()) {
int inByte = Serial.read();
Serial1.write(inByte);
}
}
Ou avec une carte UNO et un port de communication logiciel :
// Pins
// Arduino pin 2 (RX) to ESP8266 TX
// Arduino pin 3 to voltage divider then to ESP8266 RX
// Connect GND from the Arduiono to GND on the ESP8266
// Pull ESP8266 CH_PD HIGH
#include <SoftwareSerial.h>
SoftwareSerial ESPserial(2, 3); // RX | TX
void setup()
{
Serial.begin(9600); // communication with the host computer
// Start the software serial for communication with the ESP8266
ESPserial.begin(9600);
Serial.println("");
Serial.println("Remember to to set Both NL & CR in the serial monitor.");
Serial.println("Ready");
Serial.println("");
}
void loop()
{
// listen for communication from the ESP8266 and then write it to the serial monitor
if ( ESPserial.available() ) { Serial.write( ESPserial.read() ); }
// listen for user input and send it to the ESP8266
if ( Serial.available() ) { ESPserial.write( Serial.read() ); }
}
ESp12 :
5v donc pas de conversion de signal. RXArduino->TXESP ; TXArduino->RXESP
CH_PD ESP -> 5v et toutes masses entre elles.
Sketch de test à charger dans l’Arduino MEGA :
int inByte;
String sChaine = "";
#define led 13 //-- Témoin LED
void setup() {
Serial.begin(9600);
Serial3.begin(9600);
pinMode(led, OUTPUT);
}
void loop() {
if (Serial3.available()) {
delay(100);
while (Serial3.available()) {
inByte = Serial3.read();
if ((inByte != 13 && inByte != 10 && inByte != 0 )) //&& inByte > 32 && inByte < 123
{
sChaine += char(inByte);
}
}
if (sChaine != "")
{
sChaine.trim();
sChaine.toLowerCase();
Serial.println("Commande=" + sChaine);
delay(100);
sChaine = "";
}
}
//-- Lecture commande saisie à la console
if (Serial.available()) {
delay(100);
while (Serial.available()) {
inByte = Serial.read();
if ( inByte > 32 && inByte < 123)
{ sChaine += char(inByte);
}
}
if (sChaine != "")
{
sChaine.trim();
sChaine.toLowerCase();
Serial3.println(sChaine);
delay(100);
sChaine = "";
}
}
}
Dans l’ESP12 :
#define RedLed 12
#define GreenLed 13
#define BlueLed 15
int inByte;
String sChaine = "";
void setup() {
pinMode(GreenLed, OUTPUT);
pinMode(RedLed, OUTPUT);
pinMode(BlueLed, OUTPUT);
Serial.begin(9600);
//-- Led Bleu = Init Ok
setColor(0, 255, 0);
}
void loop() {
if (Serial.available()) {
delay(100);
while (Serial.available()) {
inByte = Serial.read();
if ( inByte > 32 && inByte < 123)
{
sChaine += char(inByte);
}
}
sChaine.trim();
sChaine.toLowerCase();
//-- Test de la commande
if (sChaine.equals("rouge"))
{
setColor(0, 0, 255);
Serial.println("rougeok");
}
else if (sChaine.equals("vert"))
{ setColor(255, 0, 0);
Serial.println("vertok");
}
else if (sChaine.equals("bleu"))
{ setColor(0, 255, 0);
Serial.println("bleuok");
}
else
Serial.println(sChaine);
sChaine = "";
delay(100);
}
}
void setColor(int red, int green, int blue)
{
analogWrite(RedLed, red);
analogWrite(GreenLed, green);
analogWrite(BlueLed, blue);
}
Ce Sketch allume la LED en rouge, bleu ou vert de la carte ESP en saisissant une commande dans la console de la carte MEGA
Références :
https://learn.sparkfun.com/tutorials/bi-directional-logic-level-converter-hookup-guide
http://iot-playground.com/blog/2-uncategorised/17-esp8266-wifi-module-and-5v-arduino-connection
http://www.martyncurrey.com/arduino-to-esp8266-serial-commincation/