#include "main.hpp"
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "ssd1306.h"
#define I2C_MASTER_SCL_IO 9 /*!< gpio number for I2C master clock */
#define I2C_MASTER_SDA_IO 8 /*!< gpio number for I2C master data */
#define I2C_MASTER_NUM I2C_NUM_0 /*!< I2C port number for master dev */
#define I2C_MASTER_FREQ_HZ 100000 /*!< I2C master clock frequency */
//#define RELAY_GPIO GPIO_NUM_3// teste
static ssd1306_handle_t ssd1306_dev = NULL;
RTClibWrapper rtc;
static const char TAG[] = "DHT";
// i2c-address Endereço I2C da tela "0x3c"
extern "C"
{
void app_main(void);
}
bool firstReading = true;
char displayStr[32];
char dateTimeStr[32]; // Variável para armazenar a data e hora formatada
/*void controlarRele(float humidity)
{
if(humidity < 30.0)
{
gpio_set_level(RELAY_GPIO, 1);
printf("Relé ligado\n");
}else {
gpio_set_level (RELAY_GPIO, 0);
printf("Relé desligado\n");
}
}*/
void dht_test(void *pvParameters)
{
float temperature, humidity;
#ifdef CONFIG_EXAMPLE_INTERNAL_PULLUP
gpio_set_pull_mode(dht_gpio, GPIO_PULLUP_ONLY);
#endif
while (1)
{
if (dht_read_float_data(SENSOR_TYPE, CONFIG_EXAMPLE_DATA_GPIO, &humidity, &temperature) == ESP_OK)
{
// controlarRele(humidity);
uint16_t year;
uint8_t month, day;
uint8_t hours, minutes, seconds;
rtc.getDate(year, month, day);
rtc.getTime(hours, minutes, seconds);
snprintf(dateTimeStr, sizeof(dateTimeStr), "%02d/%02d/%02d | %02d:%02d", year, month, day, hours, minutes, seconds);
// Limpe a tela
ssd1306_clear_screen(ssd1306_dev, 0x00);
// Exiba a temperatura na primeira linha
char tempStr[16];
sprintf(tempStr, "Temp: %.1f C", temperature);
ssd1306_draw_string(ssd1306_dev, 0, 0, (const uint8_t *)tempStr, 16, 1);
// Exiba a umidade na segunda linha
char humStr[16];
sprintf(humStr, "Hum: %.1f %%", humidity);
ssd1306_draw_string(ssd1306_dev, 0, 16, (const uint8_t *)humStr, 16, 1);
ssd1306_draw_string(ssd1306_dev, 16, 54, (const uint8_t *)dateTimeStr, 12, 1);
// Atualize o display
ssd1306_refresh_gram(ssd1306_dev);
printf("Humidity: %.1f%% Temp: %.1fC\n", humidity, temperature);
}
else
printf("Could not read data from sensor\n");
// If you read the sensor data too often, it will heat up
// http://www.kandrsmith.org/RJS/Misc/Hygrometers/dht_sht_how_fast.html
vTaskDelay(pdMS_TO_TICKS(2000));
}
}
void app_main(void)
{
///
/* gpio_pad_select_gpio(RELAY_GPIO);
gpio_set_direction(RELAY_GPIO, GPIO_MODE_OUTPUT);
gpio_set_level(RELAY_GPIO, 0);*/
i2c_config_t conf;
conf.mode = I2C_MODE_MASTER;
conf.sda_io_num = (gpio_num_t)I2C_MASTER_SDA_IO;
conf.sda_pullup_en = GPIO_PULLUP_ENABLE;
conf.scl_io_num = (gpio_num_t)I2C_MASTER_SCL_IO;
conf.scl_pullup_en = GPIO_PULLUP_ENABLE;
conf.master.clk_speed = I2C_MASTER_FREQ_HZ;
conf.clk_flags = 0; //I2C_SCLK_SRC_FLAG_FOR_NOMAL;
i2c_param_config(I2C_MASTER_NUM, &conf);
i2c_driver_install(I2C_MASTER_NUM, conf.mode, 0, 0, 0);
ssd1306_dev = ssd1306_create(I2C_MASTER_NUM, SSD1306_I2C_ADDRESS);
ssd1306_refresh_gram(ssd1306_dev);
ssd1306_clear_screen(ssd1306_dev, 0x00);
/* char data_str[10] = {0};
//sprintf(data_str, "C STR");
sprintf(data_str, "OSVALDO");
ssd1306_draw_string(ssd1306_dev, 70, 16, (const uint8_t *)data_str, 16, 1);
ssd1306_refresh_gram(ssd1306_dev);*/
char data_str[] = "Leituras DHT22";
int displayWidth = 128; // Largura do seu display, ajuste conforme necessário
int displayHeight = 64; // Altura do seu display, ajuste conforme necessário
int textWidth = strlen(data_str) * 8; // Supondo que cada caractere tem 16 pixels de largura
int textHeight = 16; // Supondo que a altura do texto seja de 16 pixels
int xPos = (displayWidth - textWidth) / 2; // Calcula a posição X central
int yPos = (displayHeight - textHeight) / 2; // Calcula a posição Y central
ssd1306_draw_string(ssd1306_dev, xPos, yPos, (const uint8_t *)data_str, 16, 1);
ssd1306_refresh_gram(ssd1306_dev);
///
xTaskCreate(dht_test, "dht_test", configMINIMAL_STACK_SIZE * 3, NULL, 5, NULL);
rtc.begin();
Led led1(led1gpio);
Led led2(led2gpio);
LedTask task1(led1, 1000);
LedTask task2(led2, 200);
task1.start();
task2.start();
time_t now;
char strftime_buf[64];
struct tm timeinfo;
time(&now);
// Fuso horário Fortaleza-BR
setenv("TZ", "UTC-3", 1);
tzset();
localtime_r(&now, &timeinfo);
strftime(strftime_buf, sizeof(strftime_buf), "%d/%m/%Y %H:%M:%S", &timeinfo);
ESP_LOGI(TAG, "The current date/time in Shanghai is: %s", strftime_buf);
uint16_t year;
uint8_t month, day;
uint8_t hours, minutes, seconds;
// Configurar data
//rtc.setDate(2023, 5, 19);
//rtc.setTime(23, 59, 54);
// Espera indefinidamente
while (true)
{
rtc.getDate(year, month, day);
rtc.getTime(hours, minutes, seconds);
printf("Data: %02d/%02d/%02d\n", day, month, year);
printf("Hora: %02d:%02d:%02d\n\n", hours, minutes, seconds);
vTaskDelay(3000 / portTICK_PERIOD_MS);
//vTaskDelay(portMAX_DELAY);
}
}