Comando luci

Ciao a tutti, sono nuovo del Forum e ho cominciato da poco nel mondo Arduino. Sono già un addetto del settore nella programmazione di PLC Siemens e linguaggi di programmazione tipo VB6 e Visual Studio.

Ho un quesito:

Ho una scheda Arduino Uno Rev 3 con una I/O Shield a 6 relè acquistata dalla futura elettronica.

Devo fare il seguente e semplice progettino:

Nelle 6 uscite relè sono collegati 6 Led 3 Verdi e 3 Rossi Nei 6 Ingressi sono collegati 6 pulsanti

Fino a qui niente di difficile

I pulsanti sono in coppia uno deve accendere il primo led verde o il led rosso, etc se scelgo di premere il verde o il rosso non devo più avere la possibilità di cambiare lo stato

La condizione finale è che i led si devono accendere solo quando tutte e tre le coppie di pulsanti hanno fatto una scelta.

Poi alla fine quando si sono accesi i led con un timer devo resettare tutto e spegnere

Spero di essere stato chiaro.

Qualcuno mi può aiutare...?

Grazie

yaroze61

ciao yaroze61 non avendolo ancora fatto, e non avendotelo ancora scritto Guglielmo, nel rispetto del regolamento, ti chiedo cortesemente di presentarti QUI ([u]spiegando bene quali conoscenze hai di elettronica e di programmazione[/u] ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO ... Grazie.

Andando alla tua richiesta, direi che a livello logico potresti fare il tutto con 3 variabili di tipo int alle quali inizialmente assegni il valore 0. Questo sarà il valore appunto che avranno inizialmente (o dopo ogni reset) che vuol dire che ancora non è stato scelto nessun colore per il led.

Quando verifichi la pressione delle coppie di pulsanti devi controllare anche che il valore della variabile che associ a loro sia ancora 0, altrimenti se avrà un valore diverso ignori la pressione (così non puoi cambiare più stato dopo una scelta). Se invece il valore è ancora 0 devi memorizzare la scelta assegnando (esempio) "1" se hai toccato il bottone per la scelta del led verde o "2" per la scelta del led rosso. La stessa cosa viene fatta per le altre 2 coppie di bottoni. Metterai poi un semplice controllo: se tutte e tre le variabili hanno un valore diverso da 0 allora accendi i led, ovviamente in base alla scelta dell'utente e quindi in base al valore stesso della variabile (1 o 2) e:

[u]1° alternativa[/u] imposti un delay per il numero di ms che vuoi che restino accesi, dopo azzeri le 3 variabili e spegni i led

[u]2° alternativa[/u] salvi il tempo attuale in una variabile (dai un'occhiata alla funzione millis() e agli esempi BlinkWithoutDelay) e solo dopo che sia trascorso il tempo da te desiderato come differenza dal tempo salvato all'accensione dei led, li spegni e azzeri le 3 variabili così che venga permessa una nuova scelta per ogni coppia di pulsanti

La differenza tra le 2 alternative è che la prima bloccherà il programma finchè dovranno essere spenti i led. La seconda permetterà al programma di fare altro mentre i led sono accesi e prima di permettere una nuova scelta... Nel tuo caso se il programma deve fare solo quanto da te descritto, puoi benissimo usare la 1° alternativa... ma dai un'occhiata alle alternative anche perchè potrebbero servirti su altri progetti :)

5a2v0

5a2v0 ... grazie :) Sono in treno verso la Maker Faire :D

Guglielmo

Dove posso postare il software del comando luci. Non l'ho ancora provato ma mi piacerebbe se qualcuno desse un'occhio. Lo posso copiare qui....?

Elisio

Ciao a tutti,
ho allegato il programma del comando luci. Non l’ho ancora provato, spero di farlo domani e vedere se funziona… Avrò fatto sicuramente qualche toppa va bhe dai perdonatemi… :confused: :confused:

Saluti Elisio

Comando_Squenziale.ino (4.12 KB)

ci sono parecchi problemi:

== e = sono 2 cose diverse; == é un confronto Per esempio in tutti i IF.

if ((Luce_R_1 = true) or (Luce_G_1 = true)) and ((Luce_R_2 = true) or (Luce_G_2 = true)) and ((Luce_R_3 = true) or (Luce_G_3 = true))

sará sempre vero.

if Luce_R_1 = false

Ci vogliono le parentesi tonde. controlla in tutti gli IF per mancano in quasi tutte.

Hai messo resistenze pullup/pulldown sui pulsanti?

Ciao Uwe

Ciao, avete ragione, sono più abituato a scrivere il VB che in C e visto che il programma lo avevo scritto in VB ho fatto dei copia / incolla. Come scheda I/O ho una schield della Futura elettronica con 6 Relè con 6 Out e 6 In ovviamente. Che resistenze devo mettere?

Grazie

Elisio

Ciao,
ho modificato il programma ma non l’ho ancora caricato. Adesso nanna.
Una domanda ma dove de sapere se sto premendo un pulsante:

/* Pulsante Rosso 1 */
if ( digitalRead(inp1) == 0 )
{

al posto di == 0 ) posso mettere == LOW ) ???

Grazie a tutti a domani.

NOTTE NOTTE

Elisio

Comando_Squenziale.ino (4.2 KB)

Ma il programma compila o da errori? Quale scheda hai? (link) Ciao Uwe

Ciao, non ho ancora caricato il programma, questa sera lo farò sicuramente. Volevo avere un tuo parere se la sintassi era corretta.

La scheda che sto usando è quella della Futura Elettronica con 6 Ingressi digitali, 6 Ingressi Analogici e 6 Uscite Relè.

Qualcuno mi ha parlato di resistenze da mettere sul pulsanti per pullup e il pulldown, a me se sembra non ci voglia niente... però chiedo a Voi...

Grazie

Yaroze61

Qualcuno mi ha parlato di resistenze da mettere sul pulsanti per pullup e il pulldown, a me se sembra non ci voglia niente... però chiedo a Voi.

Quella scheda ha già le resistenze di PullUp sugli ingressi

Infatti dallo schema che è in dotazione mi sembrava. Comunque grazie.

Stasera carico il programma e provo...

Saluti

Yaroze61

No, la sintassi non è corretta

boolean Luce_R_1 == false;
 if ( Luce_R_1 == false )
    {
      Luce_G_1 == true
    }
if ( ( Luce_R_1 == true ) or ( Luce_G_1 == true ) ) and ( ( Luce_R_2 == true ) or ( Luce_G_2 == true ) ) and ( ( Luce_R_3 == true ) or ( Luce_G_3 == true ) )