ماژول نمایشگر OLED دو رنگ آبی و زرد 0.96 با پروتکل ارتباطی I2C درایور SSD1306
نمایشگر OLED SSD1306
با ورود ماژول OLED یا به عبارتی Organic Light emitting diode به دنیای نمایشگرها انقلاب تازهای در الکترونیک را رقم زده است. پرنور، شفاف و بسیار نازک و انتخاب رنگ از ویژگیهای بارز ماژول OLED مدرن است. پس از آموزش راه اندازی ال سی دی های کاراکتری نوبت به OLED گرافیکی رسیده است. محبوب ترین ماژول OLED که در حال حاضر در صنعت الکترونیک و بردهای توسعه میکروکنترلر استفاده میشود،
نمایشگر OLED با درایور قدرتمند SSD1306 است که در ظاهرهای مختلف به بازار ارائه شده است. چیپ SSD1306 یک کنترل کننده درایور قدرتمند CMOS است. این درایور از پروتکل های ارتباطی I2C و SPI پشتیبانی میکند و با توجه به اینکه در پروتکل I2C تنها با دو پایه برای اتصال نیاز دارد، ولتاژ کاری نمایشگر ۳٫۳ و ۵ ولت است و از هر دو پایه های تعذیه میکروکنترلر میتوانید استفاده کنید. زاویه دید نمایشگر ۱۶۰ درجه است و ابعاد آن ۰٫۹۶ اینچ است. نمایشگر دارای ۸ سطر و ۱۲۸ ستون است.
ویژگی های فنی نمایشگر OLED SSD1306
برخی از ویژگیهای فنی ماژول نمایشگر OLED SSD1306 عبارتند از:
- رزولوشن: 128x64 پیکسل
- ولتاژ کاری: 3.3 ولت
- پروتکل ارتباطی: I2C
- اندازه نمایشگر: 0.96 اینچ یا 1.3 اینچ
- نوع نمایشگر: OLED
- تعداد رنگ: 1 (سیاه و سفید)
- زاویه دید: حدود 160 درجه در هر دو راستای عمودی و افقی
- میزان روشنایی: قابل تنظیم
- مصرف برق: کم
- دمای کاری: بین -40 درجه سانتیگراد تا +85 درجه سانتیگراد
پایه های Pinout نمایشگر OLED SSD1306
نمایشگر OLED SSD1306 دارای دو نوع پایه متفاوت است که به شرح زیر است. ابتدا وصل کنندههای پایههای نمایشگر SSD1306 را به پایههای مورد نظر در آردوینو وصل کنید. برای این منظور، پایههای VCC و GND به منابع تغذیه، پایه SCL به پایه A5 و پایه SDA به پایه A4 آردوینو وصل شوند. همچنین دقت داشته باشید که ترتیب پایههای ماژول OLED I2C به دو حالت در دسترس هستند که در ادامه میتوانید مشاهده کنید. البته راه اندازیها هیچ تفاوتی ندارند.
نمایشگر OLED I2C
- VCC: ولتاژ تغذیه (3.3 ولت)
- GND: زمین
- SCL: پایه کنترل ساعت I2C
- SDA: پایه ارتباطی داده I2C
راه اندازی نمایشگر OLED SSD1306 با آردوینو
برای راه اندازی نمایشگر OLED SSD1306 با آردوینو، مراحل زیر را دنبال کنید.
ابتدا باید کتابخانه SSD1306 را در آردوینو نصب کنید. برای این کار به قسمت Sketch -> Include Library -> Manage Libraries بروید و در باکس جستجو کتابخانه SSD1306 را جستجو کنید. پس از پیدا شدن کتابخانه، آن را نصب کنید. کد زیر را کپی و در نرم افزار آردوینو Arduino IDE اجرا کنید.
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED نمایشگر عرض صفحه
#define SCREEN_HEIGHT 32 // OLED نمایشگر ارتفاع صفحه
// نشانگر OLED تعریف میشود
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
Serial.begin(9600);
// شروع ارتباط با OLED نمایشگر
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 نمایشگر پیدا نشد"));
while(true);
}
// طرح اولیه را پاک کنید
display.clearDisplay();
// متن را نمایش دهید
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("Hello, World!");
// نمایش تصویر
display.display();
}
void loop() {
// دستورات دیگر را در اینجا بنویسید
}
راه اندازی نمایشگر OLED SSD1306 با میکروپایتون و ESP32
برای راه اندازی نمایشگر OLED SSD1306 با ESP32، می توانید از کتابخانه ssd1306 استفاده کنید. ابتدا کتابخانه را در میکروپایتون ESP32 خود نصب کنید. سپس کد زیر را برای راه اندازی نمایشگر OLED SSD1306 با ESP32 بنویسید.
در این کد، ابتدا پایه های SPI تعریف شده و سپس نمایشگر با استفاده از پایه های مورد نیاز و از طریق پروتکل SPI ایجاد می شود. پس از ساخت نمایشگر، با فراخوانی oled.fill(0)، صفحه نمایش پاک شده و با oled.text() متن مورد نظر بر روی صفحه نمایش نمایش داده می شود. در انتها با oled.show() تغییرات روی نمایشگر اعمال می شود.
import machine
import ssd1306
# تعریف پایه های SPI
spi = machine.SPI(1, baudrate=80000000, polarity=0, phase=0)
# تعریف پایه های نمایشگر
oled = ssd1306.SSD1306_SPI(128, 64, spi, machine.Pin(16), machine.Pin(17), machine.Pin(18))
# پاک کردن نمایشگر
oled.fill(0)
oled.show()
# نمایش متن
oled.text("Hello, World!", 0, 0)
oled.show()
راه اندازی نمایشگر OLED SSD1306 با میکروپایتون و PICO RP2040
نمایشگر OLED SSD1306 با پروتکل ارتباطی I2C , SPI با تراشه RP2040 همخوانی دارد و قابلیت برنامه نویسی با زبان میکروپایتون را دارد. در ادامه توسط نرم افزار میکروپایتون Thonny IDE کد راه اندازی نمایشگر OLED را اجرا کنید. برای استفاده از سخت افزارها بایستی در ایتدا درایور آن ها برای میکروکنترلر نصب شود. این مورد کاملا وابسته به زبان برنامه نویسی مورد نظر و انتخاب نرم افزار است.
در این پروژه از زبان برنامه نویسی میکروپایتون و نرم افزار THONNY IDE برای نمایش دیتا در نمایشگر OLED استفاده میکنیم قدم اول برای معرفی نمایشگر OLED به نرم افزار THONNY IDE اضافه کردن درایور مورد نظر است. درایور نمایشگر OLED درایور SSD1306 است. به ترتیب زیر درایور را به نرم افزار و برد رزبری پای پیکو اضافه کنید.
درایور SSD1306 برای MICROPYTHON را دانلود کنید ( ترجیحا از گیت هاب دانلود کنید ) برای استفاده از سخت افزارها بایستی در ایتدا درایور آن ها برای میکروکنترلر نصب شود. این مورد کاملا وابسته به زبان برنامه نویسی مورد نظر و انتخاب نرم افزار است. در این پروژه از زبان برنامه نویسی میکروپایتون و نرم افزار THONNY IDE برای نمایش دیتا در نمایشگر OLED استفاده میکنیم قدم اول برای معرفی نمایشگر OLED به نرم افزار THONNY IDE اضافه کردن درایور مورد نظر است. درایور نمایشگر OLED درایور SSD1306 است. به ترتیب زیر درایور را به نرم افزار و برد رزبری پای پیکو اضافه کنید.
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
w = 128
h = 64
i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=200000)
addr = i2c.scan()[0]
oled = SSD1306_I2C(w, h, i2c, addr)
oled.fill(0)
oled.text("Hello ", 5, 5)
oled.text("Ladyjaaaan", 35, 15)
oled.show()
مشخصات
- نوع ماژول
- نمایشگر
- ابعاد
- 27x27mm
- ولتاژ مورد نياز
- 3.3 تا 5 ولت DC
- رنگ بندی
- نمایشگر زرد
- تعداد پایه ها
- 4 پایه
- پروتکل ارتباطی
- I2C
- پردازنده
- SSD1306
- نوع LCD
- OLED
- صفحه نمایش لمسی
- ندارد
- اندازه نمایشگر
- 0.96 اینچ
- نوع نمایشگر
- نمایشگر OLED
- نوع مبدل
- پروتکل I2C
اتصالات باتریها را بررسی کنید. همگی از یک نمونه باشند و اتصالات کامل و استاندارد باشند.
توسط همین ماژول هم میتوانید اقدام به اجرای درخواستتان کنید. البته اگر فقط بخواهید یک سلول باتری لیتیومی را مدیریت شارژ کنید، همان گزینه ماژول TP4056 مناسب خواهد بود.
با سلام
کاربر گرامی برای این منظور بایستی از ماژول PCF8574 استفاده کنید. لینک ماژول PCF8574 را بررسی کنید.
در نظر داشته باشید، با اتصال تغذیه بدون اجرا شدن کد برنامه، نمایشگر فرمان روشن و فعال شدن را دریافت نمیکند و بایستی کد را ابتدا آپلود و سپس تغییرات را مشاهده کنید.
اگر ارور "Adafruit_GFX.h" در محیط برنامهنویسی Arduino یا محیطهای برنامهنویسی مشابه دیده میشود، این به معنای این است که کتابخانه گرافیک Adafruit GFX به درستی به پروژه شما اضافه نشده یا به صورت صحیح موقع کامپایل نمیشود. کتابخانه Adafruit GFX یک کتابخانه مفید برای کار با نمایشگرهای LCD و OLED است و بسیاری از پروژههای الکترونیکی آن را برای رسم شکلها، متون و نمادها بر روی نمایشگر استفاده میکنند. اطمینان حاصل کنید که کتابخانه Adafruit GFX به پروژه شما اضافه شده باشد. برای افزودن این کتابخانه، در Arduino IDE به "Sketch" رفته و سپس "Include Library" و در نهایت "Adafruit GFX" را انتخاب کنید.
امکان راه اندازی چند سنسور DHT با ESP8266 با استفاده از MicroPython وجود دارد. سنسورهای DHT با پروتکل دیجیتال و از طریق پایههای GPIO قابل اتصال به میکروکنترلرها هستند.
برای ساخت یک سیستم کنترل دما با برد میکروکنترلر ESP32، به موارد زیر نیاز دارید:
یک برد میکروکنترلر ESP32
یک سنسور دما مثل DHT DS18B20
یک المان سرد کننده
با استفاده از کتابخانه DHT.h، میتوانید از سنسور دما برای خواندن دمای محیط استفاده کنید. سپس، میتوانید از این دما برای کنترل المان گرمایشی یا سرمایشی استفاده کنید.
در خصوص برنامه نویسی از کتابخانه DHT و در صورت نیاز کتابخانه وای فای برای ارسال دادهها به پلتفرم IoT باید استفاده کنید.
برای نصب درایور SSD1306 فایل زیر را در thonny ide با نام SSD1306.py ذخیره کنید.
from time import sleep_ms
from machine import Pin, I2C
# Constants
DISPLAYOFF = 0xAE
SETCONTRAST = 0x81
DISPLAYALLON_RESUME = 0xA4
DISPLAYALLON = 0xA5
NORMALDISPLAY = 0xA6
INVERTDISPLAY = 0xA7
DISPLAYON = 0xAF
SETDISPLAYOFFSET = 0xD3
SETCOMPINS = 0xDA
SETVCOMDETECT = 0xDB
SETDISPLAYCLOCKDIV = 0xD5
SETPRECHARGE = 0xD9
SETMULTIPLEX = 0xA8
SETLOWCOLUMN = 0x00
SETHIGHCOLUMN = 0x10
SETSTARTLINE = 0x40
MEMORYMODE = 0x20
COLUMNADDR = 0x21
PAGEADDR = 0x22
COMSCANINC = 0xC0
COMSCANDEC = 0xC8
SEGREMAP = 0xA0
CHARGEPUMP = 0x8D
EXTERNALVCC = 0x10 #0x1
SWITCHCAPVCC = 0x20 #0x2
SETPAGEADDR = 0xB0
SETCOLADDR_LOW = 0x00
SETCOLADDR_HIGH = 0x10
ACTIVATE_SCROLL = 0x2F
DEACTIVATE_SCROLL = 0x2E
SET_VERTICAL_SCROLL_AREA = 0xA3
RIGHT_HORIZONTAL_SCROLL = 0x26
LEFT_HORIZONTAL_SCROLL = 0x27
VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL = 0x29
VERTICAL_AND_LEFT_HORIZONTAL_SCROLL = 0x2A
# I2C devices are accessed through a Device ID. This is a 7-bit
# value but is sometimes expressed left-shifted by 1 as an 8-bit value.
# A pin on SSD1306 allows it to respond to ID 0x3C or 0x3D. The board
# I bought from ebay used a 0-ohm resistor to select between "0x78"
# (0x3c << 1) or "0x7a" (0x3d << 1). The default was set to "0x78"
DEVID = 0x3c
# I2C communication here is either <DEVID> <CTL_CMD> <command byte>
# or <DEVID> <CTL_DAT> <display buffer bytes> <> <> <> <>...
# These two values encode the Co (Continuation) bit as b7 and the
# D/C# (Data/Command Selection) bit as b6.
CTL_CMD = 0x80
CTL_DAT = 0x40
class SSD1306(object):
def __init__(self, height=64, external_vcc=True, i2c_devid=DEVID):
self.external_vcc = external_vcc
self.height = 32 if height == 32 else 64
self.pages = int(self.height / 8)
self.columns = 128
self._row = 0
self._col = 0
self._x = 0
self._y = 0
self.devid = i2c_devid
self.offset = 1
self.cbuffer = bytearray(2)
self.cbuffer[0] = CTL_CMD
self.i2c = I2C(scl=Pin(2), sda=Pin(16), freq=400000)
self.buffer = bytearray(self.offset + self.pages * self.columns)
def clear(self):
self.buffer = bytearray(self.offset + self.pages * self.columns)
if self.offset == 1:
self.buffer[0] = CTL_DAT
def write_command(self, command_byte):
self.cbuffer[1] = command_byte
self.i2c.writeto(self.devid, self.cbuffer)
def invert_display(self, invert):
self.write_command(INVERTDISPLAY if invert else NORMALDISPLAY)
def display(self):
self.write_command(COLUMNADDR)
self.write_command(0)
self.write_command(self.columns - 1)
self.write_command(PAGEADDR)
self.write_command(0)
self.write_command(self.pages - 1)
self.i2c.writeto(self.devid, self.buffer)
def set_pixel(self, x, y, state):
index = x + (int(y / 8) * self.columns)
if state:
self.buffer[self.offset + index] |= (1 << (y & 7))
else:
self.buffer[self.offset + index] &= ~(1 << (y & 7))
def init_display(self):
chargepump = 0x10 if self.external_vcc else 0x14
precharge = 0x22 if self.external_vcc else 0xf1
multiplex = 0x1f if self.height == 32 else 0x3f
compins = 0x02 if self.height == 32 else 0x12
contrast = 0x9f # 0x8f if self.height == 32 else (0x9f if self.external_vcc else 0x9f)
data = [DISPLAYOFF,
SETDISPLAYCLOCKDIV, 0xF0,
SETMULTIPLEX, 0x3f,
SETDISPLAYOFFSET, 0x00,
SETSTARTLINE | 0x00,
CHARGEPUMP, 0x14,
MEMORYMODE, 0x00,
SEGREMAP | 0x00,
COMSCANINC,
SETCOMPINS, 0x12,
SETCONTRAST, 0xCF,
SETPRECHARGE, 0xF1,
DISPLAYALLON_RESUME,
NORMALDISPLAY,
0x2e, # stop scroll
DISPLAYON]
for item in data:
self.write_command(item)
# self.clear()
self.display()
def poweron(self):
if self.offset == 1:
sleep_ms(10)
else:
self.res.high()
sleep_ms(1)
self.res.low()
sleep_ms(10)
self.res.high()
sleep_ms(10)
def poweroff(self):
self.write_command(DISPLAYOFF)
def contrast(self, contrast):
self.write_command(SETCONTRAST)
self.write_command(contrast)
def set_start_end_cols(self, start_col=0, end_col=None):
if end_col is None:
end_col = self.columns - 1
if start_col < 0 or start_col > self.columns - 1:
raise ValueError('Start column must be between 0 and %d.' % (self.columns - 1,))
if end_col < start_col or end_col > self.columns -1:
raise ValueError('End column must be between the start column (%d) and %d.' % (start_col, self.columns - 1))
self.write_command(COLUMNADDR)
self.write_command(start_col) # Start column
self.write_command(end_col) # End column
def set_start_end_pages(self, start_page=0, end_page=None):
if end_page is None:
end_page = self.pages - 1
if start_page < 0 or start_page > self.pages - 1:
raise ValueError('Start page must be between 0 and %d.' % (self.pages - 1,))
if end_page < start_page or end_page > self.pages - 1:
raise ValueError('End page must be between the start page (%d) and %d.' % (start_page, self.pages - 1))
self.write_command(PAGEADDR)
self.write_command(start_page) # Page start address. (0 = reset)
self.write_command(end_page) # Page end address.
def p_char(self, ch):
fp = (ord(ch)-0x20) * 5
char_buf = bytearray([0,0,0,0,0])
f = open('font5x7.fnt','rb')
f.seek(fp)
char_buf = f.read(5)
bp = self.columns*self._row + 6*self._col + 1
for x in range (0,5):
self.buffer[bp+x] = char_buf[x]
self.buffer[bp+5] = 0 # put in inter char space
self._col += 1
if (self._col>int(self.columns/6 - 1)):
self._col = 0
self._row += 1
if (self._row>int(self.height/8 - 1)):
self._row = 0
def p_string(self, str):
for ch in (str):
self.p_char(ch)
def pixel(self,x,y,fill):
r = int(y/8)
i = r * self.columns + x + self.offset
b = y % 8
self.buffer[i] = self.buffer[i] | ( 1 << b )