Mi serve un consiglio per una programmazione migliore

Salve, grazie per avermi accettato nel forum.
Sono un elettronico che sta cercando di entrare nella programmazione di Arduino, tempo fa programmavo un Po in quikbasic.
Il mio piccolo problema e che mi mancano un Po di cose in questo linguaggio, tipo Subroutine, cicli FOR next, ecc, sicuramente in Arduino ci sarà un modo per farli, ma non gli ho ancora trovato.
Sto scrivendo un programma che serve a visualizzare un dato messaggio su un display se cambia il livello logico a un determinato ingresso del Microcontrollore ATmega2560.
Il programma funziona ma per fare scrivere il messaggio sul display e fare in modo che cambi ciclicamente, devi scrivere più volte i messaggi gestendoli con dei delay(xxxx)
Esiste un modo più coretto di scrivere questa rutina, decidendo quante volte deve ripeterla e la temporizzazione da usare?
Allego una delle rutine che sto usando
Grazie

if (digitalRead(PULSANTE1) == HIGH) // Pulsante 1 premuto
  {
digitalWrite(USCITA1, HIGH);    // Accensione led 2
print2display(" PORTA  "); // linea aggiunta da giorgio per mettere una frase  30-4-2018
delay (1000);  
print2display("INGRESSO"); // linea aggiunta da giorgio per mettere una frase  30-4-2018
delay(1000);
print2display(" PORTA  "); // linea aggiunta da giorgio per mettere una frase  30-4-2018
delay (1000);  
print2display("INGRESSO"); // linea aggiunta da giorgio per mettere una frase  30-4-2018
delay(1000);
print2display(" PORTA  "); // linea aggiunta da giorgio per mettere una frase  30-4-2018
delay (1000);  
print2display("INGRESSO"); // linea aggiunta da giorgio per mettere una frase  30-4-2018
delay(1000);
print2display(" PORTA  "); // linea aggiunta da giorgio per mettere una frase  30-4-2018
delay (1000);  
print2display("INGRESSO"); // linea aggiunta da giorgio per mettere una frase  30-4-2018
delay(1000);
print2display(" PORTA  "); // linea aggiunta da giorgio per mettere una frase  30-4-2018
delay (1000);  
print2display("INGRESSO"); // linea aggiunta da giorgio per mettere una frase  30-4-2018
delay(1000);
print2display(" PORTA  "); // linea aggiunta da giorgio per mettere una frase  30-4-2018
delay (1000);  
print2display("INGRESSO"); // linea aggiunta da giorgio per mettere una frase  30-4-2018
delay(1000);  
 }
  else
  {
  digitalWrite(USCITA1, LOW);
  }
  delay(100);

The Arduino is programmed in C++ and of course you can write and call subroutines (actually called functions) and use for loops

falconblu: Prima di tutto, nella sezione in lingua Inglese si può scrivere SOLO in Inglese … quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post …

… poi, essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (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

… infine, in conformità al suddetto regolamento, punto 13, il cross-posting è proibito (anche tra lingue diverse) per cui, il tuo post duplicato qui nella sezione Italiana è stato cancellato.

Grazie.

Guglielmo

P.S.: Il tuo post è già stato spostato nell’opportuna sezione del forum "Italiano”dove puoi proseguire la discussione.
P.P.S.: Ti ricordo che, fino a quando non sarà fatta la presentazione, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

Salve gpb019, mi spiace se al mio primo post ho creato un Po di confusione, non era mia intenzione.
Se ho scritto nella sezione inglese invece di quella italiana, penso che sia stata colpa del traduttore automatico che ho sulle pagine web, a volte non mi rendo conto se è inglese o italiano.
Mi spiace se non mi sono presentato, ma non sono alla ricerca di un lavoro e non pensavo di dare un curriculum :slight_smile: .

Poi se non mi vogliono rispondere, non fa niente, già alla prima risposta ho capito che aria tira, non mi sembrava di aver chiesto tanto, né tantomeno ho fatto richiesta di scrivermi un programma, ma era solo un’ottimizzazione sulla scrittura di un codice.
Devo essermi abituato male nella vita, a me se qualcuno mi si avvicina e mi chiede un aiuto su come disporre, o come ottimizzare un circuito elettronico, non gli chiedo né il curriculum, né tanto meno gli rispondo in modo complicato, ma cerco nel possibile di aiutarlo.
Nella mia vita vale sempre la regola numero uno di mio padre, se voi una casa fattela da solo, e se non ci arrivi tempo ci vuole.
Aspetto che questo post è letto e cancello inscrizione al forum.
Grazie e scusate il disturbo.

falconblu:
Salve gpb019, mi spiace se al mio primo post ho creato un Po di confusione, non era mia intenzione ........

... se esiste un REGOLAMENTO non ti sembra normale e buona educazione rispettarlo ?

Poi fai come vuoi, cancellati pure ... però certi atteggiamenti non li capisco ... ::slight_smile:
... oltretutto, se avessi letto il regolamento come richiesto, avresti anche scoperto perché si chiede la presentazione (punto 16.7).

Guglielmo

Ciao! Non vedere tutto negativo perché non è cosi :slight_smile: Questo forum è un ambiente dove si aiuta volentieri, è formato da tanti utenti che non sono specializzati ne in elettronica ne in informatica, è un forum aperto a tutti molto tollerante.
La presentazione non deve essere un curriculum, ma solo due righe per sapere quanto sei preparato di elettronica e in programmazione. E' utile per chi deve rispondere, ad esempio a me è capitato di voler rispondere a qualche domanda sulla programmazione, ma leggendo la presentazione ho scoperto che erano programmatori professionisti, ho evitato quindi di dare risposte da "principiante" a qualcuno che è laureato in informatica, perché certamente ne sapeva più di me :slight_smile:

La presentazione è una richiesta democratica, viene chiesta a tutti, anche se si iscrive
la direttrice del CERN, o il ragazzo del salumiere.
Inoltre quì ci sono tanti appassionati che spendono il loro tempo ad aiutare i principianti
e anch'io ne ho "approfittato" molto , e comunque nessuno ti vuole "stuzzicare".
Ti invito a rimanere e vedrai che tutto filerà liscio.
Ciao

Ps: anch'io ai primi tempi, in una discussione, o preso cappello, può succedere, siamo fallaci.

Buonasera, ho fatto una breve presentazione, riprovo a porre il quesito al forum, sperando che non abbia fatto altri casini, perché sembra che sono partito male. :slight_smile:

Ho ripulto il post da tutte le inutili chiacchiere che nulla avevano a che vedere con la discussione tecnica ...
... cortesemente rimaniamo in ambiente "tecnico", grazie.

Guglielmo

falconblu:
... Il mio piccolo problema e che mi mancano un Po di cose in questo linguaggio, tipo Subroutine, cicli FOR next, ecc, sicuramente in Arduino ci sarà un modo per farli, ma non gli ho ancora trovato ...

Come puo ben immaginare quelle cose esistono anche in C/C++ ... solo che hanno nomi diversi.

Quelle che in altri linguaggi chiami "subroutines" in 'C' le chiami "funzioni", quindi, definisci una funzione, ci metti dentro il codice che deve eseguire e, dove ti serve, la richiami quante volte vuoi.

Per i cicli ne hai di vario tipo, incluso il for ed il do while.

Detto questo, direi che per ripetere più volte una sequenza di istruzioni, un bel ciclo for potrebbe seere la soluzione ... ci vuoi provare ad applicarlo al tuo codice ?

Guglielmo

Mah, io gli avevo modificato il suo programma con il ciclo FOR, e senza "inutili chiacchiere" ma non lo vedo più...

steve-cr:
Mah, io gli avevo modificato il suo programma con il ciclo FOR, e senza “inutili chiacchiere” ma non lo vedo più…

Perché era in mezzo al blocco di “monnezza” e quindi è partito con essa … comunque, è stato ben indicato al OP come in ‘C’ si fanno i vari cicli e non dubito che sarà in grado di sistemare il suo codice utilizzando il for :slight_smile:

Guglielmo

Edit: … sono riuscito a recuperare il post:

steve-cr:
Per quanto riguarda il tuo programma, da quanto ho capito vuoi far lampeggiare la scritta ciclicamente.
quindi fai:

if (digitalRead(PULSANTE1) == HIGH) // Pulsante 1 premuto

{
digitalWrite(USCITA1, HIGH);    // Accensione led 2

for (int i=0; i <= 10; i++){
   
print2display(" PORTA  ");
delay (1000);
print2display(“INGRESSO”);
delay(1000);
}

eccetera eccetera…

Mi attacco qui anch'io, perché credo di essere allo stesso livello di falconeblu
Ki mi spiega il programma, quello corretto?

AmericanDreamer:
Ki mi spiega il programma, quello corretto?

Perfavore ... non sei né su una chat né su WhatsApp ... qui da noi chi si scrive chi e NON ki, grazie :smiley:

Detto questo cosa non ti è chiaro? Il ciclo for? o che cosa ?

Guglielmo

Scusa, non mi trovo col for
Per la kappa, mi è scappata

Il for è una “struttura di controllo” che trovi ben descritta nel reference di Arduino, QUI.

Richiede (non obbligatoriamente) tre parametri, un primo di “inizializzazione”, un secondo di “condizione” ed un terzo di “incremento”. In pratica nel primo inizializzi una variabile, nel secondo gli dici per quali valore di quella variabile si resta nel ciclo e nel terzo come deve incrementare la variabile … quindi, tutto quello che è racchiuso tra le successive parentesi graffe viene ripetuto tante volte sino a quando la “condizione” non è più soddisfatta e si esce dal ciclo.

Ad esempio:

uint8_t miaVar;
...
for (miaVar = 0; miaVar < 10; miaVar++) {
   // blocco ripetuto
}

miaVar viene prima “inizializzata” a 0, poi si dice che la “condizione” per restare nel ciclo è che essa sia minore di 10 e quindi si dice che ad ogni ciclo la si “incrementa” di 1, quindi … il ciclo verrà ripetuto per 10 volte: 0, 1, 2, 3 … 9

Più chiaro ora ?

Guglielmo

Ciao! Non ho visto la risposta di gpb01 e ho postato :slight_smile: Non cancello tanto male non fa :slight_smile:

Il for esegue un ciclo fino “ripete”, fino a quando la condizione è vera.
Normalmente si usa il ciclo for() per ripetere un certo numero di volte tramite una variabile contatore.

il for() è diviso in tre parti da un punto e virgola, ogni parte ha uno scopo.

for(assegnazione variabile, viene eseguita una sola volta ; condizione,se vera il ciclo continua; incremento della variabile contatore)

Esempio

int i;

for(i=0;i<5;i++){


}

/*1)Prima parte i=0, assegno alla variabile i un valore iniziale, questa parte del for viene eseguita 
      una sola volta.

2) condizione i<5, questa parte viene eseguita ad ogni ripetizione del ciclo,
    se la condizione è vera il ciclo continua, se falsa termina, se i minore di 5 continua.


3) Incremento della variabile i++, viene eseguito a ogni ripetizione del ciclo
    in questo modo intanto che il ciclo si ripete, i diverrà uguale a 5, la condizione diverrà falsa
    e il ciclo for() terminerà.


   in questo caso esegue 5 volte, i=0,i=1,i=2,i=3,i=4, quando i diventa uguale  a 5, la condizione i<5 sarà  falsa, i non è minore di 5 perché adesso i è uguale a 5, e il ciclo termina.

*/

Grazie a tutti
Comunque mi sono reso conto che devo studiare ancora un po'
Ci si sente più avanti, al prossimo mio dubbio

Ciao AmericanDreamer, ho letto la tua presentazione e faccio una mia riflessione condivisibile o meno, l’intento è dare uno spunto di riflessione.

Sebbene tu abbia fatto sicuramente la cosa giusta a comprare la Bibbia del C, io sarei per consigliarti qualcosa di più alla portata, per iniziare.
Sia sul C che su Arduino.
Qualcosa che sia meno “palloso” e più pratico/diretto/concreto.
Poi, per raffinare e approfondire, cioè per fare il salto di qualità, la Bibbia è senz’altro il libro giusto, ma come primo libro ho l’impressione che se non sei proprio votato (cioè se non hai l’animo hacker che spinge da dentro in modo incontrollato) per questo mestiere sia più scoraggiante che utile.
Guglielmo consiglia sempre questo.
Scarico la colpa su Guglielmo :wink: perchè io non l’ho comprato, ne ho presi altri di taglio diverso, un po’ più tecnici forse, per cui non te li propongo.

La "Bibbia" (il K&R), come dico sempre, è un "reference" e NON è un libro didattico! Per cominciare è molto, ma molto più utile un libro "didattico" come è, ad esempio, quello indicato :wink:

Guglielmo