吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3100|回复: 15
收起左侧

[Python 原创] 低成本esp32-s3+MAX7219+八位数码管+MicroPython驱动脚本

  [复制链接]
天域至尊 发表于 2025-2-15 23:27
本帖最后由 天域至尊 于 2025-2-16 12:19 编辑

上次文章发出后,发现不少大佬比较惊讶于可以使用python编写小型开发板的程序
随着近些年的技术成熟,MicroPython已经非常成熟,一个可以运行MicroPython的开发板,最低的只需要十几元。
1.jpg
例如这个esp32带蓝牙wifi,可以上网,仅需14元
此次文章使用的八位数码管驱动
2.png
仅需5元一个。
现在此类产品,成本较低,但是能够实现的功能,就是仁者见仁,智者见智了。
例如我之所以学习这个知识,主要是上班时间,可以关注股价等情况,你自己一直盯着手机APP或者电脑网页,观感不好
自制一个,没几个钱,USB供电,通电自动链接wifi,上网,将数据通过数码管实时展示,随时可以搂一眼,而且你不说,别人不知道干嘛的
目前焊好的板子长这样
3.jpg
程序还没写好,正在学习基础知识。
因为支持python,程序开发就很简单了,加上现在AI自动帮助写程序也比较发达,开发成本越来越低,
硬件成本低,性能不低,学习成本低,上手难度小
现在正赋予这些小玩意,无限可能。我也注意到有很多人,拿这些东西控制家中的智能家居,接入米家,做自己的智能策略,玩法给了自己更多无限可能。

此次使用的是MAX7219驱动的八位数码管,在网上没找到线程可以用的esp32的MAX7219芯片驱动,就自己根据别的芯片改了个,反正也是SPI协议驱动的
SPI协议的细节,在这里就不讲了,这个是一个通用协议
驱动代码如下:
[Python] 纯文本查看 复制代码
from machine import Pin, SPI

class MAX7219:

    _NOOP = 0
    _DIGIT0 = 1
    _DIGIT1 = 2
    _DIGIT2 = 3
    _DIGIT3 = 4
    _DIGIT4 = 5
    _DIGIT5 = 6
    _DIGIT6 = 7
    _DIGIT7 = 8
    _DECODEMODE = 9
    _INTENSITY = 10
    _SCANLIMIT = 11
    _SHUTDOWN = 12
    _DISPLAYTEST = 15

    _DIGITS = {
        ' ': 0x00,
        '0': 0x7e,
        '1': 0x30,
        '2': 0x6d,
        '3': 0x79,
        '4': 0x33,
        '5': 0x5b,
        '6': 0x5f,
        '7': 0x70,
        '8': 0x7f,
        '9': 0x7b,
    }

    # 小数点的掩码(右下角)
    _DECIMAL_POINT = 0x80

    NUM_DIGITS = 8

    def __init__(self, spibus:int,baudrate:int,clk:int,din:int, cs:int):
        """
        这是驱动MAX7219芯片控制八位数码管的类
        该类可以通过SPI总线控制MAX7219芯片,从而控制数码管
        该类提供了显示数字的方法
        可以在指定引脚,声明该类,然后调用show_number方法显示数字
        该脚本编写语言是MicroPython

        spibus: spi总线 建议为2
        baudrate: 波特率 建议为115200
        clk: 时钟引脚 max7219的CLK引脚 建议为18
        din: 数据引脚 max7219的DIN引脚 建议为16
        cs: 片选引脚 max7219的CS引脚 建议为5
        """
    
        self.spi = SPI(spibus, baudrate=baudrate, polarity=0, phase=0, sck=Pin(clk), mosi=Pin(din), miso=None)
        self.cs = Pin(cs, Pin.OUT, value=0)
        self.buffer = bytearray(8)
        self.spi.init()
        self.init()

    def _register(self, command, data):
        # 写入显示寄存器
        self.cs.value(0)
        self.spi.write(bytearray([command, data]))
        self.cs.value(1)

    def init(self):
        # 初始化显示
        for command, data in (
            (self._SHUTDOWN, 0),
            (self._DISPLAYTEST, 0),
            (self._SCANLIMIT, 7),
            (self._DECODEMODE, 0),
            (self._SHUTDOWN, 1),
        ):
            self._register(command, data)

    def write_number(self, value, zeroPad=False, leftJustify=False, decimalPos=None):
        # 显示数字,格式化并查找字符,然后传递到缓冲区

        if len(str(value)) > self.NUM_DIGITS:
            raise OverflowError('{0} 太大,无法显示'.format(value))

        size = self.NUM_DIGITS
        formatStr = '%'

        if zeroPad:
            formatStr += '0'

        if leftJustify:
            size *= -1

        formatStr = '{fmt}{size}i'.format(fmt=formatStr, size=size)
        position = self._DIGIT7
        strValue = formatStr % value

        # 处理小数点
        decimalFlag = [False] * len(strValue)
        if decimalPos is not None and decimalPos < len(strValue):
            decimalFlag[decimalPos] = True

        # 查找每个数字的字符并处理小数点
        for i, char in enumerate(strValue):
            digit = self.letter(char)
            if decimalFlag[i]:
                digit |= self._DECIMAL_POINT  # 设置小数点位
            self.buffer[position - 1] = digit
            position -= 1

    def letter(self, char):
        # 查找字符编码并返回
        value = self._DIGITS.get(str(char), 0x00)  # 如果字符无效,默认为0
        return value

    def show(self):
        # 显示缓冲区内容
        for y in range(8):
            self._register(self._DIGIT0 + y, self.buffer[y])
    
    def show_number(self,number,decimal_places:int=-1):
        """
        展示数字
        decimal_places: 展示几位小数,-1表示不显示小数点,传入int类型设置该位无效
        """
        if type(number) == float:
            if decimal_places == -1 or decimal_places == 0:
                number = int(number)
            else:
                now=str(int(number))
                if len(now)>8:
                    number=int(now[:8])
                    decimal_places=0
                elif len(now)+decimal_places>7:
                    decimal_places=8-len(now)
                    number = int(number * 10**decimal_places)
                else:
                    number = int(number * 10**decimal_places)
        decimalPos=7-decimal_places
        if decimalPos==7:
            decimalPos=None
        self.write_number(number,decimalPos=decimalPos)
        self.show()
    def set_brightness(self, brightness):
        """
        设置亮度,范围为 0 到 15
        """
        if 0 <= brightness <= 15:
            self._register(self._INTENSITY, brightness)
        else:
            raise ValueError("亮度值必须在 0 到 15 之间")


if __name__ == "__main__":
    import time
    
    CLK = 17
    DIN = 16
    CS = 15
    smg = MAX7219(2,115200,CLK,DIN,CS)
    smg.set_brightness(15)

    for i in range(9999999,10000020):
        smg.show_number(i)
        time.sleep(1)
    for i in range(1234567.21,1234577.21,1):
        smg.show_number(i,2)
        time.sleep(1)
    for i in range(12345678.21,12345688.21,1):
        smg.show_number(i,2)
        time.sleep(1)

欢迎大家有兴趣可以去看看类似的小东西,可以作为一个业余爱好玩玩,做做自己喜欢的东西
反正比钓鱼啥的,便宜多了,很多物料都是五块钱以下的,还包邮

免费评分

参与人数 3吾爱币 +9 热心值 +3 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
明月相照 + 1 + 1 谢谢@Thanks!
helian147 + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

aken 发表于 2025-2-16 03:38
买了股票,做了监测涨跌的,不得再做一个监测心率的

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
吴浪 + 1 + 1 我很赞同!

查看全部评分

aken 发表于 2025-2-16 17:54
天域至尊 发表于 2025-2-16 12:18
可以,股票跌幅超过10%,心率数值大于150,自动弹出速效救心丸是吧

这个可以有
losingstars 发表于 2025-2-16 01:05
吾爱丶筱豪 发表于 2025-2-16 02:58
话说从哪淘这么便宜的板子   xdd 也也挺贵
nuoan 发表于 2025-2-16 11:25
有完整的项目文件可以分享吗?
interji 发表于 2025-2-16 11:38
确实是一个比较省钱的兴趣爱好
歆风 发表于 2025-2-16 11:43
esp32-s3都被小智顶到40多了。。
 楼主| 天域至尊 发表于 2025-2-16 12:18
aken 发表于 2025-2-16 03:38
买了股票,做了监测涨跌的,不得再做一个监测心率的

可以,股票跌幅超过10%,心率数值大于150,自动弹出速效救心丸是吧
SVIP9大会员 发表于 2025-2-16 12:38
期待楼主补个效果图!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-5-24 17:48

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表