Sto cercando di fare un timer che allo scadere del tempo fa suonare un allarme, per la parte del timer sono riuscito a farlo funzionare (forse il codice è ancora un po' incasinato), purtroppo ho riscontrato un problema quando devo far suonare l'allarme.
come allarme ho messo un piezo, non avendo più pin a disposizione mi sono trovato costretto a collegarlo ad uno dei pin analogici ( A1, che io ho dichiarato come 15), mi chiedo se il problema sia dovuto proprio al fatto che è collegato ad un pin analogico, ma non credo.
in pratica quando il timer arriva a 0 il piezo emette un suono, il problema è che quando il piezo inizia a suonare impazzisce lo schermo LCD.
posto il codice così magari potete aiutarmi a capire come risolvere il problema o se invece è una questione di hardware (il piezo è posizionato molto vicino allo schermo);
PS: sono nuovo e immagino che il codice che ho scritto sia abbastanza obsoleto, accetto consigli di qualsiasi tipo.
IL CODICE:
#include <LiquidCrystal.h>
#include "MyTimer.h"
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
MyTimer t1;
MyTimer t2;
const int activePin1 = 6;
const int activePin2 = 13;
const int aumNumberPin1 = 8;
const int aumNumberPin2 = 9;
const int dimNumberPin1 = 7;
const int dimNumberPin2 = 10;
const int piezo = 15;
int impMinutes1 = 0;
int impMinutes2 = 0;
int minutes1 = 0;
int minutes2 = 0;
int seconds1 = 0;
int seconds2 = 0;
int prevMinutes1 = 99;
int prevMinutes2 = 99;
int prevSeconds1 = 99;
int prevSeconds2 = 99;
bool activePinState1 = false;
bool activePinState2 = false;
void setup() {
lcd.begin(16,2);
pinMode(activePin1,INPUT);
pinMode(activePin2,INPUT);
pinMode(aumNumberPin1,INPUT);
pinMode(aumNumberPin2,INPUT);
pinMode(dimNumberPin1,INPUT);
pinMode(dimNumberPin2,INPUT);
pinMode(piezo,OUTPUT);
}
void loop() {
if(digitalRead(aumNumberPin1) == HIGH && activePinState1 == false && impMinutes1 < 60){
impMinutes1++;
minutes1 = impMinutes1;
if(minutes1 != prevMinutes1){
lcd.setCursor(0,0);
if(minutes1 < 10) lcd.print(0);
lcd.print(minutes1);
prevMinutes1 = minutes1;
delay(200);
}
}
if(digitalRead(aumNumberPin2) == HIGH && activePinState2 == false && impMinutes2 < 60){
impMinutes2++;
minutes2 = impMinutes2;
if(minutes2 != prevMinutes2){
lcd.setCursor(0,1);
if(minutes2 < 10) lcd.print(0);
lcd.print(minutes2);
prevMinutes2 = minutes2;
delay(200);
}
}
if(digitalRead(dimNumberPin1) == HIGH && activePinState1 == false && impMinutes1 > 0){
impMinutes1--;
minutes1 = impMinutes1;
if(minutes1 != prevMinutes1){
lcd.setCursor(0,0);
if(minutes1 < 10) lcd.print(0);
lcd.print(minutes1);
prevMinutes1 = minutes1;
delay(200);
}
}
if(digitalRead(dimNumberPin2) == HIGH && activePinState2 == false && impMinutes2 > 0){
impMinutes2--;
minutes2 = impMinutes2;
if(minutes2 != prevMinutes2){
lcd.setCursor(0,1);
if(minutes2 < 10) lcd.print(0);
lcd.print(minutes2);
prevMinutes2 = minutes2;
delay(200);
}
}
if(digitalRead(activePin1) == HIGH) activePinState1 = !activePinState1;
if(digitalRead(activePin2) == HIGH) activePinState2 = !activePinState2;
if(seconds1 != prevSeconds1){
lcd.setCursor(0,0);
if(minutes1 < 10) lcd.print(0);
lcd.print(minutes1);
lcd.print(":");
if(seconds1 < 10) lcd.print(0);
lcd.print(seconds1);
prevSeconds1 = seconds1;
}
if(seconds2 != prevSeconds2){
lcd.setCursor(0,1);
if(minutes2 < 10) lcd.print(0);
lcd.print(minutes2);
lcd.print(":");
if(seconds2 < 10) lcd.print(0);
lcd.print(seconds2);
prevSeconds2 = seconds2;
}
if(activePinState1 == true){
t1.startTime(&seconds1);
t1.change(&minutes1,&seconds1);
}
if(activePinState2 == true){
t2.startTime(&seconds2);
t2.change(&minutes2,&seconds2);
}
if(seconds1 == 0 && minutes1 == 0 && activePinState1 == true){
t1.reset(&minutes1,&seconds1,&prevMinutes1,&prevSeconds1,&impMinutes1);
tone(piezo,400,400);
activePinState1 = false;
}
if(seconds2 == 0 && minutes2 == 0){
t2.reset(&minutes2,&seconds2,&prevMinutes2,&prevSeconds2,&impMinutes2);
tone(piezo,400,400);
activePinState2 = false;
}
}