#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "driver/spi_master.h"
#include "driver/adc.h"
#include "esp_adc_cal.h"
#include "driver/gpio.h"
#include "math.h"
#include "string.h"
#define SPI_MOSI 23
#define SPI_SCLK 18
#define SPI_CS 5
#define NLSF595 4
#define TEMP ADC1_CHANNEL_3
spi_device_handle_t handle;
void ADC_init()
{
adc1_config_width(ADC_WIDTH_BIT_10); //cuantos bits se leeran
adc1_config_channel_atten(TEMP, ADC_ATTEN_DB_11);// atenuacion de ADC
}
void SPI_init()
{
esp_err_t error;
spi_bus_config_t buscfg = {
.mosi_io_num = SPI_MOSI,
.miso_io_num = -1,
.sclk_io_num = SPI_SCLK,
.max_transfer_sz = 1,
.quadhd_io_num = -1,
.quadwp_io_num = -1,
};
spi_device_interface_config_t devcfg = {
.mode = 0,
.clock_speed_hz = SPI_CLK_SRC_DEFAULT,
.spics_io_num = SPI_CS,
.queue_size = 1,
};
error = spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO);
ESP_ERROR_CHECK(error);
error = spi_bus_add_device(SPI2_HOST, &devcfg, &handle);
ESP_ERROR_CHECK(error);
}
//NLSF595 write
void write_NLSF595(uint8_t data)
{
spi_transaction_t t;
memset(&t, 0, sizeof(t)); //give memory
t.length = 8; //1 byte
t.tx_buffer = &data; // data
spi_device_polling_transmit(handle, &t);
gpio_set_level(NLSF595, 1);
gpio_set_level(NLSF595, 0);
}
//SET RGB
void set_rgb(float celsius, float tiempo_pasado)
{
uint8_t color = 0b11111111;
//led1
if (celsius > 60)
color &= ~(1); //00000001 rojo
else if(celsius<60 && celsius >=30)
color &= ~(5);//00000101 purpura
else if(celsius <30 && celsius >=0)
color &= ~(3);//00000011 amarillo
else if(celsius < 0)
color &= ~(4);//00000100 azul
//led2
if(celsius > tiempo_pasado)
color &= ~(3<<3); //00110000 amarillo
else if(celsius < tiempo_pasado)
color &= ~(4<<3); //00100000 azul
else if(celsius == tiempo_pasado)
color &= ~(2<<3); //00010000 verde
write_NLSF595(color);
}
//TEMPERATURE read
void read_temperature()
{
static float tiempo_pasado = 0;
const float BETA = 3950; // should match the Beta Coefficient of the thermistor
int analogValue = adc1_get_raw(TEMP);
float celsius = 1 / (log(1 / (1024.0 / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
printf("%1f°C\n", celsius);
set_rgb(celsius, tiempo_pasado);
tiempo_pasado = celsius;
}
void app_main() {
ADC_init();
SPI_init();
gpio_set_direction(NLSF595, GPIO_MODE_OUTPUT);
while (1)
{
read_temperature();
vTaskDelay(pdMS_TO_TICKS(1000));
}
}