Pulsanti e Lcd

Buon giorno a te,

questo è il mio progetto/problema....

Ho fondalmente due pulsanti che quando sono premuti contemporaneamente accendono una luce verde
e sul display lcd salta fuori la scritta "erogazione energia"
Quando premo solo il destro si accende la luce rossa (la verde rimane spenta) e sul display viene scritto
"Premere anche il pulsante sinistro)
Viceversa quando premo il pulsante sinistro (luce rossa accesa-Luce verde spenta-Lcd "Premere pulsante destro)

Quando nessuna di queste condizioni è in "funzione" un led rgb si accende e sul display salta fuori "sistema offline"

Spero di essermi spiegato bene perchè probabilmente sembra più complicato di quello che è.
Calcolate che ho comprato il libretto di Arduino (Quindi non capisco fondamentalmente una mazza, e meno male che c' era il libro)

Se riesco allego il codice con qualche commento in proposito:

// VI PREGO AIUTATEMI NON SO PIÙ DOVE SBATTERE LA TESTA.


#include <LiquidCrystal.h>
LiquidCrystal lcd(9, 8, 5, 4, 3, 2);  
#define Ledrosso 13
#define LedRGB 11
#define Ledverde 12
#define Pulsante 7
#define Pulsante2 6
#define LedLcd 10

void setup() 
{
  pinMode(Ledrosso, OUTPUT);  
  pinMode(LedRGB, OUTPUT);
  pinMode(Ledverde,OUTPUT);
  pinMode(LedLcd, OUTPUT);
  pinMode(Pulsante2, INPUT);
  pinMode(Pulsante, INPUT); 
unsigned char myChar = 0;
  
 // messaggio principale che si vede solo una volta accendendo la macchina
 
digitalWrite(LedLcd, HIGH);
 lcd.begin(16, 2);
 lcd.print("  Made by");
 lcd.setCursor(0, 1);
 lcd.print("Alex Branchi");
for (int positionCounter = 0; positionCounter < 13; positionCounter++) 
  {lcd.scrollDisplayLeft(); 
    delay(150);}
for (int positionCounter = 0; positionCounter < 29; positionCounter++) 
  {lcd.scrollDisplayRight(); 
    delay(150);}
for (int positionCounter = 0; positionCounter < 16; positionCounter++) 
  {lcd.scrollDisplayLeft(); 
    delay(150);}
    delay(2000);
 lcd.noDisplay();
 digitalWrite(LedLcd,LOW);}

void loop(){

//Pulsante 1 ON + Pulsante 2 ON = Luce verde accesa
if (digitalRead(Pulsante2) == HIGH && digitalRead(Pulsante) == HIGH) 
{digitalWrite(Ledverde, HIGH);
unsigned char myChar = 1;}  //NELLA MIA IGNORANZA HO APPENA CREATO UNA VARIABILE CON VALORE 1 PER SWICH CASE
 else
{digitalWrite(Ledverde, LOW);}

//Pulsante 1 ON + Pulsante 2 OFF = Luce rossa accesa
if (digitalRead(Pulsante2) == LOW && digitalRead(Pulsante) == HIGH) 
{digitalWrite(Ledrosso, HIGH);
unsigned char myChar = 2;}  //NELLA MIA IGNORANZA HO APPENA CREATO UNA VARIABILE CON VALORE 2 PER SWICH CASE
 else 
{digitalWrite(Ledrosso, LOW);}

//Pulsante 1 OFF + Pulsante 2 ON = Luce rossa accesa
if (digitalRead(Pulsante2) == HIGH && digitalRead(Pulsante) == LOW) 
{digitalWrite(Ledrosso, HIGH);
unsigned char myChar = 3;} //NELLA MIA IGNORANZA HO APPENA CREATO UNA VARIABILE CON VALORE 3 PER SWICH CASE
 else 
{digitalWrite(Ledrosso, LOW);}

//Funzione Defoult con led RGB accesa e luce verde o rossa spenta
if (digitalRead(Pulsante2) == LOW && digitalRead(Pulsante) == LOW) 
{digitalWrite(LedRGB, HIGH);
}
 else 
{digitalWrite(LedRGB, LOW);}


//Test funzione swich case per lcd volendo ovviare al problema dei caratteri a random nel display Lcd
//L' idea è quella ma tra la teoria e la pratica...
switch (unsigned char myChar = 0) {

  //messaggio 1
case '1':
 lcd.clear();
 lcd.display();
 lcd.setCursor(1, 0);
 lcd.print(" EROGAZIONE");
 lcd.setCursor(0, 1);
 lcd.print(" ENERGIA");
  break;
   
  
  //messaggio 2
case '2':
 lcd.clear();
 lcd.display();
 lcd.setCursor(1, 0);
 lcd.print(" PREMERE ANCHE");
 lcd.setCursor(0, 1);
 lcd.print("  TASTO SINISTRO");
  break;
 //messaggio 3
case '3':
 lcd.clear();
 lcd.display();
 lcd.setCursor(1, 0);
 lcd.print(" PREMERE ANCHE");
 lcd.setCursor(0, 1);
 lcd.print("TASTO DESTRO");
  break;
  
default :
lcd.clear();
lcd.display();
 lcd.setCursor(1, 0);
 lcd.print("OFFLINE");}
}

Lasciati dire che se attivi una votazione non puoi dare domande come possibili risposte.

Spiegaci i sintomi e gli effetti del non funzionamento.
Oltra a dover capire qual'é la causa del errore dobbiamo anche cercare come si manifesta il malfuzionamento?

a piú tardi Ciao Uwe

le due cose strane che vedo:

unsigned char myChar = 0;
forse é meglio usare al posto del char un byte
byte myChar = 0;
poi non mi sembra che serva la funzione:
lcd.display();
cancellala.

Un consiglio aggiorna il contenzto del LCD solo quando cambia non a ogni ciclo del loop(). Metti in una variabile il valore del myChar nel momneto che aggiorni lcd e solo quando é diverso del myChar esegui il switch case e aggiorni il contenuto del LCD.

Ciao Uwe

Hai troppo ragione per quanto riguarda il sondaggio... ...che dire, sono un pirla :slight_smile:

Per quanto riguarda la manifestazione del problema hai anche li ragione! Ora ti spiego subito il delirio.

Funziona tutto bene per un po, poi all' improvviso mentre premo i pulsanti a random per testare l' apparecchio, anzichè comparire il messaggio da me scritto inizia un delirio di lettere a caso in scroll da sinistra verso destra. Ogni tanto si intravede qualche pezzo di mia frase e ciò inizialmente mi ha fatto pensare ad un disturbo esterno dovuto magari alle bobine dei relè... Mi ero fatto una pazza idea dove praticamente formandosi un piccolo arco elettrico (relè 220V) l' lcd viene disturbato....

Boooh adesso cerco di mettere in pratica ciò che mi hai detto e poi ti faccio sapere!

Grazie!

Mi sa che è perché non fai il debounce dei pulsanti e poi il codice ti legge "rimbalzi" casuali e fa un po' quello che vuole.

Ho provato ha fare quello che mi avete detto ma tra il dire e il fare c'è in mezzo il mare.... ....un mare di ignoranza

Ho anche provato ad implementare un eventuale debounce dei pulsanti ma non ci sono riuscito.
Prendendo atto del fatto che non ci sono riuscito ho provato a farne una versione diversa ma il problema rimane quasi uguale....
...Premendo un numero di volte variabile i due pulsanti contemporaneamente adesso subentra (a mio avviso) un lcd.clear() perenne, sembra quasi di avere l' lcd spento.

Qualche anima pià ha idea di come implementare nel concreto un debounce?
Ci ho provato ma con effetti letali...

grazie

Nuova versione codice:

#include <LiquidCrystal.h>
LiquidCrystal lcd(9, 8, 5, 4, 3, 2);  
#define Ledrosso 13
#define Ledblu 11
#define Ledverde 12
#define Pulsante 7
#define Pulsante2 6
#define LedRGB 11 

void setup() 
{
  pinMode(Ledrosso, OUTPUT);  
  pinMode(Ledblu, OUTPUT);
  pinMode(Ledverde,OUTPUT);
  pinMode(Pulsante2, INPUT);
  pinMode(Pulsante, INPUT); 
  pinMode(LedRGB, OUTPUT);
 
 // Accensione macchina (LCD)
 lcd.begin(16, 2);
 lcd.print("  Made by");
 lcd.setCursor(0, 1);
 lcd.print("Alex Branchi");
 for (int positionCounter = 0; positionCounter < 13; positionCounter++) 
  {lcd.scrollDisplayLeft(); 
    delay(150);}
 for (int positionCounter = 0; positionCounter < 29; positionCounter++) 
  {lcd.scrollDisplayRight(); 
    delay(150);}
 for (int positionCounter = 0; positionCounter < 16; positionCounter++) 
  {lcd.scrollDisplayLeft(); 
    delay(150);}
    delay(2000);}

void loop(){

//FUNZIONE VERDE
if (digitalRead(Pulsante2) == HIGH && digitalRead(Pulsante) == HIGH) 
{digitalWrite(Ledverde, HIGH);
 lcd.setCursor(1, 0);
 lcd.print("EROGAZIONE");
 lcd.setCursor(0, 1);
 lcd.print(" ENERGIA ");}
 else
{digitalWrite(Ledverde, LOW);}

//ROSSO DESTRO
if (digitalRead(Pulsante2) == LOW && digitalRead(Pulsante) == HIGH) 
{digitalWrite(Ledrosso, HIGH);
 lcd.setCursor(1, 0);
 lcd.print("PREMERE ANCHE");
 lcd.setCursor(0, 1);
 lcd.print("TASTO DESTRO");}
 else 
{digitalWrite(Ledrosso, LOW);}

//ROSSO SINISTRO 
if (digitalRead(Pulsante2) == HIGH && digitalRead(Pulsante) == LOW) 
{digitalWrite(Ledrosso, HIGH);
 lcd.setCursor(1, 0);
 lcd.print("PREMERE ANCHE");
 lcd.setCursor(0, 1);
 lcd.print("TASTO SINISTRO");}
 else 
{digitalWrite(Ledrosso, LOW);}

//LCD DEFAULT MODE
if (digitalRead(Pulsante2) == LOW && digitalRead(Pulsante) == LOW) 
{digitalWrite(LedRGB, HIGH);
lcd.clear();}
 else 
{digitalWrite(LedRGB, LOW);}

}

Prima di conmtrollare quale pulsante é premuto leggi i tasti col debounce:
libreria Arduino Playground - Bounce

int pulsanteA=0;
int pulsanteB=0;
int pinpulsanteA = 6;
int pinpulsanteB = 7;
Bounce pinA = Bounce( BUTTON,5 );
Bounce pinB = Bounce( BUTTON,5 );
loop()
{
PinA.update ( );
PinB.update ( );
int pulsanteA = pinA.read();
int pulsanteB = pinB.read();

// qua poi far i controlli se le variabili pulsanteA e pulsanteB sono H, L ecc

}

memorrizza il stato delle variabili pulsanteA e pulsanteB e controlla prima di controllare se sono H o L se lo stato é cambiato.
Se é cambiato controlli in cosa é cambiato e scrivi di consequenza sul dsplay.

Non ho compilato il codice; spero che sia giusto.

PS. nel switch case puoi usare un char coem variabile; mi ero sbagliato. scusami.

Ciao Uwe

Ho provato e riprovato ma zero... Pasticcio ancora qualche oretta e poi dormo che domani si lavora....

Speriamo che domani sia meglio di oggi...

Domani ti faccio qualche prova anche io, ciao

Mi sa che finchè non esce l' IDE Minibloq per bambini difficilmente riuscirò a cavare qualcosa di buono dal mio piccolo Amtel :grin:

Comunque la fortuna sta dalla parte degli audaci, spero di diventare moooooolto audace in questi giorni!

oggi non ho avuto tempo di finire il tuo circuito, lo sto' ricreando con flowcode per fare esperienza su un problema reale, pero' da quel che dici sembrano di certo problemi di falksi contatti o rimbalzi.

il debounce a quanti ms lo hai fatto ? prova con valori molto spinti tipo 250ms

Il problema è che non riesco a mettere nel pratico il debounce, mi da sempre qualche messaggio di errore....
...Ma si, prima o poi ci riuscirò...

Sta sera mi ci metto e provo a finire sto progetto una volta per tutte...

Grazie comunque!

in simulazione tutto ok, per la versione solo con IF (il secondo codice)
Quando ti funziona e' traballante la scritta su lcd o e' fissa ? perche' visto che c'e' il clear lcd ad ogni scrittura, in realta' l'LCD si spegne e accende in continuazione
La soluzione e' quella che ha detto uwe, ma se non da problemi di traballamento si puo' lasciare anche cosi'

Ora mi faccio anche la versione con i Case

dopodiche' resta solo implementarlo fisicamente su breadboard :slight_smile:

Anche con lo Switch Case tutto ok,

ho notato che anche il led rosso soffre del discorso ON-OFF, perche' quando premi solo il tasto sx, con l'if precedente del tasto dx lo stai spegnendo.
gli altri led non soffrono di questa cosa perche' solo il rosso e' usato su due funzioni.

Sei un grande! Scusa se ti rispondo adesso ma avevo bruciato l' alimentatore del portatile quindi per questo piccolo pit-stop mi sono partiti 40 euri...
Detto ciò adesso cerco di imparare bene come si compila con l' ide di arduino perchè alla fine il problema è quello. E' come voler andare in moto senza saper andare in bicicletta. Se hai qualche novità che non implichi un tuo sbattimento assurdo fatti pure sentire che mi fai solo che piacere!
Grazie!