Acabei de ver a necessidade em um grupo. Pode ser que, apesar de relatado nesse outro artigo, ainda não tenha ficado claro como enviar dados de um sensor para o Blynk no smartphone. Por essa razão, resolvi colocar mais um exemplo, bem direto agora, mas não se esqueça que sempre é possível pegar um exemplo no site oficial.
Como o Blynk funciona?
Vamos tentar idealizar o funcionamento do Blynk. Se você tem algum conhecimento de MQTT, fica mais fácil ainda. Aqui no site tem “diversos” artigos a respeito, pode digitar no Google “MQTT dobitaobyte” e divirta-se.
Basicamente a comunicação se dá através de um broker; o broker é apenas um intermediário, um concentrador de mensagens. O que sua MCU manda para lá, pode ser lido por qualquer outro dispositivo ou pelo app do Blynk.
O MQTT é um protocolo M2M (Machine to Machine). A grande sacada do Blynk é que ele usa um token; todos que estiverem usando aquele token, tem acesso às mesmas informações. Daí no app ou no programa da MCU resta manipular essa informação.
Quando se usa Blynk, é possível trabalhar de duas maneiras; o programa da MCU pode enviar periodicamente (através de timer próprio, “sempre”) ou o programa da MCU pode enviar quando for requisitado através de um pino virtual. Vamos ver como o dispositivo ficaria enviando esses dados periodicamente.
Enviar dados de um sensor para o Blynk
Como citado anteriormente, o processo deve acontecer através de um timer, para não ser desconectado do servidor. Abaixo, o código de um sensor bmp280 enviando a temperatura para o broker. No caso, o broker foi configurado localmente, e como vantagem tenho 100.000 de energia para os projetos.
#include <Wire.h> #include <Arduino.h> #include <WiFi.h> #include <WiFiClient.h> #include <BlynkSimpleEsp32.h> #include <string.h> #include <Adafruit_Sensor.h> #include <Adafruit_BMP280.h> #define BLYNK_PRINT Serial #define BLYNK_DEBUG 1 Adafruit_BMP280 bme; //instância do bmp280 BlynkTimer timer; //timer do blynk para enviar periodicamente a temperatura float f_temp = 0.0; //armazenador global da temperatura char auth[] = "seu_token_aqui"; //endereço do servidor local #define SRV IPAddress(192,168,1,2) char ssid[] = "seu_ssid"; char pass[] = "sua_senha"; //task do ESP32 para controlar o blynk void vTaskBlynk(void *pvParameters){ while (true){ Blynk.run(); timer.run(); delay(100); //se não colocar delay, a MCU será totalmente ocupada e reiniciará } } void teste(){ String s_temp = String(f_temp); //se quiser converter float p/ string Serial.println(s_temp); Blynk.virtualWrite(V1,f_temp); //pino virtual V1 uint8_t relay_1 = digitalRead(25); //le estado dos relés uint8_t relay_2 = digitalRead(32); //... if (relay_1 < 1){ //logica invertida Blynk.virtualWrite(V0,1); //.ligado, se for 0 } else{ Blynk.virtualWrite(V0,0); } if (relay_2 < 1){ Blynk.virtualWrite(V2,1); } else{ Blynk.virtualWrite(V2,0); } } void setup() { pinMode(25, OUTPUT); pinMode(32,OUTPUT); digitalWrite(25,HIGH); //logica invertida digitalWrite(32,HIGH); // Debug console Serial.begin(115200); Serial.println("###################"); delay(5000); if (!bme.begin(0x76)){ Serial.println("BMP280 isn't started. locking here."); while (true); } Blynk.begin(auth, ssid, pass,SRV,8080); timer.setInterval(2000L, teste); //1 temp a cada 2 segundos delay(2000); xTaskCreatePinnedToCore(vTaskBlynk, "vTaskBlynk", 10000, NULL, 0, NULL,0); //inicia a task } void loop() { //leitura periódica de temperatura para a variável global f_temp f_temp = bme.readTemperature(); delay(999); }
Configurar o app Blynk no Smartphone.
Nesse código, está claro que tem um timer na MCU, enviando dados para os pinos virtuais V0, V1 e V2. Desse modo, basta adicionar seu widget desejado e na configuração do pino adicionar Virtual e o pino correspondente para ler o dado enviado. E pode ter mais de um widget lendo o mesmo pino virtual, sem problemas:
Os estados dos pinos dos relés são lidos lá na MCU e conforme o resultado uma informação é enviada para o broker no tópico V0 e V2.
No gráfico estão sendo plotados os valores da leitura do sensor. Poderia ser qualquer sensor, poderia ser analógico, não importa. Seu código continua sendo o mesmo, apenas adiciona-se a manipulação do resultado desse sensor.
Talvez o artigo tenha ficado meio parco, mas acredito que seja informação suficiente para tirar aquela primeira dúvida quem vem na cabeça quando não estamos habituados à uma novidade específica.
Até a próxima!
Artigos relacionados
ESP32 Modem Sleep
Funções lambda no MicroPython
Debug do ESP32 no VS Code com ESP-Prog