#include <avr/io.h>
#include <util/delay.h>
#include "avr/interrupt.h"
#include "LCD.h"
#include "Teclado.h"
#include "ADC.h"
#include "GeneradorPWM.h"
//Variable de Hz
int Estado = 1;
int Frecuencia = 0;
//Variable de Volumen
int DutyCicle = 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("Freq:");
LCD_gotoxy(0, 1);
LCD_print("Vol:");
while (1)
{
while (Estado == 1)
{
IntroducirValores();
}
while (Estado == 0)
{
String TeclaPresionada = String(readMatrixKeypad());
// Inicializar los valores de frecuencia y ciclo de trabajo
setPWMFrequency(Frecuencia); // Frecuencia inicial (1 kHz)
setPWMDutyCycle(DutyCicle); // Ciclo de trabajo inicial (50%)
if (TeclaPresionada == "*")
{
//Imprimir palabras iniciales
LCD_clear();
LCD_home();
LCD_gotoxy(0, 0);
LCD_print("Freq:");
LCD_gotoxy(0, 1);
LCD_print("Vol:");
_delay_ms(100);
//Volver a seleccionar frecuencia
Estado = 1;
}
}
}
return 0;
}
void IntroducirValores()
{
//Limpiar valor de frecuencia
String ValorFinal= "";
Frecuencia = 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("Hz");
Frecuencia = StringToInt(ValorFinal);
//Confirmación de valor de frecuencia
/*float Valor = Frecuencia;
dtostrf(Valor,(i-4), 2, Conversion);
LCD_gotoxy(5, 1);
LCD_print (Conversion);*/
_delay_ms(200);
i++;
}
if (TeclaPresionada == "#")
{
Estado = 0;
}
//Mostrar Volumen
float Volumen = Vol();
dtostrf(Volumen, 2, 0, Conversion);
LCD_gotoxy(6, 1);
LCD_print (Conversion);
LCD_gotoxy(9, 1);
LCD_print ("%");
DutyCicle = (int)Volumen;
if (TeclaPresionada == "*")
{
//Imprimir palabras iniciales
LCD_clear();
LCD_home();
LCD_gotoxy(0, 0);
LCD_print("Freq:");
LCD_gotoxy(0, 1);
LCD_print("Vol:");
i=6;
_delay_ms(100);
ValorFinal= "";
Frecuencia = 0;
}
}
}
float Vol()
{
//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 volumen = (voltage / 5.0) * 90.0;
return volumen;
}
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 {
// Si se encuentra un carácter no numérico, puedes manejar el error aquí
// o simplemente detener la conversión.
break;
}
}
return Numero * Signo;
}