#include <stdio.h>
#include <math.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/adc.h"
#include "driver/gpio.h"
#include "esp_log.h"
// Constantes da LDR (fotoresistor)
#define GAMMA 0.7
#define RL10 50.0f
#define VCC 5.0f
#define R_FIXED 2000.0f
// Tempo de atraso em milissegundos
#define DELAY_TIME_MS 100
// ADC
#define LDR_ADC_CHANNEL ADC_CHANNEL_3 // GPIO4 = ADC1_CH3
// Saídas
#define LED_GPIO GPIO_NUM_45
#define RELAY_GPIO GPIO_NUM_40
// Limiar de luminosidade
#define LUX_THRESHOLD 100.0f
static const char *TAG = "PRATICA_3";
// Estados da máquina
typedef enum {
STATE_READ_SENSOR,
STATE_LED,
STATE_RELAY,
STATE_CONSOLE
} system_state_t;
// Variáveis globais
float lux = 0;
int adc_reading = 0;
TickType_t last_wake_time;
// Função para calcular a luminosidade em lux a partir do valor do ADC
float calculate_lux(int analog_value) {
float voltage = analog_value / 4095.0 * VCC; // Mudado para 12 bits (4095)
float resistance = 2000 * voltage / (1 - voltage / VCC);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
return lux;
}
void app_main() {
// Configura o ADC
adc1_config_width(ADC_WIDTH_BIT_12);
adc1_config_channel_atten(LDR_ADC_CHANNEL, ADC_ATTEN_DB_11);
// Configura GPIOs
gpio_config_t io_conf = {
.pin_bit_mask = (1ULL << LED_GPIO) | (1ULL << RELAY_GPIO),
.mode = GPIO_MODE_OUTPUT,
.pull_up_en = 0,
.pull_down_en = 0,
.intr_type = GPIO_INTR_DISABLE
};
gpio_config(&io_conf);
// Inicializa maquina de estado
system_state_t state = STATE_READ_SENSOR;
// Captura o tempo atual de tick
last_wake_time = xTaskGetTickCount();
while (1) {
switch (state) {
case STATE_READ_SENSOR: // Lógica de leitura do ADC
adc_reading = adc1_get_raw(LDR_ADC_CHANNEL);
lux = calculate_lux(adc_reading);
state = STATE_LED;
break;
case STATE_LED: // Lógica de controle do LED
if (lux < LUX_THRESHOLD) {
gpio_set_level(LED_GPIO, 1);
} else {
gpio_set_level(LED_GPIO, 0);
}
state = STATE_RELAY;
break;
case STATE_RELAY: // Lógica de controle do relé
if (lux < LUX_THRESHOLD) {
gpio_set_level(RELAY_GPIO, 1);
} else {
gpio_set_level(RELAY_GPIO, 0);
}
state = STATE_CONSOLE;
break;
case STATE_CONSOLE: // Lógica de envio para o console
if (xTaskGetTickCount() - last_wake_time >= pdMS_TO_TICKS(DELAY_TIME_MS)) {
last_wake_time = xTaskGetTickCount();
ESP_LOGE(TAG, "Luminosidade: %.2f lux", lux);
}
state = STATE_READ_SENSOR;
break;
}
}
}