Introdução ao ambiente Arduino para o ESP 8266
MC 855 -2017
Prof. Célio Guimarães
Atualizado em 1 jun 2017
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.
- Clique Download na homepage http://www.arduino.org.
- Clique em Linux 64 bits: irá baixar o arquivo compactado:arduino-1.7.11.org-linux64.tar.xz
- Na interface gráfica do Linux clique no arquivo .xz acima, decompactando-o.
- Copie o diretório resultante para a raiz do seu homedir
- Abra o diretório arduino-1.7.11.org-linux64 e clique em install.sh. Pronta a instalação!
Configuração da IDE para o ESP 8266
- Clique no ícone do Arduino
- Selecione File > Preferences e vá para a entrada "Additional Board Manager e entre lá a URL:
http://arduino.esp.com/stable/package_esp8266.com_index.json
- Selecione Tools > Boards > Boards Manager
Na janela aberta entre no campo de busca: esp8266 (deverá ser a última entrada da janela> e
selecione essa entrada
- Aperte o botão Install no canto inferior direito (leva um tempo, pois o arquivo é grande!)
Terminologia e ambiente de programação Arduino
- Programas no ambiente Arduino são feitos em C/C++ (com extensões de funções internas e das bibliotecas incluídas)
- Um programa é denominado sketch e possui extensão .ino
- Todo sketch possui 2 funções básicas, sem parâmetros: setup() e loop(), nesta ordem.
setup() possui comandos de inicialização/configuração de periféricos.
loop() corresponde à função main() de um programa convencional e, como o nome
indica uma aplicação no Arduino executa num laço infinito.
- variáveis globais, #defines, #includes, etc. devem ser colocadas logo no inicio do programa
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
- Antes de fazer upload do seu exemplo certifique-se na IDE do Arduino em Tools -> Port
de que a porta /dev/ttyUSB0 (ou USB1) esteja selecionada senão selecione-a ("ticando no ícone).
- A maioria dos exemplos utiliza o Monitor Serial. Nesse caso tecle Shift-Ctl-M antes de
fazer a gravação (upload) a fim de abrir a janela do Monitor Serial.
- A maioria dos exemplos que veremos usa 115200 como velocidade de saída nessa janela
(se a janela já não estiver com ele selecionado, mude para esse valor no canto direito inferior).
- Logo no inicio da janela os exemplos que utilizam Wifi mostram o andamento da conexão Wifi
(uma sequencia de pontinhos), o ssid sistema Wifi e o IP interno do ESP na rede Wifi (importante anotá-lo em certos exemplos)
- Às vezes você não quer deixar de ver as primeiras saídas no Monitor Serial e que podem ser
perdidas devido ao scroll default da janela. Se for esse o caso, aperte o botão RESET
na plaquinha do ESP a fim de reiniciar o sketch.
No NodeMCU é o botão esquerdo ao lado do conector do cabo micro-USB e aí as mensagens iniciais serão novamente
mostradas no 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
- Suponha que você baixou (em ~/Downloads) uma aplicação newapp.ino e quer testá-la no seu ESP 8266:
- Verifique se possui as bibliotecas requeridas pela aplicação (senão você terá que instalá-las, veja a seguir).
- copie newapp.ino para o diretório ~/Arduino.
- sob a interface gráfica do Linux clique em newapp.ino: a IDE gráfica do Arduino vai pedir para criar um diretório
newapp e vai mover para lá newapp.ino e entrar em modo de edição.
- É comum a aplicação ser disponibilizada pelo serviço github e na página da mesma existe a opção
Clone or Download Zip.
Baixe o arquivo .zip e descompacte-o. No diretório Downloads será criado um diretório com o mesmo nome do arquivo.zip.
Mova-o para o diretório Arduino e a nova aplicação estará pronta para ser testada.
- Muitas vezes a aplicação faz parte de uma biblioteca (library): nesse caso você deve mover o diretório
contendo a aplicação para ~/Arduino/libraries
Existe uma forma mais segura de instalar uma biblioteca a partir do arquivo .zip, pois ela
pode não ter um formato aceitável pelo Arduino: sob a IDE do Arduino selecione:
Sketch -> Include Library -> Add Zip Library
e no diálogo aberto selecione o .zip que você baixou (em ~/Downloads). Se não for um .zip
válido uma mensagem de erro "not a valid zip file" será emitida pela IDE. Uma razão para isto acontecer é se
no diretório raiz da biblioteca, digamos, yourlib_master, não aparecem os arquivos padrão .cpp e .h que
fazem parte da biblioteca, mas else aparecem num subdiretório de yourlib_master (aparentemente permitido
na IDE do Arduino do Windows mas não na do Linux).
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 += \"\
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:
\
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.