programma per gestire lcd in verticale

Salve a tutti,dovrei realizzare uno skatch che mi permetta di utilizzare un display lcd in verticale,diviso in 2 colonne nel quale su una inserirò i numeri da uno a dodici(rappresenta le ore) e sull’altra dei quadratini neri ,quest’ultimi però saranno ottenuti da dei pulsanti,con il primo selezionerò un’ora/numero da cui partire,con il secondo scegliero fino a quanto far arrivare i quadratini neri(tutto ciò indica del tempo da far trascorrere(credo che questo pulsante funzioni come un’incremento),con il terzo diminuirò il numero di quadratini neri,essendo la prima volta che programmo uno sketch,in quanto me lo ha chiesto un’amico vorrei se possibile un vostro aiuto.
Per ora ho realizzato solo questa parte,mi occorrerebbe una funzione per vedere se nel cursore del display c’è o non c’è un carattere,ho provato a cercare un pò su internet ma fino ad ora non ho trovato nulla,se avete compreso quellio che devo fare potreste cordialmente aiutarmi nell’intero sketch,se ci sono domande in merito a ciò che io debba fare a causa della mia mancata competenza nell’esporre il testo sarò felice di rispondervi,comunque grazie in anticipo delle vostre preziosissime risposte.
Il codice da me scritto finora è questo:

#include <LiquidCrystal.h>
//numero del pin
#define BUTTON1// select ora
#define BUTTON2//+
#define BUTTON3//of
#define BUTTON4//on
#define BUTTON5//manuale
#define BUTTON6//-

 
// Viene inzializzata la libreria del Display con i relativi PIN a cui è connesso il Display
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//creazione caratteri in verticale 
byte uno[8] = { B00000, B00000,
                    B00000, B11111,
                     B00000, B00000,
                    B00000, B00000 };
 byte due[8] = { B00000, B00000,
                   B10001, B11001,
                   B10101, B10010,
                   B00000, B00000 };
byte tre[8] = { B00000, B00000,
B10101, B10101,
B10101, B11111,
B00000, B00000};
byte quattro[8] = {  B00000, B00100, B00110, B00101, B11111, B00100, B00000};
byte cinque[8] = { B00000, B00000,
B10111, B10101,
B10101, B11101,
B00000, B00000};
byte sei[8] = {  B00000, B00000,
B11101, B10101,
B10101, B11111, 
B00000, B00000 };
byte sette[8] = { B00000, B00001,
B00001, B00001,
B11111, B00000,
B00000, B00000 };
byte otto[8] = { B00000, B00000,
B11111, B10101,
B10101, B11111,
B00000, B00000 }; 
byte nove[8] = { B00000, B00000,
B10111, B10101,
B10101, B11111,
B00000, B00000 };       
byte dieci[8] = { B00000, B00000,
B11111, B00000,
B11111, B10001, 
B11111, B00000 };
byte undici[8] = { B00000, B00000,
B11111, B00000,
B00000, B11111, 
B00000, B00000 };  
 byte dodici[8] = { B00000, B00000,
 B11111, B00000,
 B11001, B10101,
 B10011, B00000};        

byte quadratinoNero[8] = { B11111, B11111,
B11111, B11111,
B11111, B11111,
B11111, B11111 };

void setup()
{
lcd.createChar(0, uno);
  lcd.createChar(1, due);//(num,dato)
  lcd.createChar(2, tre);
  lcd.createChar(3, quattro);
  lcd.createChar(4, cinque);
  lcd.createChar(5, sei);
  lcd.createChar(6, sette);
  lcd.createChar(7, otto);
  lcd.createChar(8, nove);
  lcd.createChar(9, dieci);
  lcd.createChar(10, undici);
  lcd.createChar(11, dodici);
  lcd.createChar(12,quadratinoNero);
  lcd.begin(12, 2);
 for (int i=0;i<12;i++)
 {
lcd.setCursor(1,i);
lcd.write(byte(i));
 }
  pinMode(BUTTON,INPUT);
 

}
void loop(){
  int Cselect=0;
 
  lcd.setCursor(0, 0);
 
if(digitalRead(BUTTON1)==HIGH)
{
  lcd.setCursor(Cselect,1);
     Cselect++;
    
}
    if((digitalRead(BUTTON2)==HIGH)&&(lcd.setCursor()))//volevo mettere se lo spazione nel cursore è
 //pieno
    {
      lcd.setCursor(Cselect,0);
      lcd.write(byte[12]);
      lcd.setCursor(Cselect, 1);
    }


}

Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento, ti chiedo 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.

Guglielmo

grazie dell'apprensione lo farò immediatamente

ma te li fa usare tutti i caratteri personalizzati? il reference parla solo di 8 caratteri...

per la verifica pieno/vuoto della posizione del display che io sappia non c'è una funzione della libreria. credo convenga tenere traccia in altro modo, tipo con un array di N elementi, ognuno associato ad una posizione.

so che potrebbe sembrarti strano,ma visto che lo sto facendo per conto di un amico,che ancora non mi ha dato arduino e il modulo lcd, a causa di ciò non ho potuto provare il funzionamento effettivo dello sketch,quindi non so se i caratteri personalizzati me li prende tutti,ho fatto un'ipotesi dove ogni quadrato che creo con l'lcd.begin() possa contenere un carattere speciale,se non fosse così non saprei cosa inventarmi :') ,comunque grazie per l'idea dell'array è ottima.

ro1999:
… possa contenere un carattere speciale,se non fosse così non saprei cosa inventarmi …

C’è poco da inventare, basta studiare il datasheet del controller usato su quei display LCD (che nel 99% dei casi è un HD44780 o suo compatibile) per vedere che la memoria fisica disponibile nel chip, per per creare nuovi caratteri, è di OTTO posizioni, quindi si possono creare sino ad 8 caratteri personali da usare contemporaneamente nelle varie scritte.

Guglielmo

grazie

non so se è possibile, ma al limite potresti provare a sovrascrivere durante l'esecuzione dello sketch i caratteri personalizzati per inserire quelli che ti servono in quel momento... te ne bastano 2 alla volta...

non credo si possa fare perchè mi sevono tutti e dodici in contemporanea

così su 2 piedi non ho la possibilità di provare, ma una cosa del tipo

lcd.createChar(0, uno);
lcd.createChar(1, due);//(num,dato)
lcd.write(byte[0]);
lcd.write(byte[1]);

lcd.createChar(0, tre);
lcd.createChar(1, quattro);
lcd.write(byte[0]);
lcd.write(byte[1]);

lcd.createChar(0, cinque);
lcd.createChar(1, sei);
lcd.write(byte[0]);
lcd.write(byte[1]);

non potrebbe funzionare? certo ti devi smazzare con un bel po' di codice, ma forse risolvi...

posso provarci tanto non mi costa nulla,poi ti farò sapere :)