0

0.96″ SPI OLED displej SSD1306

Zde si ukážeme, jak zprovoznit 0,96″ 128×64 SPI OLED displej s řadičem SSD1306 na Arduinu. SPI verze má oproti I2C výhodu v podstatně vyšší rychlosti a to hlavně při použití hardwarového SPI rozhraní Arduina. OLEDy mají obecně oproti LCD lepší obraz (kontrast, rychlost). Tato ukázka by měla fungovat na Arduinech s mikrořadiči AVR ATmega328 a podobnými – Arduino Uno, Nano….

Fotky zapojení jsou na konci článku. V kódu je popsané, co kam zapojit + pin VCC na displeji spojte s 5V nebo 3V3 na Arduinu (modul displeje má zabudovaný regulátor – pozor, datové piny nejsou regulovány na 3,3V a bylo by tedy lepší použít level shifter či 3,3V arduino) a spojte dohromady země (piny GND) na displeji a Arduinu.

Stažení a import knihovny bude probíhat stejně jako u I2C verze displeje. Knihovnu stáhneme odsud z GitHubu (Clone or download -> Download ZIP). Knihovnu po stažení importujeme Arduino IDE.  Import je jednoduchý: Sketch -> Include library -> Add .ZIP Library. Dále je potřeba stáhnout a importovat knihovnu Adafruit GFX.

Dále je potřeba upravit jeden soubor (Adafruit_SSD1306.h), aby sedělo rozlišení displeje, jinak se projekt nezkompiluje. Ten se nachází ve složce knihovny. Složka s knihovnami se na Linuxu nachází na cestě ~/Arduino/libraries, na Windows Documents/Arduino/libraries.

Tento blok kódu:

// #define SSD1306_128_64
 #define SSD1306_128_32
// #define SSD1306_96_16

je třeba zaměnit za:

 #define SSD1306_128_64
// #define SSD1306_128_32
// #define SSD1306_96_16

Ukázka kódu se SW SPI (tento kód zobrazí pár základních tvarů a poté animaci rotující čáry plus dobu na snímek v milisekundách:

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// zapojeni - cisla odpovidaji digitalnim pinum
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13 
// RESET muze zustat nezapojen, nektere modely ho ani nemaji
// VCC: 5V
// GND: GND

Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

uint8_t poz;
unsigned long oldms;

void setup() { 
 // Inicializace displeje
 display.begin(SSD1306_SWITCHCAPVCC); 

 display.clearDisplay();
 // potvrzeni zobrazeni
 display.display();
 
 // bod a cara
 display.drawLine(20, 10, 30, 20, WHITE); // X1, Y1, X2, Y2
 display.drawPixel(10, 10, WHITE);

 // obdelniky
 display.drawRect(40, 10, 10, 5, WHITE); // X, Y, velX, velY
 display.fillRect(60, 10, 10, 5, WHITE);

 // krouzky
 display.drawCircle(30,30,5,WHITE); // X, Y, polomer, barva
 display.fillCircle(50,30,5,WHITE);

 // text
 display.setTextSize(1);
 display.setTextColor(WHITE);
 display.setCursor(0,40);
 display.println("TEST SPI OLED!");

 display.display();

 // cekani a vymaz
 delay(5000);
 display.clearDisplay();
 display.display();
 
}


void loop() {
 // smycka
 display.clearDisplay();
 
 poz++;
 if (poz >= 192) poz = 0;

 if (poz < 128) display.drawLine(poz, 0, 128-poz, 63, WHITE);
 else display.drawLine(0, 192-poz, 127, poz-128, WHITE);

 display.setCursor(37,30);
 
 display.print(millis()-oldms);
 oldms = millis();
 
 display.print(" msec");
 
 display.display();
}

Ukázka kódu s HW SPI:

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// zapojeni - cisla odpovidaji digitalnim pinum 
#define OLED_DC 6
#define OLED_CS 7
#define OLED_RESET 8 // RESET muze zustat nezapojen, nektere modely ho ani nemaji
// MOSI: 11
// SCK: 13
// VCC: 5V
// GND: GND
Adafruit_SSD1306 display(OLED_DC, OLED_RESET, OLED_CS);
uint8_t poz;
unsigned long oldms;
void setup() { 
 // Inicializace displeje
 display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
 // potvrzeni zobrazeni
 display.display();
 
 // bod a cara
 display.drawLine(20, 10, 30, 20, WHITE); // X1, Y1, X2, Y2
 display.drawPixel(10, 10, WHITE);
// obdelniky
 display.drawRect(40, 10, 10, 5, WHITE); // X, Y, velX, velY
 display.fillRect(60, 10, 10, 5, WHITE);
// krouzky
 display.drawCircle(30,30,5,WHITE); // X, Y, polomer, barva
 display.fillCircle(50,30,5,WHITE);
// text
 display.setTextSize(1);
 display.setTextColor(WHITE);
 display.setCursor(0,40);
 display.println("TEST SPI OLED!");
display.display();
// cekani a vymaz
 delay(5000);
 display.clearDisplay();
 display.display();
 
}
void loop() {
 // smycka
 display.clearDisplay();
 
 poz++;
 if (poz >= 192) poz = 0;
if (poz < 128) display.drawLine(poz, 0, 128-poz, 63, WHITE);
 else display.drawLine(0, 192-poz, 127, poz-128, WHITE);
display.setCursor(37,30);
 
 display.print(millis()-oldms);
 oldms = millis();
 
 display.print(" msec");
 
 display.display();
}

Fotka se softwarovým SPI (doba na snímek cca 27 ms – 37 FPS):

IMG_20170906_105601

Fotka s HW SPI (doba na snímek cca 5 ms – 200 FPS):

IMG_20170906_111112

Tento displej, Arduino a moduly k Arduinu můžete koupit zde (PostavRobota.cz). Pro displej existují i další knihovny, například U8glib.

 

Arduino Uno, Mega, Senzory, Moduly za

VÝHODNOU CENU

Saksun

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *