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

[21] Re: Gestione display OLED

Messaggioda Foto UtenteSaverio15 » 4 mag 2024, 10:22

Grazie per la precisazione.
Della cosa mi ero accorto.
Avendo collegato alla scheda di prova , sia un display SSD1306 che un SH1106 ottengo contemporaneamente la stessa visualizzazione.
Avatar utente
Foto UtenteSaverio15
20 3
 
Messaggi: 28
Iscritto il: 17 feb 2013, 17:28

0
voti

[22] Re: Gestione display OLED

Messaggioda Foto Utentelelerelele » 4 mag 2024, 11:54

Etemenanki ha scritto:Avevo provato anche la u8glib, ma era troppo pesante ed occupava un sacco di spazio (non parliamo poi del "mattone" Adafruit, che da solo, includendolo, mi portava via quasi il 90% dello spazio di memoria)


Ecco perché mi sono sempre scritto le librerie che servivano, ma mi chiedo cosa ci sarà di interessante ad usare cose già fatte, e non capirci dentro niente?

Non sarebbe più bello ed utile, capire come farle e farsele specifiche per l'uso che se ne vuol fare? Certo non si può partire da progetto megagalattico.

Io ho scritto dentro un display grafico con un pic12!

Saluti
Avatar utente
Foto Utentelelerelele
4.475 3 7 9
Master
Master
 
Messaggi: 5130
Iscritto il: 8 giu 2011, 8:57
Località: Reggio Emilia

1
voti

[23] Re: Gestione display OLED

Messaggioda Foto UtenteSaverio15 » 4 mag 2024, 15:33

Complimenti. Questa è una cosa che non riuscirò mai a fare.
Per il momento copio molto dalla rete e aggiungo solo le cose più semplici.
Ecco l'ultimo mio lavoro di cui vorrei sostituire il display a LCD con uno a OLED ma per il momento ho grosse difficoltà.
Allegati
5.jpg
2A (1).jpg
1A.jpg
Avatar utente
Foto UtenteSaverio15
20 3
 
Messaggi: 28
Iscritto il: 17 feb 2013, 17:28

0
voti

[24] Re: Gestione display OLED

Messaggioda Foto UtenteWALTERmwp » 4 mag 2024, 17:26

lelerelele ha scritto:(...) Ecco perché mi sono sempre scritto le librerie che servivano, ma mi chiedo cosa ci sarà di interessante ad usare cose già fatte, e non capirci dentro niente? (...)
di interessante forse poco ma, a mio parere, certamente diverse altre ragioni per ricorrervici.

Saluti

p.s.
bell'oggettino Foto UtenteSaverio15!
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
29,8k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8844
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[25] Re: Gestione display OLED

Messaggioda Foto UtenteEtemenanki » 4 mag 2024, 21:05

Esistono degli OLED 20x4, ma sono troppo costosi (dai 45 ai 60 Euro per poterci scrivere solo 4 righe di testo, e' una follia chiedere un prezzo simile) ... dovresti andare su un grafico, magari gia I2C, ma per farci stare la stessa quantita' di testo, e grande abbastanza da essere leggibile senza occhiali, o vai su un 2.4 (2.42 per alcuni venditori, sempre 128x64), che li trovi sulla ventina di Euro, oppure tocca usare LCD TFT, perche' gli OLED piu grandi li fanno pagare due spropositi e tre quarti, per ora (alcuni venditori, perfino tre spropositi chiedono).

Un TFT con il suo retroilluminatore consumera' sicuramente di piu, rispetto ad un'OLED, ma almeno hai un display a colori con risoluzione maggiore (ad esempio, trovi questi o simili https://it.aliexpress.com/item/1005003936535877.html , 2.8 pollici, 240x320, oppure dei 3.5 o 4.3, ma pagandoli di piu)
"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
8.070 3 6 10
Master
Master
 
Messaggi: 5081
Iscritto il: 2 apr 2021, 23:42
Località: Dalle parti di un grande lago ... :)

0
voti

[26] Re: Gestione display OLED

Messaggioda Foto Utentestefanopc » 4 mag 2024, 22:41

Bello il tuo prototipo Foto UtenteSaverio15.

Quando hai tempo prova la libreria che ti ho segnalato.
Secondo me ti eviti una buona parte di problemi.

lelerelele ha scritto:Ecco perché mi sono sempre scritto le librerie che servivano, ma mi chiedo cosa ci sarà di interessante ad usare cose già fatte, e non capirci dentro niente?

Riguardo il farsi da se le librerie può essere interessante farlo se non esistono o se quelle esistenti non funzionano correttamente.

Con i PIC 16f88 comandavo i display lcd 4x20 con tre pin e un convertitore seriale parallelo e le librerie non sapevo nemmeno cosa fossero.

Se invece le librerie ci sono e funzionano perfettamente e gente preparata ci ha speso svariate ore di lavoro perché non usarle?

Anche io ho dovuto creare una libreria per utilizzare un chip della Linear nel mio BMS.
Diversi mesi di lavoro che mi sarei evitato volentieri con in più il rischio di ottenere qualcosa di non esattamente affidabile quanto una libreria ufficiale.

A questo punto bisognerebbe farsi ognuno un sistema operativo (al posto di Windows, Linux e Android ) e tutti gli applicativi (editor grafici e testo fogli di calcolo montaggio video, disegno vettoriale ecc) e i driver per tutte le periferiche naturalmente.

Probabilmente saremmo ancora quasi tutti (la maggior parte) alla macchina da scrivere con la carta carbone.
Ciao
600 Elettra
Avatar utente
Foto Utentestefanopc
12,0k 5 9 13
Master EY
Master EY
 
Messaggi: 4976
Iscritto il: 4 ago 2020, 9:11

0
voti

[27] Re: Gestione display OLED

Messaggioda Foto Utentelelerelele » 6 mag 2024, 14:43

stefanopc ha scritto:Riguardo il farsi da se le librerie può essere interessante farlo se non esistono o se quelle esistenti non funzionano correttamente.

Si. Non dico di no.

Se la trovi, e funziona bene, l'unico motivo sarebbe un prodotto custom potrebbe avere meno codice non necessario e quindi caricare meno il sistema, da valutare però se ne vale la pena.

poi io scordo sempre che nel mio piccolo ho fatto tutto come hobby, quindi il tempo perso non viene considerato, che in altro ambito lavorativo assume un forte peso.

Nel caso si tratti di studio, che trovo molto simile al lavoro da hobbysta, ritengo la priorità debba essere data ad imparare, interesse secondario al tempo perso, (farsele è tutto lavoro, e tempo perso, che servirà molto in futuro), quindi credo che in questo ambito sia importante.

Ovvio che questo intervento, ed il precedente, spero siano interessanti come mio punto di vista per Foto UtenteSaverio15, da prendere come un parere disinteressato.

A questo punto bisognerebbe farsi ognuno un sistema operativo (al posto di Windows, Linux e Android ) e tutti gli applicativi (editor grafici e testo fogli di calcolo montaggio video, disegno vettoriale ecc) e i driver
per ora non mi sono ancora fatto il sistema operativo del PC, (purtoppo non lo farò mai), anche se ho speso molto tempo alla ricerca di sistemi leggeri con cui usare il PC senza imbottirlo di cazzate e non va piu per il software che serve. Comunque nei miei PC, (pure al lavoro), uso tuti i giorni una serie di programmi, per vario uso, che non sono in commercio, home made, vanno anche bene. :mrgreen:


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

0
voti

[28] Re: Gestione display OLED

Messaggioda Foto UtenteSaverio15 » 11 mag 2024, 15:21

Ciao Ragazzi. Malgrado la mia buona volontà e le molte ore perse, non riesco a trovare l'inghippo. Mi mancano le competenze.
Tra di voi, c'è qualcuno della zona di Trieste che mi può aiutare?
Grazie.
Avatar utente
Foto UtenteSaverio15
20 3
 
Messaggi: 28
Iscritto il: 17 feb 2013, 17:28

0
voti

[29] Re: Gestione display OLED

Messaggioda Foto UtenteSaverio15 » 11 mag 2024, 23:46

Se può essere utile alla comprensione del mal funzionamento del display, inserisco il listato del programma.

Codice: Seleziona tutto
//     2 - Strumento con OLED SSD1306  del 02.05.2024

//     Nel programma sono usati:
//     Arduino Nano
//     Display OLED SSD1306
//     Metro: HY-SRF05  –  Inclinometro: GY-521  –  Bussola: GY-271  - Temperatura: DHT22

// *************************************************************
//                             Inizializzazione Display OLED
  #include <Adafruit_GFX.h>
  #include <SPI.h>
  #include <Wire.h>
  #include <Adafruit_SSD1306.h>
  #define OLED_ADDR   0x3C
  #define SCREEN_WIDTH 128
  #define SCREEN_HEIGHT 32

//  Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT);

  Adafruit_SSD1306 display(128, 32);

// *************************************************************
//      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 0x0D // 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()
  {
// ****************************************************************
  //                   Display OLED
  // initializza e pulisce display
  display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
  display.clearDisplay();
  display.display();

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

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

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

// ****************************************************************
  //                    Presentazione per display OLED
  display.setTextSize(1);
  display.setTextColor(WHITE); // Draw white text
  display.setCursor(42, 0);
  display.println(" Ciao");
  display.display();

  display.setTextSize(2);

  display.setCursor(0, 13);
  display.println(" Saverio");
  display.display();

  delay(2000);

  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 ()
  {
// ****************************************************************+

  //                       Tensione batteria

  ValPinBatt = analogRead(PinBatt);

  //  Serial.print("Tensione batteria:");
  ValPinBatt * 2 / 100;
  Vbatt = ValPinBatt;
  //  Serial.println(Vbatt*2/100,1); // visualizza un decimale
  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(200);

// ***************************************************************
  //                   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.setCursor(0, 0);
  display.print(t * 0.99, 1);
  display.setCursor(27, 0);
  display.print("g");
  display.display();

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

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

  delay(2000);

// ***********************************************************
  //                   Tensione batteria display OLED
  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(200);

// ************************************************************
  //                      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, 8);

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

  display.setCursor(90, 8);
  display.println(d); // distanza in cm
  display.display();
  delay(200);


//************************************************************
  //                        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.setTextSize(1);
  display.setTextColor(WHITE); // Draw white text

  display.setCursor(0, 16);
  display.print(" Incl. X= ");
  display.setCursor(50, 16);
  display.print("     ");

  display.setCursor(58, 16);
  display.println(Pitch); // Asse X
  display.display();
  delay(200);

  display.setCursor(80, 16);
  display.print(" Y= ");
  display.setCursor(80, 16);
  display.print("     ");

  display.setCursor(100, 16);
  display.println(Roll); // Asse Y
  display.display();
  delay(200);

//  *************************************************************
  //                     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, 24); // Posizione testo display OLED
    display.print("   Nord");
    display.display();
  }
  if ((angle >= 22) && (angle <= 67.1 ))
  {
    display.setCursor(10, 24); // Posizione testo display OLED
    display.print(" Nord-Est");
    display.display();
  }
  if ((angle >= 67) && (angle <= 112.1 ))
  {
    display.setCursor(10, 24); // Posizione testo display OLED
    display.print("   Est");
    display.display();
  }
  if ((angle >= 112) && (angle <= 157.1 ))
  {
    display.setCursor(10, 24); // Posizione testo display OLED
    display.print("Sud-Est");
    display.display();
  }
  if ((angle >= 157) && (angle <= 202.1 ))
  {
    display.setCursor(10, 24); // Posizione testo display OLED
    display.print("   Sud");
    display.display();
  }
  if ((angle >= 202) && (angle <= 247.1 ))
  {
    display.setCursor(10, 24); // Posizione testo display OLED
    display.print("Sud-Ovest");
    display.display();
  }
  if ((angle >= 247) && (angle <= 292.1 ))
  {
    display.setCursor(10, 24); // Posizione testo display OLED
    display.print("  Ovest");
    display.display();
  }
  if ((angle >= 292) && (angle <= 337 ))
  {
    display.setCursor(10, 24); // Posizione testo display OLED
    display.print("Nord-Ovest");
    display.display();
  }

  //                     Angolo display OLED

  display.setCursor(80, 24); // Posizione testo display OLED
  display.print("     ");   // cancellazione valori precedenti
  display.setCursor(80, 24); // 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();
  return Result;

  // delay(8000);

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

0
voti

[30] Re: Gestione display OLED

Messaggioda Foto UtenteSaverio15 » 13 mag 2024, 13:01

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.
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 3 ospiti