Manual
do
Maker
.
com
É, 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 24x7 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.
Esse artigo é de abril de 2017. Obviamente houve evolução em todas as plataformas, portanto não considere a condição frágil de outrora como atual. Todavia, a migração para C++ é completamente válida.
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.
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.
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:
void sleep(unsigned long interval_ms){
unsigned long initial_time = millis();
unsigned long delta = millis()-initial_time;
while (delta < interval_ms){
delta = millis()-initial_time;
delayMilliseconds(1); //apenas para a CPU 'respirar'
}
}
Essa é matadora. O Sming tem uma função que simplifica o modo de escrita em um arquivo, desse jeito:
fileSetContent(nome_arquivo,var_conteudo);
Mas se for pelo modo convencional, também tem suas peculiariedades. Algo como:
file_t variavel = fileOpen(nome_arquivo, FLAGS);
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:
void logEvent(String msg){
fileSetContent(LOG_FILE,msg);
char data[5] = "";
file_t fileObj = fileOpen(LOG_FILE, eFO_Append | eFO_CreateIfNotExist);
int chk = fileRead(fileObj,&data,1);
if (chk > -1){
Serial.println("Arquivo yevesta.log criado com sucesso");
Serial.println("Reiniciando agora...");
sleep(300);
System.restart();
}
}
Não testei ainda se o append cria o arquivo caso não exista, mas a flag 'eFO_CreateIfNoExist' tem esse propósito.
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:
System.restart()
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í.
É 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':
void listDir(){
Vector<String> files = fileList();
Serial.println("Listando arquivos:");
for (int i=0; i<files.count(); i++){
Serial.println(files.get(i));
}
}
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.
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():
void init(){
Serial.begin(115200);
spiffs_mount();
...
MqttClient mqtt(MQTT_BROKER,MQTT_PORT,onMessageReceived);
}
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 canal Manual do Maker no YouTube.
Também estamos no Instagram.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.