#include <WiFi.h>
#include <DHT.h>
#define DHTPIN 15
#define DHTTYPE DHT22
#define READ_TEMPERATURE_INTERVAL 2000 // Intervalo de leitura do sensor de temperatura em milissegundos
#define READ_GPS_INTERVAL 2000 // Intervalo de leitura do sensor de temperatura em milissegundos
const char* ssid = "Wokwi-GUEST";
const char* password = "";
WiFiClient wifiClient;
DHT dht(DHTPIN, DHTTYPE);
typedef struct{
float temperature;
float humidity;
uint8_t new_data;
} temp_infos_t;
typedef struct {
float latitude;
float longitude;
uint8_t new_data;
} gps_infos_t;
void wifi_task() {
if (WiFi.status() != WL_CONNECTED) {
Serial.print("Conectando WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi Conectado");
}
}
void temperature_task(temp_infos_t *temp_infos)
{
static unsigned long last_time = 0;
unsigned long current_time = millis();
if (current_time - last_time < READ_TEMPERATURE_INTERVAL)
{
temp_infos->new_data = 0;
return;
}
last_time = current_time;
Serial.println("[D] Lendo dados do sensor de temperatura e humidade");
temp_infos->temperature = dht.readTemperature();
temp_infos->humidity = dht.readHumidity();
temp_infos->new_data = 1;
Serial.printf("Temperatura: %.2f, humidade: %.2f", temp_infos->temperature, temp_infos->humidity);
}
/**
* @brief Inicializa o módulo GPS
*
* @return int 0 se sucesso, outro valor em caso de erro
*/
int gps_init() {
Serial.println("[D] Inicializando GPS");
// Simulação de inicialização do GPS
return 0; // Retorna 0 para indicar sucesso
}
void gps_task(gps_infos_t *gps_infos) {
static unsigned long last_time = 0;
unsigned long current_time = millis();
if (current_time - last_time < READ_GPS_INTERVAL)
{
gps_infos->new_data = 0;
return;
}
last_time = current_time;
Serial.println("[D] Lendo dados do GPS");
// Simulação de leitura GPS
gps_infos->latitude = 37.7749; // Exemplo: Latitude de São Francisco
gps_infos->longitude = -122.4194; // Exemplo: Longitude de São Francisco
gps_infos->new_data = 1;
Serial.printf("GPS - Latitude: %.4f, Longitude: %.4f\n", gps_infos->latitude, gps_infos->longitude);
}
int sd_init() {
Serial.println("[D] Inicializando SD");
// Simulação de inicialização do SD
return 0; // Retorna 0 para indicar sucesso
}
void sd_task(temp_infos_t temp_infos, gps_infos_t gps_infos) {
if (!temp_infos.new_data && !gps_infos.new_data) {
return;
}
Serial.println("[D] Salvando dados no SD");
// Simulação de salvamento no SD
Serial.printf("Dados salvos - Temperatura: %.2f, Humidade: %.2f, Latitude: %.4f, Longitude: %.4f\n",
temp_infos.temperature, temp_infos.humidity, gps_infos.latitude, gps_infos.longitude);
}
void lora_task(temp_infos_t temp_infos, gps_infos_t gps_infos) {
if (!temp_infos.new_data && !gps_infos.new_data) {
return;
}
Serial.println("[D] Enviando dados via LoRa");
// Simulação de envio via LoRa
Serial.printf("Enviado - Temperatura: %.2f, Humidade: %.2f, Latitude: %.4f, Longitude: %.4f\n",
temp_infos.temperature, temp_infos.humidity, gps_infos.latitude, gps_infos.longitude);
}
void setup() {
Serial.begin(115200);
uint8_t err = 0;
dht.begin();
err = gps_init();
if (err != 0) {
Serial.println("[E] Erro ao inicializar GPS");
return;
}
Serial.println("[D] Inicialização completa");
err = sd_init();
if (err != 0) {
Serial.println("[E] Erro ao inicializar SD");
return;
}
Serial.println("[D] SD inicializado com sucesso");
}
void loop() {
static temp_infos_t temp_infos;
static gps_infos_t gps_infos;
temperature_task(&temp_infos);
gps_task(&gps_infos);
sd_task(temp_infos, gps_infos);
lora_task(temp_infos, gps_infos);
wifi_task();
}