Embeddedesp8266Programação

Migração de código do MicroPython para Sming

É, caros leitores. Fico triste em informar, mas o MicroPython no ElectroDragon deu continuamente bugs no sistema de arquivos, tendo-o corrompido periodicamente. Não posso afirmar que o problema seja diretamente relacionado com o firmware, mas talvez do firmware relacionado com o ESP12E. Enfim, tenho um NodeMCU mini rodando 24×7 e funcional. Do mesmo modo, o ElectroDragon rodando Sming já há mais de 48 horas. Como eu já tinha um projeto quase finalizado e tive esse problema, estou confiante na migração para C++ e, vejam só, é excelente, mas é necessário conhecer o framework para implementar muitos dos recursos. Vou dando as dicas.

#include <iostream>

Não. Não inclua essa lib porque o firmware não compilará. Muitas funcionalidades estão implementadas diretamente na SmingCore.h e consultar os recursos da lib é bastante simples se você estiver utilizando o NetBeans.

Que recursos nativos estão disponíveis?





Claro que existe a possibilidade de fazer includes e ocasionalmente será necessário, mas para saber o que está disponível nativamente sem consulta online, basta você digitar uma letra qualquer e usar a combinação Ctrl+Space. Isso abrirá um menu com todos os recursos iniciados com a letra escolhida. E você pode fazê-lo com o alfabeto inteiro, se tiver paciência para isso.

Como fazer delay no Sming

Eu nem me dei ao trabalho de consultar como funcionam, mas nativamente você tem 3 tipos de delay disponíveis como função; a delayMiliseconds(ms), delay(t) e delayMicroseconds. Porém eu prefiro escrever uma função de delay por causa do risco de paralizar as tarefas de background relacionadas ao WiFi, o que pode inclusive causar um reset por WDT (Watch Dog Timer). Para isso, escrevo uma função assim:

Criação de arquivos

Essa é matadora. O Sming tem uma função que simplifica o modo de escrita em um arquivo, desse jeito:

Mas se for pelo modo convencional, também tem suas peculiariedades. Algo como:

O objeto do arquivo é do tipo file_t e as flags pode ser observadas como citado anteriormente; comece digitando ‘eFO’ e use a combinação Ctrl+Space para ver as opções. Eu criei uma função de log, deixando o a função assim:

Não testei ainda se o append cria o arquivo caso não exista, mas a flag ‘eFO_CreateIfNoExist’ tem esse propósito.

Reiniciar o ESP8266

Parece um comportamento meio Windows, mas acontece que o programa pode falhar em alguma função. Esse problema se apresentou quando rodando o programa no MicroPython e para retornar à normalidade, se fazia necessário um reset. Como você pode ver na função acima, o reset está na classe System, no método restart. Portanto:

Como saber o que uma classe oferece de recursos?

A combinação Ctrl+LeftClick abre a classe de um include em uma nova aba. O mesmo para qualquer função ou método que você utilizar essa combinação, indo direto para a referência, no segundo caso. Faça um teste utilizando essa combinação sobre o SmingCore.h. Você verá que tudo que está contido nela são includes de recursos do sistema, cujo recursos podem ser comentados para desabilitá-los no firmware, ou ainda, novos recursos escritos por você podem ser adicionados aí.

Listar arquivos

É possível receber entrada do usuário também, assim como no Arduino. Apesar de não ter ainda adicionado essa funcionalidade, já deixei pronto um recurso que utilizava muito no console do MicroPython, que é a listagem de arquivos contida no sistema de arquivos. Provavelmente vou consultar a listagem de arquivos via MQTT.

A listagem de arquivos retorna um vetor de strings, depois é necessário iterar nessa ‘lista’:

Código da migração

No próximo artigo, disponibilizarei no git do parceiro Ye Vesta Home Brewing, nesse link o código de migração do controle de temperatura para um kegerator. Estou fazendo justamente a migração, mas algumas coisas em Python são bem diferentes em C++, por isso uma certa variação no comportamento poderá ser notada.

Nem setup(){} nem loop(){}

No Sming não se utiliza as funções setup() e loop(), mas sim init(). Dentro de init fica a seu critério manter o código em um loop ou finalizar sua execução ao término de uma rotina.




Talvez você tenha reparado a chamade de Serial.println, compatível com Arduino propositalmente. Mas do mesmo modo, é necessário também inicializar a serial, e isso é feito em init():

Documentação oficial

Não encontrei tudo o que precisava lá, uma parte tive que pesquisar dentro das bibliotecas, outras, pesquisando no Google. Mas a grande maioria está disponível nesse link, onde você encontra a documentação feita com Doxygen.

Logo mais termino o código de migração (já atrasado) e conforme avançar o kegerator, vou escrevendo novos artigos.

Inscreva-se no nosso newsletter, alí em cima à direita e receba novos posts por email.

Siga-nos no Do bit Ao Byte no Facebook.

Prefere twitter? @DobitAoByte.

Inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.

Nossos grupos:

Arduino BR – https://www.facebook.com/groups/microcontroladorarduinobr/
Raspberry Pi BR – https://www.facebook.com/groups/raspberrybr/
Orange Pi BR – https://www.facebook.com/groups/OrangePiBR/
Odroid BR – https://www.facebook.com/groups/odroidBR/
Sistemas Embarcados BR – https://www.facebook.com/groups/SistemasEmbarcadosBR/
MIPS BR – https://www.facebook.com/groups/MIPSBR/
Do bit Ao Byte – https://www.facebook.com/groups/dobitaobyte/

Projetos Arduino e Eletrônica – https://www.facebook.com/groups/projetosarduinoeletronica/

ESP8266 BR – https://www.facebook.com/groups/ESP8266BR/

Próximo post a caminho!