micropython oled显示中文,显示网络数据

该代码示例展示了如何在MicroPython环境中,利用ESP32的SoftI2C和SSD1306OLED显示屏模块,结合GB2312字库进行中文显示。程序首先连接到Wi-Fi,然后通过API获取天气数据,并在OLED屏幕上显示温度信息。
摘要由CSDN通过智能技术生成

参考网址:

https://www.bilibili.com/video/BV1mV4y1S7kA/?vd_source=0cadfafacca073234febd12b3e00f507

GitHub - kaixindelele/ssd1306-MicroPython-ESP32-Chinese: ssd1306OLED显示屏-MicroPython-ESP32-中文显示-利用GB2312字库(非手动取模)

注:要刷网址中的固件

#url  https://github.com/vrialland/micropython-max7219

from machine import Pin, SPI,SoftI2C
import ssd1306

import network#导入网络模块


import ujson

def connect_wifi():#连接程序

    #并将网络凭据(ssid和密码)存储在两个变量上。
    ssid = "maker"
    password =  "qazwsx12"
    try:
    #获取站点WiFi接口的实例并将其存储在变量上
        wlan = network.WLAN(network.STA_IF)
        wlan.active(True)
        if not wlan.isconnected():
            print('Connecting to network...')
            wlan.connect(ssid, password)
            while not wlan.isconnected():
                time.sleep(1)
        print('Network connected:', wlan.ifconfig())
    except:
        print('--')
        pass

import time
connect_wifi()


i2c = SoftI2C(scl=Pin(22), sda=Pin(21),freq=10000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
oled.font_load("GB2312-12.fon")# 所使用的字体时12号字体
from lib import urequests
while True:
    response = urequests.get('https://api.seniverse.com/v3/weather/now.json?key=SK6E_7MBhPJr0_Cs3&location=quzhou&language=zh-Hans&unit=c')
    data = ujson.loads(response.text)
    print(data)
    city=data['results'][0]["location"]['name']
    tq=data['results'][0]["now"]['text']
    temperature=data['results'][0]["now"]['temperature']
    print(city,tq,temperature)
    oled.text("Weather: {}".format(temperature), 0, 20)
    oled.text("温度:%s℃"%temperature,35,48)
    # 更新显示器
    oled.show()   #显示
    time.sleep(2)
    
    #oled.fill(0)  清屏
    

from machine import Pin, SPI,SoftI2C
import ssd1306

#i2c = SoftI2C(scl=Pin(22), sda=Pin(21),freq=10000)
i2c = SoftI2C(scl=Pin(2), sda=Pin(4),freq=10000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
oled.text("sdfsdf", 0, 20)
# 更新显示器
oled.show() 

库文件 ssd1306.py ;urequests.py

from micropython import const
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)

# Subclassing FrameBuffer provides support for graphics primitives
# http://docs.micropython.org/en/latest/pyboard/library/framebuf.html
class SSD1306(framebuf.FrameBuffer):
    def __init__(self, width, height, external_vcc):
        self.width = width
        self.height = height
        self.external_vcc = external_vcc
        self.pages = self.height // 8
        self.buffer = bytearray(self.pages * self.width)
        super().__init__(self.buffer, self.width, self.height, framebuf.MONO_VLSB, self.width)
        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.width > 2 * self.height 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 poweron(self):
        self.write_cmd(SET_DISP | 0x01)

    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_data(self.buffer)


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)
        self.write_list = [b"\x40", None]  # Co=0, D/C#=1
        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_data(self, buf):
        self.write_list[1] = buf
        self.i2c.writevto(self.addr, self.write_list)


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
        import time

        self.res(1)
        time.sleep_ms(1)
        self.res(0)
        time.sleep_ms(10)
        self.res(1)
        super().__init__(width, height, external_vcc)

    def write_cmd(self, cmd):
        self.spi.init(baudrate=self.rate, polarity=0, phase=0)
        self.cs(1)
        self.dc(0)
        self.cs(0)
        self.spi.write(bytearray([cmd]))
        self.cs(1)

    def write_data(self, buf):
        self.spi.init(baudrate=self.rate, polarity=0, phase=0)
        self.cs(1)
        self.dc(1)
        self.cs(0)
        self.spi.write(buf)
        self.cs(1)
import usocket

class Response:

    def __init__(self, f):
        self.raw = f
        self.encoding = "utf-8"
        self._cached = None

    def close(self):
        if self.raw:
            self.raw.close()
            self.raw = None
        self._cached = None

    @property
    def content(self):
        if self._cached is None:
            try:
                self._cached = self.raw.read()
            finally:
                self.raw.close()
                self.raw = None
        return self._cached

    @property
    def text(self):
        return str(self.content, self.encoding)

    def json(self):
        import ujson
        return ujson.loads(self.content)


def request(method, url, data=None, json=None, headers={}, stream=None):
    try:
        proto, dummy, host, path = url.split("/", 3)
    except ValueError:
        proto, dummy, host = url.split("/", 2)
        path = ""
    if proto == "http:":
        port = 80
    elif proto == "https:":
        import ussl
        port = 443
    else:
        raise ValueError("Unsupported protocol: " + proto)

    if ":" in host:
        host, port = host.split(":", 1)
        port = int(port)

    ai = usocket.getaddrinfo(host, port, 0, usocket.SOCK_STREAM)
    ai = ai[0]

    s = usocket.socket(ai[0], ai[1], ai[2])
    try:
        s.connect(ai[-1])
        if proto == "https:":
            s = ussl.wrap_socket(s, server_hostname=host)
        s.write(b"%s /%s HTTP/1.0\r\n" % (method, path))
        if not "Host" in headers:
            s.write(b"Host: %s\r\n" % host)
        # Iterate over keys to avoid tuple alloc
        for k in headers:
            s.write(k)
            s.write(b": ")
            s.write(headers[k])
            s.write(b"\r\n")
        if json is not None:
            assert data is None
            import ujson
            data = ujson.dumps(json)
            s.write(b"Content-Type: application/json\r\n")
        if data:
            s.write(b"Content-Length: %d\r\n" % len(data))
        s.write(b"\r\n")
        if data:
            s.write(data)

        l = s.readline()
        #print(l)
        l = l.split(None, 2)
        status = int(l[1])
        reason = ""
        if len(l) > 2:
            reason = l[2].rstrip()
        while True:
            l = s.readline()
            if not l or l == b"\r\n":
                break
            #print(l)
            if l.startswith(b"Transfer-Encoding:"):
                if b"chunked" in l:
                    raise ValueError("Unsupported " + l)
            elif l.startswith(b"Location:") and not 200 <= status <= 299:
                raise NotImplementedError("Redirects not yet supported")
    except OSError:
        s.close()
        raise

    resp = Response(s)
    resp.status_code = status
    resp.reason = reason
    return resp


def head(url, **kw):
    return request("HEAD", url, **kw)

def get(url, **kw):
    return request("GET", url, **kw)

def post(url, **kw):
    return request("POST", url, **kw)

def put(url, **kw):
    return request("PUT", url, **kw)

def patch(url, **kw):
    return request("PATCH", url, **kw)

def delete(url, **kw):
    return request("DELETE", url, **kw)

MicroPython是一个轻量级的Python实现,特别适合嵌入式系统,如微控制器和物联网设备。在微控制器上使用OLED显示图形,通常涉及到硬件驱动和基础图形库。 首先,你需要一块支持MicroPythonOLED屏幕,比如SSD1306或ILI9341这类常见的128x64或128x32分辨率的屏幕。然后,你需要安装MicroPython中的`uasyncio`库来管理异步操作,因为OLED刷新通常需要耗时处理。 步骤如下: 1. **初始化硬件**:连接OLED到微控制器,并编写代码加载OLED模块,例如`adafruit_displayio_ssd1306`或`adafruit_framebuf`。 ```python import displayio import terminalio import adafruit_rgb_display.ssd1306 as ssd # 初始化屏幕尺寸 display = ssd.SSD1306(128, 32) ``` 2. **创建帧缓冲区**:用于存储图像数据。 ```python WIDTH, HEIGHT = display.width, display.height bitmap = displayio.Bitmap(WIDTH, HEIGHT, 1) # 1位颜色模式 palette = displayio.Palette(1) # 黑色和白色 buffer = displayio.TileGrid(bitmap, pixel_shader=palette) ``` 3. **绘制图形**:可以使用`displayio.GlyphBuffer`、`draw_string`或其他自定义函数画文本或形状。 ```python def draw_rectangle(x, y, width, height): for i in range(x, x + width): for j in range(y, y + height): bitmap[j, i] = 1 # 设置像素为白色 # 调用函数绘制矩形 draw_rectangle(10, 10, 50, 20) # 将缓冲区添加到显示组 group = displayio.Group() group.append(buffer) display.show(group) ``` 4. **更新显示**:通过`display.refresh()`更新屏幕内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值