istruzione switch RISOLTO

Salve a tutti Dovrei far girare un codice con 2 programmi consecutivi richiamabili arichiesta tramite 2 pulsanti o un interuttore Attualmente collegato sulla porta digitale 8 dell atmega328, sto provando con l istruzione switchma non mi cambia la visualizzazione dell output sullo schermo lcd. Nellospecifico il primo codice riceve 4 segnali sui pin analogici (tensione batteria etc...) il secondo riceve e codifica una stringa seriale e la visualizza sul lcd. Entrambi i codici funzionano ma non riesco a farli commutare visualizzandoli sull lcd. Che potrei fare.? Ringrazio Armando

Nel mondo dei microcontrollori non esiste il concetto di più programmi all'interno della memoria. Il programma è sempre e solo uno, composto da uno o più blocchi di codice.

Nel caso specifico, puoi usare o un if per far eseguire il blocco interessato se la scelta è fra 2 sole opzioni, ad esempio controllare se un pin è high o low, oppure uno switch..case se hai più di un'opzione.

Nel tuo caso potresti semplicemente mettere 2 if uno dietro all'altro:

if (analogRead(pin)>=valore)  { 
  ...blocco 1.....
}
if (letturaSeriale()==true) {
  ...blocco 2....
}

Nota che ho messo "letturaSeriale()==true", questa è una funzione che richiamerai per leggere la seriale, interpretare i dati in arrivo e restituire "true" se ciò che hai ricevuto è quello che stavi aspettando.

Puoi anche mettere più controlli, in modo da non eseguire il 2° blocco se esegui il 1° ecc....

Ti ringrazio leo
Domani provero con la commutazione sul pin analogico
L avevo fatta sul pindigitale impoststo in input ma le due visualizzazioni si sovrappongono ed esce un minestrone

Probabilmente mescoli cose dei 2 sketch.

Se domani lo sketch finale ti dà problemi, allegalo qui (se non è molto grande) che vediamo cos'è che non va.

buon giorno a tutti
ho provato con il pin analogico ma nulla da fare
qui in allegato un semplice programmino che dovrebbe fungere allo scopo
pin digitale 8 ( input)
e due testi con il ciclo IF
ho caricato il tutto la commutazione avviene ma rimane leggermente impressa la scritta precedente
mettendo anche il lcd.clear()

#include <LiquidCrystal.h>
LiquidCrystal lcd(4,9,5,6,7,3);
const int buttonPin = 8;    
int buttonState = LOW;         

void setup() {
  lcd.begin(16,4);
  
  pinMode(buttonPin, INPUT);     
}

void loop(){
    buttonState = digitalRead(buttonPin);
   if (buttonState == LOW)
  {     
   lcd.setCursor(0,0);
 lcd.print("buongiorno ");
  } 
  else 
  {
  lcd.setCursor(0,0); 
lcd.print("buonanotte ");
  }
}

edit by mod: per favore includi il codice usando gli appositi tag

finche non parte questo piccolo programma e inutile lavorare sull’altro.

armando1966:
ho caricato il tutto la commutazione avviene ma rimane leggermente impressa la scritta precedente …

Primo, cortesemente edita il tuo messaggio e racchiudi il codice entro i TAG “code” (bottone #, il terzultimo della seconda fila quando sei in edit).

Secondo … “leggermente impressa” ??? :astonished: :astonished: :astonished:

Una scritta o è visibile sul LCD o non lo è … non può essere leggermente visibile !

Sicuro invece che tu non veda più volte le due scritte apparire e scomparire a causa dei “rimbalzi” del pulsante ? Non vedo infatti nessun codice per il “debouncing” e così, ogni volta che premi il bottone, hai una raffica di impulsi HIGH/LOW !!!

Per inciso, ecco cosa più o meno si ha quando schiacci un bottone :

Guglielmo

Impatare a collegare sempre i pulsanti con resistenza e condensatore ... vi risparmierete carrettate di bestemmie ;) XD XD XD

e che tipo di condensatore e resistenza si deve utilizzare fra il pulsante ed il pin di arduino?

armando1966:
buon giorno a tutti
ho provato con il pin analogico ma nulla da fare
qui in allegato un semplice programmino che dovrebbe fungere allo scopo
pin digitale 8 ( input)
e due testi con il ciclo IF
ho caricato il tutto la commutazione avviene ma rimane leggermente impressa la scritta precedente
mettendo anche il lcd.clear()

#include <LiquidCrystal.h>
LiquidCrystal lcd(4,9,5,6,7,3);
const int buttonPin = 8;
int buttonState = LOW;

void setup() {
lcd.begin(16,4);

pinMode(buttonPin, INPUT);
}

void loop(){
buttonState = digitalRead(buttonPin);
if (buttonState == LOW)
{
lcd.setCursor(0,0);
lcd.print("buongiorno ");
}
else
{
lcd.setCursor(0,0);
lcd.print("buonanotte ");
}
}

finche non parte questo piccolo programma e inutile lavorare sull’altro.

ma dove è l’istruzione switch ?
ma come fai a dichiarare 8 input e poi gli assegni = LOW ]:slight_smile:
se metti un interruttore a levetta (per mettere a massa 8,) devi fare pullup mettendo = HIGH
se metti un pulsante è tassativo qualche tipo di debounce

killrob: e che tipo di condensatore e resistenza si deve utilizzare fra il pulsante ed il pin di arduino?

Non sono critici ... supponendo che tu usi pulsanti collegati a massa e che abiliti la pull-up interna dei pin, ad esempio, basta una resistenza da 1K fra il pulsante ed il pin, ed un condensatore da 100n fra il pin e massa ... se invece il pulsante e' collegato al positivo, NON abiliti la pull-up interna ed aggiungi anche una resistenza da 22K in parallelo al condensatore (che ci vorrebbe in ogni caso, come pull-down), ed il resto rimane come prima ...

Scusate il ritardo ma sono stato dal medico.
Rispondendo a Guglielmo la scritta che appare sul display e leggermente sovrascritta da dall altra
anzi ho allegato 2 foto ( se partono
)in seconda analisi i l interuttore non ha nessuna resistenza sul pin 8 e quindi nessun deboucing ( per quest ultimo devo vdere di che si tratta a livello software.)
Per la questione della dichiarazione del pin 8 ho fatto delle prove da high a low cmq in risultato non cambia alla fine e rimasto low.
Ho allegato n. 2 foto (sono capovolte)
Sicuro in un vs riscontro
GEntilissimi come sempre
Armando

Etemenanki:

killrob: e che tipo di condensatore e resistenza si deve utilizzare fra il pulsante ed il pin di arduino?

Non sono critici ... supponendo che tu usi pulsanti collegati a massa e che abiliti la pull-up interna dei pin, ad esempio, basta una resistenza da 1K fra il pulsante ed il pin, ed un condensatore da 100n fra il pin e massa ... se invece il pulsante e' collegato al positivo, NON abiliti la pull-up interna ed aggiungi anche una resistenza da 22K in parallelo al condensatore (che ci vorrebbe in ogni caso, come pull-down), ed il resto rimane come prima ...

ed utilizzando codice per il debounce si può fare a meno di utilizzare resistenza e condensatore?

Di solito si ... ma il punto e' l'opposto ... usando resistenze e condensatori, si puo fare a meno delle routine di debounce (quindi meno cicli da eseguire, meno ritardi, meno codice e piu memoria a disposizione per il resto ;) XD)

In piu, cosa non indifferente, l'hardware, di solito, funziona sempre al primo colpo, al contrario del software ... (aspetta che mi riparo dietro un muro, prima che i softwaristi qui attorno comincino a tirare bottiglie di birra e sgabelli :P XD XD XD)

Ti dico la mia, io ed il debounce hardware non andiamo d’accordo, mentre un piccolo ritardo software funziona al primo colpo :wink:

@killrob:
il tuo codice ha un problema di fondo: scrive ripetutamente la frase che dipende dallo stato del pin in continuazione. Quelle lettere “fantasma” sono lo sfarfallio del display durante la scrittura tra una frase e l’altra. Lo noti nelle ultime lettere, dove “giorno” si sovrappone a “notte”.
Devi prevedere nel codice la scritta della frase 1 sola volta, al cambio di stato, e poi basta.

0kciao leo sono d accordo Ma sedevovisualizzare Coodinate geografiche , lat , long speed course dato il display 16 x 4 Ecommutando in qualche modo VCC di batteria Pressione olio Temperatura acqua Ripeto codici gia funzionanti e condizionati con l apposita formula Anche questii sono 4 grandezze da visualizzare sul lcd Oppure al limite far lavorare 2 lcd con lo stesso processore Ipare di aver letto che possono lavorare in parallelo .... diciamo Dando priorita al solo pin per l abilitazione Lcd.begin (16, 4); Lcd1.begin(16, 4); Che ne pensi .

Devi elaborare un pò il codice. Nel senso che tutte queste info non puoi stamparle continuamente sul display, altrimenti vedrai quelle lettere fantasma oppure altri tipi di sfarfallii. evi fare in modo di usare millis per poter, ad esempio, scrivere sul display lo stato dei vari dispositivi solo ogni tot. E così fare anche con il tuo messaggio di benvenuto, farlo apparire una sola volta, al cambio di stato. Per fare ciò devi usare una variabile in cui memorizzare il precedente stato e confrontare la lettura del pin, e far apparire la scritta solo se lo stato letto è diverso da quello precedente.

messo in pseudo codice:

var vecchioStato;

  • leggo il pin
  • confronto con vecchioStato: è diverso?
  • sì: salvo la lettura in vecchioStato e poi stampo a video la scritta in base allo stato del pin
  • ripeto

Ti ringrazio leo Ma questo tipo di codice potrebbe essere al di sopra delle mie possibilita Voglio provare con due lcd , per adesso altre soluzioni non mi vengono in mente Anche perche i valori che voglio visualizzare devono fungere da monitor del motore E gli altri richiamabili devono servire per la navigazione Quindi devono rimanere fissi sul display Cerco di provare con due lcd

Per "ogni tot" non intendo per tempi lunghi, basta una stampa ogni 500 ms, per esempio, un tempo ragionevole per non dare problemi di sfarfallii eccessivi e sempre valido per informazioni "aggiornate" (2 volte al secondo).

Etemenanki: Di solito si ... ma il punto e' l'opposto ... usando resistenze e condensatori, si puo fare a meno delle routine di debounce (quindi meno cicli da eseguire, meno ritardi, meno codice e piu memoria a disposizione per il resto ;) XD)

In piu, cosa non indifferente, l'hardware, di solito, funziona sempre al primo colpo, al contrario del software ... (aspetta che mi riparo dietro un muro, prima che i softwaristi qui attorno comincino a tirare bottiglie di birra e sgabelli :P XD XD XD)

tutto "dipende" se avessi lo sketc troppo grande ci può anche stare l'hardware ,

altrimenti solo e sempre software che non costa nulla ;)