/*
Curso Online NodeMCU ESP32 FreeRTOS
Autor: Fernando Simplicio
www.microgenios.com.br
--Este Projeto tem por objetivo criar duas threads no FreeRTOS.
--Cada thread é responsável em enviar uma string pela UART do ESP32 de maneira concorrente.
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"
#include "freertos/queue.h"
#include <Arduino.h>
#include <WiFi.h>
#include <WiFiMulti.h>
#include <HTTPClient.h>
#include "dht.h"
//int.umidade;
//temperatura;
int16_t temperature=0;
int16_t humidity=0;
static const dht_sensor_type_t sensor_type = DHT_TYPE_AM2301;
static const gpio_num_t dht_gpio = (gpio_num_t)17;
//RELE
#define RELE 4
/*
* WiFi;
*/
#define WIFISSID "Wokwi-GUEST"
#define PASSWORD ""
static WiFiMulti wifiMulti;
/*
* Função de inicialização da Serial e Oled;
*/
static void wifi_init( void )
{
Serial.begin(115200);
for(uint8_t t = 4; t > 0; t--)
{
Serial.printf("[SETUP] WAIT %d...\n", t);
Serial.flush();
delay(500);
}
wifiMulti.addAP( WIFISSID, PASSWORD );
for(;;){
if(wifiMulti.run() != WL_CONNECTED) {
Serial.println("WiFi not connected!");
delay(1000);
} else break;
}
}
void vTask_dht(void *pvParameters)
{
gpio_set_pull_mode(dht_gpio, GPIO_PULLUP_ONLY);
while (1)
{
if (dht_read_data(sensor_type, dht_gpio, &humidity, &temperature) == ESP_OK)
printf("humidity: %d%% Temp: %dC\n", humidity / 10, temperature / 10);
else
printf("Could not read data from sensor\n");
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
}
static void vTask_http( void *pvParameters )
{
Serial.println( "Task1 Init..." );
for( ;; )
{
if( (wifiMulti.run() == WL_CONNECTED) )
{
HTTPClient http;
//............................................................
char url[200] = {0,};
//long rd = random(100); //0 a 100
snprintf(url, sizeof(url)-1, "http://api.thingspeak.com/update?api_key=Z5F5WBBNIIZR994R&field2=%d", (humidity / 10));
http.begin(url);
//Serial.print(rd);
//Serial.println("Valor Randomico");
//..............................................................
http.addHeader( "Content-Type", "application/json" );
http.addHeader( "Connection", "close" );
int httpCode = http.GET();
if( httpCode > 0 )
{
Serial.printf("HTTP_CODE_RETURN: %d\n", httpCode );
if( httpCode == HTTP_CODE_OK )
{
String payload = http.getString();
Serial.println( payload.c_str() );
}
} else {
Serial.printf("[HTTP] POST.. falha, error: %s", http.errorToString(httpCode).c_str() );
}
http.end();
}
vTaskDelay( 10000 / portTICK_PERIOD_MS );
}
}
static void vTaskRele ( void *pvParameters ){
for(;;){
if(temperature/10 > 24){
digitalWrite(RELE, HIGH);
}
else if(temperature/10 < 23){
digitalWrite(RELE,LOW);
}
vTaskDelay( 2100 / portTICK_PERIOD_MS);
}
}
void setup( void )
{
pinMode(RELE,OUTPUT);
/**
* Inicializa WiFi;
*/
wifi_init();
/**
* Cria a tarefa responsável em requisitar o servidor thingspeak;
*/
xTaskCreate(vTask_http, "Task 1", 1024*8, NULL, 2, NULL);
xTaskCreate(vTask_dht, "Task 2", configMINIMAL_STACK_SIZE * 3, NULL, 2, NULL);
xTaskCreate(vTaskRele, "Task 3", configMINIMAL_STACK_SIZE * 3, NULL, 2, NULL);
}
/**
* Task loop;
*/
void loop(void)
{
vTaskDelay(2000 / portTICK_PERIOD_MS);
}