Introdução ao ambiente Arduino para o ESP 8266

MC 855 -2017
Prof. Célio Guimarães
Atualizado em 1 jun 2017

ESP8266 Arduino Core Reference:
descreve os pinos de I/O e principais bibliotecas

Instalação da IDE do Arduino no ambiente Linux

A maior parte do que se segue também se aplica aos ambientes Windows e Mac OS.

Configuração da IDE para o ESP 8266

Terminologia e ambiente de programação Arduino

Compilando e gravando um programa (sketch) para o ESP 8266 na IDE do Arduino

  • Clique no ícone do Arduino Deverá carregar um arquivo default xxx.ino
  • Em Tools > Board selecione: Node MCU 1.0 (ESP-12E Module) está bem embaixo da lista
  • Em Tools > Upload Speed selecione: 115200
  • Em Tools > Port selecione USB0 (ou USB1, o que aparecer)
  • Selecione Sketch > Verify/Compile (compila o seu programa - leva ~ 1 minuto na 1a vez)
  • Se não houver erros na compilação, em sketch selecione Upload (vai gravar o binário na flash do ESP) e em seguida disparar a sua execução.
  • Assim que a gravação (upload) terminar (led azul de gravação para de piscar) aperte Shitf-Ctrl-M para abrir a janela do Monitor Serial
    Se você abrir a janela do Monitor Serial antes da gravação terminar ela aborta! e será necessário gravar (upload) novamente (não danifica o hw).
  • selecionando upload diretamente compila e grava o sketch (se não hover erros de compilação);

    O programa "Hello World" do ambiente Arduino: piscar um led

    /*
    blink.ino
    Turns on an LED for one second, then off for one second, repeatedly.
    Most Arduinos have an on-board LED you can control. 
    On the ESP8266 NodeMCU 12E  with serial interface CH340 it is attached to digital pin 16 (common anode(*))
    This example code is in the public domain.
    modified 15 Oct 2016
    */
    #define USERLED 16
    // the setup function runs once when you press reset or power the board
    void setup() { 
    pinMode(USERLED, OUTPUT); // initialize digital pin USERLED as an output.
    }
    void loop() { // the loop function runs over and over again forever
    digitalWrite(USERLED, HIGH);   // turn the LED on (HIGH is the voltage level)(*)
    delay(1000);              // wait for 1000 ms = 1 second
    digitalWrite(USERLED, LOW);    // turn the LED off by making the voltage LOW (*)
    delay(1000);              // wait for a second
    }
    
    (*)a ligação elétrica "common anode" equivale a : Vcc-->resistor-->led-->pino16
    o que faz passar corrente pelo led (acendendo-o) quando o pino 16 é aterrado (LOW).
    Ligações externas de outro(s) pino(s) ligado(s) a led(s), se forem do tipo "common catode", acendem o led
    quando o pino ligado ao led é colocado em HIGH (Vcc). Exemplo:
    pinox-->resistor externo-->led-->terra
    

    Visualizando a janela do Monitor Serial

    Como enviar mensagens para o Monitor Serial

    Se você usa printf para depurar programas em C, esta é a forma equivalente no ambiente Arduino: insira os seguintes comandos no início da função setup():
    Serial.begin(115200); //inicializa o Monitor Serial a 115200 bps
    delay(10); // da um pequeno atraso (10 ms)

    Na função loop() após os comandos digitalWrite(...) escreva o comando apropriado:
    Serial.println("Led foi aceso");
    ou
    Serial.println("Led foi apagado");
    Você verá essas mensagens se alternando a cada segundo no Monitor Serial.

    Instalando aplicações ou bibliotecas de terceiros

    Truques e Armadilhas...

  • Nunca deixe 2 ou mais janelas da IDE abertas. Ao abrir uma nova janela (por exemplo, clicando no arquivo .ino), feche a janela previamente aberta.
  • Se ao fazer upload uma mensagem do tipo "USBx not available" provavelmente o seu sketch estava esperando que outra porta USB estivesse selecionada. Se for o caso selecione a porta correta e digite Shift-Ctl-M para abrir o Monitor Sertial.
  • Se você comete um erro de lógica num programa convencional em C, ele simplesmente aborta após emitir uma mensagem de erro. No Arduino ele emite uma mensagem (ao gerar uma interrupção interna do tipo exceção), mas continua no laço infinito da função loop(), gerando sucessivas exceções!.
  • Sua aplicação em geral estará executando num ambiente rodando em background os protocolos TCP, WiFi e de acesso ao Monitor Serial, e que usam interrupções internamente e é preciso permitir a esse "SO escondido" executar. Por isto é aconselhável colocar como primeiro comando da função loop() a chamada: yield() (e que equivale ao comando delay(0)), para dar chance ao sistema em background de executar. Se houver um laço muito longo na sua aplicação é também conveniente colocar nele chamadas yield() a fim de evitar que ocorram exceções.
  • Pela mesma razão, se, a fim de depurar um programa, você coloca-o num laço infinito em determinado ponto (via comando while(1); ), com o objetivo de evitar que a partir daquele ponto mensagens para o Monitor Serial não sejam exibidas, não vai funcionar: uma exceção é gerada e seu programa continua executando alguns comandos após o comando while(1); !
  • Pela mesma razão, nos exemplos a serem vistos usando temporizadores (que na verdade são rotinas de interrupção) é importante que elas sejam o mais curtas possivel e não incluam chamadas como delay() e Serial.print()
  • Pela mesma razão, nos exemplos que veremos de comunicação externa com um Broker MQTT, é fundamental dentro da aplicação ter um comando do tipo client.loop(), além do comando yield().
  • No exemplo que obtem a temperatura e humidade local (via sensor DHT11) e remotamente (em qualquer cidade do mundo), através do site openweathermap.org, é necessário registrar-se no site e obter uma chave (KEY) para ter acesso ao serviço. Você poderá usar a seguine chave e inseri-la na seguinte linha do sketch de demonstração:
     s += \"\$.ajax({url: \"http://api.openweathermap.org/data/2.5/weather?q=Sao Paulo,Brazil&APPID=655524d2ed8ac92981fe9beb514965d4\", crossDomain: true})"; 
    
  • No exemplo que permite acender remotamente um led (e com hardware apropriado um dispositivo elétrico como uma lâmpada, motor, etc), há um script remoto que interpreta um comando na linguagem jquery e que é acessado através de uma URL especial e que parece ser filtrado pelo firewall do IC. O seguinte script externo funciona no IC e foi usado no exemplo:
    \ src="https://code.jquery.com/jquery-2.1.3.min.js\">\"
    
  • Fixando o IP interno do esp8266:
    Normalmente esse IP é dinâmico e obtido via dhcp pelo roteador. Isto é inconveniente se você tem uma aplicação como o Servidor Web do exemplo Lamp Control, que você gostaria que tivesse sempre o mesmo IP. Isto pode ser feito sem reconfigurar o seu roteador, no setup() do seu sketch, com os seguintes comandos:
    WiFi.begin(ssid, password);
      IPAddress subnet(255, 255, 255, 0);  
      WiFi.config(IPAddress(192, 168, 0, 125), 
                  IPAddress(192, 168, 0, 1), subnet); 
    
    onde 192.168.0.1 é o IP do gateway da sua LAN, ou seja do roteador.