#include <Arduino.h>
#include "driver/ledc.h"
//#include "config.h"
#define ADC_VREF_mV 3300.0
#define ADC_RESOLUTION 4096.0
#define PIN_LM35 36
//Pines para la lectura del ADC y el botón
#define btnTemp 35
//Canales para los leds y pwm
#define RedChannel 1
#define GreenChannel 2
#define YellowChannel 3
//Pines para los led RGB
#define ledVerde 23
#define ledAmarillo 22
#define ledRojo 21
//Frecuencia del PWM
#define freqPWM 5000
#define freqPWM1 1000
#define freqPWM2 500
#define resolution 8
int estadoBtn = 0; //estado inicial del botón
int estadoFinal = 0; //estado final del botón
int adcRaw = 0; //valor "crudo" del ADC
int ciclo1 = 0;
int ciclo2 = 0;
int ciclo3 = 0;
int rotacion = 0;
int ten = 0;
int unit = 0;
int decimal = 0;
int display;
//Pines de los display
#define segA 2
#define segB 4
#define segC 26
#define segD 14
#define segE 13
#define segF 5
#define segG 27
//Pines de los comunes
#define digitD0 33
#define digitD1 25
#define digitD2 32
const int servoPin = 18;
void configurarPWM(void);
void displayConfig(void);
void showTemp(int display);
ledc_channel_config_t channel_config[3];
ledc_channel_config_t servo_channel_config;
//AdafruitIO_Feed *UVG = io.feed("Proyecto 21201");
void setup() {
Serial.begin(115200);
pinMode(btnTemp, INPUT);
pinMode(digitD0, OUTPUT);
pinMode(digitD1, OUTPUT);
pinMode(digitD2, OUTPUT);
digitalWrite(digitD0, LOW);
digitalWrite(digitD0, LOW);
digitalWrite(digitD0, LOW);
pinMode(btnTemp, INPUT);
configurarPWM();
displayConfig();
digitalWrite(ledRojo, LOW);
digitalWrite(ledVerde, LOW);
digitalWrite(ledAmarillo, LOW);
pinMode(servoPin, OUTPUT);
ledcAttachPin(servoPin, LEDC_CHANNEL_4);
servo_channel_config.gpio_num = servoPin;
servo_channel_config.speed_mode = LEDC_HIGH_SPEED_MODE;
servo_channel_config.channel = LEDC_CHANNEL_4;
servo_channel_config.intr_type = LEDC_INTR_DISABLE;
servo_channel_config.timer_sel = LEDC_TIMER_0;
servo_channel_config.duty = 75;
ledc_channel_config(&servo_channel_config);
ledc_timer_config_t timer_config;
timer_config.speed_mode = LEDC_HIGH_SPEED_MODE;
timer_config.duty_resolution = LEDC_TIMER_16_BIT;
timer_config.timer_num = LEDC_TIMER_0;
timer_config.freq_hz = 50;
ledc_timer_config(&timer_config);
//while(! Serial);
//Serial.print("Connecting to Adafruit IO");
//io.connect();
//while(io.status() < AIO_CONNECTED) {
// Serial.print(".");
// delay(500);
}
// Serial.println();
// Serial.println(io.statusText());
//}
void loop() {
int leerTemp = digitalRead(btnTemp); //lee el estado del botón
if (leerTemp == LOW && estadoFinal == HIGH) {
int adcVal = analogRead(PIN_LM35); //Lectura del sensor de temperatura
float milliVolt = adcVal * (ADC_VREF_mV / ADC_RESOLUTION);
float temp = milliVolt / 5; //Convierte el voltaje a temperatura
int temperatura = temp * 10;
ten = temperatura / 100;
temperatura = temperatura - (ten*100);
unit = temperatura / 10;
temperatura = temperatura - (unit*10);
decimal = temperatura;
Serial.print("Temperatura: "); //muestra la temperatura leída
Serial.print(temp);
Serial.println(" °C"); //sistema en Celsius
//Mapeo de la temperatura a los valores PWM para los leds
if (temp <= 34) {
ciclo1 = 0;
ciclo2 = 255;
ciclo3 = 0;
ledcWrite(RedChannel, ciclo1);
ledcWrite(GreenChannel, ciclo2);
ledcWrite(YellowChannel, ciclo3);
rotacion = map(temp, 25, 34, 0, 180);
} else if(temp >= 40) {
ciclo1 = 255;
ciclo2 = 0;
ciclo3 = 0;
ledcWrite(RedChannel, ciclo1);
ledcWrite(GreenChannel, ciclo2);
ledcWrite(YellowChannel, ciclo3);
rotacion = map(temp, 40, 50, 0, 180);
} else if(temp > 34 && temp < 40) {
ciclo1 = 0;
ciclo2 = 0;
ciclo3 = 255;
ledcWrite(RedChannel, ciclo1);
ledcWrite(GreenChannel, ciclo2);
ledcWrite(YellowChannel, ciclo3);
rotacion = 90;
}
//io.run();
//Serial.print("sending -> ");
//Serial.println(temp);
//UVG->save(temp);
//delay(3000);
}
display = ten;
digitalWrite(digitD0, HIGH);
digitalWrite(digitD1, LOW);
digitalWrite(digitD2, LOW);
showTemp(display);
delay(5);
display = unit;
digitalWrite(digitD0, LOW);
digitalWrite(digitD1, HIGH);
digitalWrite(digitD2, LOW);
showTemp(display);
delay(5);
display = decimal;
digitalWrite(digitD0, LOW);
digitalWrite(digitD1, LOW);
digitalWrite(digitD2, HIGH);
showTemp(display);
delay(5);
digitalWrite(digitD0, LOW);
digitalWrite(digitD1, LOW);
digitalWrite(digitD2, LOW);
int pulseWidth = map(rotacion, 0, 180, 1500, 8000);
ledcWrite(LEDC_CHANNEL_4, pulseWidth);
estadoFinal = leerTemp;
delay(5);
}
void configurarPWM(void)
{
ledcSetup(RedChannel, freqPWM, resolution);
ledcSetup(GreenChannel, freqPWM1, resolution);
ledcSetup(YellowChannel, freqPWM2, resolution);
ledcAttachPin(ledRojo, RedChannel);
ledcAttachPin(ledVerde, GreenChannel);
ledcAttachPin(ledAmarillo, YellowChannel);
}
void displayConfig(void) {
pinMode(segA, OUTPUT);
pinMode(segB, OUTPUT);
pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT);
pinMode(segE, OUTPUT);
pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT);
digitalWrite(segA, LOW);
digitalWrite(segB, LOW);
digitalWrite(segC, LOW);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, LOW);
digitalWrite(segG, LOW);
}
void showTemp(int display) {
switch(display) {
case 1:
digitalWrite(segA, HIGH);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, HIGH);
digitalWrite(segE, HIGH);
digitalWrite(segF, HIGH);
digitalWrite(segG, LOW);
break;
case 2:
digitalWrite(segA, LOW);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, LOW);
digitalWrite(segG, LOW);
break;
case 3:
digitalWrite(segA, HIGH);
digitalWrite(segB, HIGH);
digitalWrite(segC, LOW);
digitalWrite(segD, HIGH);
digitalWrite(segE, HIGH);
digitalWrite(segF, LOW);
digitalWrite(segG, HIGH);
break;
case 4:
digitalWrite(segA, HIGH);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, HIGH);
digitalWrite(segE, LOW);
digitalWrite(segF, LOW);
digitalWrite(segG, HIGH);
break;
case 5:
digitalWrite(segA, LOW);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, HIGH);
digitalWrite(segG, HIGH);
break;
case 6:
digitalWrite(segA, HIGH);
digitalWrite(segB, LOW);
digitalWrite(segC, HIGH);
digitalWrite(segD, HIGH);
digitalWrite(segE, LOW);
digitalWrite(segF, HIGH);
digitalWrite(segG, HIGH);
break;
case 7:
digitalWrite(segA, HIGH);
digitalWrite(segB, LOW);
digitalWrite(segC, HIGH);
digitalWrite(segD, HIGH);
digitalWrite(segE, HIGH);
digitalWrite(segF, HIGH);
digitalWrite(segG, HIGH);
break;
case 8:
digitalWrite(segA, HIGH);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, LOW);
digitalWrite(segG, LOW);
break;
case 9:
digitalWrite(segA, HIGH);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, HIGH);
digitalWrite(segE, HIGH);
digitalWrite(segF, HIGH);
digitalWrite(segG, HIGH);
break;
case 10:
digitalWrite(segA, HIGH);
digitalWrite(segB, HIGH);
digitalWrite(segC, HIGH);
digitalWrite(segD, LOW);
digitalWrite(segE, LOW);
digitalWrite(segF, HIGH);
digitalWrite(segG, HIGH);
break;
}
}