[RISOLTO] Display 128x64 e u8glib

Ciao, da un paio di giorni sto facendo un po' di prove con un LCD grafico 128x64 e sto usando la libreria u8glib.h

Purtroppo qua iniziano i problemi: provando gli sketch di esempio tutto bello e tutto bene ma appena carico lo sketch creato da me per mostrare 4 stringhe inizia a non andare più come dovrebbe.
La parte superiore (la metà precisa superiore) funziona senza problemi mentre in quella inferiore non riesco a fare niente, mi rimane addirittura l'ultima impostazione dei pixel visualizzata prima del nuovo caricamento (e se il display è appena acceso mostra solo del "disturbo".

Questo la parte di sketch incriminata

void loop(){

    u8g.firstPage();
    do {
      RTC.get(rtc,true);
      sprintf(ora,"%02d:%02d:%02d",rtc[2],rtc[1],rtc[0]);
      Serial.println(ora);
      u8g.setFont(u8g_font_fub20);
      u8g.setPrintPos(8, 23);   // 23 
      u8g.print(ora);
      vecchiSec = rtc[0] + 1;
      if (vecchiSec == 60){
        vecchiSec = 0;
      }

      u8g.setFont(u8g_font_04b_03);
      //u8g.setPrintPos(3, 35); 
      u8g.drawStr(3,35,"Temperatura vasca: 25°C");
      //u8g.setPrintPos(3, 47); 
      u8g.drawStr(3,47,"Temperatura Centralina: 30°C");
      //u8g.setPrintPos(3, 59); 
      u8g.drawStr(3,59,"Temperatura plafo: 35°C"); 
    } 
    while( u8g.nextPage() );
  


}

Qualche idea?

Buongiorno, stamattina ho fatto un po' di prove partendo dalla modifica degli sketch esempio.

Ora sono arrivato a capire che se inserisco la parte relativa all'RTC il display mi mostra il problema in caso contrario no.

Ho modificato lo sketch così:

#include "U8glib.h"
#include <DS1307.h>
#include <Wire.h>


int rtc[7];
char ora[8] = "";
int vecchiSec = 0;

U8GLIB_ST7920_128X64_4X u8g(18, 16, 17);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17



void setup(void){


  RTC.get(rtc,true);
  Serial.begin(19200);
  if (rtc[6]<2014){
    RTC.stop();
    RTC.set(DS1307_SEC,0);
    RTC.set(DS1307_MIN,40);
    RTC.set(DS1307_HR,19);
    RTC.set(DS1307_DOW,5);
    RTC.set(DS1307_DATE,22);
    RTC.set(DS1307_MTH,11);
    RTC.set(DS1307_YR,14);

    RTC.start();
  }
   RTC.SetOutput(DS1307_SQW32KHZ);
   
   

}

void scriviOra(){
  RTC.get(rtc,true);
  sprintf(ora,"%02d:%02d:%02d",rtc[2],rtc[1],rtc[0]);
  //   Serial.println(ora);
  u8g.setFont(u8g_font_fub20);
  u8g.drawStr(0,23,ora);
}

void scrivi(void){

  
  //  u8g.setPrintPos(0, 23);
  // call procedure from base class, http://arduino.cc/en/Serial/Print
  
  u8g.setFont(u8g_font_04b_03);
  //u8g.setPrintPos(3, 35); 
  u8g.drawStr(3,35,"Temperatura vasca: 25°C");
  //u8g.setPrintPos(3, 47); 
  u8g.drawStr(3,47,"Temperatura Centralina: 30°C");
  //u8g.setPrintPos(3, 59); 
  u8g.drawStr(3,59,"Temperatura plafo: 50°C"); 
  vecchiSec = rtc[0] + 1;
  if (vecchiSec == 60){
    vecchiSec = 0;
  }
}

void loop(void){
  
  u8g.firstPage();
  
  do {
    //scriviOra();
    scrivi(); 
  } 
  while( u8g.nextPage() );


}

Con questo codice mi mostra tranquillamente le tre righe

  • Temperatura vasca
  • Temperatura centralina
  • Temperatura plafo

e non mi mostra l'orario (ovviamente).

Appena scommento //scriviOra() inizia a mostrarmi l'orario in maniera corretta, ma non mi mostra più le tre stringhe di temperatura aggiornate.

Excause me for answering here in the italy forum. Unfortunately i do not know your language, but i saw the code. You should do any I/O code outside the picture loob as shown below.

Oliver

SirNino:

void loop(){

RTC.get(rtc,true);
     sprintf(ora,"%02d:%02d:%02d",rtc[2],rtc[1],rtc[0]);
     Serial.println(ora);

u8g.firstPage();
   do {
     u8g.setFont(u8g_font_fub20);
     u8g.setPrintPos(8, 23);   // 23
     u8g.print(ora);
     vecchiSec = rtc[0] + 1;
     if (vecchiSec == 60){
       vecchiSec = 0;
     }

u8g.setFont(u8g_font_04b_03);
     //u8g.setPrintPos(3, 35);
     u8g.drawStr(3,35,"Temperatura vasca: 25°C");
     //u8g.setPrintPos(3, 47);
     u8g.drawStr(3,47,"Temperatura Centralina: 30°C");
     //u8g.setPrintPos(3, 59);
     u8g.drawStr(3,59,"Temperatura plafo: 35°C");
   }
   while( u8g.nextPage() );

}




Qualche idea?

Hi Oliver thaks for your answer and i'm sorry for my english. :confused:

Ho fatto nuove prove ed il problema sembra essere (the problem is... IMHO):

sprintf(ora,"%02d:%02d:%02d",rtc[2],rtc[1],rtc[0])

Considerato che si trattava di sole 3 righe ho iniziato a provare ad escluderle a una a una e appena ho commentato questa ha iniziato a funzionare (ma ovviamente non mi mostra l'orario aggiornato ma una stringa inserita manualmente).

Le stringhe non sono terminate con un zero?
in char ora[8] = ""; non riesci a mettere "oo:mm:ss0"

metti il array a 9 e dovrebbe funzionare.

Ciao Uwe

Grazie, risolto :smiley:

  sprintf(ora,"%02d:%02d:%02d",rtc[2],rtc[1],rtc[0], "0");

Cosí non hai risolto.

Il problema del Array usato fuori dal range di ram riservato ce l'hai ancora.

Ciao Uwe