Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Gestione display OLED

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteMassimoB, Foto Utentexyz, Foto UtenteWALTERmwp

0
voti

[31] Re: Gestione display OLED

Messaggioda Foto Utentelelerelele » 13 mag 2024, 14:58

Saverio15 ha scritto:Visto che il problema dei caratteri puntiformi sembra più ostico, c'è qualcuno che possa risolvere il problema della sovrascrittura delle misure rendendo la lettura impossibile?
Grazie.

Per quel poco che ho fatto io, ricordo che prima di scrivere il dato, andavo a cancellare quello precedente, puoi usare vari metodi, uno che ricordo di aver usato era scrivere il carattere da cancellare con il colore di fondo poi scrivevo il valore successivo, ( utilizzato anche per i disegni) oppure puoi scrivere l'intera matrice del carattere con colore di fondo. (Da inesperto del campo) :mrgreen:
Saluti.
Avatar utente
Foto Utentelelerelele
4.460 3 7 9
Master
Master
 
Messaggi: 5108
Iscritto il: 8 giu 2011, 8:57
Località: Reggio Emilia

0
voti

[32] Re: Gestione display OLED

Messaggioda Foto UtenteEtemenanki » 13 mag 2024, 19:00

Io avevo semplicemente scritto le nuove informazioni sopra le vecchie, usando prima un buffer che con una sprintf() riempivo con quello che volevo scrivere (di lunghezza pari alla lunghezza complessiva della riga), cosi il comando oled.print si limitava a sovrascrivere completamente la riga senza necessita' di cancellare prima.

Esempio al volo: (da ricordare che stavo usando una libreria solo testo, niente grafica)

Codice: Seleziona tutto
void scrivi() { // routine che scrive i dati sul display
  char linea[15] = { 0 }; // creo un buffer locale
  sprintf(linea, "LETT %u       ", lettura); // con questo font max 14 car per linea
  oled.setCursor(0, 0); // posiziono all'inizio della riga dove voglio scrivere
  oled.print(linea); // scrivo tutta la linea, sovrascrivendo la precedente
  ...
  eccetera
}


Non so pero' se questo sistema possa essere utile anche a te', di certo non funziona se devi usare una libreria che ti permette anche di disegnare della grafica, e la disegni.
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.
Avatar utente
Foto UtenteEtemenanki
7.912 3 6 10
Master
Master
 
Messaggi: 5027
Iscritto il: 2 apr 2021, 23:42
Località: Dalle parti di un grande lago ... :)

0
voti

[33] Re: Gestione display OLED

Messaggioda Foto UtenteSaverio15 » 13 mag 2024, 23:35

Intanto grazie per la pazienza nelle vostre risposte.
Ho provato il primo sistema suggerito da lele, funziona ma devo inserire diverse righe in più.
Questo è quello che ho provato:


void loop() {

display.setTextSize(2);

display.setTextColor(BLACK); // colore carattere nero
display.setCursor(15,30); // posizione carattere
display.println(num); // valore da stampare

display.setTextColor(WHITE); // colore carattere bianco
display.setCursor(15,30); // posizione carattere
display.println(num=num+1); // Valore da stampare + 1
display.display();

delay(2000);

}


MI sembra impossibile che sia solo questo il sistema. Nel display LCD basta solo una riga.

Prossimamente proverò il sistema di Etemenanki ma per le mie capacità mi sembra più difficile.
Avatar utente
Foto UtenteSaverio15
20 3
 
Messaggi: 28
Iscritto il: 17 feb 2013, 17:28

0
voti

[34] Re: Gestione display OLED

Messaggioda Foto UtenteSaverio15 » 21 mag 2024, 23:37

Dopo molte di ore passate in prove, sono riuscito ad eliminare il difetto di visualizzazione dei caratteri puntiformi sul display SSD1306.

Ora risolto un problema, si è presentato un secondo difetto sul display.
Come si vede dalla foto, le letture sono ottime ma se guardate sulla ultima riga del display, si presentano dei simboli non voluti che disturbano.
Da prova fatte, questo difetto si elimina solo togliendo la visualizzazione della misura del sensore sensore di umidità e temperatura. Dopo numerosi tentativi non sono riuscito ad eliminare.
Avete dei suggerimenti?
Grazie.
Allegati
IMG_20240521_224256_665 (2).jpg
Avatar utente
Foto UtenteSaverio15
20 3
 
Messaggi: 28
Iscritto il: 17 feb 2013, 17:28

0
voti

[35] Re: Gestione display OLED

Messaggioda Foto Utentelelerelele » 22 mag 2024, 8:20

questa riga la scrivi come le altre?

i valori della riga, sei sicuro che abbiano dimensioni corrette, se vai a scrivere o leggere valori molto piu grandi della variabile che li contiene potrebbero dare problemi del genere. Prova a sostituire i valori delle varibili con numeri fissi e vedi se te li scrive correttamente.

saluti.
Avatar utente
Foto Utentelelerelele
4.460 3 7 9
Master
Master
 
Messaggi: 5108
Iscritto il: 8 giu 2011, 8:57
Località: Reggio Emilia

0
voti

[36] Re: Gestione display OLED

Messaggioda Foto UtenteSaverio15 » 22 mag 2024, 16:32

Ho messo dei valori fissi nelle variabili, ma il difetto si ripresentava.
Ho parzialmente risolto inserendo all'inizio del loop, una cancellazione del display.
Ora il difetto non si vede ma in questo modo le letture del display si rinnovano ad ogni ciclo, il chè non è bello.
Mi dispiace non aver capito il perché della presentazione di quei caratteri non voluti.
Allegati
IMG_20240522_153214.jpg
Avatar utente
Foto UtenteSaverio15
20 3
 
Messaggi: 28
Iscritto il: 17 feb 2013, 17:28

0
voti

[37] Re: Gestione display OLED

Messaggioda Foto UtenteEtemenanki » 22 mag 2024, 19:05

Se fai un solo lcd.clear, magari nel setup, i caratteri strani ci sono lo stesso ?

Com'e' il programma ?
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.
Avatar utente
Foto UtenteEtemenanki
7.912 3 6 10
Master
Master
 
Messaggi: 5027
Iscritto il: 2 apr 2021, 23:42
Località: Dalle parti di un grande lago ... :)

0
voti

[38] Re: Gestione display OLED

Messaggioda Foto UtenteSaverio15 » 22 mag 2024, 23:50

I caratteri strani sulla ultima riga spariscono solo con una cancellazione del display posto sulla prima riga del loop.
Allego il programma, fatto in maniera elementare, completo e funzionante. Spero che qualcuno lo migliori e me lo faccia sapere.

Codice: Seleziona tutto
//              300.3  - Grotta con SSD1306 OK del 22.05.2024
 
//   Scheda Arduino Nano
//   Display OLED SSD1306 - ind. 0x3C
//   Inclinometro GY-521 - ind. 0x68
//   Bussola GY-271      - ind. 0x1E
//   Metro HY-SRF05
//   Temperatura e Umidità DHT22

// misura di una distanza con il sensore a ultrasuoni SRF05
// allarme acustico tramite buzzer con il superamento di soglie prefissate
// visualizzazione della distanza e dello stato del buzzer sul monitor seriale

// ******************************************************************************

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_ADDR   0x3C
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);

// *************************************************************
//      Inizializzazione DHT22 Umidità e Temperatura del 13.03.2024
  #include <DHT.h>
  #define dataPin 2
  #define DHTType DHT22
  DHT dht = DHT(dataPin, DHTType);

// **************************************************************
//                    Tensione batteria
  int PinBatt = A0;
  int ValPinBatt;
  float Vbatt;
// **************************************************************
//                          Metro
  int t, d; // t=tempo, d=distanza

// **************************************************************
//                     Inclinometro
  #include <SPI.h>
  #include <Wire.h>
  #define MPU 0x68  // I2C address of the MPU-6050 Inclinometro
  #define addr 0x68 //  Address for The QMC5883L  Bussola

  double AcX, AcY, AcZ;
  int Pitch, Roll;

//****************************************************************
//                        Bussola
  #define HMC5883L_Address 0x1E // oppure 0x1E   L'indirizzo del modulo bussola1
  #define X 3 // Registra l'indirizzo per i dati X Y e Z
  #define Y 7
  #define Z 5
  double angle;

//*****************************************************************
  void setup()
  {
// ****************************************************************
  // initializza e pulisce display
  display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);   
  display.clearDisplay();

// ****************************************************************
  Serial.begin(9600);

// ****************************************************************
//                   Tensione batteria
  pinMode (PinBatt, INPUT);

// ****************************************************************
//            Sensore di temperatura e umidità
  dht.begin();

// ****************************************************************
//                  Inclinometro
init_MPU(); // Inizializzazione MPU6050 

// ****************************************************************
  //                    Presentazione per display OLED
  display.setTextSize(1);
  display.setTextColor(WHITE); // Draw white text
  display.setCursor(35, 15);
  display.println(" IFS 324");
  display.display();

  display.setTextSize(1);
  display.setCursor(12, 45);
  display.println(" ciao");
//  display.display();

  display.setTextSize(2);
  display.setCursor(40, 45);

  display.println(" PAOLO");
  display.display();

  delay(3000);

  display.clearDisplay();
  display.display();

// ******************************************************************
  //                             Metro
  pinMode (5, INPUT); // pin echo
  pinMode (6, OUTPUT); // pin trigger
  pinMode (7, OUTPUT); // pin buzzer

// ****************************************************************
  //                         Bussola
  Wire.begin(); // Inizializza la libreria Wire
  Init_HMC5883L(); // Inizializza il modulo HMC5883L

//*****************************************************************
  //                              Bussola
  Wire.beginTransmission(addr); //start talking
  Wire.write(0x0B); // Tell the QMC5883L to Continuously Measure
  Wire.write(0x01); // Set the Register
  Wire.endTransmission();
  Wire.beginTransmission(addr); //start talking
  Wire.write(0x09); // Tell the QMC5883L to Continuously Measure
  Wire.write(0x1D); // Set the Register
  Wire.endTransmission();
  }
// *****************************************************************
  void loop ()
  {
// *************************************************************   
// display.setTextColor(BLACK); // Draw white text
   delay(3000);
   
// ***************************************************************
  //                   controllo sensore DHT22
  delay(200);
  float h = dht.readHumidity();
  float t = dht.readTemperature();

// ************************************************************
  //                     Sensore temperatura display OLED
  display.setTextSize(1);
  display.setTextColor(WHITE); // Draw white text

  display.clearDisplay();

  display.setCursor(0, 0);
  display.print(t * 0.99, 1);
  display.setCursor(27, 0);
  display.print("g");
  display.display();
//   delay(100);

// ************************************************************
//                        Sensore umidità display OLED

  display.setCursor(40, 0);
  display.print(h, 1);
  display.setCursor(68, 0);
  display.print("PC");
  display.display();
  //  delay(100);

// ****************************************************************+
  //                       Tensione batteria

  ValPinBatt = analogRead(PinBatt);
  ValPinBatt * 2 / 100;
  Vbatt = ValPinBatt;
  delay(200);

  //               ----------------------------
  //                  Display OLED

  // display.clearDisplay();
  // display.display();
  // delay(100);

  display.setTextSize(1);
  display.setTextColor(WHITE); // Draw white text
  display.setCursor(90, 0);
  display.print(Vbatt * 2 / 100, 1);
  display.println(" V");
  display.display();
// delay(100);

// ************************************************************
  //                      Programma metro
  digitalWrite(6, LOW); // livello basso sul pin trigger
  delayMicroseconds(2); // per 2 ms
  digitalWrite(6, HIGH); // livello alto sul pin trigger
  delayMicroseconds(10); // per 2 ms
  digitalWrite(6, LOW); // livello basso sul pin trigger
  t = pulseIn(5, HIGH); // comando per la misura del tempo
  d = t / 58; // calcolo della distanza

  //      visualizzazione dei dati sul monitor seriale

  //                     display OLED

  display.setTextSize(1);
  display.setTextColor(WHITE); // Draw white text

  display.setCursor(0, 18);
  display.print("   Metro = cm ");
  display.setCursor(100, 18);
  display.print("        ");

  display.setCursor(90, 18);
  display.println(d); // distanza in cm
  display.display();
// delay(100);

//************************************************************
  //                        Programma Inclinometro
  FunctionsMPU(); // Acquisisco assi AcX, AcY, AcZ.

  Roll = FunctionsPitchRoll(AcX, AcY, AcZ);   //Calcolo angolo Roll
  Pitch = FunctionsPitchRoll(AcY, AcX, AcZ);  //Calcolo angolo Pitch

  }
void init_MPU()
  {

  Wire.beginTransmission(MPU);
  Wire.write(0x6B);  // PWR_MGMT_1 register
  Wire.write(0);     // set to zero (wakes up the MPU-6050)
  Wire.endTransmission(true);
// delay(200);
  }

//         Funzione per il calcolo degli angoli Pitch e Roll

  double FunctionsPitchRoll(double A, double B, double C) {
  double DatoA, DatoB, Value;
  DatoA = A;
  DatoB = (B * B) + (C * C);
  DatoB = sqrt(DatoB);

  Value = atan2(DatoA, DatoB);
  Value = Value * 180 / 3.14;

  return (int)Value;
  }

//       Funzione per l'acquisizione degli assi X,Y,Z del MPU6050

  void FunctionsMPU()
  {
  Wire.beginTransmission(MPU);
  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU, 6, true); // request a total of 14 registers
  AcX = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
  AcY = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L

  //                     display OLED
  display.setCursor(0, 36);
  display.print(" Incl. X= ");
  display.setCursor(50, 36);
  display.print("     ");
//   delay(100);

  display.setCursor(58, 36);
  display.println(Pitch); // Asse X
  display.display();
//   delay(100);

  display.setCursor(80, 36);
  display.print(" Y= ");
  display.setCursor(80, 36);
  display.print("     ");
//   delay(100);
   
  display.setCursor(100, 36);
  display.println(Roll); // Asse Y
  display.display();
//   delay(100);

//  *************************************************************
  //                     Programma Bussola
  angle = (atan2((double)HMC5883L_Read(X), (double)HMC5883L_Read(Y)) * (180 /
           3.14159265)) + 180; /* Angolo in gradi */

  display.setTextSize(1);  // Testo display OLED
  display.setTextColor(WHITE); // Colore testo display OLED
  if ((angle <= 22.1) || (angle >= 337.1 ))
  {
    display.setCursor(10, 54); // Posizione testo display OLED
    display.print("   Nord");
    display.display();
  }
  if ((angle >= 22) && (angle <= 67.1 ))
  {
    display.setCursor(10, 54); // Posizione testo display OLED
    display.print(" Nord-Est");
    display.display();
  }
  if ((angle >= 67) && (angle <= 112.1 ))
  {
    display.setCursor(10, 54); // Posizione testo display OLED
    display.print("   Est");
    display.display();
  }
  if ((angle >= 112) && (angle <= 157.1 ))
  {
    display.setCursor(10, 54); // Posizione testo display OLED
    display.print("Sud-Est");
    display.display();
  }
  if ((angle >= 157) && (angle <= 202.1 ))
  {
    display.setCursor(10, 54); // Posizione testo display OLED
    display.print("   Sud");
    display.display();
  }
  if ((angle >= 202) && (angle <= 247.1 ))
  {
    display.setCursor(10, 54); // Posizione testo display OLED
    display.print("Sud-Ovest");
    display.display();
  }
  if ((angle >= 247) && (angle <= 292.1 ))
  {
    display.setCursor(10, 654); // Posizione testo display OLED
    display.print("  Ovest");
    display.display();
  }
  if ((angle >= 292) && (angle <= 337 ))
  {
    display.setCursor(10, 54); // Posizione testo display OLED
    display.print("Nord-Ovest");
    display.display();
  }

  //                     Angolo display OLED

  display.setCursor(80, 54); // Posizione testo display OLED
  display.print("     ");   // cancellazione valori precedenti
  display.setCursor(80, 54); // Posizione testo display OLED
  display.print(angle, 0);
  display.print(" gr");
  //  display.print((char)223);

  display.display();

// ***************************************************************
  delay(100); // Aspetta un po' prima di leggere di nuovo

  }
//  Questa funzione inizializzerà il modulo e dovrà essere eseguito solo una volta
//  dopo che il modulo è stato acceso o resettato per la prima volta

  void Init_HMC5883L(void)
  {
  // Impostare il modulo su media 8x e frequenza 15Hz
  Wire.beginTransmission(HMC5883L_Address);
  Wire.write(0x00);
  Wire.write(0x70);

  // Imposta un guadagno di 5
  Wire.write(0x01);
  Wire.write(0xA0);
  Wire.endTransmission();
  }
//  Questa funzione verrà letta una sola volta da uno dei registri a 3 assi
//  e restituire il risultato firmato a 16 bit

  int HMC5883L_Read(byte Axis)
  {
  int Result;

  // Iniziare una singola misurazione
  Wire.beginTransmission(HMC5883L_Address);
  Wire.write(0x02);
  Wire.write(0x01);
  Wire.endTransmission();
  delay(6);

  Wire.beginTransmission(HMC5883L_Address);
  Wire.write(Axis);
  Wire.endTransmission();

  // Leggi i dati dai registri
  Wire.requestFrom(HMC5883L_Address, 2);
  Result = Wire.read() << 8;
  Result |= Wire.read();

//  delay(2000);

  return Result;

}
Avatar utente
Foto UtenteSaverio15
20 3
 
Messaggi: 28
Iscritto il: 17 feb 2013, 17:28

0
voti

[39] Re: Gestione display OLED

Messaggioda Foto UtenteEtemenanki » 23 mag 2024, 9:59

Saverio15 ha scritto:I caratteri strani sulla ultima riga spariscono solo con una cancellazione del display posto sulla prima riga del loop...

Scusa, intendi dire che NON spariscono se il clear lo fai nel setup, oppure che spariscono, ma poi si ripresentano durante la scrittura dei dati ?

EDIT: considera anche che se stai usando un 1.3", probabilmente il "costruttore" da usare e' quello del SH, non quello del SSD (per i miei era cosi).
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.
Avatar utente
Foto UtenteEtemenanki
7.912 3 6 10
Master
Master
 
Messaggi: 5027
Iscritto il: 2 apr 2021, 23:42
Località: Dalle parti di un grande lago ... :)

0
voti

[40] Re: Gestione display OLED

Messaggioda Foto UtenteSaverio15 » 23 mag 2024, 10:33

Nel setup c'era sempre una cancellazione totale dello schermo.
Il difetto si presentava solo all'interno del loop, contemporaneamente alla solo scrittura dei dati del sensore di umidità e temperatura.
Ora mi "riposo" poiché non vi sto a dire quante ore ho perso, poi proverò a trasferire tutto il programma in un display OLED SH1106.
In realtà in una delle innumerevoli prove con la mia scheda (ha montato sia il display SSD1306 che il SH1106), con il programma per l'SH1106, i due diplay davano perfettamente la stessa visualizzazione, ma nel display SSD1306, si vedevano dei strani simboli in verticale all'inizio delle righe. poiché era solo delle prove, non avevo dato troppo peso.
Avatar utente
Foto UtenteSaverio15
20 3
 
Messaggi: 28
Iscritto il: 17 feb 2013, 17:28

PrecedenteProssimo

Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 7 ospiti