# Modul cu ecran OLED 0.96 inch si encoder rotativ EC11

> Modul cu display OLED 0.96 inch (driver SSD1306) si encoder rotativ EC11, cu interfata de comunicare I2C. Tensiune de operare 3.3-5V, dimensiuni 56 x 97mm. Include butoane dedicate CONFIRM si RETURN pentru control si feedback vizual. Potrivit pentru interfete HMI, panouri de control si proiecte DIY, se poate conecta la Arduino si placi similare. Referinta 88126.

- Pagina: https://sigmanortec.ro/modul-cu-ecran-oled-de-096-inch-si-encoder-rotativ-ec11
- Pret: 39.98 RON
- Disponibilitate: In stoc; 1-2 zile
- Cod: 88126 · EAN: 5947357466026
- Categorie: Mecatronica si IoT > Senzori si Module > Display si LCD > Display-uri OLED
- Colet (date de livrare): 0.027 kg
- Actualizat: 2026-09-14
- Magazin: [Sigmanortec.ro](https://sigmanortec.ro/llms.txt)
- Preturi: RON, TVA inclus; preturi si stoc la data de 2026-09-23 13:21 (Europe/Bucharest)

## Descriere

Solutie compacta pentru interfete HMI si proiecte DIY, combina un OLED 0.96 inch cu contrast ridicat si un encoder rotativ EC11 pentru navigare precisa in meniuri si reglaje. Comunicarea I2C reduce cablajul si permite integrare rapida cu Arduino si placi similare. Include apasare pe encoder si butoane de confirmare si revenire pentru control clar si feedback vizual imediat.
Acest modul combina un display OLED de 0.96 inch cu un encoder rotativ EC11, fiind o solutie compacta pentru realizarea rapida a unei interfete de utilizator.
Conectarea OLED-ului prin I2C permite integrare usoara cu Arduino si alte placi de dezvoltare, cu un numar redus de fire. Display-ul OLED asigura contrast ridicat si lizibilitate foarte buna, iar encoderul rotativ ofera control precis pentru navigare in meniuri, selectii si reglarea parametrilor.
Modulul include si butoane dedicate pentru confirmare si revenire, ceea ce il face potrivit pentru panouri de control, interfete HMI simple si proiecte DIY unde ai nevoie de comenzi clare si feedback vizual imediat.
Specificatii:
Tensiune de operare: 3.3-5V
Tip display: OLED
Driver OLED: SSD1306
Dimensiune ecran: 0.96 inch
Tip control: encoder rotativ EC11
Interfata de comunicare: I2C
Dimensiuni: 56 x 97mm
Pinout:
Pin
Functie
CON
Buton CONFIRM
SDA
Linie date I2C pentru OLED
SCK
Linie ceas I2C pentru OLED
PSH
Apasare encoder EC11
TRA
Semnal A encoder EC11
TRB
Semnal B encoder EC11
BAK
Buton RETURN
GND
Masa
VCC
Alimentare
Utilizare:
Conectati modulul la placa Arduino respectand pinout-ului si alimentati conform specificatiilor.
Programarea OLED-ului se face ca pentru oricare alt OLED 0.96.
Conectare:
Pin modul
Arduino UNO
Rol
GND
Masa comuna
VCC
3.3V
Alimentare modul
SCL
A5
I2C clock
SDA
A4
I2C data
TRA
D2
Encoder canal A recomandat pe intrerupere
TRB
D3
Encoder canal B recomandat pe intrerupere
PSH
D4
Apasare encoder select
CON
D5
Buton CONFIRM optional
BAK
D6
Buton RETURN optional
Cod Test Arduino UNO:
\#include <Wire.h>
\#include <Adafruit_GFX.h>
\#include <Adafruit_SSD1306.h>
\#define OLED_ADDR 0x3C
\#define OLED_W 128
\#define OLED_H 64
Adafruit_SSD1306 display(OLED_W, OLED_H, &Wire)
\#define ENC_A 2
\#define ENC_B 3
\#define ENC_SW 4
\#define BTN_CON 5
\#define BTN_BAK 6
volatile int8_t encDelta = 0
volatile uint8_t lastA = 0
unsigned long tSw = 0
unsigned long tCon = 0
unsigned long tBak = 0
const unsigned long debounceMs = 180
const char* menuItems[] = {
"Status",
"Setari",
"Calibrare",
"Info",
"Reset"
}
const uint8_t menuCount = sizeof(menuItems) / sizeof(menuItems[0])
int menuIndex = 0
int page = 0
int setViteza = 10
int setPrag = 50
void isrEncA() {
uint8_t a = digitalRead(ENC_A)
if (a == lastA) return
lastA = a
uint8_t b = digitalRead(ENC_B)
if (b != a) encDelta++
else encDelta--
}
bool pressed(int pin, unsigned long &tLast) {
if (digitalRead(pin) == LOW) {
unsigned long now = millis()
if (now - tLast > debounceMs) {
tLast = now
return true
}
return false
}
void drawHeader(const char* title) {
display.clearDisplay()
display.setTextSize(1)
display.setTextColor(WHITE)
display.setCursor(0, 0)
display.print(title)
display.drawLine(0, 10, 127, 10, WHITE)
}
void drawMenu() {
drawHeader("Sigmanortec")
int y = 14
for (uint8_t i = 0; i < menuCount; i++) {
if (i == menuIndex) {
display.fillRect(0, y - 1, 128, 10, WHITE)
display.setTextColor(BLACK)
} else {
display.setTextColor(WHITE)
}
display.setCursor(2, y)
display.print(menuItems[i])
y += 11
}
display.setTextColor(WHITE)
display.setCursor(0, 56)
display.print("Rotire: meniu OK: select BAK: inapoi")
display.display()
}
void drawStatus() {
drawHeader("Status")
display.setCursor(0, 16)
display.print("Encoder: OK")
display.setCursor(0, 28)
display.print("Viteza: ")
display.print(setViteza)
display.setCursor(0, 40)
display.print("Prag: ")
display.print(setPrag)
display.setCursor(0, 56)
display.print("BAK: inapoi")
display.display()
}
void drawSetari() {
drawHeader("Setari")
display.setCursor(0, 16)
display.print("Viteza: ")
display.print(setViteza)
display.setCursor(0, 28)
display.print("Prag: ")
display.print(setPrag)
display.setCursor(0, 44)
display.print("Rotire: ajustare")
display.setCursor(0, 56)
display.print("OK: comuta BAK: inapoi")
display.display()
}
void drawInfo() {
drawHeader("Info")
display.setCursor(0, 16)
display.print("OLED SSD1306 I2C")
display.setCursor(0, 28)
display.print("Encoder EC11")
display.setCursor(0, 40)
display.print("Meniu: Sigmanortec")
display.setCursor(0, 56)
display.print("BAK: inapoi")
display.display()
}
void setup() {
pinMode(ENC_A, INPUT_PULLUP)
pinMode(ENC_B, INPUT_PULLUP)
pinMode(ENC_SW, INPUT_PULLUP)
pinMode(BTN_CON, INPUT_PULLUP)
pinMode(BTN_BAK, INPUT_PULLUP)
lastA = digitalRead(ENC_A)
attachInterrupt(digitalPinToInterrupt(ENC_A), isrEncA, CHANGE)
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)
display.clearDisplay()
display.setTextWrap(false)
display.dim(0)
display.display()
drawMenu()
}
void loop() {
int8_t d = 0
noInterrupts()
d = encDelta
encDelta = 0
interrupts()
bool ok = pressed(ENC_SW, tSw) || pressed(BTN_CON, tCon)
bool back = pressed(BTN_BAK, tBak)
if (page == 0) {
if (d != 0) {
menuIndex += (d > 0) ? 1 : -1
if (menuIndex < 0) menuIndex = menuCount - 1
if (menuIndex >= menuCount) menuIndex = 0
drawMenu()
}
if (ok) {
if (menuIndex == 0) page = 1
if (menuIndex == 1) page = 2
if (menuIndex == 2) page = 3
if (menuIndex == 3) page = 4
if (menuIndex == 4) page = 5
if (page == 1) drawStatus()
if (page == 2) drawSetari()
if (page == 3) drawHeader("Calibrare"), display.setCursor(0, 20), display.print("Calibrare in lucru"), display.setCursor(0, 56), display.print("BAK: inapoi"), display.display()
if (page == 4) drawInfo()
if (page == 5) {
drawHeader("Reset")
display.setCursor(0, 20)
display.print("Reset valori")
setViteza = 10
setPrag = 50
display.setCursor(0, 56)
display.print("OK: meniu")
display.display()
}
} else if (page == 1) {
if (back) {
page = 0
drawMenu()
}
} else if (page == 2) {
static bool editViteza = true
if (ok) {
editViteza = !editViteza
drawSetari()
}
if (d != 0) {
if (editViteza) {
setViteza += (d > 0) ? 1 : -1
if (setViteza < 0) setViteza = 0
if (setViteza > 99) setViteza = 99
} else {
setPrag += (d > 0) ? 1 : -1
if (setPrag < 0) setPrag = 0
if (setPrag > 999) setPrag = 999
}
drawSetari()
}
if (back) {
page = 0
drawMenu()
}
} else if (page == 3 || page == 4) {
if (back) {
page = 0
drawMenu()
}
} else if (page == 5) {
if (ok || back) {
page = 0
drawMenu()
}
} }
}
