查看: 2463|回复: 5

129行代码的M5Stack(core Esp32)电子秤(micropython)

[复制链接]
  • TA的每日心情
    开心
    2019-7-17 13:13
  • 签到天数: 264 天

    [LV.8]以坛为家I

    发表于 2019-3-9 10:29 | 显示全部楼层 |阅读模式
    本帖最后由 沧海笑1122 于 2019-3-11 22:45 编辑

    M5Stack(core Esp32)电子秤(micropython)

    【项目基本情况】
        源于我在2014年做的一个电子秤,移植到M5以及micropython是2018年4~5月间的事,一直没有整理分享。春节后有点点时间,进行了一番整理,希望与使用M5Stack的玩家一起分享。回馈M5Stack的开源、分享和宽容。
        本玩具将M5stack与称重传感器和HX711 AD转换模块结合,做了一个基于esp32和micropython的小小电子秤。一共129行代码,非常适合上手体验,相信我,你肯定行的,一起试试吧。
       主要功能:
    去皮功能,称重功能以及精度校准功能和电子秤关机功能。
       假设:
    假设读到此文的玩家您,有一点单片机esp32的开发基础,知道烧写固件,知道基本接线规则(能留意到vcc的电压以及正负极不要接错),如果不知道也没关系,有一台能上网的手机或pc,乐于百度,bing和正确提问。那么这个小玩具就适合您。
    hx711_1.jpg

    视频在此-------请点击---☞
       什么是M5Stack?
    M5stack是国人创客团队一款基于eps32的创客平台,一个5*5见方的盒子上,集成了esp32,三只自定义按钮、一块TFT彩屏、喇叭、TF读写槽、电源管理以及锂电池。外壳是开模的,精度很高。玩家不需要再自己搭建一些外设,就可以专注于创客开发。引出了大量IO口。
    难能可贵的是M5stack一开始就重视生态圈建设,推出大量周边,提供了很强的拓展能力。
    【硬件准备】
      
    序号
      
    功能
    型号
    备注
    1
    主控
    M5stack
    内核esp32
    2
    称重传感器
    750g微型称重传感器
      

    电阻桥式


    3
    AD转换模块
    hx711
    24位ad芯片
    4
    秤盘
    /
    根据一个旧的usbhub改制
    5
    线材
    杜邦线+USB母
    热缩管若干
    【软件准备】(固件、代码、hx711库文件均打包附后,几个小工具自行百度吧)
      
    序号
      
    功能
    型号
    备注
    1
    固件
    m5stack-20180516-v0.4.0.bin
    离线版micropython  cloud固件
    2
    esptool
    2.6
    烧写固件程序
    3
    upycraft
    0.30
    Dfrobot开发的开源micropython IDE,界面友好,玩家可以根据实际情况选择
    4
    uPyLoader
    0.1.3
    重要的mpy传送工具,方便快捷,本例用于传送图片文件
    5
    HX711库文件
    1.0.1
    Pypi.org,开源mpy库,支持去皮、校准
    【开始一起玩吧】
    Step1:准备硬件连接
    硬件连接只有四根线,以下是对应关系,注意电压不要弄错了。
      
      
    M5Stack
    HX-711
    1
    I05
    DO
    2
    I02
    CK
    3
    3V3
    VCC
    4
    GND
    GND

    wire_s.jpg

    Step2:制作称重托盘(本例的秤盘,我没有新制作,使用了2014年项目的秤盘,接下来有时间我也会重新切割一个新秤盘)
    热熔胶+螺丝刀,拆解USBHUB后,将内部掏空,装入称重传感器以及HX711。
    硬件部分就这么多,很简单吧,注意,托盘一定要保证称重传感器水平,称重传感器的原理就是形变传感器,所以保持水平、固定都很重要。

    hx711_3.jpg
    Step3:为M5STACK烧写固件
    我手里的M5是最早的一批,记得是2017-08-30,默认固件是arduino,出厂test也是基于arduino的。现在我们开始烧写micropython固件。
    我用的是M5官方提供的云固件(本地离线版),版本号是m5stack-20180516-v0.4.0.bin,这也是目前最新版,里面对M5的按钮、LCD做了很好的封装,使用起来很方便。就没有必要下载其他micropython固件,然后自己做轮子,去折腾LCD和按钮的驱动,专注于应用就好了。
    烧写一共两步骤
    一是擦除。
       备注:这里的COM3是我PC上识别出来的M5的通信口,因人而异啊。
    二是烧写固件。

    kittenblock中小学创客名师推荐的图形化编程软件

      Python esptool.py --chip esp32 --port COM3--baud 460800 write_flash 0x1000 m5stack-20180516-v0.4.0.bin
    备注:我们预设玩家都很熟悉这些基础知识,如果想了解固件烧写,请自行百度。

    Step4:开始编程
    基本流程:
    代码很简单,只有129行,实际上就是对三个按钮的编程:
    A是去皮功能
    B是校准功能
    C是电子秤关电源功能
    LOGO是M5STACK的,jpg格式显示,开机会有一个画面,然后循环侦测三个按钮陷阱。没有就好好干活,称重。
    备注:
    代码中已经做了详细的注释,就不再多说。
    设置了一个correction.txt用来放置校准系数,每次开机自动读取,一旦校准后,新结果写入。Esp32的空间足够大,用一个text文本文件存很合适啦。校准用的是两个砝码(100g,200g)进行了一个线性校准。比较简单。
    为什么要校准?此贴不再多说,玩家也可以百度,我在2014年在极客工坊写过一篇帖子,有详细介绍。奉上链接。



    kittenblock中小学创客名师推荐的图形化编程软件

    '''
    
    time:2019-03-06
    
    1、增加一个去皮(清零)按钮,实现手动去皮功能
    2、(0504new)实现对去皮数值的读写功能,不再用txt文件存储
    3、(0504new)增加一个BUTTONB按钮,利用correction.txt文件存储校正系统
    4、(0504new)增加一个BUTTONC按钮,关机按钮
    5、(0505new)设计电子秤界面,三个按钮提示。数字用七段,其余用小字体
    6、(0505new)完成小数点两位显示。
    
    '''
    
    
    
    from hx711 import HX711
    from utime import sleep_us
    from m5stack import lcd, buttonA,buttonB,buttonC
    #import math
    global val_cort  #校正系数
    
    def drawbutton():
            #显示三个按钮以及文字
            lcd.clear()
            lcd.font(lcd.FONT_Ubuntu)
            lcd.roundrect(30, 190, 70, 40, 1, 0xFFFFF0, 0xFFF68F)  #buttonA
            lcd.text(40,200,"N.W", 0x0F0F0F,transparent=True)
            lcd.roundrect(130, 190, 70, 40, 1, 0xFFFFF0, 0xC6E2FF)  #buttonB
            lcd.text(140,200,"CORR", 0x0F0F0F,transparent=True)
            lcd.roundrect(230, 190, 70, 40, 1, 0xFFFFF0, 0x9AFF9A)  #buttonC
            lcd.text(240,200,"Off", 0x0F0F0F,transparent=True)
    
    
    class Scales(HX711):
        def __init__(self, d_out, pd_sck):
            super(Scales, self).__init__(d_out, pd_sck)
            self.offset = 0
    
        def reset(self):
            self.power_off()
            self.power_on()
    
        def tare(self):
            self.offset = self.read()
            #self.offset = val_tare
    
        def raw_value(self):
            return self.read() - self.offset
    
        def stable_value(self, reads=10, delay_us=500):
            values = []
            for _ in range(reads):
                values.append(self.raw_value())
                sleep_us(delay_us)
            return self._stabilizer(values)
    
        @staticmethod
        def _stabilizer(values, deviation=10):
            weights = []
            for prev in values:
                weights.append(sum([1 for current in values if abs(prev - current) / (prev / 100) <= deviation]))
            return sorted(zip(values, weights), key=lambda x: x[1]).pop()[0]
    
    #------------begin
    lcd.image(0, 0, file="M5Stack.jpg", scale=0, type=lcd.JPG)  #显示m5 logo
    sleep_us(1000000)
    '''
    1、建立一个scale实例
    2、初始化时进行一次去皮纠偏
    '''
    #显示三个按钮以及文字
    drawbutton()
    scales = Scales(d_out=5, pd_sck=2)
    #读出预存的校正系数
    with open('cort.txt', 'r') as myfile:
            val_cort=float(myfile.read().replace('\n', ''))  #读出预存的校正系数
    myfile.close()
    scales.tare() #初始化时进行一次去皮
    
    
    while True:
            if buttonA.wasPressed(): #如果去皮按钮按下
                    lcd.clear()
                    lcd.font(lcd.FONT_Default)
                    scales.tare()  #去皮
                    lcd.text(40,40,"      ")
                    lcd.text(40,40,"offset tare..")
                    print('offset tare..')
                    sleep_us(2000000)
                    lcd.clear()
                    #显示三个按钮以及文字
                    drawbutton()
            if buttonB.wasPressed():  #如果校正按钮按下
                    lcd.clear()
                    lcd.font(lcd.FONT_Default) #改变字体
                    lcd.print("Put 100g please..",100, 100, color=0xFF0000) #请先放上100g的砝码
                    sleep_us(5000000)
                    val100 = scales.stable_value()  #把100g的对应稳定读数放入val100
                    lcd.print(str(val100),100, 120, color=0xFF0000) #屏显100g对应度数
                    lcd.print("Put 200g please..",100, 140, color=0xFF0000) #请先放上200g的砝码
                    sleep_us(5000000)
                    val200 = scales.stable_value()  #把200g的对应稳定读数放入val200
                    lcd.print(str(val200),100, 160, color=0xFF0000) #屏显200g对应度数
                    '''计算校正系统'''
                    val_cort=100/(val200-val100)
                    lcd.print(str(val_cort),100, 180, color=0xFF0000) #屏显校正系数
                    lcd.print("take away 200g..",100, 200, color=0xFF0000)
                    sleep_us(5000000)
                    '''将系数放入cort.txt当中'''
                    f = open('cort.txt', 'w')  #打开cort.txt文件,以write方式,准备写入参数
                    f.write(str(val_cort))   #把刚才计算的校正系统写入cort.txt中
                    f.close()
                    lcd.clear()
                    #显示三个按钮以及文字
                    drawbutton()
            if buttonC.wasPressed():  #如果关机按钮按下
                    lcd.clear()
                    lcd.font(lcd.FONT_Minya) #改变字体
                    lcd.print("Scales Power OFF NOW",40, 40, color=0xFFF000) #屏显校正系数
                    scales.power_off()
            #lcd.clear()
            #字体变为七段数字字体
            lcd.font(lcd.FONT_7seg)
            lcd.attrib7seg(22, 5, 0xFF0000, 0xFF0000)
            val = val_cort*scales.stable_value() #带有折算补偿系数的计算,如-0.00051235
            print(val)
            sleep_us(1000000)
            lcd.text(40,40,"           ")
            lcd.text(40,40,str("{:.1f}".format(val)))   #格式化的字符输出,保留两位小数
    
    
    
    
    
    
    



    Step5:所有的活儿干完了,现在看看效果
    电子秤嘛,称重精度最重要,我们用了一个100g砝码,看看精度还可以,再看看200g,有一点波动(约0.2g左右),可以了,做厨房秤都够了,咱们不用秤珠宝。
    hx711_2.jpg
    【结语】
    感谢M5Stack推出这样棒的平台,玩家不用造轮子,关注于应用即可。
    感谢arduino.cn给我们一个开放包容的交流环境。
    感谢hx711库的作者https://github.com/SergeyPiskunov/micropython-hx711如果觉得好,请大家点一颗星吧。我们都是开源的受益者。
    享受创客带给我们的好奇、波折以及收获。生活是无数因缘和合而成,珍惜遇到的每件事、每个人。开心每一天。
    沧海抱拳。
    【附件】代码、固件以及hx711库。
    m5stack.ipg    logo文件
    hx711.py       hx711库文件
    hx711_0505a.py 电子秤代码文件,如果要让它在m5stack自动运行,将其改为main.py
    cort.txt       校准系数文件,自行校准后,新结果会自动存入
    -------------------以上四个文件都需要传送到m5stack中

    m5stack-20180516-v0.4.0.bin  mpy固件,需要烧写,详细见本帖子

    upload2_1.rar (15.97 KB, 下载次数: 59)
    打赏作者鼓励一下!

    该用户从未签到

    发表于 2019-3-9 11:34 | 显示全部楼层
    M5 看起来不错哦

    做的东西很精巧
    打赏作者鼓励一下!
  • TA的每日心情
    开心
    2019-10-15 08:38
  • 签到天数: 690 天

    [LV.9]以坛为家II

    发表于 2019-3-9 17:12 | 显示全部楼层
    我的M5还一直在吃灰
    打赏作者鼓励一下!
  • TA的每日心情
    开心
    2019-7-17 13:13
  • 签到天数: 264 天

    [LV.8]以坛为家I

     楼主| 发表于 2019-3-9 17:40 | 显示全部楼层
    vickywong 发表于 2019-3-9 17:12
    我的M5还一直在吃灰

    O(∩_∩)O哈哈~赶快拿出来折腾一下吧,micropython别有趣味。
    打赏作者鼓励一下!
  • TA的每日心情
    开心
    2019-7-17 13:13
  • 签到天数: 264 天

    [LV.8]以坛为家I

     楼主| 发表于 2019-3-9 17:41 | 显示全部楼层
    Zoologist 发表于 2019-3-9 11:34
    M5 看起来不错哦

    做的东西很精巧



    还做了一个gps手表,也没及时整理。。。
    打赏作者鼓励一下!
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    【Arduino】108种传感器系列实验(11)---金属触摸传感器模块
    【Arduino】108种传感器系
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    【干货分享】mega2560原理图PCB图纸altium designer18
    【干货分享】mega2560原理
    分享一下mega2560的板子 AD版本 **** 本内容被作者隐藏 **** ergo
    GRBL sender 自己制作的控制软件
    GRBL sender 自己制作的控
    网上找了许多GRBL控制软件都不理想,于是决定自己动手做一个,这是第一版,功能有限,
    Arduino模拟USB键盘
    Arduino模拟USB键盘
    [md] ### 模拟键盘输入信息 本示例将演示使用Arduino Leonardo模拟USB键盘输出信息。
    免费高效的PCB工具
    免费高效的PCB工具
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表