Manual
do
Maker
.
com
Ahá! Parece inovador quando mudando o ângulo de visão, não é mesmo? Legal, mas apesar de ser verdade o conceito de um Arduino como slave para o ESP8266, trata-se apenas do shield WiFi com ESP8266 sobre um Arduino; o Arduino shield desse outro artigo.
Resolvi fazer a chamada desse jeito porque apesar da aplicação estar nas mãos do usuário, diversas pessoas vieram com o chavão "o ESP8266 não precisa de um Arduino". Pessoal do clichê, "hello"! Pesquise no site e encontre mais de 60 artigo sobre ESP8266, com diversos firmwares diferentes. Entenda de vez que quase ninguém mais utiliza o firmware AT no ESP8266, então não é uma novidade que o ESP8266 é independente. Escrevi 2 ou 3 artigos sobre o uso de AT, todos os demais focam na independência do ESP8266 e quando escrevo sobre utilizar o ESP8266 em conjunção ao Arduino, obviamente trata-se de Arduino como slave. E ainda você pode se perguntar se existe razão para isso. Sim, existe, basta pensar o que tem de vantagem no Arduino que seria bom ter no ESP8266:
Fora isso, você ainda tem a vantagem de utilizar um ADC extra em 1V ou 3V3, conforme seleção do pino no shield.
Como agregar isso ao ESP8266? Simplesmente use o shield WiFi sobre o Arduino UNO, por exemplo. Para colocar o shield ESP8266 em modo de gravação, mude os pinos 3 e 4 do DIP switch para ON. Coloquei os pinos 1 e 2 também em ON e utilizei a porta de debug para gravar, ligando um FTDI ao shield. As conexões são simples como em qualquer ESP8266 em que se utilize FTDI:
ESP8266 debug port | FTDI 3V3 |
TX | RX |
RX | TX |
3V3 | VCC |
GND | GND |
Em suma, coloca-se os 4 pinos do DIP switch em ON. Para tirar do modo de gravação, desligue o shield e mude os pinos 3 e 4 para OFF.
Pouco provável que ainda não conheça esse recurso, mas se ainda não utilizou a IDE do Arduino para gravar um firmware no ESP8266, recomendo esse artigo.
Entre outras IDEs, você pode ver a configuração nesse artigo que escrevi para ESP32, mas serve para ESP8266 também.
Coloque os pinos 1 e 2 do DIP switch em ON. Desse modo, o TX do ESP8266 estará conectado ao RX do Arduino. De outro modo, não haverá comunicação direta entre o Arduino e o ESP8266 e esse modo é útil quando em modo debug direto com o ESP8266.
Coloque ambas as seriais em 9600, tanto no Arduino quanto no ESP8266. Depois disso trate toda a lógica de seu programa no ESP8266 e apenas use o Arduino como slave, enviando dados para a serial em forma de comandos. Por exemplo, defina algumas macros:
#define HALL_LAMP_ON 0
#define HALL_LAMP_OFF 1
#define FREEZER_ON 2
#define FREEZER_OFF 3
...
E em seu programa, apenas escreva esse 1 byte pela serial. No Arduino, faça condicionais ou arrays para manipular os bytes advindos da serial e apenas utilize-o para executar os comandos, acionando relés, disparando alarmes etc.
Esse exemplo faz a alternância do estado do LED onboard do ESP8266 para que você tenha um status enquanto analisa a comunicação serial. O primeiro passo para testá-lo é remover o FTDI do pino TX da porta de debug (após ter gravado o firmware) e colocá-lo ao pino 0 do shield. Abra o monitor serial e perceba que com os pinos 1 e 2 do DIP switch em ON, você verá o print na serial. Desligue o shield, troque os estados do DIP switch para OFF novamente e perceba que, apesar do LED estar alternando seu estado ainda, a serial não exibe mais nada, pois o DIP switch fez o isolamento. Teste com esse sketch:
unsigned long firstTime = 0;
int counter = 0;
bool state = false;
void setup() {
Serial.begin(9600);
firstTime = millis();
pinMode(2,OUTPUT);
}
void loop() {
int total = millis()-firstTime;
if (total > 3000){
firstTime = millis();
Serial.println(counter%2);
counter += 1;
state = !state;
digitalWrite(2,state);
}
}
Esse sketch é exclusivamente para o Arduino UNO porque estou utilizando o recurso SerialEvent (peguei do próprio exemplo e adicionei umas 5 ou 6 linhas apenas), que não está disponível para todas as boards. Basicamente, o Arduino lê um evento da seria e trata conforme o resultado, acendendo ou apagando o LED colocado sobre o pino 7.
#define LED_PIN 7
String inputString = ""; // a String to hold incoming data
boolean stringComplete = false; // whether the string is complete
void setup() {
Serial.begin(9600);
pinMode(LED_PIN,OUTPUT);
inputString.reserve(200); // reserve 200 bytes for the inputString
}
void loop() {
// print the string when a newline arrives:
if (stringComplete) {
if (inputString.charAt(0) == '0'){
digitalWrite(LED_PIN,LOW);
}
else{
digitalWrite(LED_PIN,HIGH);
}
// clear the string:
inputString = "";
stringComplete = false;
}
}
void serialEvent() {
while (Serial.available()) {
// get the new byte:
char inChar = (char)Serial.read();
// add it to the inputString:
inputString += inChar;
// if the incoming character is a newline, set a flag so the main loop can
// do something about it:
if (inChar == '\n') {
stringComplete = true;
}
}
}
Após subir o sketch em cada uma das placas, encaixe o shield sobre o Arduino e ligue-o à porta USB ou a um pack de bateria e veja o sincronísmo entre o LED do ESP8266 e o LED do Arduino. Gostou do exemplo?
Esse shield WiFi você encontra na Eletrogate, através desse link, mas sugiro agilidade na aquisição porque parece que o shield foi muito bem aceito e está chegando às últimas peças.
Inscreva-se no nosso canal Manual do Maker no YouTube.
Também estamos no Instagram.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.