KKM: I2C OLED 128x32

Početnik si s Croduinom. Ili s elektronikom? Za oko ti je zapeo određeni modul, ali ne znaš kako ga koristiti? Bez brige, tu je KKM! Kako Koristiti Module (KKM) je serija blog tutorijala e-radionice na kojoj ćeš pronaći sve što ti treba kako bi započeo rad sa svojim omiljenim modulom. Tutorijali obuhvaćaju: tehničke karakteristike, princip rada, upute kako povezati modul s Croduinom te osnovni kod. Sve ostalo prepuštamo tebi na maštu.

UVOD

U ovom tutorijalu ćemo se upoznati s jednim vrlo malim ali zanimljivim modulom koji primjenu nalazi u svim projektima gdje je potrebno prikazati neke podatke sa senzora. Radi se o OLED displeju veličine 0.91“ što ga čini lako primjenjivim u svim projektima jer ne zauzima puno mjesta, a daje odličan kontrast zbog drukčijeg načina rada od LCD displeja. Da ne dužimo s uvodom idemo se kratko upoznati s načinom rada displeja i nekim osnovnim funkcijama za ispis teksta, iako displej može prikazivati i neke jednostavnije grafičke oblike.
 
Karakteristike modula:
• Napon: 3.3V ili 5 V
• Potrošnja: 20 mA (ovisi o broju upaljenih pixela)
• Komunikacija: I2C
• Boja pixela: Bijela
• Veličina displeja: 0.91“
• Dimenzije modula: 38 mm x 12 mm * 4 mm (bez konektora za spajanje)
 

KAKO RADI?

Displej se sastoji od 128*32 individualnih pixela koji su upravljani sa SSD1306 kontrolerom koji pali ili gasi svaki pixel ovisno kako smo mu zadali. Kako imamo pixele koji se pale ili gase oni nam daju osvjetljenje i displej ne treba pozadinsko osvjetljenje kao kod LCD displeja, te je zbog toga potrošnja OLED displeja puno manja nego kod LCD. IZ istog razloga je i kontrast puno bolji te se s displeja iako je malih dimenzija jasno mogu pročitati i sitniji znakovi. Kontroler SSD1306 podatke može primati na 3 načina ovisno kako spojimo pinove koji kontroliraju način komunikacije, te tako možemo imati 8-bitnu paralelnu komunikaciju, SPI ili I2C komunikaciju, a u našem slučaju je odabrana I2C komunikacija.
Za napajanje kontrolera se koristi napon od 3.3 V te je zbog toga na pločicu ugrađen regulator napona. Kontroler također može od napona s kojim se napaja napraviti napon (7-9 V) koji je potreban za napajanje samog displeja odnosno pixela. Kako je naš modul izveden tako da se napaja s 5-3.3V naponom onda moramo u programu kontroleru reći da treba napraviti veći napon za rad displeja.

KAKO POVEZATI?

Modul je vrlo jednostavno povezati jer koristi I2C komunikaciju što nam zahtjeva samo 2 pina sa Croduina koja treba povezati. Na pin A4 povezujemo SDA pin modula, a na pin A5 sa Croduina SCL pin s modula. Potrebno nam je još spojiti napajanje sa Croduina na modul i spremni smo za rad.Kao što smo pod karakteristikama naveli modul može raditi na 5 V ili na 3.3 V pa je svejedno koji napon mu dovedemo jer u sebi ima ugrađen naponski konverter. Ako nije jasno kako spojiti uređaj dana je i shema spajanja na kojoj je spojen i senzor temperature i vlage DHT11 s kojeg ćemo ispisivati vrijednosti na displej.
 

ARDUINO KOD

Kako bi OLED displej mogli koristiti sa Croduinom potrebno je instalirati biblioteku Adafruit_SSD1306 za rad s OLED displejom koja sadrži sve funkcije koje koristimo u primjerima. Ako ne znate kako instalirati biblioteku pogledajte tutorijal u kojem je sve detaljno objašnjeno.
U prvom primjeru ćemo očitavati podatke sa DHT11 senzora i ispisivati ih na displej( za senzor je također potrebna biblioteka).
 

#include <Wire.h> //uključujemo wire biblioteku koja nam omogućuje I2C komunikaciju 
#include <Adafruit_SSD1306.h> //uključujemo biblioteku za rad s OLED displejom
#include "DHT.h" //uključujemo biblioteku za DHT senzor temperature i vlage

#define SCREEN_WIDTH 128 //definiramo širinu displeja, u pixelima
#define SCREEN_HEIGHT 32 //definiramo visinu displeja, u pixelima
#define DHTPIN 10 // definiramo pin na koji je spojen data pin s DHT senzora
#define DHTTYPE DHT11 //definiramo tip DHT senzora(DHT11 ili DHT22

//Konstruktor za našu biblioteku za OLED displej,kako bi imali pristup funkcijama koje upravljanju displejom
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
//Konstruktor za DHT senzor
DHT dht(DHTPIN, DHTTYPE);

void setup() {
 Serial.begin(9600);//Inicijalizacija serijske komunikacije( brzina 9600 bauda)
 dht.begin();////Inicijalizacija biblioteke za DHT senzor
 //Inicijalizacija biblioteke za OLED displej
 // SSD1306_SWITCHCAPVCC = generira napon za displej(7-9 V) od 3.3V napona koji ima s regulatora napona
 if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Adresa 0x3C za 128x32 displej
 //ako inicijalizacija nije uspjela na Serial monitoru dobijemo poruku o grešci
 Serial.println(F("SSD1306 allocation failed"));
 for(;;); //beskonačna petlja ako inicijalizacija nije uspjela kako program ne bi nastavio izvođenje
 }
}
void loop() {
 float temperatura=dht.readTemperature();//u varijablu temperatura spremamo temperaturu sa DHT11 senzora
 float vlaga=dht.readHumidity();// u varijablu vlaga spremamo vlagu zraka sa DHT11 senzora
 display.clearDisplay();//funkcija za brisanje svega s displeja
 display.setTextSize(1);//funkcija za postavljanje veličine teksta 
 display.setTextColor(WHITE);//funkcija za postavljanje boje slova(naš displej može samo jednu boju) 
 display.setCursor(0,0);//funkcija za postavljanje kursora (0-128,0-32)na displeju gdje želimo početi s ispisom teksta 
 display.print("Temp: ");//funkcija za ispis teksta koji joj predamo
 display.print(temperatura);//ispisuje temperaturu
 display.print(" *C");//ispisujemo razmak i *C kako bi znali da je temp u stupnjevima Celzijevim
 display.setCursor(0,10);// postavljamo kursor u novi red i ispisujemo podatke za vlagu
 display.print("Vlaga: ");
 display.print(vlaga);
 display.println(" %");
 display.display();//prikazujemo sav tekst na displeju koji smo prethodno poslali u buffer displeja
 delay(1000);// pauza od 1 sekunde kako se vrijednosti ne bi stalno mijenjale
 }

 
Drugi primjer nam pokazuje kako na displeju možemo nacrtati razne slike, naravno ako nisu prevelike i previše komplicirane. Za crtanje po displeju potrebno je preuzeti Adafruit_GFX biblioteku koja u sebi sadrži razne funkcije za iscrtavanje(pravokutnici, krugovi, elipse, linije) kao i funkciju za iscrtavanje bitmapa. Kako bi od slike dobili bitmap trebamo sliku spremiti u png ii jpg formatu. Pomoću online konvertera dobijemo bitmap koji kopiramo u Croduino kod i možemo iscrtati naš oblik.
 

#include <Wire.h> //uključujemo wire biblioteku koja nam omogućuje I2C komunikaciju 
#include <Adafruit_SSD1306.h> //uključujemo biblioteku za rad s OLED displejom
#include <Adafruit_GFX.h> //uključujemo Adafruit GFX biblioteku koja ima sve funkcije za crtanje raznih oblika 

#define SCREEN_WIDTH 128 //definiramo širinu displeja, u pixelima
#define SCREEN_HEIGHT 32 //definiramo visinu displeja, u pixelima
//Konstruktor za našu biblioteku za OLED displej,kako bi imali pristup funkcijama koje upravljanju displejom
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);

#define LOGO_HEIGHT 32//visina slike koju želimo prikazati(u pixelima)
#define LOGO_WIDTH 32//širina slike koju želimo prikazati(u pixelima)
//bitmap slike koju prikazujemo na displeju
static const uint8_t logo_bmp[] PROGMEM = {
 B00000000, B00000000, B00000000, B00000000, 
 B00000000, B00000001, B10000000, B00000000, 
 B00000000, B00001111, B11100000, B00000000, 
 B00000000, B00111111, B11111100, B00000000, 
 B00000000, B11111111, B11111110, B00000000, 
 B00000001, B11111111, B11111111, B10000000, 
 B00000111, B11111110, B01111111, B11100000, 
 B00011111, B11100000, B00000111, B11111000, 
 B01111111, B11001111, B11111001, B11111110, 
 B01111111, B00111111, B11111100, B11111110, 
 B01111110, B01111111, B11111111, B01111110, 
 B01111110, B11111111, B11111111, B10111110, 
 B01111100, B11110000, B00011111, B10011110, 
 B01111101, B11011101, B01000001, B11011110, 
 B01111101, B10111111, B01011111, B11011110, 
 B01111000, B10100011, B11011111, B11011110, 
 B01111111, B10111111, B11000011, B11011110, 
 B01111111, B10011101, B01011111, B11011110, 
 B01111111, B11001011, B01000001, B11011110, 
 B01111100, B11110000, B00011111, B10011110, 
 B01111110, B11111111, B11111111, B10111110, 
 B01111110, B01111111, B11111111, B01111110, 
 B01111111, B00111111, B11111110, B01111110, 
 B01111111, B11001111, B11111001, B11111110, 
 B00111111, B11100000, B00000111, B11111100, 
 B00001111, B11111110, B01111111, B11110000, 
 B00000011, B11111111, B11111111, B11000000, 
 B00000000, B11111111, B11111111, B00000000, 
 B00000000, B00111111, B11111100, B00000000, 
 B00000000, B00001111, B11110000, B00000000, 
 B00000000, B00000011, B11000000, B00000000, 
 B00000000, B00000000, B00000000, B00000000, 
};
void setup() {
 Serial.begin(9600);//Inicijalizacija serijske komunikacije( brzina 9600 bauda)
 //Inicijalizacija biblioteke za OLED displej
 // SSD1306_SWITCHCAPVCC = generira napon za displej(7-9 V) od 3.3V napona koji ima s regulatora napona
 if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Adresa 0x3C za 128x32 displej
 //ako inicijalizacija nije uspjela na Serial monitoru dobijemo poruku o grešci
 Serial.println(F("SSD1306 allocation failed"));
 for(;;); //beskonačna petlja ako inicijalizacija nije uspjela kako program ne bi nastavio izvođenje
 }
}

//prikazuje se Adafruit logo koji biblioteka prosljeđuje displeju jer mi nismo ništa spremili u buffer 
 display.display();
 delay(2000); //pauza 2 sekunde
 //funkcija za brisanje svega s displeja
 display.clearDisplay();
 // Upalimo jedan pixel (x,y, boja)
 display.drawPixel(10, 20, WHITE);
 display.display();//funkcija za iscrtavanje onoga što je spremljeno u buffer
 delay(2000);//pauza 2 sekunde
 
 dIscrtaj_sliku(); //Iscrtavamo našu bitmap sliku pozivom funkcije Iscrtaj_sliku(slika se prikazuje 1 sekunde jer u funkciji imamo pauzu od 1 sekunde)

 // Invertiramo sliku na displeju, napravimo pauzu 1 s i vratimo sliku kako je bila, i onda opet zaustavimo program na 1 sekundu
 display.invertDisplay(true);
 delay(1000);
 display.invertDisplay(false);
 delay(1000);
}
//slika će ostati stalno na displeju zato što smo ju zadnju nacrtali, a nismo ništa novo poslali za crtanje, u loop-u nema koda
void loop() {
}

// funkcija za crtanje bitmap slike
void Iscrtaj_sliku(void) {
 display.clearDisplay();// očistimo displej
 //pozivamo funkciju za crtanje drawBitmap sa sljedećim parametrima(x koordinata za početak crtanja,
 // y koordinata za početak crtanja, varijabla u kojoj je spremljen bitmap slike, širina slike, visina slike)
 display.drawBitmap(
 (display.width() - LOGO_WIDTH ) / 2,
 (display.height() - LOGO_HEIGHT) / 2,
 logo_bmp, LOGO_WIDTH, LOGO_HEIGHT, 1);
 display.display();//prikazujemo sliku na displeju 
 delay(1000);//pauza od 1 sekunde
}
Leave a Reply