Comunicando o Arduino com o ESP8266 por I2C

Já fui questionado inúmeras vezes a respeito de como fazer a comunicação entre o ESP8266 e o Arduino por serial (UART). Este questionamento é muito comum quando o ESP por algum motivo não consegue atender todos os requisitos de hardware, seja por falta de IO, entrada analógica ou até mesmo um projeto legado.

O que ocorre é que em alguns casos, a comunicação por UART não é viável, como por exemplo quando a UART é utilizada para debug ou outra aplicação.

Tendo em vista que a UART não possa ser utilizada no seu projeto, vou mostrar como usar a comunicação por I2C para enviar comandos entre o ESP8266 e o Arduino.

Comunicação I2C

A interface I2C, ou Inter-Integrated Circuit, é um tipo de comunicação serial, bi-direcional e por barramento, muito utilizada em diversos equipamentos, sensores, displays, memorias e muitos outros periféricos. Usualmente em dispositivos de baixa velocidade e pode operar em vários modos, como master-slave, multi-slave, multi-master entre outros.

O I2C possui duas linhas, uma de dados (SDA) e outra de clock (SCL), . Para o barramento funcionar, é necessário resistores, usualmente de 10k de pull-up na linha de clock e data.

Para saber detalhes de como funciona o I2C, mas recomendo a leitura desse material:

Em Ingles: https://learn.sparkfun.com/tutorials/i2c

Em Portugues: http://www.arduinobr.com/arduino/i2c-protocolo-de-comunicacao/

Utilização

Essa técnica pode ser muito útil em casos onde já exista um projeto Arduino pronto, ou um projeto com o ESP em que mais portas digitais ou entradas analógicas são necessárias. Isso pode reduzir o custo de um projeto ou simplificá-lo.

Comunicação master-slave ou mestre-escravo

Para entender o papel do master (mestre), ele é quem envia os comandos para o slave (escravo) responder. O slave não pode iniciar a comunicação, e sim esperar o master perguntar.

Nesse modo, apenas um master pode existir e cada slave terá um endereço, não podendo repetir esse endereço no mesmo barramento. O endereço pode variar entre 7 a 10bits, o que significa que em um único barramento, pode existir algo entre 128 a 1024 slaves

Para esse exemplo, vou utilizar um Arduino como slave e um ESP8266 (Wemos) como master, onde serão enviados comandos para o Arduino através do ESP8266. Não será possível utilizar o ESP como slave neste artigo.

Existe uma limitação na utilização do ESP8266 como slave, mas não devido ao hardware e sim o firmware. Vou tentar abordar esse tema mais para frente utilizando o SDK com NONOS (desenvolvimento nativo).

Hardware

É importante lembrar que no ESP8266 o nivel logico é de 3.3V e no Arduino é de 5V. Para resolver isso sem o medo de queimar o ESP é usar um level shifter, que faz a conversão do sinal logico entre as duas tensões de trabalho.

No caso do uso de level shifter, os resistores de 10k não são necessários, já que o circuito já possui, conforme o esquema abaixo:

Level Shifter

Abaixo segue o esquema completo de ligação:

Diagrama Esquematico

Codigo

Nesse exemplo, vou mostrar como piscar o LED do Arduino Nano e devolver na resposta do comando o estado dele para que o LED da Wemos também pisque. Se o barramento for desconectado, ambos param de piscar.

Vamos utilizar a IDE Arduino versão 1.8.2 (Linux Manjaro).

Para o lado do master, temos o seguinte código:

E para o slave(s):

 

Vale lembrar que esse é um simples exemplo que pode ser customizado de acordo com a necessidade de cada projeto.

Conclusão

A grande vantagem deste modo, é que a serial pode ser utilizada para o debug da placa sem a necessidade de tratamento dos pacotes de comunicação, além do fato de não ter o inconveniente dos dados que são enviados pela serial no processo de boot do ESP.

Esse método ainda pode ser útil em inúmeros casos e situações, ficando assim mais uma solução na manga no momento do aperto!

Happy Hacking!

9 Comments

  1. Rafael

    Ola Pedro, excelente artigo!

    Vi na net um post que fala que as portas digitais do Wemos Mini são tolerantes a 5v. Recentemente fiz uma comunicação entre ele e um arduino Uno via serial, sem problemas. No caso da comunicação I2C, esse shift level que adicionou entre os dois microcontroladores é realmente necessário?

    Reply
    1. Pedro Minatel (Post author)

      Olá Rafael.

      Nenhuma linha da Wemos é tolerante a 5V, já que usam o ESP8266 sem nenhum nivelamento lógico ou proteção. O ESP até tolera 5V em alguns casos onde a corrente é extremamente baixa, como no caso de comunicação, mas nao e recomendado fazer isso.
      O ideal é sempre usar level shifter para ter uma longevidade do seu módulo, já que em todos os datasheets e manuais a recomendação é não ultrapassar os 3.6V.

      Abaixo segue o link do fabricante da Wemos com o aviso dos 3.3V nas IOs.

      https://wiki.wemos.cc/products:d1:d1_mini
      https://wiki.wemos.cc/products:d1:d1_mini_pro
      https://wiki.wemos.cc/products:d1:d1_mini_lite

      Reply
  2. Paulo Wang

    Caro Pedro. Estou brigando para conseguir fazer a comunicação do esp01 com um Arduino uno. Tentei de várias formas mas ainda não funcionou. Seu código é um pouco diferente do que eu fiz. Mais tarde irei comparar e ver as diferenças.

    Reply
  3. ArmandoBruna Mendes

    Olá Pedro, ótimo post! Gostaria se você poderia me ajudar, estou fazendo meu projeto integrador e gostaria ver se é possível interagir via wireless dois esp8266, um nano arduino com com esp8266 estaria monitorando o nível de água da caixa d’água e outro esp8266 junto ao um display mostraria os valores em um local de fácil acesso. É possível isso?

    Reply
  4. Gustavo Valença

    Parabéns pelo post Pedro, realmente deu pra entender o funcionamento perfeitamente.

    Fiz a automação do meu quarto utilizando módulos relé Wi-Fi com esp8266 + raspberry pi3 controlados pelo iPhone através do aplicativo de voz “Siri” e agora pretendo construir minha residência toda automatizada e gostaria muito da sua ajuda.

    Vi que com o iC2 eu economizo muitos pinos da minha placa o q diminuiria muito o custo com arduínos.

    Pretendo utilizar módulos relés optoacoplacos de 8 e 16 canais + iC2 + NodeMCU (esp12f) controlados através do meu Iphone (Siri) pela raspberry.

    Gostaria de saber se é possível fazer a automação usando essa minha idéia e como eu faria essa comunicação/programação entre o NodeMCU (master) e os módulos relés (Slaves) através do i2c.

    Desde já o meu muito obrigado.

    Obs: esse tema daria um excelente vídeo.

    Reply
  5. Rafael

    Bom dia. Estou entrando em contato apenas para dar os parabéns pelo site e agradecer por todo o conteúdo e ensinamentos agregados. Realmente foi um achado seu site. No meu caso sou um hobista, sem formação na área de tecnologia (a minha formação está em humanas) mas que já a muitos anos utiliza arduino e outras tecnologias a fim de fazer soluções caseiras para minhas necessidades. É raro encontrar um conteúdo tão profundo e com linguagem e explicações acessíveis ao mesmo tempo. Enfim, só resolvi enviar este e-mail pois creio ser importante esse feedback para quem cria o conteúdo. Muitos sabem reclamar, poucos elogiar. Novamente parabéns e faço votos que continue nos propiciando excelentes conteúdos.

    Reply
    1. Rafael

      Ps.: Ali está e-mail pois iria enviar essa mensagem por e-mail. Mas resolvi postar aqui mesmo.

      Reply
    2. Pedro Minatel (Post author)

      Obrigado, Rafael! Espero ajudar a quem quer aprender algo interessante, e vou continuar a publicar sempre que eu posso.

      Muito obrigado!

      Reply
  6. Eduardo Silva Cardoso

    Olá, assim como você sitou essa comunicação é útil para enviar dados do arduino para o ESP quando o mesmo possui uma melhor usabilidade de portas analógicas. Tentei incansavelmente enviar dados adquiridos pelo arduino para ESP8266, porem não consegui, para ser mais especifico estou tentando, enviar a leitura de corrente de um as712.
    Você tem alguma dica de como enviar esse dado via i2C?

    Reply

Deixe seu comentário