display lcd 1602

Salve a tutti. Sto iniziando ad usare arduino e Fino ad ora ho imparato ad accendere led con pulsanti.
Ora vorrei inizare a scivere una stringa su display lcd premendo un pulsante ovvero, ogni volta che premo un pulsante scrive una parola definita.
Ho provato a cerare su forum e fra i tanti esempi, ma nulla che possa aiutarmi.
Può qualcuno darmi qualche informazioni

Ciao, hai provato con la libreria LiquidCrystal?

Si, la libreria e caricata correttamente, ma non so come dire ad arduino di scrivere una parola alzando un ingresso

ciao nicolini2000,

se posti il tuo sketch ci diamo un occhio.

Mi sembrava ci fosse l'esempio... Io sono già a letto :wink: quindi posso mandarti qualcosa domani :wink:

nicolini2000:
Si, la libreria e caricata correttamente, ma non so come dire ad arduino di scrivere una parola alzando un ingresso

Allora con la libreria LiquidCrystal utilizzo questa funzione:

void scriviLCD(char* riga1, char* riga2) {
  LCD.clear();
  LCD.setCursor(0, 0);  
  LCD.print(riga1);
  LCD.setCursor(0, 1);
  LCD.print(riga2);
}

e per scrivere la richiami

scriviLCD("Ciao","a tutti!! :)");

Se vuoi centrare una scritta aggiungi alla stringa degli spazi prima o dopo o ti fai una funzione :wink:

nicolini2000:
Salve a tutti. Sto iniziando ad usare arduino

Benvenuto. Essendo il tuo primo post, nel rispetto del regolamento, ti chiediamo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO... Grazie.
Qui una serie di link utili, non inerenti al tuo problema:


se scarico lo sketch piu volte a volte appare la scritta ma comunque premendo il pulsante non succede nulla

ho preso spunto da un esempio display lcd 1602 - Software - Arduino Forum

/* Pilotare un LCD 16x2 con Arduino
Collegamenti dell'LCD
VSS -> GND
VDD -> +5v
V0 -> al potenziometro
RS -> Arduino D1
R/W -> GND
E -> Arduino D0
D0 -> N/C
D1 -> N/C
D2 -> N/C
D3 -> N/C
D4 -> Arduino D2
D5 -> Arduino D3
D6 -> Arduino D4
D7 -> Arduino D5
A -> Arduino A0
K -> GND
*/

// includo la libreria
#include <LiquidCrystal.h>

// pin per interfacciare arduino a lcd
LiquidCrystal lcd(0, 1, 2, 3, 4, 5);

int btn1_pin = 6;

void setup() {

pinMode(btn1_pin, INPUT);
lcd.begin(16, 2);

// imposto ad output l'uscita per la retroilluminazione
pinMode(A0, OUTPUT);

}

void loop()
{

// Accendo la retroilluminazione
digitalWrite(A0, HIGH);

int in1 = digitalRead(btn1_pin);

if (in1 == HIGH){
digitalWrite(btn1_pin, HIGH);

lcd.clear();
lcd.setCursor (0,0);
lcd.print ("BUONGIORNO");

delay(100);
}
}

>nicolini2000: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra). Grazie,

Guglielmo

ciao...in primis edita il tuo ultimo post inserendo lo sketch tra i tag code (pulsante </> sopra le faccine).

lo sketch che hai pubblicato ha due "problemi" per i quali non ti sembra funzionare...il primo è l'uso del delay(100) ed il secondo è il refresh continuo che fai dell'LCD.

il delay() è bloccante e nel tempo incluso in esso arduino diventa "sordo" ...in pratica arduino andrà a verificare lo stato del pulsante solo per un infinitesima frazione di tempo...poi si blocca per il tempo delay()...e così all'infinito.
ad ogni ciclo loop() resetti il display con lcd.clear()...se premi e mantieni premuto il pulsante penso che l'effetto che ottieni sia una specie di "sfarfallio" della scritta "buongiorno".

il consiglio che ti do è quello di eliminare il delay(); creare una variabile flag per il confronto con lo stato del pulsante; crearti una condizione che verifica lo stato attuale del pulsante ed il valore della flag e nel caso sia stato premuto e sia diverso da flag aggiorni l'LCD con quello che vuoi.
esempio:

char a[] = "ciao"; // parola da scrivere
byte statoPulsante = LOW; // valore attuale del pulsante
byte statoPulsanteOld = LOW;  // valore precedente del pulsante (variabile flag)
byte bottone = 8;  // dov'è collegato il pulsante

void setup() {
  Serial.begin(9600);
  pinMode(bottone, INPUT);
}

void loop() {

  statoPulsante = digitalRead(bottone); // leggo stato PIN

  if (statoPulsante == HIGH && (statoPulsante != statoPulsanteOld)) {  // eseguo confronto con sato attuale e stato precedente
    // qua dovresti resettare e riscrivere l'LCD
    Serial.println(a);
    statoPulsanteOld = statoPulsante; //salvo lo stato attuale come stato precedente
  }
  if (statoPulsante == LOW && statoPulsanteOld == HIGH) {  // se non premuto adesso ma era stato premuto prima
    statoPulsanteOld = statoPulsante;  // parifico i due stati attuale e precedente
  }
}

nel mio esempio stampo su monitor seriale...a te adattarlo per l'LCD...se posso consigliare io imposterei l'ingresso del pulsante come INPUT_PULLUP (vai a vedere nelle reference) in modo da avere uno stao iniziale certo ed essere "meno" soggetto ai disturbi...attenzione ce se lo usi impostato così il pulsante deve essere connesso a GND e la lettura va verificata al contrario...cioè se pulsante premuto (contatto chiuso) l'ingresso e LOW se non premuto (contatto aperto) l'ingress è HIGH.

ho creato questo ma le scritte sfarfallano e non riesco a risolvere!!!!!!!!!!!!!!

Pilotare un LCD 16x2 con Arduino
Collegamenti dell'LCD per funzionamento a 4 bit:
VSS -> GND
VDD -> +5v
V0 -> al potenziometro
RS -> Arduino D1
R/W -> GND
E -> Arduino D0
D0 -> N/C
D1 -> N/C
D2 -> N/C
D3 -> N/C
D4 -> Arduino D2
D5 -> Arduino D3
D6 -> Arduino D4
D7 -> Arduino D5
A -> Arduino A0
K -> GND
*/

// includiamo la libreria
#include <LiquidCrystal.h>;

// Creiamo l'oggetto "lcd" inizializzandolo come richiesto dalla libreria:
// LiquidCrystal(enable, rs, d4, d5, d6, d7)
LiquidCrystal lcd(0, 1, 2, 3, 4, 5);

void setup() {

// impostiamo ad output l'uscita per la retroilluminazione
pinMode(A0, OUTPUT);

//impostiamo numero di colonne e righe dell'lcd a (colonne, righe)
lcd.begin(16, 2);

pinMode (6, INPUT_PULLUP);
pinMode (7, INPUT_PULLUP);
}

void loop() {

// Accendiamo la retroilluminazione
digitalWrite(A0, HIGH);

int sensorVal1=digitalRead (6);
int sensorVal2=digitalRead (7);
Serial.println(sensorVal1);
Serial.println(sensorVal2);

// posizioniamo il cursore a (colonna, riga)
lcd.setCursor(0, 0);

//qui controllo lo stato del pulsante-scritta
//se LOW Pulsante aperto nessuna scritta se HIGH pulsante chiuso visualizzo la scritta
if (sensorVal1 == LOW) {
lcd.print("ciao");
}
else {
lcd.clear();
}

lcd.setCursor(0, 0);
if (sensorVal2 == LOW) {
lcd.print("By-By");
}
else {
lcd.clear();
}
}

ciao nicolini2000...per cortesia modifica il tuo ultimo post e anche il tuo post numero #7 inserendo il codice tra i tag code (pulsante </> in alto a sinistra sopra le faccine)...una volta che l'avrai fatto ti dico perchè lo schermo sfarfalla.

ho creato questo ma le scritte sfarfallano e non riesco a risolvere!!!!!!!!!!!!!!


Pilotare un LCD 16x2 con Arduino
Collegamenti dell'LCD per funzionamento a 4 bit:
VSS -> GND
VDD -> +5v
V0 -> al potenziometro
RS -> Arduino D1
R/W -> GND
E -> Arduino D0
D0 -> N/C
D1 -> N/C
D2 -> N/C
D3 -> N/C
D4 -> Arduino D2
D5 -> Arduino D3
D6 -> Arduino D4
D7 -> Arduino D5
A -> Arduino A0
K -> GND
*/
 
// includiamo la libreria
#include <LiquidCrystal.h>;
 
// Creiamo l'oggetto "lcd" inizializzandolo come richiesto dalla libreria:
// LiquidCrystal(enable, rs, d4, d5, d6, d7)
LiquidCrystal lcd(0, 1, 2, 3, 4, 5);


void setup() {
 
// impostiamo ad output l'uscita per la retroilluminazione
pinMode(A0, OUTPUT);
 
//impostiamo numero di colonne e righe dell'lcd a (colonne, righe)
lcd.begin(16, 2);
 
 
pinMode (6, INPUT_PULLUP);
pinMode (7, INPUT_PULLUP);
}
 
void loop() {

// Accendiamo la retroilluminazione 
   digitalWrite(A0, HIGH);

   int sensorVal1=digitalRead (6);
   int sensorVal2=digitalRead (7);
   Serial.println(sensorVal1);
   Serial.println(sensorVal2); 



// posizioniamo il cursore a (colonna, riga)
   lcd.setCursor(0, 0);
 
  //qui controllo lo stato del pulsante-scritta 
  //se LOW Pulsante aperto nessuna scritta se HIGH pulsante chiuso visualizzo la scritta 
  if (sensorVal1 == LOW) {
  lcd.print("ciao");
}
   else {
  lcd.clear();
}

  lcd.setCursor(0, 0);
  if (sensorVal2 == LOW) {
  lcd.print("By-By");
}
   else {
  lcd.clear();
}
}

per il post n° 7 non so come modificarlo non ci sono riuscito

devo replicarlo?

ciao...per modificare i tuoi post devi premere, per ogni uno di loro, il pulsante "quick edit more" (o una cosa del genere) in basso a destra del post stesso.

detto questo...questo sketch presenta 3 "errori":

primo: ad ogni inizio loop() gli dici di accendere la retro illuminazione...impegna tempo...la metti nel setup() e hai fatto...poi se ti servirà spegnere e riaccendere durante il loop() è un'altra storia.

secondo: sempre ad ogni inizio loop() imposti il cursore a (0,0) ...impegna tempo e per fare cosa!?...capirai col terzo punto cosa intendo...

terzo: leggi lo stato dei due pulsantoi e lo salvi su una variabile (bene)...poi verifichi le due varibile e se LOW scrivi se HIGH ripulisci lo schermo...cioè se premi un pulsante alla volta, e lo tieni premuto, questo scriverà in continuazione ma l'altro non premuto cancellerà in continuazione...se li premi entrambi "un macello"... comunque con lcd.clear() ripulisci lo schermo e posizioni in automatico il cursore a (0,0)...per questo prima ho scritto "per fare cosa".

a te serve fare una sola cosa se premuto un pulsante e solo un'altra se premuto il secondo...guarda il mio esempio:

// includiamo la libreria
#include <LiquidCrystal.h>;

// Creiamo l'oggetto "lcd" inizializzandolo come richiesto dalla libreria:
// LiquidCrystal(enable, rs, d4, d5, d6, d7)
LiquidCrystal lcd(0, 1, 2, 3, 4, 5);

boolean premuto = false;

void setup() {

  // impostiamo ad output l'uscita per la retroilluminazione
  pinMode(A0, OUTPUT);

  //impostiamo numero di colonne e righe dell'lcd a (colonne, righe)
  lcd.begin(16, 2);


  pinMode (6, INPUT_PULLUP);
  pinMode (7, INPUT_PULLUP);
  // Accendiamo la retroilluminazione
  digitalWrite(A0, HIGH);
  // ripuliamo il display
  lcd.clear();
}

void loop() {

  int sensorVal1 = digitalRead (6);
  int sensorVal2 = digitalRead (7);
  Serial.println(sensorVal1);
  Serial.println(sensorVal2);

  if (sensorVal1 == LOW && premuto = false) {
    lcd.clear();
    lcd.print("ciao");
    premuto = true;
  }
  if (sensorVal2 == LOW && premuto = false) {
    lcd.clear();
    lcd.print("bye bye");
    premuto = true;
  }
  if (sensorVal1 == HIGH && sensorVal2 == HIGH) {
    premuto = false;
  }
}

ho inserito una varibile che limita ad un solo gruppo di azioni alla volta un pulsante (se lo premo scrive una sola volta non in continuazione)...e non consente che entrambi i pulsanti eseguano il loro gruppo di azioni se premuti assieme...quando non li premo questa variabile si resetta e mi consente un'altra "pigiata".

>nicolini2000: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post #7 (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

Guglielmo

qualcuno può dirmi perchè le scritte sul display sfarfallano?

ciao...hai letto il mio post #15 ?

ho fatto un po di confusione ora lo leggo e provo
Grazie ti faro sapere