Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

creare 2 pagine per un solo 2x16

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteMassimoB, Foto UtenteWALTERmwp, Foto Utentexyz

0
voti

[1] creare 2 pagine per un solo 2x16

Messaggioda Foto Utentedanielealfa » 21 set 2019, 23:09

ciao a tutti, ho iniziato da poco con arduino .
ho un scker di un programma che usa un lcd 16x2
e sono indicate alcune informazioni.
ora oltre a definire il pin di ingresso (il cambio di schermata avviene con un pulsante )
quale e il codice da usare?
Avatar utente
Foto Utentedanielealfa
222 2 4 7
Sostenitore
Sostenitore
 
Messaggi: 1159
Iscritto il: 27 mag 2009, 22:51

0
voti

[2] Re: creare 2 pagine per un solo 2x16

Messaggioda Foto UtenteMarcoD » 22 set 2019, 9:58

La tua domanda non mi è chiara.
Hai già un programma demo funzionante?
Hai montato l'hardware, funziona ?
Per scrivere più pagine, riscrivi ogni volta tutte le due righe di caratteri. O_/
Avatar utente
Foto UtenteMarcoD
6.364 4 8 13
Master EY
Master EY
 
Messaggi: 2579
Iscritto il: 9 lug 2015, 16:58
Località: Torino

0
voti

[3] Re: creare 2 pagine per un solo 2x16

Messaggioda Foto Utentelucaking » 22 set 2019, 10:07

MarcoD ha scritto:La tua domanda non mi è chiara.

Questo mi consola, non l' ho capita nemmeno io. :D

Foto Utentedanielealfa, se hai uno sketch, posta il codice tra gli appositi tag "Code" che trovi sopra nell' editor dei messaggi, sarà più facile aiutarti.
Avatar utente
Foto Utentelucaking
928 2 5 8
Expert
Expert
 
Messaggi: 846
Iscritto il: 29 mag 2015, 14:28

0
voti

[4] Re: creare 2 pagine per un solo 2x16

Messaggioda Foto Utentedanielealfa » 22 set 2019, 16:26

ciao e grazie della risposta.
questo e' il codice, che ho modificato da scrivi a sinistra.
li funziona ed va bene.
ora a parte la stringa di abilitazione pin , come creo un'altra o altre usando un comando esterno?
Codice: Seleziona tutto
void setup()
{
  lcd.createChar(1, smiley);
  lcd.createChar(2, sat1);
  lcd.createChar(3, sat2);
  lcd.createChar(4, sat3);
  lcd.begin(16, 2);
  lcd.clear();
  gpsSerial.begin(9600);
  lcd.setCursor(0, 0);
  lcd.print("    Ricerca     ");
  delay(1000);
  lcd.setCursor(0, 1);
  lcd.print(" Satelliti");
  lcd.setCursor(12, 1);
  lcd.write(2);
  lcd.write(3);
  lcd.write(4);
  delay(5000);
  lcd.clear();

  lcd.leftToRight();                    //Scrivi da sinistra a destra
  lcd.setCursor(0, 0);                  //Sposta il cursore sulla prima riga 5° colonna
  lcd.write(2);
  lcd.write(3);
  lcd.write(4);
  for (int i = 0; i < 13; i++) {          //Esegui tredici volte
    lcd.scrollDisplayRight();            //Sposta a destra tutte le scritte
  delay(500);
  }
 
  lcd.clear();
                           
  lcd.setCursor(13, 1);                  //Sposta il cursore sulla prima riga 5° colonna
 
  lcd.write(2);
  lcd.write(3);
  lcd.write(4);
  delay(500);
  for(int i = 0; i<12; i++){              //Esegui 10 volte
    lcd.scrollDisplayLeft();             //Sposta a sinistra
    delay(500);                       
}

  lcd.clear();
}

// end setup

void loop()
{
  int start = millis();
  int now = millis();

un'altra pagina 16x2 devo ancora crearla
Avatar utente
Foto Utentedanielealfa
222 2 4 7
Sostenitore
Sostenitore
 
Messaggi: 1159
Iscritto il: 27 mag 2009, 22:51

0
voti

[5] Re: creare 2 pagine per un solo 2x16

Messaggioda Foto UtenteIlGuru » 22 set 2019, 16:54

Puoi definire due funzioni, una per visualizzare ciascuna schermata 16x2, ed invocare una o l'altra alla bisogna
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
4.154 1 10 13
Master
Master
 
Messaggi: 1387
Iscritto il: 31 lug 2015, 23:32

0
voti

[6] Re: creare 2 pagine per un solo 2x16

Messaggioda Foto Utentelucaking » 22 set 2019, 16:56

Se vuoi fare in modo che in qualunque parte del loop ti trovi alla pressione di un tasto esterno si disegni una nuova schermata, io definirei una funzione che disegni la nuova schermata e la chiamerei con un interrupt.
Avatar utente
Foto Utentelucaking
928 2 5 8
Expert
Expert
 
Messaggi: 846
Iscritto il: 29 mag 2015, 14:28

0
voti

[7] Re: creare 2 pagine per un solo 2x16

Messaggioda Foto Utentedanielealfa » 22 set 2019, 17:03

grazie delle prime informazioni.
io ho un loop(cosi si chiama , credo) che legge dei segnali da un modulo gps ,, tramite tx e rx .
credo che un interup non vada bene...almeno sono all ' inizo e sono un po ' ignorante
e volevo modificare questo progetto.
ho gia' fatto degli esperimenti...
scusate la mia mancanza in futuro
Avatar utente
Foto Utentedanielealfa
222 2 4 7
Sostenitore
Sostenitore
 
Messaggi: 1159
Iscritto il: 27 mag 2009, 22:51

1
voti

[8] Re: creare 2 pagine per un solo 2x16

Messaggioda Foto Utentexyz » 22 set 2019, 17:17

Il tuo codice non è scritto rispettando alcune convezioni delle API di Arduino. Nella funzione setup devi semplicemente inizializzare LCD e tutti gli altri dispositivi utilizzati, tutta la logica la metti nella funzione loop. Lo so' che in rete si trovano programmi per Arduino dove fanno tutto della funzione di setup, ma questo non giustifica scrivere codice in quel modo.

La tua domanda iniziale è quasi incompressibile, comunque la gestione di pagine multiple vengono gestiste semplicemente con una macchina a stati, dove ogni stato è una pagina, ad ogni cambio di stato viene ripulito tutto lo schermo e riscritto in base al nuovo stato.
Avatar utente
Foto Utentexyz
5.945 2 4 5
G.Master EY
G.Master EY
 
Messaggi: 1582
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

0
voti

[9] Re: creare 2 pagine per un solo 2x16

Messaggioda Foto Utentedanielealfa » 22 set 2019, 17:21

questo puo essere un esempio?

Codice: Seleziona tutto
/*  ARDUINO MENU selezionabile con 4 OPZIONI e Display LCD I2C
*   
*  (Temperatura, Led Verde, Led Rosso, Relè)

*  Per maggiori info visitate www.progettiarduino.com

*  Autore Fancello Salvatore
*/


#define butUp        12     //pulsante SU al pin 12
#define butDown     11     //Pulsante GIU al pin 11
#define butP        10       //Pulsante SELEZIONA al pin 10
#define butM          9     //non utilizzato in questo esempio
#define LampRed     13     //LED Rosso al pin 13
#define LampRed2    1    //LED Verde al pin 1
#define LampRele     8   //Relè al pin 8
#define PhotoSensor A0   // sensore temperatura al pin analogico A0

//Funzioni dei vari cicli
void changeMenu();
void dispMenu();
void mostraMsg();
void controlLed();
void controlLed2();
void controlRele();
void temperatura();


//Variabili globali
char menu = 0x01;
char set1 = 0x00, set2 = 0x00 , set3 = 0x00;
boolean t_butUp, t_butDown, t_butP, t_butM;
int sensorValue = 0;
int reading = 0;
int sensorPin = A0;

//DISPLAY Mappa Hardware

#include <Wire.h>           // libreria wire presente, di fault, nell'IDE
#include <LiquidCrystal_I2C.h> // libreria di gestione del display lcd

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // definisce la tipologia del display

void setup() {
 
  lcd.begin(16, 2);
  for (char i=9; i<13; i++){            //Ingresso dei pulsanti
   
         pinMode(i, INPUT_PULLUP);
   
  }
 
  pinMode(LampRed, OUTPUT);               //LED ROSSO
  pinMode(LampRed2, OUTPUT);        //LED VERDE
  pinMode(LampRele, OUTPUT);            //RELÈ
                     
  digitalWrite (LampRele, HIGH);    //Imposto inizialmente il relè allo stato Alto (Attivo)
 
  t_butUp    = 0x00;                     //Inizializza le variabili come ZERO
  t_butDown = 0x00;
  t_butP    = 0x00;
  t_butM    = 0x00;
 

}

void loop() {
 
 
  changeMenu();                        //Menu di scambio
 
  dispMenu();                        //Selezionare il menu
 

}


//Funzioni

void changeMenu(){
 
  if(digitalRead(butUp) == 0x00){            //Setta la variabile in 1 se si preme il pulsante UP
   
    t_butUp = 0x01;
   
  }
 
   if(digitalRead(butDown) == 0x00){         //Setta la variabile in 1 se si preme il pulsante DOWN
   
    t_butDown = 0x01;
   
  }
 
  if(digitalRead(butUp) && t_butUp){
   
    t_butUp = 0x00;
   
    lcd.clear();        //Cancella Schermo lcd
   
    menu++;
     
    if(menu > 0x04){
     
      menu = 0x01;
    }
  }
 
  if(digitalRead(butDown) && t_butDown){
   
    t_butDown = 0x00;
   
    lcd.clear();
   
    menu--;
     
    if(menu < 0x01){
     
      menu = 0x04;
    }
  }   
 
}



void dispMenu(){
 
  switch(menu){
   
    case 0x01:
        controlLed();              //Funzione controllo  led1
       break;
    case 0x02:
       controlRele();               //Funzione controllo  relè
       break;
    case 0x03:
       temperatura();               //Funzione controllo  temperatura
       break;
    case 0x04:
        controlLed2();             //Funzione controllo  led2
       break;
  }
}


                         /*Ciclo per la funzione controllo LED1*/
void controlLed(){

  lcd.setCursor(0,0);
  lcd.print("ACCENSIONE LED 1");
 
  if(digitalRead(butP) == 0x00){
   
    t_butP = 0x01;
   
  }
 
  if(digitalRead(butM) == 0x00){
   
    t_butM = 0x01;
   
  }
 
  if(digitalRead(butP) && t_butP){
   
    t_butP = 0x00;
    set1++;

   
    if(set1 > 2){
     
      set1 = 0x01;
    }
   
    switch(set1){
     
      case 0x01:
         lcd.clear();
        lcd.setCursor(0,1);
         digitalWrite (LampRed, HIGH);  //Accendo il Led Rosso
        lcd.print("LED ROSSO ON");
         break;
      case 0x02:
        lcd.clear();
        lcd.setCursor(0,1);
         digitalWrite (LampRed, LOW);  //Spengo il Led Rosso
        lcd.print("LED ROSSO OFF");
      break;
    }
  }
}


                         /*Ciclo per la funzione controllo Relè*/
void controlRele(){
 
   
  lcd.setCursor(0,0);
  lcd.print("RELE");
 
  if(digitalRead(butP) == 0x00){
   
    t_butP = 0x01;
   
  }
 
  if(digitalRead(butM) == 0x00){
   
    t_butM = 0x01;
   
  }
 
  if(digitalRead(butP) && t_butP){
   
    t_butP = 0x00;
    set2++;

   
    if(set2 > 2){
     
      set2 = 0x01;
    }
   
    switch(set2){
     
      case 0x01:
         lcd.clear();
        lcd.setCursor(0,1);
         digitalWrite (LampRele, LOW);
        lcd.print("RELE ON");
         break;
      case 0x02:
        lcd.clear();
        lcd.setCursor(0,1);
         digitalWrite (LampRele, HIGH);
        lcd.print("RELE OFF");
      break;
    }
  }
}

                         /*Ciclo per la funzione controllo TEMPERATURA*/
void temperatura(){
  reading = analogRead(sensorPin);
  int celsius = reading/2;
  lcd.setCursor(0, 0);
  lcd.print("Temperatura: ");
  lcd.setCursor(0,1);
  lcd.print(celsius, DEC);
  lcd.print((char)223);
  lcd.print("C");
  delay(10);
}


                         /*Ciclo per la funzione controllo Led Verde*/
void controlLed2(){

 
  lcd.setCursor(0,0);
  lcd.print("ACCENSIONE LED 2");
 
  if(digitalRead(butP) == 0x00){
   
    t_butP = 0x01;
   
  }
 
  if(digitalRead(butM) == 0x00){
   
    t_butM = 0x01;
   
  }
 
  if(digitalRead(butP) && t_butP){
   
    t_butP = 0x00;
    set3++;

   
    if(set3 > 2){
     
      set3 = 0x01;
    }
   
    switch(set3){
     
      case 0x01:
        lcd.clear();
        lcd.setCursor(0,1);
        digitalWrite (LampRed2, HIGH);
        lcd.print("LED VERDE ON");
        break;
      case 0x02:
        lcd.clear();
        lcd.setCursor(0,1);
        digitalWrite (LampRed2, LOW);
        lcd.print("LED VERDE OFF");
      break;
    }
  }
}
Avatar utente
Foto Utentedanielealfa
222 2 4 7
Sostenitore
Sostenitore
 
Messaggi: 1159
Iscritto il: 27 mag 2009, 22:51

0
voti

[10] Re: creare 2 pagine per un solo 2x16

Messaggioda Foto Utentedanielealfa » 22 set 2019, 20:10

come da consiglio ho corretto il setup e sto rivedendo la logica.

ho un problema, con questo codice, l animazione non si ferma , e il testo dopo non e' fermo.
ho provato anche con il comando write ma si ferma tutto quanto .
dove sbaglio?[code
Codice: Seleziona tutto
  B01110,
  B00110,
};
TinyGPSPlus gps;
SoftwareSerial gpsSerial(9, 8);
const int serialTime = 200;
void setup()
{
  lcd.createChar(1, smiley);
  lcd.createChar(2, sat1);
  lcd.createChar(3, sat2);
  lcd.createChar(4, sat3);
  lcd.begin(16, 2);
  lcd.clear();
  gpsSerial.begin(9600);
  lcd.setCursor(0, 0);
  lcd.print("   CAPTURING    ");
  delay(1000);
  lcd.setCursor(0, 1);
  lcd.print(" SATELLITES");
  lcd.setCursor(12, 1);
  lcd.write(2);
  lcd.write(3);
  lcd.write(4);
  delay(3000);
  lcd.clear();
} // end setup
void loop()
{
  lcd.leftToRight();                    //Scrivi da sinistra a destra
  lcd.setCursor(0, 0);                  //Sposta il cursore sulla prima riga 5° colonna
  lcd.write(2);
  lcd.write(3);
  lcd.write(4);
  for (int i = 0; i < 13; i++) {          //Esegui tredici volte
    lcd.scrollDisplayRight();            //Sposta a destra tutte le scritte
    delay(500);
  }
  lcd.clear();
  lcd.setCursor(13, 1);                  //Sposta il cursore sulla prima riga 5° colonna
  lcd.write(2);
  lcd.write(3);
  lcd.write(4);
  delay(500);
  for (int i = 0; i < 12; i++) {          //Esegui 10 volte
    lcd.scrollDisplayLeft();             //Sposta a sinistra
    delay(500);
  }
  lcd.clear();
int start = millis();
  int now = millis();
  do {
    while (gpsSerial.available() > 0) {
      gps.encode(gpsSerial.read());

][/code]
Avatar utente
Foto Utentedanielealfa
222 2 4 7
Sostenitore
Sostenitore
 
Messaggi: 1159
Iscritto il: 27 mag 2009, 22:51

Prossimo

Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite