Aiuto Arduino lcd

Buona giornata a tutti! :) Mi sono iscritto da poco e spero che qualcuno di voi mi sappia aiutare.. Ho collegato il display al mio Arduino Mega e fin qui tutto ok, il display serve per visualizzare, quando è inserita o disinserita la combinazione, se l'allarme è attivato o disattivato e fin qui tutto ok, il problema sorge, quando, per mezzo di 4 finecorsa l'allarme si attiva, facendo suonare un buzzer che si spegnerà solo dopo aver disinserito l'allarme tramite la combinazione. Quando c'è l'"intrusione" il mio intento è far visualizzare sul display lcd la parola "intruso", e questo accade, con il solo problema che la scritta "trema" e sotto a questa rimane impressa la scritta "abilitato" o "disabilitato", premetto che con la funzione lcd.clear() non raggiungo la soluzione poichè il mio intento è quello di scrivere sulla prima riga "Allarme" e, sulla seconda riga, le cose elencate sopra. (il display è 16x2). La mia domanda è questa: c'è un modo per cancellare solo la seconda riga del display, o risolvere in qualche altro modo il mio problema? Grazie in anticipo per l'aiuto che sono sicuro mi darete :D Per qualsiasi cosa che ho omesso non esitate a chiedere..

lcd.setCursor(0, 1); // prima colonna, seconda riga
lcd.print("                "); // 16 spazi

Purtroppo questa non è la soluzione adatta… Ci ho provato e il problema rimane.
Grazie lo stesso :slight_smile:

Allora includi il codice dello sketch, probabilmente c'e' qualche inghippo nel tuo codice. Includi il codice negli appositi tag (usa il pulsante # che ti mette i 2 tag all'interno dei quali mettere il codice)

Il suggerimento di Paolo è quello che si usa di solito quando si sovrappongono scritte, puoi provare ad inserire un piccolo delay per dare il tempo al display di sovrapporre gli spazi alle scritte, es:

stampa 16 spazi delay (50) stampa tua stringa

Altra cosa: molti display mostrano un naturale sfarfallio, quando sono sottoposti a refresh rapidi e continui, che però sparisce se ti poni proprio di fronte ad esso, cioè lo vedi solo se lo guardi dalle angolature...

#include <LiquidCrystal.h>

const int ButtonPin = 7;
const int buttonPin = 48;
const int B = 53;

int Led = 8;
int Ledg = 46;
int Allarm = 47;
int Ledr = 49;

int fotoresistenzaPin = A2;
int OutOA = A1;

//int ledState = 0;
int buttonState = 0;
int buttonState1 = 0;
int buttonState2 = 0;
int fotoresistenzaValue; // Variabile che memorizzerà la lettura
int AllarmState = 0;
int value = 0;
int Vo = 0;


LiquidCrystal lcd(8, 9, 10, 11, 12, 13);

void setup()
 {
  lcd.clear();

  lcd.begin(16,2);

  lcd.print("Allarme:");

  pinMode(OutOA, INPUT);
  pinMode(B, INPUT);
  pinMode(buttonPin, INPUT);
  pinMode(ButtonPin, INPUT);

  pinMode(Allarm, OUTPUT);
  pinMode(Ledg, OUTPUT);
  pinMode(Ledr, OUTPUT);
  pinMode(Led, OUTPUT);

  Allarme();
 }
void loop()
 {
  lcd.setCursor(0,2);
  
  buttonState = digitalRead(B);
  buttonState1 = digitalRead(buttonPin);
  buttonState2 = digitalRead(ButtonPin);
  AllarmState = digitalRead(Allarm);

  //ledState = digitalRead(Ledg)
  
  Vo = analogRead(OutOA);
  fotoresistenzaValue = analogRead(fotoresistenzaPin);
  
  if(buttonState2 == HIGH && fotoresistenzaValue<450)
  {
    digitalWrite(Led, HIGH);
  }
  
  else
  {
    digitalWrite(Led, LOW);
  }
  
  if(buttonState == HIGH)
  {
      lcd.setCursor(0,2);

    digitalWrite(Ledg, HIGH);
    digitalWrite(Ledr, LOW);
    
    lcd.print("ATTIVATO ");
    
    Allarme();
  }
  
  else
  {
    if(buttonState == LOW)
   {
       lcd.setCursor(0,2);

    digitalWrite(Ledr, HIGH);
    digitalWrite(Ledg, LOW);

    lcd.print("DISATTIVATO");
    
    Allarme();
   }
  }
  
  if(buttonState ==HIGH && buttonState1 == HIGH)
  {
   digitalWrite(Allarm, HIGH);
   
   Allarme();
  }
  
  if(buttonState == LOW)
  {
   digitalWrite(Allarm, LOW);
   
   Allarme();
  }
  
  if(buttonState == HIGH && Vo > 600)
  {
   digitalWrite(Allarm, HIGH);
   
   Allarme();
  }
  
  if(buttonState == LOW && Vo < 300)
  {
   digitalWrite(Allarm, LOW);
   
   Allarme();
  }
 }
 
int Allarme()
 {
  if(AllarmState == HIGH)
  {
   lcd.setCursor(0,2);
   lcd.print("INTRUSO ");
  }
 
  if(AllarmState == HIGH && buttonState == LOW && Vo > 600)
   {
    lcd.setCursor(0,2);
    lcd.print("INTRUSO ");
   }
  
  else
  {
   if(AllarmState == HIGH && buttonState == HIGH && Vo < 300)
   {
    lcd.setCursor(0,2);
    lcd.print("INTRUSO ");
   }
  
  else
  {
    if(AllarmState == HIGH && buttonState == LOW && Vo > 600)
    {
     lcd.setCursor(0,2);
     lcd.print("INTRUSO ");
    }
  else
  {
   if(AllarmState == HIGH && buttonState == HIGH && Vo > 600)
    {
     lcd.setCursor(0,2);
     lcd.print("INTRUSO ");
    }
   }
  }
 }
}

in questo Sketch ho aggiunto anche il crepuscolare, quindi, la fotoresistenza connessa ad “A2”, il ButtonPin “7” e Led “8”, non li considerate :slight_smile:

Il loop non fa altro che scrivere qualcosa, in continuazione, senza sosta, ovvio che vedi sfarfalii e sovrapposizioni da tutte le parti; dopo ogni

lcd.setCursor(0,2);

devi aggiungere la riga suggerita da Paolo

lcd.print(" "); // 16 spazi

, lui però nella riga precedente posizionava il cursore sulla riga 2, tu sulla 3, forse il problema era questo; come detto prova anche un piccolo delay. In pratica dovunque hai messo

lcd.setCursor(0,2);

devi trasformarlo in:

lcd.setCursor(0,2); lcd.print(" "); // 16 spazi delay(50);

dovresti migliorare la situazione di parecchio.

Ci ho appena provato e non funziona, anzi così facendo, “intruso” non me lo scrive proprio più… Per caso ho sbagliato io a fare le modifiche? Quello postato prima l’ho modificato in questo:

#include <LiquidCrystal.h>

const int ButtonPin = 8;
const int buttonPin = 48;
const int B = 53;

int Led = 8;
int Ledg = 46;
int Allarm = 47;
int Ledr = 49;

int fotoresistenzaPin = A2;
int OutOA = A1;

//int ledState = 0;
int buttonState = 0;
int buttonState1 = 0;
int buttonState2 = 0;
int fotoresistenzaValue; // Variabile che memorizzerà la lettura
int AllarmState = 0;
int value = 0;
int Vo = 0;


LiquidCrystal lcd(8, 9, 10, 11, 12, 13);

void setup()
 {
  lcd.clear();

  lcd.begin(16,2);

  lcd.print("Allarme:");

  pinMode(OutOA, INPUT);
  pinMode(B, INPUT);
  pinMode(buttonPin, INPUT);
  pinMode(ButtonPin, INPUT);

  pinMode(Allarm, OUTPUT);
  pinMode(Ledg, OUTPUT);
  pinMode(Ledr, OUTPUT);
  pinMode(Led, OUTPUT);

  Allarme();
 }
void loop()
 {
  lcd.setCursor(0,2);
  
  buttonState = digitalRead(B);
  buttonState1 = digitalRead(buttonPin);
  buttonState2 = digitalRead(ButtonPin);
  AllarmState = digitalRead(Allarm);

  //ledState = digitalRead(Ledg)
  
  Vo = analogRead(OutOA);
  fotoresistenzaValue = analogRead(fotoresistenzaPin);
  
  if(buttonState2 == HIGH && fotoresistenzaValue<450)
  {
    digitalWrite(Led, HIGH);
  }
  
  else
  {
    digitalWrite(Led, LOW);
  }
  
  if(buttonState == HIGH)
  {
      lcd.setCursor(0,2);

    digitalWrite(Ledg, HIGH);
    digitalWrite(Ledr, LOW);
    
    lcd.print("ATTIVATO   ");
    
    Allarme();
  }
  
  else
  {
    if(buttonState == LOW)
   {
    lcd.setCursor(0,2);
    digitalWrite(Ledr, HIGH);
    digitalWrite(Ledg, LOW);

    lcd.print("DISATTIVATO");
    
    Allarme();
   }
  }
  
  if(buttonState ==HIGH && buttonState1 == HIGH)
  {
   digitalWrite(Allarm, HIGH);
   
   Allarme();
  }
  
  if(buttonState == LOW)
  {
   digitalWrite(Allarm, LOW);
   
   Allarme();
  }
  
  if(buttonState == HIGH && Vo > 600)
  {
   digitalWrite(Allarm, HIGH);
   
   Allarme();
  }
  
  if(buttonState == LOW && Vo < 300)
  {
   digitalWrite(Allarm, LOW);
   
   Allarme();
  }
 }
 
int Allarme()
 {
  if(AllarmState == HIGH)
  {
   lcd.setCursor(0,2);
       lcd.print("                ");
    delay(50);
   lcd.print("INTRUSO ");
  }
 
  if(AllarmState == HIGH && buttonState == LOW && Vo > 600)
   {
    lcd.setCursor(0,2);
    lcd.print("                ");
    delay(50);
    lcd.print("INTRUSO ");
   }
  
  else
  {
   if(AllarmState == HIGH && buttonState == HIGH && Vo < 300)
   {
    lcd.setCursor(0,2);
    lcd.print("                ");
    delay(50);
    lcd.print("INTRUSO ");
   }
  
  else
  {
    if(AllarmState == HIGH && buttonState == LOW && Vo > 600)
    {
     lcd.setCursor(0,2);
     lcd.print("                ");
     delay(50);
     lcd.print("INTRUSO ");
    }
  else
  {
   if(AllarmState == HIGH && buttonState == HIGH && Vo > 600)
    {
     lcd.setCursor(0,2);
     lcd.print("                ");
     delay(50);
     lcd.print("INTRUSO ");
    }
   }
  }
 }
}

Ad una prima occhiata, mi sembra non riposizioni il cursore

    lcd.setCursor(0,2);
    lcd.print("                ");
    delay(50);
    lcd.setCursor(0,2);     // aggiungi questa!!!
    lcd.print("INTRUSO ");

sì vero, mi è sfuggita....

Ragazzi, ci ho appena provato, ho fatto questa modifica:

#include <LiquidCrystal.h>

const int ButtonPin = 8;
const int buttonPin = 48;
const int B = 53;

int Led = 8;
int Ledg = 46;
int Allarm = 47;
int Ledr = 49;

int fotoresistenzaPin = A2;
int OutOA = A1;

//int ledState = 0;
int buttonState = 0;
int buttonState1 = 0;
int buttonState2 = 0;
int fotoresistenzaValue; // Variabile che memorizzerà la lettura
int AllarmState = 0;
int value = 0;
int Vo = 0;


LiquidCrystal lcd(8, 9, 10, 11, 12, 13);

void setup()
 {
  lcd.clear();

  lcd.begin(16,2);

  lcd.print("Allarme:");

  pinMode(OutOA, INPUT);
  pinMode(B, INPUT);
  pinMode(buttonPin, INPUT);
  pinMode(ButtonPin, INPUT);

  pinMode(Allarm, OUTPUT);
  pinMode(Ledg, OUTPUT);
  pinMode(Ledr, OUTPUT);
  pinMode(Led, OUTPUT);

  Allarme();
 }
void loop()
 {
  lcd.setCursor(0,2);
  
  buttonState = digitalRead(B);
  buttonState1 = digitalRead(buttonPin);
  buttonState2 = digitalRead(ButtonPin);
  AllarmState = digitalRead(Allarm);

  //ledState = digitalRead(Ledg)
  
  Vo = analogRead(OutOA);
  fotoresistenzaValue = analogRead(fotoresistenzaPin);
  
  if(buttonState2 == HIGH && fotoresistenzaValue<450)
  {
    digitalWrite(Led, HIGH);
  }
  
  else
  {
    digitalWrite(Led, LOW);
  }
  
  if(buttonState == HIGH)
  {
      lcd.setCursor(0,2);

    digitalWrite(Ledg, HIGH);
    digitalWrite(Ledr, LOW);
    
    lcd.print("ATTIVATO   ");
    
    Allarme();
  }
  
  else
  {
    if(buttonState == LOW)
   {
    lcd.setCursor(0,2);
    digitalWrite(Ledr, HIGH);
    digitalWrite(Ledg, LOW);

    lcd.print("DISATTIVATO");
    
    Allarme();
   }
  }
  
  if(buttonState ==HIGH && buttonState1 == HIGH)
  {
   digitalWrite(Allarm, HIGH);
   
   Allarme();
  }
  
  if(buttonState == LOW)
  {
   digitalWrite(Allarm, LOW);
   
   Allarme();
  }
  
  if(buttonState == HIGH && Vo > 600)
  {
   digitalWrite(Allarm, HIGH);
   
   Allarme();
  }
  
  if(buttonState == LOW && Vo < 300)
  {
   digitalWrite(Allarm, LOW);
   
   Allarme();
  }
 }
 
int Allarme()
 {
  if(AllarmState == HIGH)
  {
   lcd.setCursor(0,2);
       lcd.print("                ");
    delay(50);
         lcd.setCursor(0,2);

   lcd.print("INTRUSO ");
  }
 
  if(AllarmState == HIGH && buttonState == LOW && Vo > 600)
   {
    lcd.setCursor(0,2);
    lcd.print("                ");
    delay(50);
         lcd.setCursor(0,2);

    lcd.print("INTRUSO ");
   }
  
  else
  {
   if(AllarmState == HIGH && buttonState == HIGH && Vo < 300)
   {
    lcd.setCursor(0,2);
    lcd.print("                ");
    delay(50);
    lcd.setCursor(0,2);
    lcd.print("INTRUSO ");
   }
  
  else
  {
    if(AllarmState == HIGH && buttonState == LOW && Vo > 600)
    {
     lcd.setCursor(0,2);
     lcd.print("                ");
     delay(50);
          lcd.setCursor(0,2);

     lcd.print("INTRUSO ");
    }
  else
  {
   if(AllarmState == HIGH && buttonState == HIGH && Vo > 600)
    {
     lcd.setCursor(0,2);
     lcd.print("                ");
     delay(50);
          lcd.setCursor(0,2);

     lcd.print("INTRUSO ");
    }
   }
  }
 }
}

ma niente il problema rimane anzi intruso non viene più scritto…

Scusate, ma se il display è un 16x2 le righe non sono la 0 e la 1? :sweat_smile:

nono.. e comunque anche se non fosse il programma così va bene.. ahah scrive sulla prima riga "allarme" e sulla seconda "disattivato" il mio problema è solo sulla visualizzazione "intruso"..

sotto ogni riga

lcd.print("INTRUSO ");

aggiungi un altro delay, un po' più consistente.....

delay(500);

raga..ci provo, la voglia di sdebitarmi è tanta

nel tuo codice, se pulsante low scrivi disattivato

  if(buttonState == HIGH)
  {
      lcd.setCursor(0,2);

    digitalWrite(Ledg, HIGH);
    digitalWrite(Ledr, LOW);
    
    lcd.print("ATTIVATO   ");
    
    Allarme();
  }
  
  else
  {
    if(buttonState == LOW)
   {
    lcd.setCursor(0,2);
    digitalWrite(Ledr, HIGH);
    digitalWrite(Ledg, LOW);

    lcd.print("DISATTIVATO");
    
    Allarme();
   }

quindi in ogni caso quando è low dopo high ti scrive "disattivato", anche se vuoi scrivere sopra altre cose... prova a mettere un se pulsante high e condizione poi low e una condizione provo a collegare il mega con un display

Ragazzi grazie a tutti, ho appena risolto con la soluzione del delay, certo, la scritta lampeggia, ma fa niente è meglio così. :)

con i delay puoi "giocare", prova a diminuire quello dopo gli spazi (finanche ad eliminarlo....) ed aumentare quello dopo le scritte, o viceversa, io ti ho dato valori possibili, non è detto che siano i migliori; se è tutto ben organizzato il display non dovrebbe lampeggiare in modo vistoso...