#include <LiquidCrystal.h>
const byte _I_PIN_2_IN_ = 2; // PIN_2 entrada [Interrupción decremento]
const byte _I_PIN_3_IN_ = 3; // PIN_3 entrada [Interrupción aumento]
const byte I_PIN_4_IN = 4; // PIN_4 entrada [Aumento x10]
const byte I_PIN_5_IN = 5; // PIN_5 entrada [Aumento x100]
const byte I_PIN_6_IN = 6; // PIN_6 entrada [Aumento x1 000]
const byte I_PIN_7_IN = 7; // PIN_7 entrada [Aumento x10 000]
const byte I_PIN_10_OUT = 10; // PIN_10 salida [Pulso]
unsigned long UL_Tiempo_millis = 0;
unsigned long UL_Tiempo_ms = 10000.0; // 600000 EQU 10min
float F_Frecuencia = 31.0; // Min 31Hz - Max 65535Hz
int I_Aumento = 1;
int I_Decremento = 1;
const unsigned int UI_Frecuencia_minima = 31;
const unsigned int UI_Frecuencia_maxima = 65535;
bool B_Acceso = false;
volatile bool B_Decremento = false;
volatile bool B_Incremento = false;
volatile bool flagLCD = false;
const int RS=1, E=0, D4=13, D5=12, D6=11, D7=9;
LiquidCrystal lcd(RS, E, D4, D5, D6, D7);
void setup(void) {
// Por defecto las I/O digitales están configuradas como INPUT
// put your setup code here, to run once:
pinMode(_I_PIN_2_IN_, INPUT); // Pin 2, entrada [Interrupción decremento]
pinMode(_I_PIN_3_IN_, INPUT); // Pin 3, entrada [Interrupción aumento]
pinMode(I_PIN_4_IN, INPUT); // Pin 4, entrada [Aumento x10]
pinMode(I_PIN_5_IN, INPUT); // Pin 5, entrada [Aumento x100]
pinMode(I_PIN_6_IN, INPUT); // Pin 6, entrada [Aumento x1 000]
pinMode(I_PIN_7_IN, INPUT); // Pin 7, entrada [Aumento x10 000]
pinMode(I_PIN_10_OUT, OUTPUT); // Pin 10, salida [Pulso]
lcd.begin(16, 2);
lcd.clear();
// Print a message to the LCD.
lcd.setCursor(0, 0);
lcd.print("[ON] Frecuencia");
lcd.setCursor(0, 1);
lcd.print(F_Frecuencia);
// Habilita interrupcion
// MODO: Activa la interrupcion...
// [LOW] Siempre que el pin esté bajo.
// [CHANGE] Cada vez que el pin cambia de valor.
// [RISING] Cuando el pasador va de bajo a alto.
// [FALLING] Cuando el pasador va de alto a bajo.
// ARDUINO DUE permite también...
// [HIGH] Siempre que el pin esté alto.
attachInterrupt(digitalPinToInterrupt(_I_PIN_2_IN_), _Interrupcion_Decremento_, RISING); // attachInterrupt(digitalPinToInterrupt(PIN_que_realizara_la_interrupcion), Funcion_interrupcion, Modo)
attachInterrupt(digitalPinToInterrupt(_I_PIN_3_IN_), _Interrupcion_Incremento_, RISING);
}
void _Interrupcion_Incremento_(void) {
flagLCD = true;
B_Incremento = true;
}
void _Interrupcion_Decremento_(void) {
flagLCD = true;
B_Decremento = true;
}
void _F_Incremento_(void) {
if(digitalRead(I_PIN_4_IN)){ // Si PIN_4 posee voltaje [Aumento +10]
B_Acceso = true;
F_Frecuencia = F_Frecuencia + 10;
}
if(digitalRead(I_PIN_5_IN)){ // Si PIN_5 posee voltaje [Aumento +100]
B_Acceso = true;
F_Frecuencia = F_Frecuencia + 100;
}
if(digitalRead(I_PIN_6_IN)){ // Si PIN_6 posee voltaje [Aumento +1000]
B_Acceso = true;
F_Frecuencia = F_Frecuencia + 1000;
}
if(digitalRead(I_PIN_7_IN)){ // Si PIN_7 posee voltaje [Aumento +10 000]
B_Acceso = true;
F_Frecuencia = F_Frecuencia + 10000;
}
if(B_Acceso == false){
F_Frecuencia = F_Frecuencia + I_Aumento;
} else {
B_Acceso = false;
}
if(F_Frecuencia > 65535.0) {
F_Frecuencia = UI_Frecuencia_minima;
}
UL_Tiempo_ms = UL_Tiempo_ms + UL_Tiempo_millis;
}
void _F_Decremento_(void) {
if(digitalRead(I_PIN_4_IN)){ // Si PIN_4 posee voltaje [Aumento +10]
B_Acceso = true;
F_Frecuencia = F_Frecuencia - 10;
}
if(digitalRead(I_PIN_5_IN)){ // Si PIN_5 posee voltaje [Aumento +100]
B_Acceso = true;
F_Frecuencia = F_Frecuencia - 100;
}
if(digitalRead(I_PIN_6_IN)){ // Si PIN_6 posee voltaje [Aumento +1000]
B_Acceso = true;
F_Frecuencia = F_Frecuencia - 1000;
}
if(digitalRead(I_PIN_7_IN)){ // Si PIN_7 posee voltaje [Aumento +10 000]
B_Acceso = true;
F_Frecuencia = F_Frecuencia - 10000;
}
if(B_Acceso == false){
F_Frecuencia = F_Frecuencia - I_Decremento;
} else {
B_Acceso = false;
}
if(F_Frecuencia < 31.0) {
F_Frecuencia = UI_Frecuencia_maxima;
}
UL_Tiempo_ms = UL_Tiempo_ms + UL_Tiempo_millis;
}
void loop(void) {
UL_Tiempo_millis = millis();
if(flagLCD) {
if(B_Decremento){
_F_Decremento_();
B_Decremento = false;
} else if(B_Incremento){
_F_Incremento_();
B_Incremento = false;
}
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(F_Frecuencia);
flagLCD = false;
}
if (UL_Tiempo_millis <= UL_Tiempo_ms){
tone(I_PIN_10_OUT, F_Frecuencia);
} else {
noTone(I_PIN_10_OUT);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("[OFF] Please...");
lcd.setCursor(0, 1);
lcd.print(" disconnect.");
delay(10000);
}
}