Lcd Nokia5110 _ librerai adafruit

buongiorno,
ho ripreso in mano un vecchio progetto con lcd nokia 5110 , perchè voglio fare una piccola centralina meteo.. con sensore pressione e temperatura... mi è però successa una cosa strana...

se vado a leggere i valori di pressione e temp. con monitor seriale... tutto ok
ma quando voglio visualizzarli sul Nokia 5110 , mi visualizza solo le scritte ma non mi riporta le variabili
inviate dai sensori ??

i comandi sono
display.print ("Pressione atm :__");
display.print(pressione);

ma sul nokia mi visualizza Pressione atm :__ e poi 00.0

dovrei impostare il formato del valore pressione in modo diverso ma come e dove posso farlo?
grazie
massi

Non ho capito.
Il primo problema è di posizionamento ?
Se stampi "PIPPO __" e poi qualcos'altro è normale che quei trattini ci sono, mica riposizioni il cursore.
Puoi riposizionarti con setCursor()

Il secondo problema è che stampa sempre 0 per la pressione ?

ciao posto sketch :

#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <SPI.h>
#include <Wire.h>
#include <SFE_BMP180.h>

Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 7, 6);

//  classe SFE_BMP180
SFE_BMP180 pressure;
 int i=0;
 int inv=0;
 boolean stan=0;
 float pressione ;
 float altitudine;
 float pressioneSLDM;

void setup()
{
 Serial.begin(9600);
   display.begin();
   display.setContrast(40); 
   display.clearDisplay();
 
 // Inizializza e calibra il sensore
 if (pressure.begin())
    Serial.println("BMP180 operativo.");
 else
    { 
    Serial.println("BMP180 non collegato correttamente.\n\n");
    while(1); // Loop perpetuo
    }
}


void leggi_BMP180(float* altit, float* temp, float* press, float* press0) 
{
 char status;
 double A,T,P,p0;

// Altitudine della stazione di misura in metri. Può essere ricavata da un GPS
 A = 378.0;
 
 // Prima è necessaria una lettura della temperatura.
 // Ritorna il tempo di attesa per la lettura della pressione.
 status = pressure.startTemperature();
 // Attende il completamento della lettura
 delay(status);

 // Ritorna la lettura di temperatura.
 status = pressure.getTemperature(T);

 // Legge la pressione:
 // Va inserito il parametro di oversampling ( da 0 a 3)
 // Più è alto migliore è la precisione, maggiore è il tempo di attesa
 status = pressure.startPressure(3);

 // Attende il completamento della misura.
 delay(status);

 // Legge la pressione atmosferica. La funzione oltre a ritornare
 // la pressione letta ritorna di nuovo il valore di temperatura.
 status = pressure.getPressure(P,T);

 // Ricava la pressione atmosferica SUL LIVELLO del mare.
 // Questa è confrontabile con quella emessa dai bollettini meteo.
 p0 = pressure.sealevel(P,A);
 
 *altit = A;
 *temp = T;
 *press = P;
 *press0 = p0;
}

void loop()
{
 float altitudine,temperatura, pressione, pressioneSLDM;
 leggi_BMP180(&altitudine, &temperatura, &pressione, &pressioneSLDM);
void  setTextSize(uint8_t size);
 //Stampa per il debug
 Serial.print("Altezza in mt. della stazione di misura = ");
 Serial.println(altitudine);
 Serial.print("Pressione atmosferica in mBar ......... = ");
 Serial.println(pressione);
 Serial.print("Pressione atmosferica in mBar SLDM .... = ");
 Serial.println(pressioneSLDM);
 Serial.print("Temperatura in gradi centigradi ....... = ");
 Serial.println(temperatura);
 Serial.print("\n\n");

 //sweep loops
 for(i=0;i<=84;i=i+2){
       if(i>0){
    display.clearDisplay();     
  // display.drawLine(i-2,0,42,47,WHITE);  
  // display.drawLine(i,0,42,47,BLACK);
   //grid();
   meteo();  
   } else {
   display.clearDisplay();  
   //display.drawLine(i,0,42,47,BLACK);
   //grid();
   meteo();  
   }
   display.display();    
   delay(50);   
}
for(i=84;i>=0;i=i-2){
    if(i>=84){
       display.clearDisplay();
   //display.drawLine(i,0,42,47,BLACK);
   //grid();
   meteo();  
   display.display();    
   delay(50);
   } else {
      display.clearDisplay();
   //display.drawLine(i+2,0,42,47,WHITE);   
   //display.drawLine(i,0,42,47,BLACK);
  //grid();
   meteo();  
  display.display();    
  delay(50);     
  }
 }
 }
   void meteo(){
   //grid();
   display.setCursor(0,0);
   display.println("Stazione meteo");
   display.setCursor(0,13);
   display.println("Press.assoluta");
   display.setCursor(0,20);
   display.println("mbar :___");
   display.setCursor(54,20);
   display.println(pressione);
   display.setCursor(0,33);
   display.println("Press.relativa");
   display.setCursor(0,40);
   display.println("mbar: ");
   display.setCursor(40,40);
   display.println(pressioneSLDM);
   display.setCursor(0,40);
   /*display.println("altitudine ");
   display.setCursor(0,35);
   display.println("m :___");
   display.setCursor(54,40);
   display.println(altitudine);*/
       
   delay(10000); // Pausa di 10 secondi.
}
  1. problema di posizione:
    Non so se quello ma togli quei println e metti print semplice, altrimenti stampi oltre al valore anche andata a capo e forse il display "scrolla"
    display.println("mbar: ");

  2. NON puoi dichiarare le variabili locali alla loop() nuovamente, LEVA quelle dichiarazioni delle variabili float nella loop. La leggi_BMP180 e le varie Serial.print scrive e leggono quelle locali alla loop (valorizzate) mentre la funzione meteo NON può vedere le variabili locali alla loop() e quindi usa quelle globali (che sono a 0)
    Cerca in internet documentazione sul C e la visibilità delle variabili (globali e locali)

P.S. ma che sono quei due for() ?? nella loop ?? ??

ciao,
partendo dal fondo ... i cicli for erano di un vecchio programma per fare delle cornici... non servono a nulla!

punto 2. non ho capito ??

punto1. ho provato con entrambi print e println ma non cambia nulla!?

grazie !

massibal

Punto 2, non ti funziona perchè hai dichiarato 2 volte le stesse variabili.
Prendiamo ad esempio pressione.

float pressione ;       // dichiarazione globale
...
void setup()
...
void loop()
{
float altitudine,temperatura, pressione, pressioneSLDM; // dichiarazione locale 
 qui scrivo su pressione LOCALE e la uso nelle Serial.print
 QUALSIASI CODICE QUI, Vedo le variabili locali
}
...
void meteo()
{  // QUI vedo pressione come variabile GLOBALE, mai utilizzata e quindi a 0
}

Per fare una prova, metti la Serial.print(pressione) nella meteo e quindi vedrai che ...
Per correggere togli dalla loop() quelle dichiarazioni di variabili float, ma temperatura, quella non mi pare doppia, quindi mettila anche lei tra quelle globali, all'inizio del programma.

si scusa hai ragione ... ho ripetuto le variabili anche nel loop!!

stasera provo!

ancora una cosa tu mi sai dire come posso ridurre i caratteri sul LCD nokia ?

grazie
bye
massibal

La libreria di Adafruit dovrebbe avere una setTextSize

pagina 14

grazie

come hai potuto vedere io nel mio sketch ho usato :
void setTextSize(uint8_t size);

ma non è cambiato nulla!! sai dirmi qualcosa in merito!

grazie mille
saluti
massi

niente da fare... qualcuno mi sa dire se e come posso ridurre i caratteri del nokia 5110 , usando la libreria adafruit... ho già provato in mille modi ma riesco solo ad aumentare le dimensioni ma non a ridurle!!

grazie mille
massibal

Scusa, ma mi pare chiara la documentazione:
"Below you can see scales of 1 (the default), 2 and 3" e poi c'e' l'immagine di esempio.
Quindi si, puoi solo aumentare il font, di default è alla dimensione minima.
Tutti i caratteri sono bitmap 7x5 di meno che vuoi fare ? :o

ok
è chiaro...pensavo che come si poteva aumentare si poteva anche diminuire

allora devo cambiare libreria ... perchè in rete ho visto che con nokia 5110 hanno usato caratteri molto piccoli!! ?

massibal:
ok
è chiaro...pensavo che come si poteva aumentare si poteva anche diminuire

allora devo cambiare libreria ... perchè in rete ho visto che con nokia 5110 hanno usato caratteri molto piccoli!! ?

Urca meno di 7x5 ? Se trovi e funziona, e se hai voglia, metti poi qui il link, grazie :slight_smile:

prova a guardare qui :

mi sembra che il testo "pressure" abbia un carattere più piccolo i "hPa" ..

ciao se usi la LCD5110_Graph library ...

il carattere più piccolo è il tiny font ed è 4x6 pixels

bye
massibal

Ok, grazie :slight_smile:

:slight_smile:
alla prossima