#include <stdio.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include "DHT.h"
#define TEMPO_ENVIO_INFORMACOES 5000 //ms
#define DEBUG_UART_BAUDRATE 115200
#define MQTT_ID "" // Device ID
#define MQTT_PUB_TOPIC "wnology/66e9829eec1f59bf1798e4d7/state"
#define MQTT_SUB_TOPIC "wnology/66e9829eec1f59bf1798e4d7/command"
#define MQTT_USERNAME "07fb9596-5699-44fd-8caa-3c99ce90c26d"
#define MQTT_PASSWORD "0faf37996ef4c30eebc38c014721f91b9272ff44a4ee96ef702680c1ed74f2d4"
#define DHTPIN 2
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE);
/* WIFI */
#define WIFI_SSID "Bancadas_01"
#define WIFI_PASSWORD "Kits@801"
//HCSR04 hcsr04(TRIG_PIN, ECHO_PIN, 20, 4000);
WiFiClient espClient;
StaticJsonDocument<1024> doc;
/* MQTT */
const char* broker_mqtt = "broker.app.wnology.io";/* MQTT broker URL */
int broker_port = 1883; /* MQTT broker port */
PubSubClient MQTT(espClient);
/* Prototipos */
void init_wifi(void);
void init_MQTT(void);
void connect_MQTT(void);
void connect_wifi(void);
void verify_wifi_connection(void);
void verify_mqtt_connection(void);
void send_data_iot_platform(void);
char json[100];
/* Funcao: inicializa conexao wi-fi
* Parametros: nenhum
* Retorno: nenhum
*/
void init_wifi(void)
{
delay(10);
Serial.println("------WI-FI -----");
Serial.print("Tentando se conectar a rede wi-fi ");
Serial.println(WIFI_SSID);
Serial.println("Aguardando conexao");
connect_wifi();
}
/* Funcao: conexao a uma rede wi-fi
* Parametros: nenhum
* Retorno: nenhum
*/
void connect_wifi(void)
{
if (WiFi.status() == WL_CONNECTED)
return;
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED)
{
delay(100);
Serial.print(".");
}
Serial.println();
Serial.print("Conectado com sucesso a rede wi-fi: ");
Serial.println(WIFI_SSID);
Serial.print("IP: ");
Serial.println(WiFi.localIP());
}
/* Funcao: verifica e garante conexao wi-fi
* Parametros: nenhum
* Retorno: nenhum
*/
void verify_wifi_connection(void)
{
connect_wifi();
}
/* Funcao: inicializa variaveis do MQTT para conexao com broker
* Parametros: nenhum
* Retorno: nenhum
*/
void init_MQTT(void)
{
MQTT.setServer(broker_mqtt, broker_port);
//MQTT.setCallback(callback);
}
/* Funcao: conecta com broker MQTT (se nao ha conexao ativa)
* Parametros: nenhum
* Retorno: nenhum
*/
void connect_MQTT(void)
{
while (!MQTT.connected())
{
Serial.print("* Tentando se conectar ao broker MQTT: ");
Serial.println(broker_mqtt);
if (MQTT.connect(MQTT_ID, MQTT_USERNAME, MQTT_PASSWORD))
{
Serial.println("Conectado ao broker MQTT com sucesso!");
}
else
{
Serial.println("Falha na tentativa de conexao com broker MQTT.");
Serial.println("Nova tentativa em 2s...");
delay(2000);
}
MQTT.subscribe(MQTT_SUB_TOPIC);// se escreve no topico desejado
}
}
/* Funcao: verifica e garante conexao MQTT
* Parametros: nenhum
* Retorno: nenhum
*/
void verify_mqtt_connection(void)
{
connect_MQTT();
}
/*
JSON a ser enviado:
{
"variable": "nome_da_variavel",
"unit" : "unidade",
"value" : valor
}
*/
void send_data_iot_platform(void)
{
float temperatura_lida = random(20,180);
//float temperatura_lida = dht.readTemperature();
float umidade_lida = random(35,80);
//float umidade_lida = dht.readHumidity();
int i;
if (isnan(temperatura_lida || isnan(umidade_lida))) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
String cjson = "{\"data\": {\"Temperatura\": " + String(temperatura_lida) + ", \"Umidade\": " + String(umidade_lida)+"} }"; // construção do JSON para o envio à plataforma
cjson.toCharArray(json,100);
/* Imprime medicoes de temperatura e umidade (para debug) */
//for (i=0; i<80; i++)
Serial.println(" ");
// Debug das mensagens enviadas para a plataforma
Serial.println("----------");
Serial.print("Temperatura: ");
Serial.print(temperatura_lida);
Serial.println("C");
Serial.print("Umidade: ");
Serial.print(umidade_lida);
Serial.println("%");
MQTT.publish(MQTT_PUB_TOPIC, json); // puclica na plataforma
}
void setup() {
// put your setup code here, to run once:
/* UARTs setup */
Serial.begin(DEBUG_UART_BAUDRATE);
dht.begin();
/* Inicializa wi-fi */
init_wifi();
/* Inicializa MQTT e faz conexao ao broker MQTT */
init_MQTT();
connect_MQTT();
}
void loop() {
// put your main code here, to run repeatedly:
MQTT.loop();
/* Verifica e garante conectividades wi-fi e MQTT */
verify_wifi_connection();
verify_mqtt_connection();
/* Faz o envio da temperatura e umidade para a plataforma IoT (Tago.io) */
send_data_iot_platform();
/* Aguarda o tempo definido em TEMPO_ENVIO_INFORMACOES para o proximo envio */
delay(TEMPO_ENVIO_INFORMACOES);
}