#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include <string.h>
#include "esp_log.h"
#include <math.h>
#include "driver/gpio.h"
#include "driver/adc.h"
#include "driver/spi_master.h"
#include "esp_err.h"
#define GPIO_MOSI 23
#define GPIO_SCLK 18
#define GPIO_CS 5
#define NLSF595_LATCH 4
const float BETA = 3950;
float celsiusGlobal;
float celsiusAnterior = 0;
spi_device_handle_t spi_handle;
esp_err_t spi_init(){
esp_err_t ret;
spi_bus_config_t buscfg = {
.mosi_io_num = GPIO_MOSI,
.miso_io_num = -1,
.sclk_io_num = GPIO_SCLK,
.quadwp_io_num = -1,
.quadhd_io_num = -1,
.max_transfer_sz = 4092
};
ret = spi_bus_initialize(HSPI_HOST, &buscfg, 0);
if (ret != ESP_OK) return ret;
spi_device_interface_config_t devcfg = {
.clock_speed_hz = 1000000, // 1 MHz
.mode = 0,
.spics_io_num = GPIO_CS,
.queue_size = 1
};
ret = spi_bus_add_device(HSPI_HOST, &devcfg, &spi_handle);
return ret;
}
void nlsf595_write(uint8_t data)
{
esp_err_t ret;
spi_transaction_t t;
memset(&t, 0, sizeof(t));
t.length=8;
t.tx_buffer=&data;
ret=spi_device_polling_transmit(spi_handle, &t);
assert(ret==ESP_OK);
gpio_set_level(NLSF595_LATCH, 1);
gpio_set_level(NLSF595_LATCH, 0);
}
void app_main() {
gpio_set_direction(NLSF595_LATCH, GPIO_MODE_OUTPUT);
// Initialize SPI
ESP_ERROR_CHECK(spi_init());
// Configure the ADC for the temperature sensor
adc1_config_width(ADC_WIDTH_BIT_12);
adc1_config_channel_atten(ADC1_CHANNEL_6, ADC_ATTEN_DB_11);
while (true) {
vTaskDelay(pdMS_TO_TICKS(2000));
int analogValue = adc1_get_raw(ADC1_CHANNEL_6);
uint8_t color = 0b11111111;
float celsius = 1 / ((log(1 / (4095.0 / analogValue - 1)) / BETA) + 1.0 / 298.15) - 273.15;
celsiusGlobal = celsius;
printf("Temperatura actual: %f ℃\n", celsiusGlobal);
printf("Temperatura anterior: %f ℃\n", celsiusAnterior);
if (celsiusGlobal >= 60) {
color &= 0b11111110; // rojo
} else if (celsiusGlobal < 60 && celsiusGlobal >= 30) {
color &= 0b11111010; // morado
} else if (celsiusGlobal < 30 && celsiusGlobal >= 0) {
color &= 0b11111100; // amarillo
} else if (celsiusGlobal < 0) {
color &= 0b11111011; // azul
}
if (celsiusGlobal > celsiusAnterior) {
color &= 0b110100111; // naranja
} else if (celsiusGlobal < celsiusAnterior) {
color &= 0b11011111; // azul
} else {
color &= 0b11101111; // verde
}
celsiusAnterior = celsiusGlobal;
nlsf595_write(color);
}
}