Display Oled 20x04

Salve a tutti, ho acquistato un display oled da 20x4 , ma non riesco a far visualizzare più di due righe , ho scaricato la libreria per il 16x2 e con questo sono riuscito a visualizzare qualcosa , ho trovato poi una libreria specifica per il mio tipo di display ma non è funzionante perchè credo ci siano problemi con le estensioni , qualcuno potrebbe aiutarmi? allego i link delle librerie su git hub:

Libreria 16x02 : GitHub - gadjet/1602-OLED-Arduino-Library: wide.HK 1602 OLED Library
Libreria 20x04 : GitHub - jafrado/2004_i2c_oled: Display Driver for the Wide.HK 20x4 SSD1311 Character mode OLED display

Grazie ancora :slight_smile:

Quale display hai comprato?

uwefed:
Quale display hai comprato?

Questo https://www.ebay.it/itm/IIC-I2C-2004-20x4-OLED-Module-Display-For-Arduino-PIC-AVR-ARM/162156498430?hash=item25c147cdfe:g:Y3UAAMXQeW5TalcD

Quello che hai trovato per il 20x4 NON è una ibreria Arduino, ma è codice 'C' con tanto di main.c, makefile, ecc. ecc.

Hai però tutti i sorgenti che servono per poter scrivere una libreria Arduno, quindi ... "olio di gomito", studiare tutti i sorgenti, capire quali sono le funzioni e scrivere la libreria per Arduino, oppure ...

... nel link al prodotto che hai messo (che NON avrei mai comprato dato che NON viene fornita la minima specifica tecnica utile), c'è una nota :

SPECIFICATION

1 i2C Interface
2 DC Support : 3.3v / 5v
3 Ultra small and bright (97x30x8 mm)

Available for Arduino UNO example download on packet

... quindi sembra che il venditore abbia un esempio d'uso per Arduino ... contatta il venditore e fattelo mandare!

Guglielmo

gpb01:
... quindi sembra che il venditore abbia un esempio d'uso per Arduino ... contatta il venditore e fattelo mandare!

Guglielmo

Grazie per la cortese risposta Sig. Guglielmo , in questi giorni ho fatto delle ricerche e dei passi avanti e sono riuscito tramite il codice allegato a visualizzare tutte e 4 le righe del display
La cosa che non rieco a capire e come posso utilizzare il codice come si fa normalmente con altri display , con i comandi seandstring e il posizionamento dei cursori

[code]
//***************************************//
// --- WIDE.HK---//
// --- Revised Date : 02/05/2014
// --- I2C Arduino - Arduino UNO Demo ---//
// --- SSD131x PMOLED Controller      ---//
// --- SCL, SDA, GND, VCC(3.3v -5v)   ---//
//***************************************//

#include <Wire.h>          // *** I2C Mode 
#define OLED_Address 0x3c
#define OLED_Command_Mode 0x80
#define OLED_Data_Mode 0x40

void setup()
{
  Wire.begin();
}

void loop()
{
int i;
// *** I2C initial *** //
delay(100);
sendCommand(0x80);
sendCommand(0x2A);  // **** Set "RE"=1  00101010B
sendCommand(0x71);
sendCommand(0xC0);
sendCommand(0x00);
sendCommand(0x28);

sendCommand(0x08);  // **** Set Sleep Mode On
sendCommand(0x2A);  // **** Set "RE"=1  00101010B
sendCommand(0x79);  // **** Set "SD"=1  01111001B

sendCommand(0xD5);
sendCommand(0x70);
sendCommand(0x78);  // **** Set "SD"=0

//sendCommand(0x08);
sendCommand(0x09);  // **** Set 5-dot, 3 or 4 line(0x09), 1 or 2 line(0x08)


sendCommand(0x06);  // **** Set Com31-->Com0  Seg0-->Seg99
sendCommand(0x72);
  sendCommand(0xC0);
   sendCommand(0x01);
// **** Set OLED Characterization *** //
sendCommand(0x2A);    // **** Set "RE"=1 
sendCommand(0x79);    // **** Set "SD"=1

// **** CGROM/CGRAM Management *** //
// sendCommand(0x72);   // **** Set ROM
// sendCommand(0x00);   // **** Set ROM A and 8 CGRAM

sendCommand(0xDC);    // **** Set ROM
sendCommand(0x00);    // **** Set ROM A and 8 CGRAM

sendCommand(0xDA);  // **** Set Seg Pins HW Config
sendCommand(0x10);   

sendCommand(0x81);    // **** Set Contrast
sendCommand(0xD9);    // 
  sendCommand(0x8F);    // **** Set Contrast

sendCommand(0xF1); 

sendCommand(0xDB);    // **** Set VCOM deselect level
sendCommand(0x30);    // **** VCC x 0.83

sendCommand(0xDC);    // **** Set gpio - turn EN for 15V generator on.
sendCommand(0x03);

sendCommand(0x78);    // **** Exiting Set OLED Characterization
sendCommand(0x28); 
//sendCommand(0x2A); 
//sendCommand(0x05);  // **** Set Entry Mode (invert)
sendCommand(0x06);  // **** Set Entry Mode

sendCommand(0x28);  // **** Set "IS"=0 , "RE" =0 //28
sendCommand(0x01); 
sendCommand(0x80);  // **** Set DDRAM Address to 0x80 (line 1 start)

delay(100);
sendCommand(0x0C);    // **** Turn on Display



// ********************************************************************//
// **** Show Data Value *** //

send_string("\0"); send_string("1 English - Term 6<>");   //1 ??line
send_string("\0"); send_string("2 English - Term 7<>");   //2 ??line
send_string("\0"); send_string("3 English - Term 8<>");   //3 ??line
send_string("\0"); send_string("4 English - Term 9<>");   //4 ??line

/*
sendCommand(0x2C); //2 in 1 line

*/
   
while(1);

// **** Show Data Value *** //

}


void sendData(unsigned char data)
{
    Wire.beginTransmission(OLED_Address);   // **** Start I2C 
    Wire.write(OLED_Data_Mode);         // **** Set OLED Data mode
    Wire.write(data);
    Wire.endTransmission();                     // **** End I2C 
}

void sendCommand(unsigned char command)
{
    Wire.beginTransmission(OLED_Address);    // **** Start I2C 
    Wire.write(OLED_Command_Mode);         // **** Set OLED Command mode
    Wire.write(command);
    Wire.endTransmission();                    // **** End I2C 
      delay(10);
}

void send_string(const char *String)
{
    unsigned char i=0;
    while(String[i])
    {
        sendData(String[i]);      // *** Show String to OLED
        i++;
    }
}

[/code]

Le risposte sono nel tuo secondo link ...
... c'è tutta la documentazione, il datasheet del controller, i comandi che esso usa e i driver già scritti in 'C' con i comandi che tu cerchi ... basta avere tempo e studiare "ssd13xx_20x4_oled.c" (... e magari anche gli altri sorgenti).

Il codice ho visto è ben scritto e commentato, quindi ... forza e coraggio :wink:

Guglielmo

gpb01:
Le risposte sono nel tuo secondo link ...
... c'è tutta la documentazione, il datasheet del controller, i comandi che esso usa e i driver già scritti in 'C' con i comandi che tu cerchi ... basta avere tempo e studiare "ssd13xx_20x4_oled.c" (... e magari anche gli altri sorgenti).

Il codice ho visto è ben scritto e commentato, quindi ... forza e coraggio :wink:

Guglielmo

Grazie ancora, non credo che ne sono capace visto che non ho nessuna nozione di programmazione, per fare dei semplici sketch ci sto giorni, non voglio immaginare quanto tempo metterò per fare una libreria, vedrò cosa posso fare grazie ancora per l'aiuto datomi gliene sono grato

tix88:
...vedrò cosa posso fare grazie ancora per l'aiuto datomi gliene sono grato

... si ma ... dammi del tu :slight_smile:

Guglielmo

P.S.: Beh, se ti studi i sorgenti vedi i vari comandi che tu hai come valori esadecimali a cosa corrispondono :wink:

gpb01:
... si ma ... dammi del tu :slight_smile:

Guglielmo

P.S.: Beh, se ti studi i sorgenti vedi i vari comandi che tu hai come valori esadecimali a cosa corrispondono :wink:

Ok
Ho letto i vari comandi e ho capito quale comando sposta il cursore dai commenti, quello che non capisco è come fa a capire a cosa corrisponde x e y, cioè come fa a sapere che il display è 20x4?

Problema risolto sono riuscito a stampare le 4 righe ...

Ottimo, visto che non era difficile come pensavi ? :slight_smile:

Guglielmo

Ho trovato in rete una libreria modificata per il 2004, tutto qua, non è farina del mio sacco ma va bene così.

Magari posta anche il link della libreria, così se a qualcun'altro capita la stessa cosa sa come hai risolto...

Basta fare una ricerca su l web e leggere i vari progetti sviluppati con questo display :wink:

tix88:
Basta fare una ricerca su l web e leggere i vari progetti sviluppati con questo display :wink:

Non mi pare che gli altri utenti ti abbiano risposto così... Non è molto in linea con lo spirito del forum, credo.
Comunque a me non serve usare questo display.

CrazyHorse80:
Non mi pare che gli altri utenti ti abbiano risposto così...

Si infatti un infinità di utenti ti dico, il problema è che siamo tutti pronti a chiedere ma nessuno è disposto a dare , solo il gentilissimo Guglielmo mi ha risposto infatti non finisco di ringraziarlo perchè mi ha aperto la mente dicendomi di leggere quel link , ma comunque questa è un'altra storia.
Ecco il link dove ho scaricato la libreria Making a custom 3D printer controller , c'è un file zip e all'interno ci sono i file oled.ccp e oled.h che servono al display , io ho avuto problemi all'inizio perchè non mi si accendeva il display ma ho risolto inizializzando il display in void setup con il comando "lcd.lcdOn();" e cosi sono riuscito a farlo funzionare , spero di essere d'aiuto a qualcuno come me che non ha le basi giuste per la programmazione con l'IDE .

Buona serata

Tiziano

Questo mi pare lo spirito giusto! Se poi altri sbagliano, non è una buona scusa per farlo anche tu. :wink:
Buona serata anche a te.
Pierangelo

Ho riscontrato un problema ambiguo allego lo sketch cosi da capirci
Praticamente dopo che inizializzo il tutto e vado a stampare i segmenti per creare le lettere succede una cosa strana, mi spiego per creare la lettera "C" ho bisogno dei segmenti 8/1/1 e 3/4/4 se metto
lcd.write ("8"); mi da un carattere vuoto, ma se al carattere che dovrebbe corrispondere al numero 8 gli cambio numero tipo 1 mi funziona normalmente, se lo rinomino con un altro numero tipo 9 mi da sempre un carattere vuoto , qualcuno ha idea del perchè?

[code]
#include <Wire.h>
#include <OLedI2C.h>
OLedI2C lcd;



byte LT[8] = 
{
  B00111,
  B01111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111
};
byte UB[8] =
{
  B11111,
  B11111,
  B11111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000
};
byte RT[8] =
{
  B11100,
  B11110,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111
};
byte LL[8] =
{
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B01111,
  B00111
};
byte LB[8] =
{
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111,
  B11111
};
byte LR[8] =
{
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11110,
  B11100
};
byte UMB[8] =
{
  B11111,
  B11111,
  B11111,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111
};
byte LMB[8] =
{
  B11111,
  B00000,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111,
  B11111
};



 
void setup() {
  Wire.begin();
  lcd.lcdOn();
  lcd.clear();  

  lcd.createChar(1,UB);
  lcd.createChar(2,RT);
  lcd.createChar(3,LL);
  lcd.createChar(4,LB);
  lcd.createChar(5,LR);
  lcd.createChar(6,UMB);
  lcd.createChar(7,LMB);
  lcd.createChar(8,LT);
{
  lcd.setCursor(0,0);
  lcd.write(8);
  lcd.write(1);
  lcd.write(1);
  lcd.setCursor(0,1);
  lcd.write(3);
  lcd.write(4);
  lcd.write(4);
}
}

 
void loop() { }

[/code]

ma i caratteri creati .... non vanno da 0 a 7? :smiley:

;D questo non lo sapevo. Grazie mille