TungNT (Blue)

tungnt.blue@gmail.com

User Tools

Site Tools


development:python:micropython

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
development:python:micropython [2024/08/15 14:44] tungntdevelopment:python:micropython [2024/08/15 14:47] (current) – [OLed] tungnt
Line 32: Line 32:
 {{ :development:python:screenshot_2024-08-14_at_22.21.00.png |}} {{ :development:python:screenshot_2024-08-14_at_22.21.00.png |}}
  
-====== Led ======+====== Kết nối thiết bị ======
  
-  * [[https://esp32io.com/tutorials/esp32-led-blink|ESP32 - LED - Blink]] +  * [[development:python:micropython:led|Led]] 
-  * [[https://wokwi.com/projects/359801682833812481|Wokwi LED]] +  * [[development:python:micropython:oled|OLed]]
-  * [[https://www.instructables.com/ESP32-Getting-Started-MicroPython-on-Board-Blink-L/|ESP32 – Getting Started MicroPython -- on Board Blink LED]]+
  
-<file python boot.py> 
-import gc 
-import esp 
-from machine import Pin 
  
-esp.osdebug(None) 
-gc.collect() 
- 
-led5 = Pin(5, Pin.OUT) 
- 
-btn26 = Pin(26, Pin.IN, Pin.PULL_UP) 
- 
-def btn26_handler(p): 
-    if btn26.value() != 1:         
-        return 
-     
-    led5.value(not led5.value()) 
- 
-btn26.irq(trigger=Pin.IRQ_RISING | Pin.IRQ_FALLING, handler=btn26_handler)  
-</file> 
- 
-{{ :development:python:screenshot_2024-08-14_at_22.30.53.png |}} 
- 
-====== OLed ====== 
- 
-  * [[https://randomnerdtutorials.com/micropython-oled-display-esp32-esp8266/|MicroPython: OLED Display with ESP32 and ESP8266]] 
-  * [[https://blog.martinfitzpatrick.com/displaying-images-oled-displays/|Displaying images on OLED screens]] 
-  * [[https://www.donskytech.com/micropython-interfacing-with-ssd1306-oled-display/|MicroPython: Interfacing with SSD1306 OLED display]] 
- 
-{{ :development:python:esp32_oled.webp |}} 
- 
-<file python ssd1306.py> 
-#MicroPython SSD1306 OLED driver, I2C and SPI interfaces created by Adafruit 
- 
-import time 
-import framebuf 
- 
-# register definitions 
-SET_CONTRAST        = const(0x81) 
-SET_ENTIRE_ON       = const(0xa4) 
-SET_NORM_INV        = const(0xa6) 
-SET_DISP            = const(0xae) 
-SET_MEM_ADDR        = const(0x20) 
-SET_COL_ADDR        = const(0x21) 
-SET_PAGE_ADDR       = const(0x22) 
-SET_DISP_START_LINE = const(0x40) 
-SET_SEG_REMAP       = const(0xa0) 
-SET_MUX_RATIO       = const(0xa8) 
-SET_COM_OUT_DIR     = const(0xc0) 
-SET_DISP_OFFSET     = const(0xd3) 
-SET_COM_PIN_CFG     = const(0xda) 
-SET_DISP_CLK_DIV    = const(0xd5) 
-SET_PRECHARGE       = const(0xd9) 
-SET_VCOM_DESEL      = const(0xdb) 
-SET_CHARGE_PUMP     = const(0x8d) 
- 
- 
-class SSD1306: 
-    def __init__(self, width, height, external_vcc): 
-        self.width = width 
-        self.height = height 
-        self.external_vcc = external_vcc 
-        self.pages = self.height // 8 
-        # Note the subclass must initialize self.framebuf to a framebuffer. 
-        # This is necessary because the underlying data buffer is different 
-        # between I2C and SPI implementations (I2C needs an extra byte). 
-        self.poweron() 
-        self.init_display() 
- 
-    def init_display(self): 
-        for cmd in ( 
-            SET_DISP | 0x00, # off 
-            # address setting 
-            SET_MEM_ADDR, 0x00, # horizontal 
-            # resolution and layout 
-            SET_DISP_START_LINE | 0x00, 
-            SET_SEG_REMAP | 0x01, # column addr 127 mapped to SEG0 
-            SET_MUX_RATIO, self.height - 1, 
-            SET_COM_OUT_DIR | 0x08, # scan from COM[N] to COM0 
-            SET_DISP_OFFSET, 0x00, 
-            SET_COM_PIN_CFG, 0x02 if self.height == 32 else 0x12, 
-            # timing and driving scheme 
-            SET_DISP_CLK_DIV, 0x80, 
-            SET_PRECHARGE, 0x22 if self.external_vcc else 0xf1, 
-            SET_VCOM_DESEL, 0x30, # 0.83*Vcc 
-            # display 
-            SET_CONTRAST, 0xff, # maximum 
-            SET_ENTIRE_ON, # output follows RAM contents 
-            SET_NORM_INV, # not inverted 
-            # charge pump 
-            SET_CHARGE_PUMP, 0x10 if self.external_vcc else 0x14, 
-            SET_DISP | 0x01): # on 
-            self.write_cmd(cmd) 
-        self.fill(0) 
-        self.show() 
- 
-    def poweroff(self): 
-        self.write_cmd(SET_DISP | 0x00) 
- 
-    def contrast(self, contrast): 
-        self.write_cmd(SET_CONTRAST) 
-        self.write_cmd(contrast) 
- 
-    def invert(self, invert): 
-        self.write_cmd(SET_NORM_INV | (invert & 1)) 
- 
-    def show(self): 
-        x0 = 0 
-        x1 = self.width - 1 
-        if self.width == 64: 
-            # displays with width of 64 pixels are shifted by 32 
-            x0 += 32 
-            x1 += 32 
-        self.write_cmd(SET_COL_ADDR) 
-        self.write_cmd(x0) 
-        self.write_cmd(x1) 
-        self.write_cmd(SET_PAGE_ADDR) 
-        self.write_cmd(0) 
-        self.write_cmd(self.pages - 1) 
-        self.write_framebuf() 
- 
-    def fill(self, col): 
-        self.framebuf.fill(col) 
- 
-    def pixel(self, x, y, col): 
-        self.framebuf.pixel(x, y, col) 
- 
-    def scroll(self, dx, dy): 
-        self.framebuf.scroll(dx, dy) 
- 
-    def text(self, string, x, y, col=1): 
-        self.framebuf.text(string, x, y, col) 
- 
- 
-class SSD1306_I2C(SSD1306): 
-    def __init__(self, width, height, i2c, addr=0x3c, external_vcc=False): 
-        self.i2c = i2c 
-        self.addr = addr 
-        self.temp = bytearray(2) 
-        # Add an extra byte to the data buffer to hold an I2C data/command byte 
-        # to use hardware-compatible I2C transactions.  A memoryview of the 
-        # buffer is used to mask this byte from the framebuffer operations 
-        # (without a major memory hit as memoryview doesn't copy to a separate 
-        # buffer). 
-        self.buffer = bytearray(((height // 8) * width) + 1) 
-        self.buffer[0] = 0x40  # Set first byte of data buffer to Co=0, D/C=1 
-        self.framebuf = framebuf.FrameBuffer1(memoryview(self.buffer)[1:], width, height) 
-        super().__init__(width, height, external_vcc) 
- 
-    def write_cmd(self, cmd): 
-        self.temp[0] = 0x80 # Co=1, D/C#=0 
-        self.temp[1] = cmd 
-        self.i2c.writeto(self.addr, self.temp) 
- 
-    def write_framebuf(self): 
-        # Blast out the frame buffer using a single I2C transaction to support 
-        # hardware I2C interfaces. 
-        self.i2c.writeto(self.addr, self.buffer) 
- 
-    def poweron(self): 
-        pass 
- 
- 
-class SSD1306_SPI(SSD1306): 
-    def __init__(self, width, height, spi, dc, res, cs, external_vcc=False): 
-        self.rate = 10 * 1024 * 1024 
-        dc.init(dc.OUT, value=0) 
-        res.init(res.OUT, value=0) 
-        cs.init(cs.OUT, value=1) 
-        self.spi = spi 
-        self.dc = dc 
-        self.res = res 
-        self.cs = cs 
-        self.buffer = bytearray((height // 8) * width) 
-        self.framebuf = framebuf.FrameBuffer1(self.buffer, width, height) 
-        super().__init__(width, height, external_vcc) 
- 
-    def write_cmd(self, cmd): 
-        self.spi.init(baudrate=self.rate, polarity=0, phase=0) 
-        self.cs.high() 
-        self.dc.low() 
-        self.cs.low() 
-        self.spi.write(bytearray([cmd])) 
-        self.cs.high() 
- 
-    def write_framebuf(self): 
-        self.spi.init(baudrate=self.rate, polarity=0, phase=0) 
-        self.cs.high() 
-        self.dc.high() 
-        self.cs.low() 
-        self.spi.write(self.buffer) 
-        self.cs.high() 
- 
-    def poweron(self): 
-        self.res.high() 
-        time.sleep_ms(1) 
-        self.res.low() 
-        time.sleep_ms(10) 
-        self.res.high() 
- 
-</file> 
- 
-<file python oled.py> 
-import ssd1306 
-from machine import SoftI2C, Pin 
- 
-class OLed: 
-    def __init__(self, scl, sda): 
-        self.scl = scl 
-        self.sda = sda 
-         
-        self.i2c = SoftI2C(scl=Pin(scl), sda=Pin(sda)) 
-        self.oled = ssd1306.SSD1306_I2C(128, 64, self.i2c)         
-     
-        self.menu_items = ["Profile", "Setup Wifi", "Option 3", "Option 4", "Option 5"] 
-        self.menu_selected_index = 0 
-        self.start_index = 0 
-        self.end_index = min(len(self.menu_items), 6) 
- 
-    def set_message(self, message, x = 0, y = 0, is_fill = True): 
-        if is_fill: 
-            self.oled.fill(0) 
- 
-        self.oled.text(message, x, y, 1) 
-        self.oled.show() 
- 
-    def set_images(self, image_pixels): 
-        self.oled.fill(0) 
-         
-        line = 0 
-        for line_pixels in image_pixels: 
-            column = 0 
-            for pixel in line_pixels: 
-                self.oled.pixel(column, line, pixel) 
- 
-                column = column + 1 
-             
-            line = line + 1 
-             
-        self.oled.show() 
- 
-    def display_menu(self, start, end, selected): 
-        self.oled.fill(0) 
-        self.set_message("Setting:") 
-         
-        for i in range(start, end): 
-            y = (i - start) * 10 + 16 
-             
-            if i == selected: 
-                self.oled.text("-> " + self.menu_items[i], 0, y) 
-            else: 
-                self.oled.text(self.menu_items[i], 19, y) 
-        self.oled.show() 
-</file> 
development/python/micropython.1723733081.txt.gz · Last modified: 2024/08/15 14:44 by tungnt

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki