LED + LCD: perchè non scrive lo stato del led?

Salve a tutti.
Oggi ho iniziato un nuovo progettino, tanto per prendere dimestichezza con lo schermo LCD che si trova nello starter kit di Arduino.
Il progetto consiste nel far accendere un led tramite un pulsante e che nello schermo LCD mi compaia scritto se il LED è acceso o no.
All'inizio vorrei che compaia una scritta con "Vediamo com'è il led" e poi acceso o spento in base se il pulsante è premuto o no; il problema sta nel fatto che scrive direttamente la scritta spento, anche se premo, ma noto che vi è un tremore nella scritta, inoltre non compare la scritta iniziale.

il codice è il seguente

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2) ;

const int led = 7;
int swhitchState = 0;

void setup()
{
lcd.begin(16, 2);
pinMode(led, INPUT);
lcd.print("vediamo");
lcd.setCursor(0, 1);
lcd.print("com'e il LED");
}

void loop() {
swhitchState = digitalRead (led);

if (swhitchState == HIGH) {
lcd.clear ();
lcd.setCursor (0,0);
lcd.print ( "acceso");
}

else{
lcd.clear ();
lcd.setCursor (0,0);
lcd.print ( "spento");
}
}

togliendo pezzi di codice, quello che ho capito e che fa tutto il loop andando direttamente al comando "else"; qualcuno potrebbe spiegarmi dove sbaglio e come dovrei impostare il codice?
grazie mille in anticipo

Forse servirebbbe mezzo schema elettrico o una foto come hai collegato LED e pulsante.
Ciao Uwe

Rifletti: un istante dopo aver stampato in prima riga "Vediamo", ci sovrapponi "acceso" o "spento", quindi non vedrai nulla.

Usa l'altra riga e risolvi il problema.

Il fatto che usi clear da quell'effetto di lampeggio indesiderato: limitati a sovrapporre le scritte in seconda riga.

ecco qui l'immagine http://it.tinypic.com/r/23ubtr4/8

Secondo l'immagine hai collegato il pin 7 a massa.

Ciao Uwe

il probema non sta nella parte hardware, xk la lampadina si accende, ma bensi è la parte software.

Secondo l'immagine hai collegato il pin 7 a massa.

si il pin7 è sulla linea 5 che va a massa, supponendo che il led sia collegato sempre alla linea 5 (dall immagine non si capisce) naturalmente il led si accende ma il pin rimane sempre a LOW
collega il pin 7 nella fila 1(prima del resistore) e inverti le due scritte

ecco qui l'immagine del circuito... potreste dirmi dove sbaglio sia nella parte hardware che software? magari spiegando dove ho sbagliato, il motivo per cui non funziona, come sistemarlo e perchè dovrei farlo in quella maniera cosi da capire l'errore e non commetterlo più

come già detto il pin 7 è collegato a massa e resterà a vita a LOW. Collegalo a monte del pulsante prima della reaiatenza

non funziona ugualmente

Stai cercando di fare il mix di questi due "circuiti":
http://www.multiwingspan.co.uk/arduino.php?page=led4

Perchè non li fai separata e poi se funzionano allora vediamo (se possibile) di metterli insieme ?

P.S. occhio che le due resistenze sono diverse e di molto. Una serve per limitare la corrente (ampere) al led a circa 10-20 mA, mentre l'altra serve come PullUp per leggere il pulsante quando lo premi
http://playground.arduino.cc/CommonTopics/PullUpDownResistor

ho fatto come ha detto lei, in quella configurazione mi sa che sbagliavo qualcosa, anche se ancora non so cosa, ora invece ho diviso il led dal pulsante e ad ognuno ho dato un pin suo e ora funziona, il problema è sempre e solo uno, la scritta lampeggia e non so come risolverlo :frowning:

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2) ;

int led = 9;
int pulsante = 13;
int switchState = 0;

void setup()
{
lcd.begin(16, 2);
pinMode(led, OUTPUT);
pinMode(pulsante, INPUT);
lcd.print("vediamo");
lcd.setCursor(0, 1);
lcd.print("com'e il LED");
delay (2000);
lcd.clear ();
}

void loop() {
switchState = digitalRead (pulsante);
lcd.clear ();

if (switchState == HIGH) {
lcd.setCursor (0,0);
lcd.print ( "acceso");
digitalWrite (led,HIGH);
}

else{
lcd.setCursor (0,0);
lcd.print ( "spento");
digitalWrite (led,LOW);
}
}

Hai seguito sicuramente il manuale:
C. Omplicato, "Come fare intrecciare più fili possibili negli schemi elettrici", Dedalo Editore
Anche i piedini del LED... :grin:

Bene, torniamo seri...

Come indicazione generale, sarebbe preferibile mostrare lo schema elettrico, invece dell'immagine - schema di montaggio.

Inoltre il codice è meglio metterlo col "code" invece che "quote".

Seguendo queste indicazioni, per noi sarà molto più rapido darti i suggerimenti.

P.S. per la scritta che lampeggia, ti ha già detto cyberhs qual è la causa

ho fatto alcune modifiche, come mi ha suggerito nid69ita, ora il sistema funziona.

Hai seguito sicuramente il manuale:
C. Omplicato, "Come fare intrecciare più fili possibili negli schemi elettrici", Dedalo Editore
Anche i piedini del LED... :grin:

non hai visto com'è diventato ora il circuito, spero solo che gli elettroni sappiano dove andare perchè c'è da perdersi ahahha

Come indicazione generale, sarebbe preferibile mostrare lo schema elettrico, invece dell'immagine - schema di montaggio.

non sono molto pratico di schemi elettrici, il massimo che posso fare e fare lo schema di montaggio su Fritzing e poi da li prenderli entrambi.

P.S. per la scritta che lampeggia, ti ha già detto cyberhs qual è la causa

è vero, cyberhs mi ha detto qual'è il problema, ma sinceramente mi interessa anche la soluzione. Togliendo il comando lcd.clear resta la scritta precende, e io vorrei che quando deve comparire una scritta, quella precedente si tolga del tutto; dunque qualcuno riesce a darmi anche qualche soluzione efficace?

In che senso la scritta precedente non "scompare" ?

Se tu stampi a 0,0 "PIPPO"
e poi sempre a 0,0 "ABC" logicamente a video vedrai ABCPO
basta stampare "ABC " con due spazio e a video ABC

In che senso la scritta precedente non "scompare" ?

Se tu stampi a 0,0 "PIPPO"
e poi sempre a 0,0 "ABC" logicamente a video vedrai ABCPO
basta stampare "ABC " con due spazio e a video ABC

si si, ha capito benissimo.
Allora l'unico modo per risolvere questo problema è quello di aggiungere degli spazi? non c'è nessun altro modo?

E' il modo migliore in generale, eviti di cancellare le altre zone del display.

Ma visto che funziona, approfittane per inserire un miglioramento nel programma, con un accorgimento che in seguito ti tornerà utile anche per cose più complesse.

Così come è ora, il tuo programma aggiorna la scritta ad ogni ciclo, anche se lo stato del pulsante è identico allo stato del ciclo precedente.
Questo ti provoca il lampeggiamento se fai un clean ma te lo potrebbe provocare anche in altre circostanze.

Il passo successivo è:

  • fare in modo che la scritta sul display venga aggiornata solo se c'è una variazione rispetto al ciclo precedente

A mio umile parere (se sbaglio ditemelo pure ammetto volentieri la mia ignoranza :smiley: :wink: ) ma mi sembra che nello script in

void loop() {
switchState = digitalRead (pulsante);
lcd.clear ();

ldc.clear(); non fa altro che pulire lo schermo ogni volta che il loop inizia... prova a toglierlo dovrebbe essere li il problema e dovrebbe uscire una cosa come questa:

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2) ;

int led = 9;
int pulsante = 13;
int switchState = 0;

void setup()
{
  lcd.begin(16, 2);
  pinMode(led, OUTPUT);
  pinMode(pulsante, INPUT);
  lcd.print("vediamo");
  lcd.setCursor(0, 1);
  lcd.print("com'e il LED");
    delay (2000);
lcd.clear ();
}
 
void loop() {
switchState = digitalRead (pulsante);

if (switchState == HIGH) {
lcd.setCursor (0,0);
lcd.print ( "acceso");
digitalWrite (led,HIGH);
}

else{
lcd.setCursor (0,0);
lcd.print ( "spento");
digitalWrite (led,LOW);
}
}

Grazie mille simonenascivera per l'aiuto, ora funziona :slight_smile:

Il passo successivo è:

  • fare in modo che la scritta sul display venga aggiornata solo se c'è una variazione rispetto al ciclo precedente

Come si fa?