Go Down

Topic: display lcd 1602 (Read 1 time) previous topic - next topic

ORSO2001

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:
Code: [Select]
// 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".

gpb01

>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
Search is Your friend ... or I am Your enemy !

nicolini2000

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

ORSO2001

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

nicolini2000

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

nicolini2000

ho letto, hai semplificato il programma
Ho provato a compilarlo e da errore nella righe  if

Errore:          valore richiesto come operando sinistro dell'assegnazione

ORSO2001

ho commesso 2 errori...primo il non aver compilato prima di postare il codice  :D ...secondo uno dei più insidiosi...confondere il "=" per il "=="  :smiley-eek-blue: ...prova questo dovrebbe essere ok
Code: [Select]
// 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;
  }
}

nicolini2000

grazie orso2001, devo visualizzare una scritta se l'ingresso va alto, la cancello se basso
C'è la possibilità che più ingressi si sovrappongano     
E simile ad un impianto di allarme dove a display vengono scritte le zone aperte

ORSO2001

ciao...allora...come vuoi impostare la visualizzazione delle zone?...più pagine che si alternano con scritto una cosa tipo:

prima pagina:
zona 1 = close
zone 2 = open

seconda pagina:
zona 3 = close
zona 4 = close

etc fino ultima pagina...oppure una unica con:

zona:  12345678
stato: 01100110

in ogni caso non è sempre necessario resettare l'LCD e scrivere sempre tutto...magari basta aggiornare solo le caselle che t'interessano...dipende come vuoi impostare il tutto

nicolini2000

a me serve visualizzare la zona aperta esempio finestra camera cosi vado direttamente nel luogo
il problema e se ci sono più finestre aperte faccio un esempio

apro finestra camera e visualizzo la scritta
apro finestra cucina cancello la camera e visualizzo la cucina
(in quel momento vedo la scritta cucina)
chiudo la cucina e visualizzo di nuovo la camera
apro il portone cancello camera e visualizzo portone
apro la finestra sala , cancello portone e visualizzo sala
 chiudo finestra camera  e rimane sala
chiudo portone rimane sala
chiudo tutto scrivo   OK

questo e un esempio non importa ne vedo una alla volta,
certamente se riuscissi a vederne su 2 righe in caso di più finestre aperte sarebbe meglio

nicolini2000

Ciao orso, cosa è successo che non ti ho più sentito ?

ORSO2001

è successo che mi aspettavo un po' di codice da "esaminare"...detto questo...non l'ho provato; le varie zone hanno una priorità...cioè la zona 8 ha priorità sulla zona 7 che ha priorità sulla zona 6 etc.
prova e dimmi se funziona:
Code: [Select]
// 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;

byte zona[8] = {  // determiniamo gli ingressi delle zone
  2,  // INPUT zona 1
  3,  // INPUT zona 2
  4,  // INPUT zona 3
  5,  // INPUT zona 4
  6,  // INPUT zona 5
  7,  // INPUT zona 6
  8,  // INPUT zona 7
  9   // INPUT zona 8
};

char zonaAperta = -1;
char zonaApertaOld = -1;

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);

  for (byte i = 0; i < (sizeof(zona) / sizeof(zona[0])); i++) {
    pinMode(zona[i], INPUT_PULLUP); // ATTENZIONE!!! collegare a GND!!! impostiamo come ingressi le varie zone
  }
  // Accendiamo la retroilluminazione
  digitalWrite(A0, HIGH);
  // ripuliamo il display
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("       OK");
}

void loop() {
  byte statoIngressi = 0;

  for (byte i = 0; i < (sizeof(zona) / sizeof(zona[0])); i++) {
    statoIngressi = digitalRead(zona[i]);
    if (statoIngressi) {
      zonaAperta = i;
    }
  }

  if (zonaAperta != zonaApertaOld) {
    switch (zonaAperta) {
      case -1:
        lcd.clear();
        lcd.print("       OK");
        zonaApertaOld = zonaAperta;
        zonaAperta = -1;
        break;
      case 0:
        lcd.clear();
        lcd.print("  zona aperta");
        lcd.setCursor(0, 1);
        lcd.print("     zona 1");
        zonaApertaOld = zonaAperta;
        zonaAperta = -1;
        break;
      case 1:
        lcd.clear();
        lcd.print("  zona aperta");
        lcd.setCursor(0, 1);
        lcd.print("     zona 2");
        zonaApertaOld = zonaAperta;
        zonaAperta = -1;
        break;
      case 2:
        lcd.clear();
        lcd.print("  zona aperta");
        lcd.setCursor(0, 1);
        lcd.print("     zona 3");
        zonaApertaOld = zonaAperta;
        zonaAperta = -1;
        break;
      case 3:
        lcd.clear();
        lcd.print("  zona aperta");
        lcd.setCursor(0, 1);
        lcd.print("     zona 4");
        zonaApertaOld = zonaAperta;
        zonaAperta = -1;
        break;
      case 4:
        lcd.clear();
        lcd.print("  zona aperta");
        lcd.setCursor(0, 1);
        lcd.print("     zona 5");
        zonaApertaOld = zonaAperta;
        zonaAperta = -1;
        break;
      case 5:
        lcd.clear();
        lcd.print("  zona aperta");
        lcd.setCursor(0, 1);
        lcd.print("     zona 6");
        zonaApertaOld = zonaAperta;
        zonaAperta = -1;
        break;
      case 6:
        lcd.clear();
        lcd.print("  zona aperta");
        lcd.setCursor(0, 1);
        lcd.print("     zona 7");
        zonaApertaOld = zonaAperta;
        zonaAperta = -1;
        break;
      case 7:
        lcd.clear();
        lcd.print("  zona aperta");
        lcd.setCursor(0, 1);
        lcd.print("     zona 8");
        zonaApertaOld = zonaAperta;
        zonaAperta = -1;
        break;
    }
  }
}

nicolini2000

#27
Feb 11, 2018, 09:24 pm Last Edit: Feb 11, 2018, 10:13 pm by nicolini2000
Ho rinominato le zone collegate dal pin 2 al pin 9 come pin 6.....13 perchè gli ingressi da 0 a 5 sono

utilizzati dal display ma non mi sembra funzionare a doc
praticamente l'ultima zona non si resetta

ORSO2001

e c'hai ragione....infatti non l'avevo provato...c'erano due errori...vediamo se noti le differenze  ;)

Code: [Select]
// 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;

byte zona[8] = {  // determiniamo gli ingressi delle zone
  2,  // INPUT zona 1
  3,  // INPUT zona 2
  4,  // INPUT zona 3
  5,  // INPUT zona 4
  6,  // INPUT zona 5
  7,  // INPUT zona 6
  8,  // INPUT zona 7
  9   // INPUT zona 8
};

char zonaAperta = -1;
char zonaApertaOld = -1;

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);

  for (byte i = 0; i < sizeof(zona); i++) {
    pinMode(zona[i], INPUT_PULLUP); // ATTENZIONE!!! collegare a GND!!! impostiamo come ingressi le varie zone
    //Serial.print(i);
  }
  // Accendiamo la retroilluminazione
  digitalWrite(A0, HIGH);
  // ripuliamo il display
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("       OK");
}

void loop() {
  byte statoIngressi = 0;

  for (byte i = 0; i < sizeof(zona); i++) {
    statoIngressi = digitalRead(zona[i]);
    if (!statoIngressi) {
      zonaAperta = i;
    }
  }
  if (zonaAperta != zonaApertaOld) {
    switch (zonaAperta) {
      case -1:
        lcd.clear();
        lcd.print("       OK");
        zonaApertaOld = zonaAperta;
        break;
      case 0:
        lcd.clear();
        lcd.print("  zona aperta");
        lcd.setCursor(0, 1);
        lcd.print("     zona 1");
        zonaApertaOld = zonaAperta;
        break;
      case 1:
        lcd.clear();
        lcd.print("  zona aperta");
        lcd.setCursor(0, 1);
        lcd.print("     zona 2");
        zonaApertaOld = zonaAperta;
        break;
      case 2:
        lcd.clear();
        lcd.print("  zona aperta");
        lcd.setCursor(0, 1);
        lcd.print("     zona 3");
        zonaApertaOld = zonaAperta;
        break;
      case 3:
        lcd.clear();
        lcd.print("  zona aperta");
        lcd.setCursor(0, 1);
        lcd.print("     zona 4");
        zonaApertaOld = zonaAperta;
        break;
      case 4:
        lcd.clear();
        lcd.print("  zona aperta");
        lcd.setCursor(0, 1);
        lcd.print("     zona 5");
        zonaApertaOld = zonaAperta;
        break;
      case 5:
        lcd.clear();
        lcd.print("  zona aperta");
        lcd.setCursor(0, 1);
        lcd.print("     zona 6");
        zonaApertaOld = zonaAperta;
        break;
      case 6:
        lcd.clear();
        lcd.print("  zona aperta");
        lcd.setCursor(0, 1);
        lcd.print("     zona 7");
        zonaApertaOld = zonaAperta;
        break;
      case 7:
        lcd.clear();
        lcd.print("  zona aperta");
        lcd.setCursor(0, 1);
        lcd.print("     zona 8");
        zonaApertaOld = zonaAperta;
        break;
    }
  }
  zonaAperta = -1;
}

nicolini2000

grazie orso, hai modificato la stringa for(  for (byte i = 0; i < sizeof(zona); i++)  e subito dopo nella stringa if hai messo un punto interrogativo di troppo che ho eliminato; questo comportava la zona aperta se 'l'ingresso era a negativo, inoltre hai aggiunto prima dell'ultima graffala stringa zonaAperta = -1;

Questa stringa l'avevo aggiunta anche io che però l'avevo inserita subito dopo il case 7,
non conoscendo la programmazione ero convinto che prima o in mezzo alle graffe era la stessa cosa.  comunque che non sarei arrivato a capire che il ciclo for fosse sbagliato.


Ora lo sto testando e credo che il tutto funzioni.
Ti tengo aggiornato su ulteriori sviluppi



Go Up