problema (timer con allarme)

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;
}

}

>distorto: ti ricordo che in conformità al regolamento, punto 7, devi editare i tui post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra dei tuoi post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non avrai sistemato il codice come richiesto, nessuno ti potrà rispondere, quindi ti consiglio di farlo al più presto. :wink:

Risolto, dovevo solo mettere un resistore tra l’alimentazione e il piezo, cosa che lo starter kit di arduino non dice di fare.

Evidentemente hai collegato la capsula piezo a massa nel punto sbagliato :slight_smile: Una capsula piezoelettrica equivale a un condensatore, con una capacità di qualche decina di nanofarad, quindi assorbe forti impulsi di corrente. Se tale corrente passa attraverso il filo di massa del display, interferisce con i dati.