Cod Arduino și Video pentru Display OLED SSD1306 128 x 32 cu I2C
În acest tutorial, vom explora cum să folosim afișajul OLED SSD1306 128 x 32 cu comunicare I2C pe un Arduino. Scopul este de a afișa diverse elemente, cum ar fi text, dreptunghiuri și valori dinamice precum tensiunea și temperatura pe ecran. Această configurație este ideală pentru proiecte care necesită o soluție de afișare compactă și eficientă.

Vom parcurge componentele hardware necesare, instrucțiunile de cablare și codul Arduino pentru a pune totul în funcțiune. Pentru un ghid vizual, asigurați-vă că urmăriți videoclipul care însoțește acest tutorial (în videoclip la 00:00).
Hardware Explicat
Componentele cheie pentru acest proiect includ afișajul OLED SSD1306, care este un afișaj cu consum redus de energie și utilizează comunicarea I2C pentru o interfațare ușoară. Afișajul are o rezoluție de 128 x 32 pixeli, fiind potrivit pentru afișarea textului și a graficelor simple.
Pentru a controla afișajul, vom folosi placa Arduino, care va trimite comenzi și date prin I2C. Arduino gestionează logica de afișare a informațiilor folosind biblioteci precum Adafruit_GFX și Adafruit_SSD1306. Aceste biblioteci simplifică procesul de comunicare și permit desenarea ușoară a formelor și textului.
Detalii din Fișa Tehnică
| Producător | Adafruit |
|---|---|
| Număr de piesă | SSD1306 |
| Tensiune logică/IO | 3.3 - 5 V |
| Tensiune de alimentare | 3.3 - 5 V |
| Consum de curent | ~20 mA (tipic) |
| Rezoluție afișaj | 128 x 32 pixeli |
| Interfață | I2C |
| Dimensiuni | 128 x 32 mm |
| Note / variante | Disponibil în diverse dimensiuni și interfețe |
- Verificați adresa I2C, de obicei 0x3C pentru OLED-uri.
- Asigurați o alimentare corectă pentru a evita deteriorarea.
- Folosiți rezistențe de pull-up pentru liniile SDA și SCL dacă este necesar.
- Păstrați cablurile scurte pentru a reduce zgomotul în semnalul I2C.
- Luați în considerare disiparea căldurii dacă alimentați mai multe module.
Instrucțiuni de Cablare

Pentru a cabla afișajul OLED SSD1306, conectați mai întâi pinul VCC al afișajului la ieșirea de 5V de pe Arduino. Apoi, conectați pinul GND la unul dintre pinii de masă ai Arduino. Pentru comunicarea I2C, conectați pinul SDA al afișajului la pinul SDA de pe Arduino, care este A4 pentru UNO. Apoi, conectați pinul SCL al afișajului la pinul SCL de pe Arduino, care este A5 pentru UNO. Dacă folosiți un alt model de Arduino, consultați maparea specifică a pinilor pentru SDA și SCL.
Pentru componente suplimentare, dacă aveți un LED pe care doriți să îl controlați, conectați-l la pinul 9 printr-un rezistor de 330 ohmi. Asigurați-vă că conectați celălalt capăt al rezistorului la anodul LED-ului, în timp ce catodul ar trebui să meargă la masă. Această configurație va permite LED-ului să se aprindă atunci când pinul 9 este activat.
Exemple de Cod și Explicații
În codul Arduino, începem prin includerea bibliotecilor necesare pentru afișajul OLED. Un identificator cheie este display, care este o instanță a clasei Adafruit_SSD1306. Afișajul este inițializat în funcția setup(), unde de asemenea curățăm afișajul pentru a ne pregăti de desenare.

void setup() {
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
delay(2000);
display.clearDisplay();
}
În funcția loop(), definim o variabilă string vString pentru a stoca valoarea tensiunii, care este actualizată dinamic. Funcția robojaxText() este folosită pentru a afișa text pe ecran la coordonate specificate.
void loop() {
String vString = String(count, 3);
display.clearDisplay();
robojaxText("Voltage: ", 4, 3, 1, false);
robojaxText(vString, 72, 3, 1, false);
display.display();
count += 0.173;
delay(2000);
}
Funcția robojaxText() este crucială pentru poziționarea și afișarea textului. Aceasta primește parametri pentru șirul de text, coordonatele x și y, dimensiunea textului și un boolean pentru a determina dacă afișajul ar trebui actualizat imediat.
void robojaxText(String text, int x, int y, int size, boolean d) {
display.setTextSize(size);
display.setTextColor(WHITE);
display.setCursor(x, y);
display.println(text);
if(d) {
display.display();
}
}
Această funcție setează dimensiunea textului, culoarea și poziția cursorului înainte de a imprima textul. Nu uitați să urmăriți videoclipul pentru o explicație completă a codului (în videoclip la 10:00).
Demonstrație / Ce să Vă Așteptați
Când codul este încărcat pe Arduino, afișajul OLED ar trebui să arate tensiunea, temperatura și valorile capacității actualizându-se dinamic la fiecare două secunde. Ar trebui să vedeți, de asemenea, un dreptunghi desenat în jurul elementelor de text. Dacă afișajul nu arată nimic, asigurați-vă că conexiunile sunt corecte și că adresa I2C corespunde celei specificate în cod.
Marcaje Temporale din Videoclip
- 00:00 - Introducere în proiect
- 02:00 - Instrucțiuni de cablare
- 05:00 - Explicația codului
- 10:00 - Demonstrația rezultatului
/*********************************************************************
This is an example for our monochrome OLEDs based on SSD1306 drivers.
This example is for a 128x32 size display using I2C.
If you get the error: Adafruit_GFX.h not found, download the Adafruit-GFX Library
https://github.com/adafruit/Adafruit-GFX-Library
Purchase this OLED module from Amazon: https://amzn.to/36zFvTb
Written by Limor Fried/Ladyada for Adafruit Industries.
BSD license, check license.txt for more information.
All text above, and the splash screen must be included in any redistribution.
* Watch the video for this code to learn it fully.
* Watch the video here: https://youtu.be/RjyulqVsz2o
* This code is offered "as is" without any warranty.
* Updated by Ahmad Shamshiri for Robojax.com video tutorial
* on March 18, 2018 at 10:21 in Ajax, Ontario, Canada.
* Please view other Robojax codes and videos at http://robojax.com/learn/arduino
* If you are sharing this code, you must keep this copyright note.
*
*********************************************************************/
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
double count=0;
/*
* PIN connection:
* Pin connection see: https://www.arduino.cc/en/Reference/Wire
* for UNO: SDA to A4, SCL to A5
* for Mega2560: SDA to 20, SCL to 21
* for Leonardo: SDA to 2, SCL to 3
* for Due: SDA to 20, SCL to 21
* VCC to 5V
* GND to GND :-)
*/
// this is the Width and Height of Display which is 128 x 32
#define LOGO16_GLCD_HEIGHT 32
#define LOGO16_GLCD_WIDTH 128
#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
void setup() {
Serial.begin(9600);
// by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x32)
display.display();
delay(2000);
// Clear the buffer.
display.clearDisplay();
}
void loop() {
String vString = String(count, 3);// using a float and the
display.clearDisplay();
robojaxText("Voltage: ", 4, 3, 1, false);
robojaxText(vString, 72, 3, 1, false);
robojaxText("V", 110, 3, 1, false);
robojaxText("Temperature: 32C", 4, 11, 1, false);
robojaxText("Capacity: 92.86L", 4, 21, 1, false);
//display.drawLine(1, 37, 100, 37, WHITE);
display.drawRect(1, 1, 126,31, WHITE);
//display.drawCircle(63,31, 31, WHITE);
//display.startscrollright(0x00, 0x0F);
display.display();
count +=0.173;
delay(2000);
}
/*
* robojaxText(String text, int x, int y,int size, boolean d)
* text is the text string to be printed
* x is the integer x position of text
* y is the integer y position of text
* size is the text size, 1, 2, 3 etc
* d is either true or false. If true, the display is updated.
*/
void robojaxText(String text, int x, int y,int size, boolean d) {
display.setTextSize(size);
display.setTextColor(WHITE);
display.setCursor(x,y);
display.println(text);
if(d){
display.display();
}
//delay(100);
}
Lucruri de care ai putea avea nevoie
-
AmazonPurchase OLED 128x32 from Amazonamzn.to
-
AliExpressPurchase SSD1306 OLED 128x32 from AliExpresss.click.aliexpress.com
Resurse și referințe
-
ExternAdafruit-GFX library (from GitHub)github.com
-
ExternSSD1306 library (from GitHub)github.com
Fișiere📁
Fișă tehnică (pdf)
-
SSD1306 display datasheetSSD1306 is a single-chip CMOS OLED/PLED driver with controller for organic / polymer light emitting diode dot-matrix graphic display system. It consists of 128 segments and 64commons. This IC is designed for Common Cathode type OLED panel. The SSD1306 embeds with contrast control, display RAM and oscillator, which reduces the number of external components and power consumption. It has 256-step brightness control. Data/Commands are sent from general MCU through the hardware selectable 6800/8000 series compatible Parallel Interface, I2C interface or Serial Peripheral Interface. It is suitable for many compact portable applications, such as mobile phone sub-display, MP3 player and calculator, etc.
SSD1306_display_datasheet.pdf1.79 MB
Fișier Fritzing
-
SSD1306 128x32 OLED WiringFritzing wiring diagram for an SSD1306 128x32 OLED display, showing connections to a microcontroller (likely Arduino). Useful for breadboard prototyping and verifying I2C or SPI wiring.
SSD1306_128x32_wiring.fzz
Wiring diagram
-
SSD1306 128x32 OLED WiringFritzing wiring diagram for an SSD1306 128x32 OLED display, showing connections to a microcontroller (likely Arduino). Useful for breadboard prototyping and verifying I2C or SPI wiring.
SSD1306_128x32_wiring.fzz