Manual
do
Maker
.
com
Claro que atualmente já não é um "jeito novo", mas o Sming é um framework muito agradável para programar. De qualquer modo, esse é um artigo sempre atual, pois trata-se do "imutável C", do nosso dia-a-dia de décadas.
Quem não gosta de novidades certamente deveria escolher uma área mais amena. Sério, se gosta de coisas complexas mas não gosta de mudanças, faça matemática, física ou algo do tipo. Se quer moleza, não faça nada. E, se você é do tipo que ama evolução, vamos falar um pouquinho de uma joia nova que apareceu - o Sming - um framework para ESP8266 que lhe dá uma interface em C++ e um sistema de arquivos. Tem muito mais novidade, recomendo que leia a introdução (muito bem elaborada) feita pelo Pedro Minatel em seu blog. Foi por esse post que tomei ciência da existência dessa belezinha. E olhe só; esse framwork reage a eventos invés de trabalhar no conceito setup()/loop() do Arduino. Isto é, você terá que criar apenas um init() e o resto mostro mais adiante. Nesse artigo trato de implementar um código em uma situação real, que é o controle de duas lâmpadas da minha sala. Isso faz parte da implementação prévia com MQTT broker e client utilizando um Raspberry que nesse momento está monitorando abertura e fechamento da porta (física), assim como abertura do trinco e status de abertura do trinco. Além disso, estou acendendo a lâmpada da minha bancada e ligando/desligando o monitor do Raspberry.
Para essa implementação, dedicarei um ESP-01, que possui apenas 2 pinos de I/O, sendo justamente os que preciso para acionar os 2 relés de um módulo que irá embutido na parede junto com o ESP-01 e a fonte de alimentação, na caixa do interruptor. Como? - Mostro logo mais.
Vamos experimentar juntos? Bem, juntos não dá, mas é como se fosse juntos para mim, que estou escrevendo. Isso porque a cada passo que dou, vou adicionando a experiência nesse post e se você seguir o que está aqui, atingirá os mesmos objetivos.
Para começar, devo preceder dizendo que uso Linux e não tenho como orientá-lo em outra plataforma. Assim sendo, tenha instalado o git (você pode clicar em 'Download Zip' invés de clonar o git do projeto, mas...) e também uma sacola de dependências. Conforme a orientação do próprio projeto, você deve sanar todas as pendências instalando esse conjunto que segue (a libtool-bin está aí, mas eu não instalei):
sudo apt-get install make unrar autoconf automake libtool libtool-bin gcc g++ gperf flex bison texinfo gawk ncurses-dev libexpat-dev python sed python-serial srecord bc git
Se você não quiser uma aventura recomendada ou se for tão ancioso que não aguenta compilar seu próprio SDK do ESP8266, você pode baixar um pronto. Eu peguei um, caso minha compilação não evolua (porque não quero deixar de experimentar de forma alguma), mas eu já tenho um SDK que utilizei para outras compilações como a do MicroPython e a do FreeRTOS. Eis o link para o SDK de 64 bits.
Dependendo do espaço em disco e do objetivo, eu costumo criar em lugares diferentes meus SDK. Esse estou criando no meu home, mas uma boa opção é criar em /opt, que é o lugar certo dentro dos padrões. Se quiser seguir meus passos, use minhas pegadas. Lembre-se que estou fazendo realmente do zero, baixando mais uma vez o SDK do ESP8266 para exemplificar para você como fazer, portanto, pule aquilo que achar devido, mas recomendo o passo-a-passo para seu aprendizado ou apenas diversão.
mkdir ~/Sming
cd ~/Sming
git clone https://github.com/pfalcon/esp-open-sdk.git
cd esp-open-sdk
make STANDALONE=y
Nesse momento você pode ter outras dependências não previstas, apenas supra as necessidades instalando-as. Meu Linux é baseado em Debian, portanto instalo tudo com "apt-get".
Exportar as variáveis de ambiente é uma maneira de colocar o compilador da arquitetura no path do sistema; isto é, criar um caminho transparente para a compilação do firmware. As duas linhas extras são importantes? - Não sei, mas está na wiki do projeto, vou colocar e depois analiso. Tendo transpassado qualquer barreira ou concluindo serenamente os passos anteriores, faça então os exports:
export PATH=/home/djames/Sming/esp-open-sdk/xtensa-lx106-elf/bin:$PATH
export ESP_HOME=~/Sming/esp-open-sdk
export SMING_HOME=~/Sming/Sming
Você concluiu a primeira parte, parabéns! Agora pode seguir para a preparação e compilação do Sming e seus periféricos.
Proceda como nos comandos a seguir.
cd ~
git clone https://github.com/SmingHub/Sming.git
cd Sming/Sming
make
Esse foi o núcleo, mas ainda não é tudo. Você já está no diretório Sming/Sming se nada foi executado além do passo anterior. Conclua com o comando:
make spiffy
Se tiver saído do diretório, apenas retorne a ele antes do comando supracitado.
É bastante provável que esse não seja seu primeiro contato com ESP8266, senão esse post não deveria lhe despertar interesse e portanto, é provável também que você já tenha o esptool.py instalado, mas não posso deixar de passar o processo na ocasionalidade de sua ausência:
sudo apt-get install python-serial unzip
wget https://github.com/themadinventor/esptool/archive/master.zip
unzip master.zip
mv esptool-master /opt/esp-open-sdk/esptool
rm master.zip
O famigerado esptool.py você já acompanhou o processo logo aí acima. Agora o esptool2 é fundamental também, senão a compilação não vai rolar.
No blog do Pedro ele cita claramente essa necessidade, eu simplesmente ignorei pra ver onde ele seria necessário (é um atalho preguiçoso pra provocar o sintoma). Isso é bem simples:
git clone https://github.com/raburton/esptool2.git
cd esptool2
make
export PATH=$PATH:~/Sming/esptool2
cd ../samples/Basic_Blink/
De todo o contruido, o que você utilizará será sempre o diretório Sming, o SDK é para fazer a compilação. Se você seguiu adequadamente todos os passos anteriores, agora já pode compilar um exemplo.
make flash
Esse comando compila e sobe a imagem para o ESP8266 usando a ttyUSB0. Se quiser apenas compilar, elimine o parâmetro 'flash', executando apenas 'make'. Para habilitar o suporte a spiff, passe o argumento para o make. De qualquer modo, o resultado deve ser parecido com isso:
Esse procedimento pode ser todo conferido na wiki do projeto, também fonte desse processo que vos descrevo e até aqui foi onde o Pedro Minatel abordou por seus meios, exemplificando a diferença entre o blink do Arduino e o blink do Sming. Executando 'cat' sobre o cpp do blink, o código visto é exatamente esse:
#include <user_config.h>
#include <SmingCore/SmingCore.h>
#define LED_PIN 2 // GPIO2
Timer procTimer;
bool state = true;
void blink()
{
digitalWrite(LED_PIN, state);
state = !state;
}
void init()
{
pinMode(LED_PIN, OUTPUT);
procTimer.initializeMs(1000, blink).start();
}
Como você pode notar, o timer executa uma interrupção no estouro do tempo, por isso que não há necessidade de loop(). Também não há necessidade de setup() porque você pode incluir o que quiser em init(), uma vez que a repetição ou chamada de uma função se dará por interrupção.
Para testar, subi o firmware no meu rato de laboratório - o Wemos D1, cuja board foi utilizada também para o teste do MicroPython e FreeRTOS.
Não dará pra colocar tudo o pretendido em um só post outra vez, como os controles do Raspberry que dividi em 2 ou 3 artigos, mas antes de finalizar, gostaria de citar também que bibliotecas que não usam recursos periféricos do hardware do Arduino em muitas vezes, 100% compatíveis. Já algumas bibliotecas contidas nesse "bolo de chocolate".
Já no próximo post vou mostrar algumas das delicias oferecidas por esse framework e com esse próprio código de exemplo já implementarei o controle das lâmpadas da sala com o ESP-01. Não pude deixar de fazer esse artigo porque como tenho exemplificado outros firmwares diferentes, nao podia faltar no meu acervo, apesar de mais uma vez eu reforçar, a novidade veio através do Pedro Minatel. Mas prometo que o diferencial virá em seguida para não ficar parecendo uma kibada!
Inscreva-se no nosso canal Manual do Maker Brasil no YouTube.
Próximo post a caminho!
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.