Manual

do

Maker

.

com

Arduino shield para ESP8266

Arduino shield para ESP8266

Arduino shield ou ESP8266 shield?

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.

Pare de usar chavões

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:

  • 5 pinos analógicos
  • 11 pinos digitais de propósito geral
  • Nível lógico 5V

Fora isso, você ainda tem a vantagem de utilizar um ADC extra em 1V ou 3V3, conforme seleção do pino no shield.

Gravar no ESP8266

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
RXTX
3V3VCC
GNDGND

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.

Utilize a IDE do Arduino

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.  

Utilize PlatformIO

Entre outras IDEs, você pode ver a configuração nesse artigo que escrevi para ESP32, mas serve para ESP8266 também.

Comunicação entre o Arduino e o shield ESP8266

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.

Comunique-se através da serial

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.

Sketch de exemplo para o ESP8266

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);
  }
}

Sketch de exemplo para o Arduino UNO

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?

Onde comprar

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.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.