Problema riguardo passaggi tra void

Salve a tutti, essendo un novizio sia riguardo la programmazione che la realizzazione di circuiti ho progettato un semplice sistema di allarme basato su laser e fotocellula, comandato esclusivamente via telecomando (per ora). Ho utilizzato due buzzer per avviso sonoro e collegato una gsm sim 900 per avviso a distanza. per sopperire all’eventuale mancanza di corrente sto utilizzando un pacco di 4 batterie da 1,2 v(anche se è da verificare quanto regga).
Riguardo il codice ho il sospetto di aver “parlato” con l’arduino nano molto “profanamente” ma sembra che il sistema funzioni a parte le seguenti cose:

  1. il sistema si accende come dovrebbe solo alla pressione del tasto giusto, ma si spegne con qualsiasi altro pulsante del telecomando (prima che aggiungessi alcune variabili invece funzionava ma non trovo il problema);;
  2. uno dei due buzzer suona debole ma non sembrano esserci problemi di saldature pin. (sospetto sia il buzzer stesso ma dato che sono qui preferisco chiedere…);
  3. Vi chiederei anche di dare un occhio al passaggio tra “manca la corrente” e “la corrente è tornata”, dato che devo ancora assemblare il circuito che ricarica la batteria tampone e quindi avendola per ora collegata al pinvin, essa entra in azione nel momento in cui al pin 5v non arriva tensione e messo così il circuito sembra avere un po’ difficoltà;

Grazie per l’attenzione e la pazienza nei confronti dell’ignoranza :slight_smile:
Allego codice

GARAGE.ino (5.97 KB)

Hai grossi casini con l'indentazione che secondo me ti causa (o è altamente probabile che la causi) una errata interpretazione del flusso, ed un mal di testa a noi che dovremmo interpretare il tuo codice.

Per favore, fallo riformattare dall'IDE (Ctrl-T), poi dagli un'occhiata per vedere se è quello che intendevi. Ad esempio, la if() a riga 157 ha un corpo nullo (due graffe consecutive).
Dopo aver fatto una prima tua verifica, posta la "nuova versione formattata CCC" (Come Cristo Comanda) con l'eventuale descrizione aggiornata dei problemi, e proseguiamo...

PS: cosa vuol dire "passaggi tra void"???

Empty imported post

Ciao, a vedere il codice completo, sembra hai preso pezzi di programmi da altri e li hai messi insieme.
Secondo me in generale è abbastanza contorto. Dovresti rivederlo, una macchina a stati finiti (MSF) sarebbe utile.
Inoltre usare le delay() è bloccante. Vedi uso di millis() e l'esempio BlinkWithoutDelay(). Va bene un delay(1000) dopo aver mandato un SMS, ma gli altri delay() impediscono un corretto rilevamento del IR

Una macchina a stati finiti, è in sostanza una variabile che assume 1 solo valore tra una serie definita. Nel tuo caso potrebbe essere SPENTO, ACCESO, ALLARME. Non so se ci sono altri casi.
Poi gli eventi che cambiano lo stato possono essere la pressione del tasto oppure un sensore.
Per ogni stato in cui è la variabile, fai azioni precise. Esempio se in allarme invii sms e suoni buzzer per un tempo.
Quindi hai nella loop() che è un ciclo infinito, la decode, a seconda del suo valore cambi stato e poi analizzi la variabile di stato con switch(stato) e fai le azioni dovute.

Consigli vari:

  1. quando definisci una costante per indicare un pin, basta byte; poi o tutti const o tutti #define
    const byte photo = 9; // invece di define
    Meglio se poi dal nome si capisce che è un pin, esempio const byte pinPhoto = 9;

  2. le costanti dei tasti fai delle define ad inizio e dagli un nome che fa capire cosa vuole dire, esempio 0xFFA857
    è il tasto VOL- ma per te è lo spegnimento ?
    Allora #define K_TASTO_SPEGNI 0xFFA857 e nel programma usi K_TASTO_SPEGNI
    Il programma sarà più chiaro anche se lo rileggerai tra molto tempo.

A tutti i validissimi consigli di nid69ita, che ti consiglio anche io di seguire, aggiungo anche che comunque dovresti dare sempre un’occhiata al tuo codice, anche se frutto di copia/incolla selvaggio come sembra :wink:

Esempio:

  • A riga 18 hai messo una seconda #include “IRremote.h” già presente a riga 2
  • Se hai installato le librerie nella cartella libraries non devi indicare gli #include con le virgolette ma con i simboli < e > (quindi #include <IRremote.h>)
  • A riga 90 hai un blocco di codice con una graffa inutile (si chiude a riga 103), toglile entrambe
  • Se una funzione la dichiari “void” non deve restituire alcun valore, invece vedi il “return(0)” della funzione allarme() ad esempio, devi fare solo “return;”
  • Fai due volte la lettura del segnale infrorosso, nel loop() (e qui ci può stare) ma anche nella funzione acceso() dove a me non pare che serva a nulla, a meno che tu non voglia leggere una sequenza di due codici (ma in tal caso la if successiva “if ((results.value) == 0xFFA857) {” dovrebbe stare dentro alla prima if “if (irrecv.decode(&results))”
  • Togli tutte quelle righe vuote assolutamente inutili ma che rendono il codice meno leggibile: lasciane solo UNA tra una funzione e l’altra o dove ti serve evidenziare qualcosa (es. i print di debug) e togli tutte quelle che hai tra il nome funzione e la sua graffa di apertura, tra la if() e a sua graffa di apertura, eccetera
  • I commenti messi a destra dell’istruzione sono poco leggibili soprattutto se sono lunghi e preceduti da un sacco di spazi che li fanno finire fuori schermo (vedi ad esempio rig 151), i commenti mettili sulla stessa riga solo se sono brevi, altrimenti mettili su una riga che precede il comando da commentare
  • Attento che nel codice c’è anche il numero di cellulare che imposti come destinatario degli sms! Imposta quella stringa come #define all’inizio e prima di mandare qui il codice (rimuovi il precedent allegato!) ricordati di mascherare il numero

Grazie per i preziosissimi consigli in effetti non è un totale copia e incolla ma un bel po' di stringhe le ho prese da sketch delle componenti utilizzate.
Le ripetizioni dovute certamente alla mia poca conoscenza sono un errore dovuto al fatto che non conoscendo ancora bene i meccanismi ho pensato di dover reinizializzare ad esempio il meccanismo di richiamo dei codici ir. Cmq per non costringervi a spiegarmi per fila e per segno tutto vi dico grazie

Ok, però posta il nuovo codice appena ti funziona (ricorda di mascherare il numero di cellulare) oppure se ancora non funziona qualcosa ed hai bisogno di aiuto, ok?
Ciao!

Purtroppo non so perchè ma se scrivo da smartphone mi "taglia" il post...
Appena ne arrivo a capo vi aggiorno grazie ancora