Como enviar dados de um sensor para o Blynk app?

Blynk Bridge | Como enviar dados de um sensor para o blynk

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, V1V2. 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:

Como enviar dados de um sensor para o blynk

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!