#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 16000000UL
#include <avr/interrupt.h>
#include "LCD.h"
#include "Teclado.h"
#include "PWM.h"
#include "ADC.h"
//Variable para conversion de string
char buffer[20];
//Variable de PWM
int Estado = 1;
int SetTemperature = 0;
//Variable de Sensor
float Temperatura = 0;
int main()
{
//Inicializar el LCD, el teclado y el ADC
LCD_init();
initMatrixKeypad();
ADC_init();
InitPWM();
//Imprimir palabras iniciales
LCD_gotoxy(0, 0);
LCD_print("Set:");
LCD_gotoxy(0, 1);
LCD_print("Temp:");
while (1)
{
while (Estado == 1)
{
IntroducirValores();
}
while (Estado == 0)
{
String TeclaPresionada = String(readMatrixKeypad());
// Inicializar los valores de frecuencia y ciclo de trabajo
SetiarPWM(SetTemperature);
dtostrf(Temperatura, 4, 1, Conversion1);
LCD_gotoxy(6, 1);
LCD_print (Conversion1);
LCD_gotoxy(11, 1);
LCD_print ("C");
if (Temperatura < SetTemperature)
{
Temperatura = Temperatura + 0.1;
}
if (Temperatura > SetTemperature)
{
Temperatura = Temperatura - 0.1;
}
if (TeclaPresionada == "*")
{
//Imprimir palabras iniciales
LCD_clear();
LCD_home();
LCD_gotoxy(0, 0);
LCD_print("Set:");
LCD_gotoxy(0, 1);
LCD_print("Temp:");
_delay_ms(100);
//Volver a seleccionar frecuencia
Estado = 1;
}
}
}
return 0;
}
void IntroducirValores()
{
//Limpiar valor de frecuencia
String ValorFinal= "";
SetTemperature = 0;
//Variable para posicionar cursor
int i=6;
//Guardar Valor
while (Estado == 1)
{
String TeclaPresionada = String(readMatrixKeypad());
if ((TeclaPresionada != "N") & (TeclaPresionada != "*") & (TeclaPresionada != "#"))
{
//Mostrar Valor
ValorFinal= ValorFinal + TeclaPresionada;
LCD_gotoxy(6, 0);
LCD_print(ValorFinal);
LCD_gotoxy(i+1, 0);
LCD_print("C");
SetTemperature = StringToInt(ValorFinal);
//Confirmación de valor de temperatura
/*float Valor = SetTemperatura;
dtostrf(Valor,(i-4), 2, Conversion);
LCD_gotoxy(5, 1);
LCD_print (Conversion);*/
_delay_ms(200);
i++;
}
if (TeclaPresionada == "#")
{
Estado = 0;
}
//Mostrar Temperatura
Temperatura = MedirTemperatura();
dtostrf(Temperatura, 4, 1, Conversion1);
LCD_gotoxy(6, 1);
LCD_print (Conversion1);
LCD_gotoxy(11, 1);
LCD_print ("C");
//DutyCicle = (int)Volumen;
if (TeclaPresionada == "*")
{
//Imprimir palabras iniciales
LCD_clear();
LCD_home();
LCD_gotoxy(0, 0);
LCD_print("Set:");
LCD_gotoxy(0, 1);
LCD_print("Temp:");
i=6;
_delay_ms(100);
ValorFinal= "";
SetTemperature = 0;
}
}
}
float MedirTemperatura()
{
//Definicin de pin para ADC
uint16_t adc_value = ADC_read(0);
// Convierte el valor ADC a voltaje
float voltage = (float)adc_value * VREF / 1023.0;
//Convertir la voltage en porcentages de volumen
float TemperaturaActual = (voltage) * 100.0;
return TemperaturaActual;
}
void intToString(int number, char *buffer, int bufferSize) {
int i = 0;
if (number < 0) {
buffer[i++] = '-';
number = -number;
}
int divisor = 1;
while ((number / divisor) >= 10) {
divisor *= 10;
}
while (divisor > 0) {
buffer[i++] = '0' + (number / divisor);
number %= divisor;
divisor /= 10;
}
buffer[i] = '\0';
}
int StringToInt(String str)
{
int Numero = 0;
int Signo = 1;
int i = 0;
int strLen = str.length();
// Manejar el signo
if (str[0] == '-') {
Signo = -1;
i = 1;
}
// Procesar los caracteres de la cadena como dígitos numéricos
for (; i < strLen; i++) {
char c = str[i];
if (c >= '0' && c <= '9') {
Numero = Numero * 10 + (c - '0');
} else {
return 0;
break;
}
}
return Numero * Signo;
}