/*
* Lib Arduino;
*/
#include <Arduino.h>
/*
* Lib C;
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*
* FreeRtos;
*/
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"
#include "freertos/queue.h"
/**
* ESP32;
*/
#include "esp_err.h"
#include "esp_log.h"
/*
* Mqtt;
*/
#include "qmqtt.h"
/*
* Lib DHT;
*/
#include "dht.h"
/*
* GPIO de configuração SDA do DHT;
*/
#define DHT_PIN_SDA 17
#define DHT_DELAY_ENTRE_AMOSTRAS 5000 /* ms */
/*
* Define o modelo do sensor DHT a ser utilizado:
* DHT_TYPE_AM2301 -> DHT22
* DHT_TYPE_DHT11 -> DHT11
*/
static const dht_sensor_type_t sensor_type = DHT_TYPE_AM2301;
static const gpio_num_t dht_gpio = (gpio_num_t)DHT_PIN_SDA;
/**
* Função responsável pela recepção das mensagens via MQTT;
*/
esp_err_t event_handler (mqtt_event_t * event)
{
char str[100];
snprintf(str, sizeof(str)-1, "Topico: %.*s, Message: %.*s\n",
event->topic_size,
event->topic_name,
event->message_size,
event->message);
Serial.println(str);
return ESP_OK;
}
void vtask_dht(void *pvParameters)
{
char str[128];
int16_t temperature = 0;
int16_t humidity = 0;
gpio_set_pull_mode(dht_gpio, GPIO_PULLUP_ONLY);
for(;;)
{
if(dht_read_data(sensor_type, dht_gpio, &humidity, &temperature) == ESP_OK)
{
//snprintf(str, sizeof(str)-1, "Temperatura: %.2f°C, Umidade: %.2f%%\n",
// (float)(temperature / 10.0), (float)(humidity / 10.0));
snprintf(str, sizeof(str)-1, "%.2f", (float)(temperature / 10.0));
/**
* Publica tópico;
*/
if(mqtt_topic_publish(str, //Endereço do vetor que contém os bytes a serem publicados;
strlen(str), //Quantidade de bytes a serem publicados
MQTT_PUBLISH_TOPIC, //Tópico de publicação
0, //QoS-0 (0, 1 ou 2)
0 //Sem retenção da mensagem pelo broker;
) == ESP_OK) {
Serial.printf("Publicado com sucesso...\n%s", str);
}
} else {
Serial.println("erro na leitura do sensor\n");
}
vTaskDelay(DHT_DELAY_ENTRE_AMOSTRAS/portTICK_PERIOD_MS);
}
}
void setup (void)
{
Serial.begin(115200);
/**
* inicializa wifi e conexão com o broker MQTT;
*/
if(mqtt_connect(&event_handler) == ESP_OK) {
Serial.println("WiFi conectado e assinatura realizada com sucesso...");
}
if(xTaskCreate(vtask_dht, "task_dht", 1024 * 5, NULL, 2, NULL) != pdPASS) {
Serial.println("error - Nao foi possivel alocar vtask_dht.\r\n" );
return;
}
}
void loop(void) {
vTaskDelay(5000/portTICK_PERIOD_MS);
}