如何设计一个数字秤
扫描二维码
随时随地手机看文章
一个没有活动部件的秤——你说不可能?根据我目前项目的结果,它拥有令人难以置信的分辨率和准确性。从一个铝制长方体的弯曲到眼睛难以察觉的弯曲,一个24位模数转换器(ADC),一个ESP8266或ESP32(缩写为以下文本ESP)和一个OLED显示器,一个数字秤被创造出来,在我的情况下,可以测量高达1kg的质量,分辨率为0.01g!本系列的这篇文章解释了它是如何工作的以及它背后的技巧。
ESP32和ESP8266上的Micropython
数字秤与HX711
我最初认为这是不可能的,结果让我非常惊讶。所用的铝制组件是一种所谓的测压元件。中间的两个孔将金属削薄,拉伸条粘在墙上,如图1的顶部和底部。材料厚度约为。1毫米。
图1:侧面的工资单元
称重传感器与底板一起拧在右侧,秤带连接在左侧。
图2:1公斤的天秤座
一张尺寸为10cm x 15cm的纸现在使测压元件弯曲如此之多,或者更确切地说,很小,以至于秤上显示的重量为0.9g。
这是如何工作的呢?拉伸带是应用于塑料载体的晶圆薄导体轨道。这些垫子粘在载体材料上。
图3:拉伸条示意图
通过弯曲载体,导体被稍微拉伸,从而变得更薄更长。这会引起电阻的变化,这取决于两个参数,ρ是比电阻,一个材料常数。
图4:阻力公式
纸上的纸张很可能会引发12.5毫米高的长方体的弯曲,这是一个原子的顺序。由此产生的测量条长度的变化也是如此。这足以改变四个测量条在测量桥上的张力,两个在长方体上面,两个在长方体下面,到目前为止,HX711可以得出一个可测量的,最重要的是可重复的电压变化。
图5:HX711 -电路
Micropython -语言-模块和程序
要安装托尼,你会在这里找到一个详细的说明(英文版)。还有一个关于ESP芯片上的Micropython固件(截至2022年6月18日)如何被烧毁的描述。
Micropython是一种解释器语言。Arduino IDE与Arduino IDE的主要区别在于,你只需要在ESP32上闪烁Micropython固件一次,以便控制器理解Micropython指令。您可以使用Thonny,µpycraft或ESPTOOL.PY。对于安东尼,我在这里描述了这个过程。
一旦固件闪过,你就可以很容易地在对话框中与控制器对话,测试单个命令并立即看到答案,而无需事先编译和传输整个程序。这正是Arduino IDE困扰我的地方。如果您可以检查语法和硬件的简单测试,以便在编写程序之前通过命令行尝试和改进函数和整个程序部分,则可以节省大量时间。出于这个目的,我总是喜欢创建小型测试程序。作为一种宏,它们总结了重复出现的命令。然后从这些程序片段开发整个应用程序。
自动启动
如果程序要通过打开控制器自动启动,请将程序文本复制到新创建的空白磁贴中。将此文件保存在工作区的boot.py下,并将其上传到ESP芯片。该程序将在下次复位或开机时自动启动。
测试程序
tony - ide中当前编辑器窗口中的程序通过F5按钮手动启动。这可以比鼠标点击开始按钮或通过菜单运行更快地完成。只有程序中使用的模块必须在ESP32的flash中。
在两者之间,Arduino id ?
如果您以后将控制器与Arduino IDE一起使用,只需以通常的方式刷新程序。然而,ESP32/ESP8266随后忘记了它曾经说过Micropython。相反,任何包含Arduino IDE或AT-Firmware或Lua或…可以很容易地提供micropython固件。这个过程总是像这里描述的那样。
电路
以下是该项目的电路图,它可以自由选择ESP32和ESP8266。选择用于连接HX711的gpio,以便您不会阻碍ESP8266的启动,并且对于两种控制器类型具有相同的名称。只有I2C总线的连接是不同的,但由程序自动分配。
图6:ESP8266上的HX711缩放
图7:HX711在ESP32上的比例
HX711的Micropython模块
与大多数传感器组件一样,HX711模块也需要操作软件。不幸的是,HX711不支持i2c。数据传输也通过dot和dpclk线以串行方式进行。24位加1 ~ 3位,用于通道A或B的选择和加强的设置。MSbit(最高有效位=高质量位)是HX711的第一个位。
用于编程模块hx711。我有这个制造商使用的数据表。
异常类处理HX711不可访问的情况。接下来是HX711类的声明,Devicenotready继承了HX711类。抛出异常后,将生成一个实例,构造函数确保输出错误消息。
我们从几个常数开始。校正系数是用各种已知的按摩片和一个计算工具(例如Libre Office)进行加权来确定的。我一会儿就来。
构造函数接受两个引脚对象dot和pdsk,以及ch中的可选通道。Dout被切换为入口,因为它应该从HX711的结果接收数据。ESP通过DPSCK管理指定速度。我们声明属性channel、tar和cal,然后等待HX711的Ready信号。如果它没有出现,则抛出WAITREADY()一个Devicenotready-Exception。如果它工作,那么我们获得通道和增益设置,并在终端中发出消息。Dictionary Channelandgain将频道号转换为纯文本。
Closure Time-out()实现了一个软件定时器,它不会在程序处于sleep() & Co状态时阻塞程序。返回的函数compare()如果分配了一个标识符来询问传递的时间是否已经以毫秒为单位过期(True)或未过期(false)。
当数据线处于GND电位时,ISDEVICEREADY()方法返回True。根据数据表,这是HX711准备好发送数据的条件。时钟线上的第一个正侧,HX711在DOUT线上提供MSbit。
图8:逻辑2扫描
每增加一个脉冲,比特就依次推出。同时,ESP必须读取和处理线路的状况。ESP通过时钟设定节奏。脉冲序列为125µs,对应的时钟约为。8 kHz。
我用逻辑分析仪和软件logic 2记录了脉冲结果。每当数据传输出现问题时,我喜欢使用DSO(数字存储示波器),或者更小的工具,更便宜的世界逻辑分析仪(La) 8通道。这个东西连接到USB总线,并使用免费软件显示总线管道上正在发生的事情。在脉冲的形状无关紧要,而只与时间顺序有关的地方,LA值千金。虽然DSO只提供曲线的快照,但您可以长时间感受洛杉矶,然后将自己放大到有趣的地方。你可以在Bernd Albrecht的博客文章“逻辑分析仪第1部分:使I2C信号可见”中找到设备的描述。其中还描述了如何扫描I2C总线。
在读取24个数据位后,再使用pdsk发出的一到三个脉冲,即税收位。你的意思是:
图9:控制脉冲的含义
名称是程序,WAITREADY()等待ISDEVICEREADY()的true,但之前在Readydydelay中设置了计时器,即3秒。如果Dout在此期间没有变为low,则会抛出一个devicenotready - exception。如果调用程序不拦截异常,就会关闭它。
HX711将数据作为双补码值发送。Conpricerult()实际上在设置的MSbit(位23)中识别负值。如果设置为2,则第2级是24的第2级减去得到一个真正的负数。
0xc17ac3 = 12679875设置了MSbit
12679875 - 0x1000000 = -4097341
clock()只在PDSCK线上产生一个12.4µs的正脉冲。
忽略channel()无参数,然后该函数传递当前通道和增益值。字典。将译文转换为纯文本。
一旦通道号被移交,我们检查正确的区域,检查HX711是否准备好,然后将相应数量的脉冲推到PDSCK线上,24加上税位。
HX711传递的原始值是由aw()接收的。变为True或根本不传递参数,则返回值为粉红色,即带符号的整数。如果为false,则返回值Bloody,因为它对应于位序列,raw。
我们正在等待HX711的发送,并将接收缓冲区设置为0。
在for循环中,我们在PDSCK上发送23个脉冲。每次运行时,我们都在数据线上的LSBIT(最低有效位=低质量位)的位置,然后将位向左推一个位置。第一个接收到的位移动到位置23,即MSbit。在另一个时钟脉冲之后,HX711将LSbit推到数据线上,我们只在原始的LSbit上或必须。除了竞争之外,下一次测量的税收也必须被记录下来。
为了平滑值的噪声,我们不仅使用单个测量值,而且使用多个测量值的平均值。这就得到了方法mean(),我们把单个测量值的数量交给它。
未受污染的天平自然也提供了ADC值,即塔拉。我们总是在启动称重程序时调用该方法,以便能够将显示设置为0。Tara值在属性self中。保存,以便方法Dimensions()可用,n再次是单个测量的数量。
方法Dimensions()将Tara从测量值中提取出来,然后通过除以校准因子计算出以克为单位的真实测量值。稍后我将说明它是如何确定的。
在校准期间,如果您可以手动处理校准因子,而不必每次都将HX711.PY模块上传到ESP,这将是一个优势。当前值将不带参数返回。
wake up()和tosleep()将HX711从睡眠模式中唤醒,或者将其置于睡眠模式中。线路上的信号顺序由HX711的数据表指定。
用于OLED显示器的大字符集
大数字使测量更容易阅读。我们使用30作为符号,而不是通常的8像素。文件geometer_30。包含相关信息。
因此,您可以从Windows提供的TTF中创建自己的字符集。
下载zeichensatz存档文件。rdown并将内容解包到任意目录中。为了节省小费,我建议在硬盘或存储卡的根路径上放置一个名字简短的列表。对我来说是F: \ fonts。
通过右键单击该目录并按下按钮,在资源管理器中打开该目录下的PowerShell窗口。然后左键点击打开PowerShell窗口。
图10:打开PowerShell窗口
在提示符下输入以下一行,按“Enter”:
.\ Makecharset.bat Britannic 30 "" 0123456789, -+KG "" “F: \ fonts \ sources \”
图11:字符集准备好了
现在目录britannic_30.py中有一个文件,其中包含新字符集的像素数据。仅实现字符“0123456789,-+KG”“”,节省存储空间。您可以从目录源中的Windows字体列表中获取其他签名速率,如上面指定的复制和转换。请注意,文件名指定时没有附加。tttf。
Libra的操作软件
程序scale.py访问四个外部模块,hx711.py,oled.py,SSD1306,这些模块在启动前必须上传到ESP的闪存中。PYand geometer_30.py。
关于变量sys。平台的ESP可以确定它自己。然后将GPIO引脚声明为I2C总线。
我们实例化一个显示对象,删除显示并声明连接到HX711的PIN对象,还有按钮,Tara键的实例。
函数Putnumber()用数字n定位字符的像素模式(基于上面生成的提取,而不是Ascii)。图案左上角的位置在XPOS, YPOS中。
查看文件geometer_30。pyx解释了这个过程。在字符串字符中列出了字符。字符串中的索引是图纸号。因此,“-”号代表数字11,“0”代表数字0。在列表编号中,此编号标识Tupel具有宽度信息和像素矩阵。现在,它被逐行逐列分散,当找到1时设置像素。这是隐藏的。只有当显示值为True Has时,整个缓冲区才会被发送到Display。返回值是下一个自由绘图位置。
图12:符号0的矩阵
绘图位置设置为0,作为开始信息,我给出了一些“-”符号。然后ESP尝试联系HX711。如果成功,我们唤醒它,用增益128通道A,并看到属性self中的TARAWALT。是土地。
如果连接不工作,我们在终端中得到一条消息,并在显示中得到一系列零。
160MHz是ESP8266的最高速度,ESP32也包含240 MHz。
然后进入主循环。我们查看是否按下了Tara键,在显示器上用一系列逗号确认,并获得一个新的Tara值。这个功能是有用的,因为称重单元受到温度漂移和零点可以在任何时候重新调整。
输出的格式字符串由测量值提供。断开显示,将绘图位置删除为0,用逗号小数点,并将缓冲区中的字符写到倒数第二个。
随着最后一个字符的输出,缓冲区内容被发送到显示器。休息半秒后开始下一轮比赛。
校准秤
图13:用于刻度校准的质量块
你需要一些质量片,如果有必要,如果质量片没有校准,还需要一个厨房或字母秤。在这种情况下,你可以做一层厚厚的坚果或螺丝之类的东西。当然,在使用前必须用不同的刻度确定质量。
图14:在ESP8266上校准
现在启动程序缩放。并在主循环中中断Ctrl+C。HX711对象在HX实例化下,可以从终端控制台访问。我们从以下命令开始。
我们从25次单独测量的平均值中减去塔拉值。如果天平没有加载,结果应该在-50…+50之间。
现在我们把大块一块一块地放在一起,分成几组,这样它的压力就会越来越大。每次我们再次启动最后一个命令,并以克为单位写下质量和终端显示的值。
让我们在Libre Office Calc或其他程序中输入,显示测量曲线以及测定(相关系数)和公式。
图15:校准曲线
相关系数R2等于1,这说明了我们测量的精度。我们可以忽略-43的轴截面,…订单是10万件。直线的斜率因子1104是我们追求的标定因子。现在将这个值共享给对象HX。
如果您现在是方法Dimensions() Call up,则值为0.0…应该显示。
佩戴文件hx711.py中的校准因子,将它们上传到ESP并启动程序scale.py new。
如果在戴上重物时显示重物,他们就赢了,可以敲打肩膀。
如果显示的值稍微靠近期望的权重,您仍然可以对校准因子值进行一些修改。如果你放大它,质量值就会下降,反之亦然。
本文编译自hackster.io