Ciao a tutti ragazzi, come ho scritto in un mio precedente post di qualche tempo fa, sto costruendo un trigger sonoro per la mia macchina fotografica. Il lavoro procede un po' a rilento perché non ho basi solidissime di elettronica e devo ricavarmi il tempo, però sono quasi riuscito a capire come metterlo insieme, cercando di risolvere da solo i vari problemi che ho incontrato. Stavolta però avrei bisogno di un aiuto: il trigger che ho in mente dovrebbe avere un interruttore di quelli a leva, che faccia eseguire al programma una funzione diversa a seconda della sua posizione: qualcosa del tipo "se leggi high sul pin x esegui questo, se leggi high sul pin y esegui quest'altro". L'interruttore è un spdt, due posizioni, entrambe ON. avevo ipotizzato di procedere così: il pin centrale collegato ai +5v e i due pin esterni collegati ognuno a un pin digitale settato in input e a GND con un resistore da 10k. Successivamente ho provato a programmare arduino in modo che mi dicesse quale dei due pin digitali leggesse come HIGH, ma dal monitor seriale mi dice che legge contemporaneamente come HIGH entrambi i pin. Dove sbaglio?
E' importante che capisci l'errore che hai fatto nel codice (credo tu non abbia molta esperienza di programmazione).
Preferisco spendere due parole in più sperando di chiarirti ancora meglio il problema:
digitalRead(toggle1); invece di toggle1=digitalRead(PIN2);
per la digitalRead() si parla di Parameters e Return value.
Nel codice tuo, tu passi toggle1 come parametro, poteva anche andar bene, siccome toggle1 valeva 2
Ma poi il valore che la funzione legge devi "scaricarlo" da qualche parte. Ovvero genericamente var=funzione(par1,par2...);
Se l'avesse scaricato dentro toggle1 sai che guaio!!! Al primo giro toggle1=2 poi leggi e quindi diventerebbe 0 o 1 (high/low);
al secondo giro leggeresti il pin 0 o 1
Spero di essere stato chiaro, non solo in questo caso ma nell'uso in genere delle funzioni e dei comandi che "ritornano" un valore.
Grazie Nid, per il tuo tempo, in effetti no, di programmazione non ho mai studiato nulla perché vengo dal classico e studio giurisprudenza, quindi ogni insegnamento/consiglio è ben accetto!
Dunque, mi pare di capire che le funzioni che restituiscono un qualche tipo di valore (es. HIGH o LOW, ma può essere anche un numero?) hanno bisogno di una sorta di contenitore dove mettere questo valore, giusto? E questo contenitore sarebbe una generica var, che nel mio caso corrisponde a int toggle1, giusto? Però non mi è del tutto chiaro questo passaggio:
Se l'avesse scaricato dentro toggle1 sai che guaio!!! Al primo giro toggle1=2 poi leggi e quindi diventerebbe 0 o 1 (high/low); al secondo giro leggeresti il pin 0 o 1
Beh, sai che guaio è un pò esagerato. Non rompevi nulla. Ma il programma non avrebbe più fatto quello che pensavi.
La loop() viene chiamata di continuo. Ovvero il codice dentro la loop() viene eseguito in maniera ripetitiva.
Detto questo, la prima volta che il programma parte, essendo toggle1=2 e toggle2=3 avresti letto giustamente dal pin 2 e 3.
Se l'istruzione digitalRead(toggle1); modificasse toggle1 con il valore letto dal pin (0/1 high/low) allora toggle1 conterrebbe 0 o 1.
Dal secondo "giro" della loop() l'istruzione avrebbe letto il pin 0 o 1 invece del 2 perchè l'informazione pin=2 non esiste più.
Se, e solo se per assurdo, l'istruzione digitalRead(toggle1) modificasse toggle1 (cosa che non fa!)
Anche questa istruzione sarebbe stata errata toggle1=digitalRead(toggle1);
i tuoi if avrebbero funzionato ma solo al primo giro
Ok, adesso è un po' più chiaro, ma credo che se non me lo avessi spiegato non ci sarei mai arrivato da solo!! Forse a tempo perso è bene che mi metta a studiare qualcosa di programmazione in maniera più metodica.
Comunque, ho appena finito di fare i test con il circuito assemblato e il tuo codice: funziona tutto esattamente come volevo io! Ho risolto quello che era l'ultimo problema che mi impediva di mettere insieme tutto l'accrocco. Finora avevo fatto i test solo su parti separate del circuito, riuscendo a farle funzionare, adesso so anche come usare l'interruttore. Finalmente posso unirle tutte e scrivere il codice finale! Non è detto che i problemi siano finiti qui (anzi!), ma posso dire di essere arrivato all'ultima fase del mio primo progetto con Arduino!!!
Grazie mille per il tuo aiuto, Nid!