Problema: scritta LCD che cambia con la pressione del pulsante

Ciao a tutti.
Oggi volevo provare a scrivere sul display LCD se un bottone è premuto o no. Questo è lo schetch:

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
int backLight = 13; 
int button = 9;
int state_button = digitalRead(button);

void setup()
{
  pinMode(backLight, OUTPUT); 
  pinMode(button, INPUT);
}

void loop()
{
  switch (state_button) {
    case 1:
       lcd.begin(16,2);
       lcd.clear(); 
       lcd.setCursor(0,0);
       lcd.print("Stato bottone:");
       lcd.setCursor(0,1);
       lcd.print("PREMUTO");
    case 0:
       lcd.begin(16,2);
       lcd.clear(); 
       lcd.setCursor(0,0);
       lcd.print("Stato bottone:");
       lcd.setCursor(0,1);
       lcd.print("LIBERO");
  }
  delay(100);
}

edit by mod: incluso codice nei tag appositi

Ho allegato lo schema frizting dei collegamenti.
Il display continua a dirmi “Libero” e continua a lampeggiare… Dove sbaglio?

  1. Presentati nell'apposita sezione prima che arrivino i Grandi Capi.
  2. Come da regolamento, inserisci lo sketch fra i tag CODE (modifica il post ;) ) 3. L'istruzione lcd.begin(16,2); mettila nel setup, così non ti lampeggerà più. Poi, la variabile state_button la inizializzi in una parte di sketch che viene letta solo una volta, e questo va bene. Ma non puoi pretendere che cambi il suo valore se non verifichi il suo stato altre volte. Quindi all'interno del loop, fuori dallo switch case, devi inserire in questa variabile il valore di digitalRead(button); ...

Inoltre nello sketch, hai impostato un pin come backlight, oltre a non gestirlo (cosa che credo che farai più avanti), attenzione a come lo colleghi fisicamente!

Qui lo schema del mitico Pighixxx:

Click Me

Ciao.

Ogni "case" dello switch DEVE terminare con l'istruzione break altrimenti ti vengono eseguite tutte in fila.

Innanzitutto scusa per il codice, è il mio primo post e credevo lo riconoscesse in automatico :sweat_smile:
Comunque non ho capito la cosa dello state_button… Dove lo metto? Così intendevi?

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
int backLight = 13; 
int button = 9;


void setup()
{
  pinMode(backLight, OUTPUT); 
  pinMode(button, INPUT);
  lcd.begin(16,2);
}

void loop()
{
  int state_button = digitalRead(button);
  switch (state_button) {
    case 1:
       
       lcd.clear(); 
       lcd.setCursor(0,0);
       lcd.print("Stato bottone:");
       lcd.setCursor(0,1);
       lcd.print("PREMUTO");
    case 0:
       
       lcd.clear(); 
       lcd.setCursor(0,0);
       lcd.print("Stato bottone:");
       lcd.setCursor(0,1);
       lcd.print("LIBERO");
  }
  delay(100);
}

Ma non funziona…

Risolto.. Era il break che mancava! Grazie mille!

In alto allo sketch, metterei int state_button = digitalRead(button);

Mentre nel loop lascerei solo state_button = digitalRead(button);

Così facendo dichiari la variabile solo una volta, e nel loop imposti ogni volta il valore che legge sull'input.

matteb99:
Risolto… Era il break che mancava!
Grazie mille!

Te l’avevo detto… :wink: