Manual
do
Maker
.
com
No artigo anterior mostrei a primeira interação do Blynk com ESP32, mas do modo básico, como se estivesse rodando em um Arduino. Nesse artigo vamos ver um pouco mais dos controles do Blynk e escrever um código mais adequado ao ESP32.
Quando cito os controles do Blynk, me refiro à sua interação com o sistema de forma bidirecional. Isto é, tanto do programa na microcontroladora como do aplicativo para smartphone. E é importante citar alguns detalhes para que não haja limitações em sua utilização.
Os pinos virtuais foram criados no Blynk para permitir outros tipos de interação que não apenas levantar ou baixar um pino. Isto é, você pode controlar servo motores ou motores DC, ler dispositivos I2C ou disparar funções declaradas no programa.
O hardware pode enviar dados para os widgets do aplicativo vi pino virtual. Por exemplo:
#Da própria documentação:
Blynk.virtualWrite(pin, "abc");
Blynk.virtualWrite(pin, 123);
Blynk.virtualWrite(pin, 12.34);
Blynk.virtualWrite(pin, "hello", 123, 12.34);
Os pinos virtuais não tem representação física, tenha isso em mente na hora de criar seus widgets.
Para receber dados dos widgets utilizados no dashboard em seu smartphone, usa-se:
BLINK_WRITE(vPIN)
Todos os valores dos pinos virtuais são enviados como strings e não há limitação do tipo de dado que pode ser enviado. Já do lado do hardware, devemos considerar que temos o chamado "tipagem forte". Isto é, números são int's, caracteres são arrays de char etc.
Para interpretar dados vindo como tipos de dados numéricos e strings, temos as funções:
param.asInt();
param.asFloat();
param.asDouble();
param.asStr();
Presumo que não seja necessário explicar os tipo, uma vez que um requisito prévio para a maioria das controladoras é saber programar em C.
Também podemos pegar o dado RAW do buffer param:
param.getBuffer();
param.getLength();
A primeira nota em relação a esse comando é que a documentação relata a necessidade de usar BlynkTimer para evitar a desconexão da microcontroladora do server.
Já supracitado, o comando Blynk.VirtualWrite pode passar diversos tipos de parâmetros e tipos, mas para envio de dados RAW, utilizamos a função Blynk.virtualWriteBinary(pin, buffer, length).
E como é necessário usar o BlynkTimer ao utilizar uma das funções anteriores, no caso de repetibilidade. Desse modo, a biblioteca Blynk não tem suas rotinas interrompidas por uma chamada externa.
Com apenas 1 BlynTimer é possível esquematizar até 16 timers. Se houver gargalo no processamento, os dados não são enfileirados. Isto é, todos os intervalos são ignorados e a função é chamada apenas 1 vez.
O BlynkTimer herda da biblioteca SimpleTimer, portanto é necessário instalar essa biblioteca para que seu sketch compile sem problemas. Mas não se preocupe, ela está disponível no repositório de bibliotecas do Arduino.
Um exemplo de utilização:
...
BlynkTimer timer;
void funcaoTemporizada(){
Blynk.virtualWrite(v2, millis()/1000);
}
void setup(){
Blynk.begin(auth);
timer.setInterval(1000L, funcaoTemporizada);
}
void loop(){
Blynk.run();
timer.run();
}
Isso significa que não adianta criar tasks para uma chamada de virtualWrite, pois o controle está por conta da instância do Blynk.
Essa é uma função chamada cada vez que o dispositivo pega um update do pino virtual vindo do server (ou, do app).
Para ler o dado recebido, utiliza-se:
BLYNK_WRITE(V0)
{
int value = param.asInt(); // pega o valor como int
// param pode conter múltiplos valores e pode ser lido pelo índice:
int x = param[0].asInt();
int y = param[1].asInt();
}
Essa função não pode ser usada em qualquer loop ou função por ser standalone.
Essa função é chamada quando o dispositivo requisitado enviar seu valor corrente do pino virtual para o servidor. Normalmente essa função deve conter o virtualWrite:
BLYNK_READ(V0)
{
Blynk.virtualWrite(V0, newValue);
}
Use esta função quando precisar rodar uma determinada rotina assim que o hardware se conectar à nuvem ou ao servidor privado.
BLYNK_CONNECTED() {
// seu codigo aqui
}
Essa função é chamada cada vez que o aplicativo Blynk se conecta ao servidor.
BLYNK_APP_CONNECTED() {
// Your code goes here
}
Para utilizá-la, primeiramente habilite os seguintes recursos:
O mesmo para o caso de chamar a próxima função.
Função chamada na desconexão com o server.
BLYNK_APP_DISCONNECTED() {
// Your code here
}
A biblioteca deve rodar o mais livre possível para não gerar atrasos na comunicação, desconexão ou resets. Como o ESP32 é dual core e rota um sistema operacional de tempo real, podemos criar uma task, que tem execução assíncrona. Porém, diferentemente de um sketch do Arduino, é necessário gerar um delay mínimo para não ocupar 100% do ciclo da CPU, o que ocasionaria um reset. Um código de exemplo (testado):
#define BLYNK_PRINT Serial
#define BLYNK_DEBUG 1
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
char auth[] = "seu_token";
#define SRV IPAddress(192,168,1,2)
char ssid[] = "SuhankoFamily";
char pass[] = "fsjmr112";
void vTaskBlynk(void *pvParameters){
while (true){
Blynk.run();
delay(100);
}
}
void setup()
{
Serial.begin(115200);
delay(5000);
Blynk.begin(auth, ssid, pass,SRV,8080);
delay(2000);
xTaskCreatePinnedToCore(vTaskBlynk, "vTaskBlynk", 10000, NULL, 0, NULL,0);
}
void loop()
{
}
Utilizando a API do Arduino para ESP32, as tarefas relacionadas aos rádios e o loop são executados no núcleo 1. No código de exemplo, a tarefa está sendo atrelada ao núcleo 0. Se você tem acompanhado os artigos sobre ESP32, já sabe que podemos definir prioridade de tarefas ou que podemos criar tarefas com a mesma prioridade em um mesmo núcleo. Isto é, na maioria dos casos não é um problema utilizar esse núcleo para outras tarefas simultâneas, desde que essa rotina não faça ocupação excessiva do núcleo.
Para adicionar um pino virtual, na construção do seu dashboard adicione um botão. Clique no local em que está escrito PIN. Selecione Virtual e o número do pino virtual, que é precedido pela letra "v". Clique em "Ok". No exemplo estamos utilizando o pino virtual v2.
Selecione Switch para o tipo do botão. Repare nos valores de transação dos pinos. O padrão é mudança de 0 para 1. Se estiver utilizando um relé de lógica invertida, inverta os estados de mudança. Mas esse não é o propósito dos pinos virtuais, apenas estou dando a dica para quando estiver utilizando o pino físico, que está em Digital.
No sketch, deve-se redeclarar a função BLINK_WRITE, como descrito anteriormente. Utilizando o mesmo código funcional acima, ficaria como:
#define BLYNK_PRINT Serial
#define BLYNK_DEBUG 1
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
char auth[] = "seu_token";
#define SRV IPAddress(192,168,1,2)
char ssid[] = "SuhankoFamily";
char pass[] = "fsjmr112";
void vTaskBlynk(void *pvParameters){
while (true){
Blynk.run();
delay(100);
}
}
void setup()
{
Serial.begin(115200);
delay(5000);
Blynk.begin(auth, ssid, pass,SRV,8080);
delay(2000);
xTaskCreatePinnedToCore(vTaskBlynk, "vTaskBlynk", 10000, NULL, 0, NULL,0);
}
BLINK_WRITE(v2){
int pinValue = param.asInt();
Serial.println(pinValue);
}
void loop()
{
}
No exemplo estamos fazendo apenas um print na serial, mas qualquer tratamento seria possível agora.
Qualquer widget pode ser utilizado. Por exemplo, o Terminal, para mandar strings.
Na declaração de pino virtual disposto mais acima, troque o print na serial por virtualWrite:
BLINK_WRITE(v2){
string msg = param.asStr();
Serial.print("From app: ");
Serial.println(msg);
Blynk.virtualWrite(V2, " <- sua msg");
}
Isso exibirá a mensagem vindo do app e devolverá a mensagem seguida do valor " <- sua msg".
Você pode ir ao site de exemplos do próprio Blynk, selecionar os recurso desejados e voi-la!
Ainda pretendo colocar exemplos mais elaborados fazendo uso dos controles do Blynk, vamos ver em uma próxima oportunidade.
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.