Go Down

Topic: Consigli per un contatore numerico? (Read 337 times) previous topic - next topic

ChriProp

Ciao a tutti, premetto che sono nuovo sul forum ma anche nuovo in materia.
Frequento la classe 3 di un itis informatica e telecomunicazioni,  nei primi due anni non ci hanno spiegato nulla riguardo ai vari linguaggi mentre all'inizio del terzo ci hanno praticamente sbattuto in faccia arduino e chiesto di inventare un progetto non troppo semplice, ma non avendo l'esperienza necessaria mi trovo parecchio spaesato quindi ho pensato di chiedere consiglio a voi su questo forum.

inizio esponendovi la mia idea:

avevo pensato a un rettangolo 3x5 formato da led, i quali dovrebbero accendersi a formare dei numeri da 0 a 9 con due pulsanti

il primo pulsante dovrebbe far aumentare in modo progressivo il numero ogni volta che viene premuto, mentre il secondo in modo automatico li farebbe scorrere dallo 0 al 9.

per il collegamento non dovrei avere troppi problemi, che invece sto riscontrando nell'idea del codice
per ora il codice si ferma nel momento in cui il primo tasto fa comparire il numero 1
(lo 0 lo metto alla fine quindi l'1 è il primo)
e non ho idea di come con un solo "click" io possa spegnere il numero 1 e far accendere il 2, e sopratutto fare in modo ce dopo l'1 venga il 2 e dopo ancora il 3

stavo più che altro cercando (sempre che esista) un modo per creare tipo un "collegamento" con magari un nome, così che si possa dire al programma "quando sei a 2, se il pulsante è accesso passa a 3"

non so se rende l'idea....comunque spero che voi possiate darmi dei consigli, o spiegarmi quali funzioni potrebbero farmi comodo

Grazie in anticipo

fabpolli

Buona sera,
essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del nostro regolamento, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie. :)

fabpolli

#2
Sep 14, 2018, 05:03 pm Last Edit: Sep 14, 2018, 05:03 pm by fabpolli
Quando hai fatto tutto del post sopra... posta il codice che hai prodotto, l'hardware che usi e se riesci anche uno schema di come hai effettuato i collegamenti (anche su carta) le risposte arriveranno più precise e rapide ;)

ChriProp

Buona sera,
essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del nostro regolamento, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie. :)
:D grazie mille non avevo idea di dove trovare quelle sezioni, però ero sicuro che ci fossero


Quando hai fatto tutto del post sopra... posta il codice che hai prodotto, l'hardware che usi e se riesci anche uno schema di come hai effettuato i collegamenti (anche su carta) le risposte arriveranno più precise e rapide ;)
il codice lo riporto anche se...ancora è completamente vuoto ahahah:


Code: [Select]

#define Sequenza 12
#define Automatico 13

void setup() {


 pinMode(1,OUTPUT);
 pinMode(2,OUTPUT);
 pinMode(3,OUTPUT);
 pinMode(4,OUTPUT);
 pinMode(5,OUTPUT);
 pinMode(6,OUTPUT);
 pinMode(7,OUTPUT);
 pinMode(8,OUTPUT);
 pinMode(9,OUTPUT);
 pinMode(10,OUTPUT);
 pinMode(11,OUTPUT);
 pinMode(Sequenza,INPUT);
 pinMode(Automatico,INPUT);

}

void loop() {

 if (digitalRead(Sequenza == HIGH)){


  digitalWrite(1, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(9, HIGH);
  digitalWrite(2, LOW);
  digitalWrite(4, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);



 
 }



 

}


ho a disposizione:
una Scheda Fluo WiFi con 13 pin
13 led
13 resistenze da 330Ω
2 pulsanti
2 resistenze da (credo 10kΩ)
delle breadborad (non so ancora quante o quanto grandi)
e ovviamente dei connettori
 
ora carico un'immagine per farvi più o meno capire quali led sono collegati a quali pin (temporaneamente) secondo il codice scritto sopra



avendo a disposizione  una scheda fluo con 13 pin, io avendo in realtà 15 led e due pulsanti ho deciso di
spostare il numero 1 a destra così da poter eliminare i due led rappresentati in nero
e collegare allo stesso pin gli unici 3 led che sono sempre accesi in qualsiasi combinazione
così da avere abbastanza ingessi per tutti i led e i due pulsanti
(non sono sicuro sia necessario che ogni led sia diviso dal resto, ma mi sembrava più semplice dal punto di vista software)

riguardo allo schema del collegamento non lo posso ancora nemmeno immaginare non sapendo che tipo di breadboard mi fornirà la scuola...se ne dovrò usare tante di piccole dimensioni o se ne avrò una abbastanza grande (fin'ora abbiamo usato le breadboard piccole (credo da 400 punti)

direi che non ho molto da aggiungere se non : "non ho idea di come continuare a scrivere il programma"

ChriProp

#4
Sep 14, 2018, 11:45 pm Last Edit: Sep 15, 2018, 12:13 am by ChriProp
Aggiornamento codice:
Code: [Select]

#define Sequenza 12
#define Automatico 13

void setup() {


 pinMode(1,OUTPUT);
 pinMode(2,OUTPUT);
 pinMode(3,OUTPUT);
 pinMode(4,OUTPUT);
 pinMode(5,OUTPUT);
 pinMode(6,OUTPUT);
 pinMode(7,OUTPUT);
 pinMode(8,OUTPUT);
 pinMode(9,OUTPUT);
 pinMode(10,OUTPUT);
 pinMode(11,OUTPUT);
 pinMode(Sequenza,INPUT);
 pinMode(Automatico,INPUT);

}

void loop() {
 

 if (digitalRead(Automatico == HIGH)){

goto uno;
delay(2000);
goto due;
delay(2000);
goto tre;
delay(2000);
goto quattro;
delay(2000);
goto cinque;
delay(2000);
goto sei;
delay(2000);
goto sette;
delay(2000);
goto otto;
delay(2000);
goto nove;
delay(2000);
goto zero;
}
 
 
uno: 
  digitalWrite(1, HIGH);
  digitalWrite(2, LOW);
  digitalWrite(3, HIGH);
  digitalWrite(4, LOW);
  digitalWrite(5, HIGH);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);

 due: 
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, LOW);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(9, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);

tre: 
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, LOW);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);


quattro: 
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, LOW);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);


cinque: 
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, LOW);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);
 

sei: 
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, LOW);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);

 
sette: 
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
 
otto: 
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);


nove: 
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);


zero: 
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, LOW);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);


 




 
 if (digitalRead(Sequenza == HIGH)){


  digitalWrite(1, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(9, HIGH);
  digitalWrite(2, LOW);
  digitalWrite(4, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);



 
 



 

}
}



ho deciso di iniziare col bottone che dovrebbe far partire la successione dei numeri automatica.
Internet mi ha aiutato a trovare la funzione goto anche se non sono sicuro di averla utilizzata nel modo corretto, però la compilazione non mi da errori, ma purtroppo non ho il materiale hardware per testarlo... volevo però sapere se secondo voi potrebbe funzionare...

Edit:
ho spostato tutto da void loop al setup, così da evitare che si ripeta all'infinito.
Dite che funziona?

ChriProp

Ok premetto che mi scuso per il multipost ma stavo facendo dei ragionamenti prima di andare a dormire,
avvalendomi della funzione goto sono riuscito (o almeno credo) a fare anche la seconda parte del programma
che quindi dovrebbe risultare finito, con tanto di commenti...
ora ve lo scrivo per chiedervi un parere.



Code: [Select]

#define Sequenza 12       //da il nome del pin 12
#define Automatico 13     //da il nome del pin 13
                          //per un fattore di memoria
void setup() {

//definisce a quali pin sono collegati input e a quali output

 pinMode(1,OUTPUT);
 pinMode(2,OUTPUT);
 pinMode(3,OUTPUT);
 pinMode(4,OUTPUT);
 pinMode(5,OUTPUT);
 pinMode(6,OUTPUT);
 pinMode(7,OUTPUT);
 pinMode(8,OUTPUT);
 pinMode(9,OUTPUT);
 pinMode(10,OUTPUT);
 pinMode(11,OUTPUT);
 pinMode(Sequenza,INPUT);
 pinMode(Automatico,INPUT);



//Ciclo automatico dei numeri

  if (digitalRead(Automatico == HIGH)){

goto uno;
delay(2000);
goto due;
delay(2000);
goto tre;
delay(2000);
goto quattro;
delay(2000);
goto cinque;
delay(2000);
goto sei;
delay(2000);
goto sette;
delay(2000);
goto otto;
delay(2000);
goto nove;
delay(2000);
goto zero;
}
 
 
uno: 
  digitalWrite(1, HIGH);
  digitalWrite(2, LOW);
  digitalWrite(3, HIGH);
  digitalWrite(4, LOW);
  digitalWrite(5, HIGH);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);

 due: 
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, LOW);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(9, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);

tre: 
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, LOW);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);


quattro: 
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, LOW);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);


cinque: 
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, LOW);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);
 

sei: 
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, LOW);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);

 
sette: 
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
 
otto: 
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);


nove: 
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);


zero: 
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, LOW);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);


}

void loop() {

int val=0; //definisce un valore 0

//Sequenza dei numeri
  if (digitalRead(Sequenza == HIGH)){

  delay(1000);

  val++; //aumenta il valore definito di 1 (fondamentale per definire il numero da rappresentare)
}

if (val == 0){
 goto zero;
}
if (val == 1){
 goto uno;
}

if (val == 2){
 goto due;
}

if (val == 3){
 goto tre;
}

if (val == 4){
 goto quattro;
}

if (val == 5){
 goto cinque;
}

if (val == 6){
 goto sei;
}

if (val == 7){
 goto sette;
}

if (val == 8){
 goto otto;
}

if (val == 9){
 goto nove;
}

if (val == 10){ //dopo il numero 9 il valore di val torna a 0
 int val = 0;
}



uno: 
  digitalWrite(1, HIGH);
  digitalWrite(2, LOW);
  digitalWrite(3, HIGH);
  digitalWrite(4, LOW);
  digitalWrite(5, HIGH);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);

 due: 
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, LOW);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(9, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);

tre: 
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, LOW);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);


quattro: 
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, LOW);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);


cinque: 
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, LOW);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);
 

sei: 
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, LOW);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);

 
sette: 
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
 
otto: 
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);


nove: 
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);


zero: 
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, LOW);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);

}



vorrei ricordare il mio livello di competenza elementare...quindi oltre al fatto che possa funzionare o meno, qualsiasi consiglio è ben gradito.
Grazie.

brunello22

Prima di tutto la fluo-wi-fi non ha 13 pin, ma 20 (come un normale Arduino UNO) e puoi usare come normali pin digitali anche quelli marcati da A0 a A5.
I pin 0 e 1 non usarli, sono riservati alla seriale e alla programmazione ( sia della parte Arduino che ESP32 )

Per il software, ora è tardi, ma quei goto proprio non si possono vedere

Claudio_FF

#7
Sep 15, 2018, 09:42 am Last Edit: Sep 15, 2018, 09:45 am by Claudio_FF
Quote from: ChriProp
oltre al fatto che possa funzionare o meno, qualsiasi consiglio è ben gradito
Mi ricordo che all'inizio, prima di poter mettere le mani su qualcosa di programmabile, anche io avevo riempito fogli di carta con "ipotesi di programma" per cercare di capire come organizzare il tutto.

Ok per la variabile che contiene il valore da visualizzare.

Fnzionerebbero anche i goto se non fosse per il fatto che non ritornano al punto di partenza da cui sono stati "chiamati", ma vengono eseguiti tutti in fila, e quindi alla fine è come saltare sempre all'ultimo.

Funzionerebbe se al posto dei goto si scrivessero delle funzioni (una volta terminate l'esecuzione riprende dal punto da cui sono state chiamate).

O ancora meglio una sola funzione, a cui passare durante la chiamata il numero da visualizzare (il valore della variabile).
* * * *    if non è un ciclo   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *

ChriProp

Prima di tutto la fluo-wi-fi non ha 13 pin, ma 20 (come un normale Arduino UNO) e puoi usare come normali pin digitali anche quelli marcati da A0 a A5.
I pin 0 e 1 non usarli, sono riservati alla seriale e alla programmazione ( sia della parte Arduino che ESP32 )

Per il software, ora è tardi, ma quei goto proprio non si possono vedere

Mhm questo mi è  molto d'aiuto, grazie.


Mi ricordo che all'inizio, prima di poter mettere le mani su qualcosa di programmabile, anche io avevo riempito fogli di carta con "ipotesi di programma" per cercare di capire come organizzare il tutto.

Ok per la variabile che contiene il valore da visualizzare.

Fnzionerebbero anche i goto se non fosse per il fatto che non ritornano al punto di partenza da cui sono stati "chiamati", ma vengono eseguiti tutti in fila, e quindi alla fine è come saltare sempre all'ultimo.

Funzionerebbe se al posto dei goto si scrivessero delle funzioni (una volta terminate l'esecuzione riprende dal punto da cui sono state chiamate).

O ancora meglio una sola funzione, a cui passare durante la chiamata il numero da visualizzare (il valore della variabile).
Ci sono due pulsanti che fanno due cose ben distinte, uno dovrebbe far scorrere i numeri uno dopo l'altro, per questo li ho messi in fila.
non capisco cosa intendi per saltare sempre all'ultimo.

Patrick_M

#9
Sep 15, 2018, 05:13 pm Last Edit: Sep 15, 2018, 05:14 pm by Patrick_M
Quote
non capisco cosa intendi per saltare sempre all'ultimo.
Code: [Select]

goto uno;
...
uno:
  digitalWrite(1, HIGH);
  digitalWrite(2, LOW);
...
  digitalWrite(9, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
   // qui non c'è nulla che fa tornare all'istuzione successiva al goto1
   // quindi il programma continua con le prossime istruzioni e cioè:
 due:
  digitalWrite(1, HIGH);
...
 tre:
...
...
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

fabpolli

Mi inserisco nella discussione, visto che sei agli inizi (come hai detto nella presentazione) ti consiglio vivamente di evitare i goto e se trovi qualche tutoria su qualche sito che li usa... SCAPPAAAAAAA :)
A parte gli scherzi non si possono proprio vedere, nel tuo caso ad esempio puoi sostituire i goto con una chiamata ad una funzione che non ritorna nulla (void):
Code: [Select]

if (digitalRead(Automatico == HIGH))
{
  primoPasso();
  delay(2000);
  secondopasso();
  delay(2000);
  terzoPasso();
  ... ecc...
}


fuori dal lopp dichiari le funzioni:
Code: [Select]

void primoPasso()
{
  digitalWrite(1, HIGH);
  digitalWrite(2, LOW);
  digitalWrite(3, HIGH);
  digitalWrite(4, LOW);
  digitalWrite(5, HIGH);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
}

void secondoPasso()
{
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, LOW);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(9, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);
}

...ecc...

Poi la cosa si potrebbe otimizzare ulteriormente ma procediamo per gradi così apprendi meglio i rudimenti e poi nessuno ti fermerà più  :)

Datman

#11
Sep 17, 2018, 10:03 am Last Edit: Sep 17, 2018, 10:12 am by Datman
Ad esempio potresti scrivere tutte le uscite di una porta contemporaneamente usando PORT:
void primoPasso()
Code: [Select]
{
 digitalWrite(1, HIGH);
 digitalWrite(2, LOW);
 digitalWrite(3, HIGH);
 digitalWrite(4, LOW);
 digitalWrite(5, HIGH);
 digitalWrite(6, LOW);
 digitalWrite(7, LOW);
 digitalWrite(8, LOW);
 digitalWrite(9, HIGH);
 digitalWrite(10, LOW);
 digitalWrite(11, LOW);
}

Diventerebbe:

PORTD=0b0010101; PORTB&=0b11110010; PORTB|=0b00000010;

Cerca informazioni su "arduino port manipulation".
Te lo dico per abbreviare il tuo codice e renderlo più compatto, ma già stiamo andando un bel po' avanti... Comunque è un argomento utile e interessante che, per la sua comprensione, richiede solo la conoscenza della notazione binaria ed è un bell'esercizio per comprenderla meglio. :)
Hi, I am Gianluca from Roma. I play and work with electronics since I was 16 (1984).
After 25 years of maintenance on cameras and video mixers, since 2013 my job is HD TV studios design.
In Jan 2015 I began playing with Arduino.

gpb01

#12
Sep 17, 2018, 10:06 am Last Edit: Sep 17, 2018, 10:08 am by gpb01
Ad esempio potresti scrivere tutte le uscite di una porta contemporaneamente usando PORT:
void primoPasso()
... un po' prematuro come consiglio non ti pare ?  ... magari facciamo si che impari a scrivere bene il codice in 'C', che poi ad ottimizzare e scrivere codice, che può anche diventare NON trasportabile da una scheda all'altra (... se non c'è necessità di velocità, è sempre meglio usare il framework wiring), c'è sempre tempo !

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

gianlucaf

#13
Sep 17, 2018, 11:29 am Last Edit: Sep 17, 2018, 11:58 am by gianlucaf
una delle prime cose che si impara nella programmazione  è l'uso delle funzioni.
Ti semplificano concettualmente il lavoro dividendolo in sottoproblemi e riducono il codice da riscrivere perchè possono essere riutilizzate.

Io farei:
- una funzione che fa un check (accende tutti i led)
- una che spegne tutti i led
- una funzione che riceve in argomento il numero intero da visualizzare ed esegue l'accensione dei led. dovrai usare uno switch case sicuramente.


il resto del codice di controllo dei pulsanti e l'incremento della variabile può stare nel loop.


esempio in semi-pseudocodice

Code: [Select]

int val;

void setup() {
  checkschermo();        // accende tutti i led
  delay(1000);           // lui mantiene accesi 1 sec
  puliscischermo();      // spegne tutti i led
}

void loop() {
  if (premuto il tasto 1) {           // se è stato premuto il tasto "su" esegue la visualizzazione di tutti i numeri da 0 a 9
    for (val = 0; val <= 9; val++) {  // ciclo for assegna alla variabile var il valore 0 e ad ogni ciclo esegue le 3 righe ed incrementa il valore di val di 1
      visualizzanumero(val);          // visualizza il numero
      delay(1000);                    // lo mantiene per 1 secondo
      puliscischermo();               // cancella il numero spegnendo i led
    }
  }
  if (premuto il tasto 2) {           // se è stato premuto il tasto "giù" esegue la visualizzazione di tutti i numeri da 9 a 0
    for (val = 9; val >= 0; val--) {  // ciclo for assegna alla variabile var il valore 9 e ad ogni ciclo esegue le 3 righe ed decrementa il valore di val di 1
      visualizzanumero(val);
      delay(1000);
      puliscischermo();
    }
  }
}

/*funzione che riceve un numero intero e accende i led rispettivi per visualizzarne il valore */
void visualizzanumero(int num) {
  switch (num) {
    case 0:
      digitalWrite(1, HIGH);
      digitalWrite(2, HIGH);
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH);
      digitalWrite(6, HIGH);
      digitalWrite(7, LOW);
      digitalWrite(8, HIGH);
      digitalWrite(9, HIGH);
      digitalWrite(10, HIGH);
      digitalWrite(11, HIGH);
      break;
    case 1:
      ...
    case n:
      //etc etc
  }
}

/* funzione che spegne tutti i led*/
void puliscischermo() {
  digitalWrite(1, LOW);
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
}

/* funzione che accende tutti i led*/
void checkschermo() {
  digitalWrite(1, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);
}



in un secondo momento magari metterei mano alla funzione visualizzanumero() cercando di renderla più elegante e compatta. Un modo semplice potrebbe essere di usare un ciclo for per passare a digitalWrite il numero della porta e il relativo stato, magari letto da un array.

Go Up