Het eerste display dat ik gebruik heb is de WeMos D1 mini OLED sshield 64x48 van 0,66inch met een I2C interface. Het shield heeft veel meer pinnen omdat het ook anders aangestuurd kan worden maar we gebruiken natuurlijk graag I2C omdat het maar twee I/O lijntjes kost. Met grootte van 0,66inch is het een behoorlijk klein display maar is het heel duidelijk af te lezen omdat het een hoog contrast heeft. Het maakt gebruik van de SSD1306 als interface chip en maakt gebruik van het I2C adres 0x3C of 0x3D wat te selecteren is door een soldeerbrug op de achterzijde van het printje. Wel erg klein dus ik waag me er niet aan en laat ze op de standaard waarde staan. De spanning is 3,3V maar de I2C pinnen zijn zonder aanpassing aan te sluiten op de 5V Arduino. Wel moet het shield zelf uit de 3v3 aansluiting van de Arduino gevoed worden. Het ding werd geleverd met losse headerpins en aangezien u toch maar 4 aansluitingen nodig heeft kunt u ook rechtstreeks de draadjes aan de print solderen. Het voor deel van dit display is dat het door de 64x48 pixel size niet zoveel geheugen van de Arduino gebruikt als schaduwgeheugen.
Link: Website van de leverancier.
Het tweede display dat ik gebruikt heb is een vrij standaard verkrijgbaar OLED display met witte pixels, een resolutie van 128x64 en een aansturing door middel van I2C en het SSD1306 driver IC. Ook dit shield heeft dus maar twee datalijnen nodig en het verbruikt minimaal stroom zodat het ook goed te gebruiken is in projecten die uit een accu of batterij gevoeld moeten worden. De afmeting van dit scherm is iets grote dan de voorgaande en is 26,0 x 15,0 mm. De module werkt op 3v3 en kan uit de 3v3 uitgang van de Arduino gevoed worden, waarbij de I2C lijnen gewoon op de 5V Arduino pinnen aangesloten kunnen worden. Het I2C adres van dit OLED shield is standaard 0x3C. Het scherm is heel duidelijk afleesbaar door een zeer hoog contrast. Doordat het gebruik maakt van 128x64 pixels bent u bij de Arduino wel ruim 1 Kb aan kostbare sram kwijt voor dit display.
De SSD1306 is een single-chip CMOS OLED/PLED driver met controller voor displays met een maximom resolutie van 128 x 64. Het IC bevat een display controller met display RAM en een ingebouwde oscillator zodat het met minimale externe componenten gebruik kan worden. Het heeft een ingebouwde 256 stappen brightness control. Het heeft een 6800/8000 series compatible Parallel Interface, I2C interface of een Serial Peripheral Interface.
Link: Datasheet van de SSD1306 controller.
Link: Website van de leverancier SSD1306 controller.
Hoewel er op Internet op diverse plekken staat dat je de displays ook op de 5V uitgang kunt aansluiten houd ik me liever aan de specicficaties en als er 3v3 beschikbaar is op de Arduino sluit ik de vcc van de display's hier op aan.
Display | Arduino |
---|---|
Vcc | 3v3 |
Gnd | Gnd |
Scl | A5 (SCL) |
Sda | A4 (SDA) |
Display | Arduino |
---|---|
Vcc | 3v3 |
Gnd | Gnd |
D1 | A5 (SCL) |
D2 | A4 (SDA) |
Download eerste: HIER mijn library voor de Arduino en installeer deze via de IDE in uw Arduino omgeving. Herstart de IDE en kijk bij de voorbeelden en zie daar "oledtest128.ino" en de "oledtest64.ino" staan. De library werkt voor beide boards, Wanneer u geheugen wilt besparen bij gebruik van de 64x48 display kunt u het buffer verkleinben door in de libraries map en in de map SSD1306 het bestand SSD1306.cpp aan te passen, verander de defines aan naar 64 en 48 en compileer daarna de schets opnieuw. Ik gebruik deze library ook zonder enige aanpassing voor het Wemos D1 mini board waar standaard de 64x48 OLED display module opgeprikt kan worden. Ook hier kunt u de "oledtest64.ino" sketch zonder enige aanpassing compileren en naar uw Wemos D1 mini board uploaden.
De code van deze libray is compact en bevat alleen een aantal basis functies:
public:
Ssd1306(uint8_t i2caddr,uint8_t width,uint8_t height,uint8_t orientation);
void begin(void);
void oledSetPixel(int16_t x, int16_t y, uint16_t color);
void oledDrawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color);
void oledDrawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
void oledFillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
void oledDrawCircle(int16_t x0, int16_t y0, int16_t r,uint16_t color);
void oledDrawChar(int16_t x, int16_t y, unsigned char c, uint16_t color);
void oledPrintLine(int16_t x, int16_t y, unsigned char *c, uint16_t color);
void oledPrintLineP(int16_t x, int16_t y, unsigned char *c, uint16_t color);
void oledInvert(void);
void oledNormal(void);
void oledCopyDisplayBuffer(void);
void oledClearDisplayBuffer(uint8_t value);
Let op!Er is ook een 1.3" oled display dat I2C aangestuurd kan worden door een Arduino maar blijkbaar zit er de 1.3" oled display versie een SH1106 controller in plaats van de SSD1306 die op de 0.96" oled displays zit. Mijn code werkt alleen met de SSD1306 controller.