Go Down

Topic: Informazioni (Read 1 time) previous topic - next topic

bulinda

Più o meno, i segnali sono discordanti. Da una parte l'interesse verso la nuova materia, cosa che inevitabilmente richiede i passi necessari col relativo tempo per digerirli, dall'altra la soluzione veloce completa.

La richiesta delle soluzioni complete mi rende creativo :smiley-twist: per cui eccone qua una, perfettamente funzionante, anche se con parecchie licenze goliardiche.

Non c'è da scrivere una sola riga di codice, basta sostituire al posto dei puntini nelle define i pin che si vogliono usare (valgono anche A0..A5), il livello che fa accendere i LED (che varia a seconda di come lo si collega) e quello fornito dal pulsante premuto (anche questo varia a seconda di come si collega).

Le uscite da LED1 a LED6 sono comandate dal pulsante PULS1
Le uscite da LED7 a LED8 sono comandate dal pulsante PULS2
Le uscite da LED9 a LED10 sono comandate dal pulsante PULS3

Nel caso la EEPROM contenga inizialmente dati non validi questi vengono impostati a zero.

Code: [Select]
#define ON_LEVEL      ...
#define PRESSED_LEVEL ...
#define PULS1         ...
#define PULS2         ...
#define PULS3         ...
#define LED1          ...
#define LED2          ...
#define LED3          ...
#define LED4          ...
#define LED5          ...
#define LED6          ...
#define LED7          ...
#define LED8          ...
#define LED9          ...
#define LED10         ...
//-----------------------------------------------------------------------
#include <EEPROM.h>
byte a1[]={LED1,LED2,LED3,LED4,LED5,LED6};
byte a2[]={LED7,LED8};
byte a3[]={LED9,LED10};
byte x,y,z;

void setup(){
  x=EEPROM.read(0);if(x>5){x=0;EEPROM.write(0,x);}
  y=EEPROM.read(1);if(y>1){y=0;EEPROM.write(1,y);}
  z=EEPROM.read(2);if(z>1){z=0;EEPROM.write(2,z);}
  pinMode(PULS1,0);pinMode(PULS2,0);pinMode(PULS3,0);
  for(byte k=0;k<6;k++){digitalWrite(a1[k],!ON_LEVEL);pinMode(a1[k],1);}
  for(byte k=0;k<2;k++){digitalWrite(a2[k],!ON_LEVEL);pinMode(a2[k],1);}
  for(byte k=0;k<2;k++){digitalWrite(a3[k],!ON_LEVEL);pinMode(a3[k],1);}
  digitalWrite(a1[x],ON_LEVEL);
  digitalWrite(a2[y],ON_LEVEL);
  digitalWrite(a3[z],ON_LEVEL);}

void f(byte p,byte*a,byte*i,byte e,byte l){
  if(digitalRead(p)==PRESSED_LEVEL){
    digitalWrite(a[*i],!ON_LEVEL);
    *i =(*i+1)%l;
    digitalWrite(a[*i],ON_LEVEL);
    EEPROM.write(e,*i);
    delay(50);while(digitalRead(p)==PRESSED_LEVEL)delay(100);}}

void loop(){f(PULS1,a1,&x,0,6);f(PULS2,a2,&y,1,2);f(PULS3,a3,&z,2,2);}
//-----------------------------------------------------------------------


Tralasciamo il discorso usura EEPROM... non credo si facciano centinaia di manovre al giorno per anni tutti i 365 giorni dell'anno. Ma nel caso teniamo conto delle 100mila scritture garantite (che diventerebbero qualche 10milioni facendo un po' di rotazione delle celle).
La prossima volta che scrivi *ciclo if*.... dico a Guglielmo di bannarti  :D  :D
Grazie tante anche a te,tu e Brunello per arrivare alla soluzione ho notato che avete scritto due cose diverse,le provo sensaltro tutte e due,confrontandole spero di riuscire a capire i diversi tipi di programmazione e capire un poco di più su Arduino.Per la EEPROM non c è problema una volta sistemato il tutto i pulsanti saranno mossi si è no 10 volte l anno.
Saluti Luciano
P.S per il caffè l invito è valido anche per tè. ;)

bulinda

Salve a tutti,vorrei ringraziare tutti quelli che sono intervenuti,sia per consigli sia per aiuti.Sinceramente ero rimasto un poco deluso, ma non avevo calcolato(sbagliando)che  essendo nuovo del Forum e cominciare a chiedere quello che ho chiesto qualche sospetto sia nato.Una volta chiarito tutto dò ragione in pieno a chi dice che la comunità di Arduino da veramente mano,mi scuso anche con il moderatore Gugliemo ,lui è lì per fare il suo lavoro.Ora comincia il lavoro per finire il progetto come lo volevo, anche grazie a voi.Per me inizia quasi il divertimento,disegnare al CAD il frontale dove inserire pulsati e led,disegnare il PCB nuovo per togliere i componenti elettromeccanici ed inserire quello digitale con tuti gli annessi,un passatempo da pensionato per tenermi in allenamento.Di nuovo grazie a tutti.
Saluti
Luciano
P.S Non è che non verrò più a rompere anzi,più ci prenderò mano più domanderò.  ;D  ;D

Etemenanki

...
La prossima volta che scrivi *ciclo if*.... dico a Guglielmo di bannarti  :D  :D
... "istruzioni if" era troppo banale ... :P :D :D :D
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

theremino

#33
Feb 14, 2018, 03:32 pm Last Edit: Feb 14, 2018, 03:38 pm by theremino
Prova questo:

Code: [Select]
#include <EEPROM.h>
#define cella1 0
#define cella2 1
#define cella3 2

#define butt1 13
#define butt2 14
#define butt3 15

#define led1 3
#define led2 4
#define led3 5
#define led4 6
#define led5 7
#define led6 8
#define led7 9
#define led8 10
#define led9 11
#define led10 12

int l1;
int l2;
int l3;

void setup()
{
 // -------------------------------- progressivo da led1 a led6
 pinMode(butt1, INPUT);
 pinMode(led1, OUTPUT);
 pinMode(led2, OUTPUT);
 pinMode(led3, OUTPUT);
 pinMode(led4, OUTPUT);
 pinMode(led5, OUTPUT);
 pinMode(led6, OUTPUT);
 digitalWrite(led1, LOW);
 digitalWrite(led2, LOW);
 digitalWrite(led3, LOW);
 digitalWrite(led4, LOW);
 digitalWrite(led5, LOW);
 digitalWrite(led6, LOW);
 l1 = EEPROM.read(cella1);
 if (l1 > led6 || l1 < led1) l1 = led1;
 digitalWrite(l1, HIGH);

 // -------------------------------- bistabile led7 e led8
 pinMode(butt2, INPUT);
 pinMode(led7, OUTPUT);
 pinMode(led8, OUTPUT);
 digitalWrite(led7, LOW);
 digitalWrite(led8, LOW);
 l2 = EEPROM.read(cella2);
 if (l2 > led8 || l2 < led7) l2 = led7;
 digitalWrite(l2, HIGH);

 // -------------------------------- bistabile led9 e led10
 pinMode(butt3, INPUT);
 pinMode(led9, OUTPUT);
 pinMode(led10, OUTPUT);
 digitalWrite(led9, LOW);
 digitalWrite(led10, LOW);
 l3 = EEPROM.read(cella3);
 if (l3 > led10 || l3 < led9) l3 = led9;
 digitalWrite(l3, HIGH);
}

void loop()
{
 // -------------------------------- progressivo da led1 a led6
 if (digitalRead(butt1) == HIGH)
 {
   digitalWrite(l1, LOW);
   l1++;
   if (l1 > led6) l1 = led1;
   digitalWrite(l1, HIGH);
   EEPROM.write(cella1, l1);
   delay(300);
 }

 // -------------------------------- bistabile led7 e led8
 if (digitalRead(butt2) == HIGH)
 {
   digitalWrite(l2, LOW);
   l2++;
   if (l2 > led8) l2 = led7;
   digitalWrite(l2, HIGH);
   EEPROM.write(cella2, l2);
   delay(300);
 }

 // -------------------------------- bistabile led9 e led10
 if (digitalRead(butt3) == HIGH)
 {
   digitalWrite(l3, LOW);
   l3++;
   if (l3 > led10) l3 = led9;
   digitalWrite(l3, HIGH);
   EEPROM.write(cella3, l3);
   delay(300);
 }

}


Ci sarebbero anche modi più concisi di scriverlo, ma ho preferito non discostarmi troppo dal tuo modo di pensare. Così puoi capirlo meglio e all'occorrenza modificarlo.

Se non fa quello che vorresti, scrivimi specificando cosa fa di sbagliato.

gpb01

#34
Feb 14, 2018, 03:37 pm Last Edit: Feb 14, 2018, 03:38 pm by gpb01
>theremino:   ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo 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). Grazie,

Guglielmo

P.S.: ... e sarebbe comunque il caso di rilettura del REGOLAMENTO ... magari con attenzione hai punti 16.1 e 16.13. Grazie.
Search is Your friend ... or I am Your enemy !

theremino

#35
Feb 14, 2018, 03:43 pm Last Edit: Feb 14, 2018, 04:00 pm by theremino
Ho tentato di editarlo ma c'è una attesa obbligatoria di 5 minuti prima di poterlo postare di nuovo.
E il tuo post è arrivato immediatamente, prima ancora che io riuscissi ad editarlo.

In pratica, se ho capito bene, il primo post non ha la barra superiore con i comandi tra cui il tag "code".
Quindi devi riaprirlo con "Modifica" e aggiungere il "Code"
Poi devi aspettare cinque minuti altrimenti non riesci a pubblicarlo.

Il giro è questo o sono io che ho capito male qualcosa?

----------------

Ho fatto un po' di prove e ho scoperto cosa sbagliavo, partivo con il Quick Replay al posto del Replay.

-----------------

Riguardo al regolamento 16.13, il mio intento non era di fornire "la pappa fatta" ma di spiegare con l'esempio. Oltretutto utilizzando le stesse strutture mentali usate dal richiedente, in modo da essere più istruttivo possibile.

Comunque terrò conto di questi consigli e in futuro starò più attento.

gpb01

#36
Feb 14, 2018, 04:07 pm Last Edit: Feb 14, 2018, 04:07 pm by gpb01
Ho tentato di editarlo ma c'è una attesa obbligatoria di 5 minuti prima di poterlo postare di nuovo.
E il tuo post è arrivato immediatamente, prima ancora che io riuscissi ad editarlo.
... lo so, sono sempre in "agguato"  :smiley-twist: :smiley-twist: :smiley-twist:

A parte scherzi, SI, fino al raggiungimento del centesimo post c'è un tempo di 5 minuti tra un post e l'altro. Personalmente non so quanto sia da deterrente per chi fa "SPAM", però, lo scopo è quello ... ::)

Guglielmo
Search is Your friend ... or I am Your enemy !

gpb01

#37
Feb 14, 2018, 04:11 pm Last Edit: Feb 14, 2018, 04:12 pm by gpb01
In pratica, se ho capito bene, il primo post non ha la barra superiore con i comandi tra cui il tag "code".
Quindi devi riaprirlo con "Modifica" e aggiungere il "Code"
Poi devi aspettare cinque minuti altrimenti non riesci a pubblicarlo.
No, no, hai due possibilità ...

1. il bottone "REPLY" che è sotto ogni post (... che NON è il bottone "Quote"), ti apre direttamente la finestra con i bottoni

2. il "Quick Replay", che è la finestrella vuota che si trova in basso e che NON ha i bottoni. In tal caso, usa il "Preview" e ti viene aperta la finestra con i bottoni e puoi continuare ad editare da li.

Guglielmo
Search is Your friend ... or I am Your enemy !

Standardoil

Come terza alternativa scrivi direttamente i tag apri quadra code chiudi quadra
Testo
Apri quadra barra code chiudi quadra
Esempio:
[ c o d e ]
testo
[ / c o d e ]

ti fa vedere:
Code: [Select]

testo


e non devi fare preview

Prima legge di Nelson (che sono io):
A parità di risultato
maggiore è il pensiero,
minore il lavoro.
Quindi prima di fare pensa!

theremino


bulinda

Prova questo:

Code: [Select]
#include <EEPROM.h>
#define cella1 0
#define cella2 1
#define cella3 2

#define butt1 13
#define butt2 14
#define butt3 15

#define led1 3
#define led2 4
#define led3 5
#define led4 6
#define led5 7
#define led6 8
#define led7 9
#define led8 10
#define led9 11
#define led10 12

int l1;
int l2;
int l3;

void setup()
{
 // -------------------------------- progressivo da led1 a led6
 pinMode(butt1, INPUT);
 pinMode(led1, OUTPUT);
 pinMode(led2, OUTPUT);
 pinMode(led3, OUTPUT);
 pinMode(led4, OUTPUT);
 pinMode(led5, OUTPUT);
 pinMode(led6, OUTPUT);
 digitalWrite(led1, LOW);
 digitalWrite(led2, LOW);
 digitalWrite(led3, LOW);
 digitalWrite(led4, LOW);
 digitalWrite(led5, LOW);
 digitalWrite(led6, LOW);
 l1 = EEPROM.read(cella1);
 if (l1 > led6 || l1 < led1) l1 = led1;
 digitalWrite(l1, HIGH);

 // -------------------------------- bistabile led7 e led8
 pinMode(butt2, INPUT);
 pinMode(led7, OUTPUT);
 pinMode(led8, OUTPUT);
 digitalWrite(led7, LOW);
 digitalWrite(led8, LOW);
 l2 = EEPROM.read(cella2);
 if (l2 > led8 || l2 < led7) l2 = led7;
 digitalWrite(l2, HIGH);

 // -------------------------------- bistabile led9 e led10
 pinMode(butt3, INPUT);
 pinMode(led9, OUTPUT);
 pinMode(led10, OUTPUT);
 digitalWrite(led9, LOW);
 digitalWrite(led10, LOW);
 l3 = EEPROM.read(cella3);
 if (l3 > led10 || l3 < led9) l3 = led9;
 digitalWrite(l3, HIGH);
}

void loop()
{
 // -------------------------------- progressivo da led1 a led6
 if (digitalRead(butt1) == HIGH)
 {
   digitalWrite(l1, LOW);
   l1++;
   if (l1 > led6) l1 = led1;
   digitalWrite(l1, HIGH);
   EEPROM.write(cella1, l1);
   delay(300);
 }

 // -------------------------------- bistabile led7 e led8
 if (digitalRead(butt2) == HIGH)
 {
   digitalWrite(l2, LOW);
   l2++;
   if (l2 > led8) l2 = led7;
   digitalWrite(l2, HIGH);
   EEPROM.write(cella2, l2);
   delay(300);
 }

 // -------------------------------- bistabile led9 e led10
 if (digitalRead(butt3) == HIGH)
 {
   digitalWrite(l3, LOW);
   l3++;
   if (l3 > led10) l3 = led9;
   digitalWrite(l3, HIGH);
   EEPROM.write(cella3, l3);
   delay(300);
 }

}


Ci sarebbero anche modi più concisi di scriverlo, ma ho preferito non discostarmi troppo dal tuo modo di pensare. Così puoi capirlo meglio e all'occorrenza modificarlo.

Se non fa quello che vorresti, scrivimi specificando cosa fa di sbagliato.

Grazie tante anche a te,ricablo la board e provo,se ci sono problemi ti "rompo" sicuramente.Senza nulla togliere agli altri che mi hanno aiutato e ringrazio di nuovo, tu hai azzeccato il modo di farmi comprendere un poco meglio anche se più lungo il procedimento,avendo già un punto di partenza volevo proprio capire come inserire in quel listato le variabili che tu hai aggiunto e che io ho provato decine di volte senza riuscirci.
Saluti
Luciano

theremino

Infatti, non si tratta di prepararti "la pappa pronta", ho solo aggiunto qualche riga al tuo codice per mostrarti come fare.

Meglio un esempio che tante parole.

Se non ti funziona bene chiedi e lo metteremo a posto insieme.

Puso

Allora vecchietto :)  provo a spiegartelo a modo mio cosi smetti di fare a cazzotti col digitale.

1-digitale uguale a 0 oppure 1 STOP
2-se lo leggi può essere LOW (0 volt) oppure HIGH(da 5 a 0,000000001volt) STOP
3-se lo scrivi idem STOP
4-la condizione attuale e quella precedente del pin digitale sono importanti STOP

Come consiglio prova magari a prendere confidenza con i pin digitali facendo qualkosa di piu semplice tralasciando per il momento l'eprom...tipo far cambiare colore ad un led RGB con un unico pulsante.


Claudio_FF

#43
Feb 14, 2018, 10:28 pm Last Edit: Feb 14, 2018, 10:30 pm by Claudio_FF
Quote from: Puso
2-se lo leggi può essere LOW (0 volt) oppure HIGH(da 5 a 0,000000001volt)
Con alimentazione 5V
Ingresso LOW = sotto 1.5V
Ingresso HIGH = sopra 3V
* * * *    if non è un ciclo   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *

bulinda

Allora vecchietto :)  provo a spiegartelo a modo mio cosi smetti di fare a cazzotti col digitale.

1-digitale uguale a 0 oppure 1 STOP
2-se lo leggi può essere LOW (0 volt) oppure HIGH(da 5 a 0,000000001volt) STOP
3-se lo scrivi idem STOP
4-la condizione attuale e quella precedente del pin digitale sono importanti STOP

Come consiglio prova magari a prendere confidenza con i pin digitali facendo qualkosa di piu semplice tralasciando per il momento l'eprom...tipo far cambiare colore ad un led RGB con un unico pulsante.


Scolta "bastraone", vecchietto un par di pa...lle :D ,ho solo 69 anni e 1/4(ce la fai a fare il calcolo in analogico?)e fino al 4 Settembre non sono ufficiale,una corsetta in macchina si può sempre provare a fare.Che in digitale lo 0 è lo stato basso e 1 è lo stato alto sono circa 50 anni che lo so,il mio problema è un altro far capire agli 0 e agli 1 quello che voglio io.A parte di scherzi,tranquillo che provo dalle cose semplici,quello che avevo chiesto era come ho detto sopra per finire un mio vecchio progetto,cominciato parecchio tempo fà,purtroppo il mio amico Ing.digitale è migrato in altri lidi per lavoro se nò mi scriveva direttamente un PIC. :smiley-razz:
Luciano
P.S anche stamattina il quasi "vecchietto" e a 0 gradi si è fatto come tutte le mattine circa 5 Km a piedi. :smiley-sweat:

Go Up