Problema con if

Ciao a tutti, sto cercando di creare con Arduino una sveglia con le ruote che scappi all’orario stabilito.
Il problema è che quando arriva l’orario stabilito fa girare i motori ma il buzzer non suona e i motori non si spengono dopo 5 secondi come ho scritto nel programma ma solo se l’orario non è più quello giusto, è come se quando si verifica l’if si annullano tutti gli altri comandi.
Grazie in anticipo

Sveglia_2.ino (2.39 KB)

Perché è esattamente ciò che hai scritto...

fintanto che questa condizione è vera, i motori girano.

if (ore == dt.hour && minuti == dt.minute && stato == 1) {

Mi sfugge il senso della variabile stato per come hai scritto il codice.
Se la usi per impedire ai motori di girare, devi metterla a false subito dopo che disattivi le uscite dei motori.

Tutto questo è sbagliato:

  pinMode(digitalRead(minuteadd), INPUT);
  pinMode(digitalRead(houradd), INPUT);
  pinMode(digitalRead(alarmset), INPUT);
  pinMode(digitalRead(motore1), INPUT);
  pinMode(digitalRead(motore2), INPUT);

perché imposta come ingresso gli I/O 0 o 1, secondo lo stato dei pin houradd, alarmset, motore1, motore2. D'altra parte è anche irrilevante, poiché all'accensione tutti i pin sono impostati come ingressi.

Le variabili possono essere byte anziché int, occupando un byte ciascuna anziché due.

Questo, poi:

  Serial.print(ore); Serial.print(":"); Serial.print(minuti); Serial.print(" "); Serial.print(stato);  
  Serial.print(" "); Serial.print(dt.hour); Serial.print(":"); Serial.println(dt.minute);

può vantaggiosamente essere scritto:

  Serial.print(ore); Serial.print(':'); Serial.print(minuti); Serial.print(' '); Serial.print(stato);  
  Serial.print(' '); Serial.print(dt.hour); Serial.print(':'); Serial.println(dt.minute);

Poi dovresti mettere una variabilina per rilevare il rilascio del tasto alarmset o almeno un delay() dopo la pressione del tasto, altrimenti stato oscillerà velocemente tra 0 e 1.

cotestatnt, volevo fare in modo che la sveglia suoni all'orario prestabilito solo se "stato" è 1.
La mia intenzione era di utilizzare la stessa variabile mentre la sveglia sta suonando in modo da renderla 0 e interrompere l'if

andri-so:
La mia intenzione era di utilizzare la stessa variabile mentre la sveglia sta suonando in modo da renderla 0 e interrompere l'if

L'if non è un cliclo che viene "interrotto", non fare confusione.
Quando il micro arriva li, controlla le condizioni, se sono vere entra nel blocco delle parentesi altrimenti continua con il resto.
Questo significa che quando è ora di attivare l'allarme, entra, fa quel che deve e dopo il tuo delay(5000) esce e va a fare il resto. Quando arriva il ciclo successivo, l'if è ancora vero perché il micro ci mette qualche millisecondo al massimo e sono passati solo 5 secondi il che significa che sei ancora nella stessa ora e nello stesso minuto di prima.
In teoria se attivi il pulsante alarmset dovrebbe smettere per via dello stato della variabile "stato", ma scritto cosi è una scommessa per via del rimbalzo del contatto del pulsante (cerca "debounce" su internet per capire di cosa sto parlando).
A mio avviso, il "flusso" che hai messo in piedi è troppo caotico e confuso con delle istruzioni che sembrano buttate li a caso...
Metti da parte Arduino per un momento, prendi carta e penna e disegna un diagramma di flusso semplice, ma dettagliato e che abbia un senso logico.
Prima devi avere chiaro in mente il COSA fare e come funzionano le strutture di controllo nella programmazione (if, else, while, for etc), il come poi diventa banale.