这是一款支持 WiFi 的体重秤,主要用于称重食物和追踪卡路里。如果您正在节食,如果您跟踪卡路里摄入量以保持体重,或者如果您正在健身并且只是想通过关注营养来改善您的结果,这将非常有用。
它可以非常精确地称量食物,最高可达十分之一克,计算卡路里能量,在 LCD 上显示此信息,使用 RESTful API,您可以传输重量信息、调整设置或远程控制秤。
我开始这个项目的原因是因为我想帮助我的妻子追踪食物。我们都有 FitBit 智能设备,我们喜欢 FitBit 帮助实现这些目标的方式。他们擅长追踪能量消耗,但不擅长记录食物。由于一些烦人的错误、缺乏功能和不完整的食物数据库,我刚刚创建了一个网络应用程序,我们从那里记录我们的食物,然后通过他们的 REST API 将这些数据发送到 FitBit。基本上我为它创建了一个更好的界面,允许我们创建一个共享的食物数据库。我目前没有使用该网络应用程序来记录我的食物(不再节食),即使我仍然戴着 FitBit 追踪器,但我的妻子喜欢每天使用它(即使她只是想保持体重)。
我们这样做的方法是用传统的厨房秤称重食物,然后将重量手动输入到网络应用程序中。在我们在电话上输入信息之前,我们不知道食物实际含有多少卡路里。所以我告诉我的妻子:“如果我告诉你我可以给你做一个能够将你的食物记录到 FitBit 的体重秤,你会怎么说,这样你就不需要手动输入体重,而且你将能够实时查看卡路里,以便您可以添加或删除东西以将东西控制在预算之内?:)。”最初我还想显示当天消耗/剩余的能量,但我决定在秤 LCD 上包含最少的信息。
我不得不决定是购买一个称重传感器并自己制作外壳,还是购买一个便宜的秤,并将其用于内部的称重传感器和稳定的底座。
我选择购买便宜的秤,其中只保留称重传感器和带按钮的外壳。如果您认为它看起来或效果更好,您可以决定创建自己的案例。我对结果很满意,即使它看起来不太好,但是嘿,这是一个 DIY 的东西......
哦,好吧......你会亲眼看到它的:) 它有一种很好的态度。
开机/关机
右侧有一个机械开/关开关,靠近充电端口。确保它已打开。
您可以通过短按红色(左)按钮打开体重秤。
要关闭电源,请长按黑色(右)按钮至少 3 秒钟。
您也可以从 API 关闭电源。
开机时,标志 LED 亮起,然后在网络连接后变暗到 20% 左右,然后在 5 秒内完全变暗。
省电:自动关机
如果 90 秒不活动,体重秤会自动关机。不活动意味着在此期间未检测到体重变化。此外,作为电池的保护措施,体重秤有一个设置为 5 分钟的通用关机定时器,无论是否处于活动状态。这些计时器可通过 API 自定义。
2022.2 中的新增功能:如果您不构建花哨的闭锁电路,体重秤将关闭其大部分组件并进入深度睡眠以节省能源。使用闭锁电路,一切都会关闭。
收费
该秤包含一块 1000 mAh 可充电锂离子电池。充满电后,体重秤通常可以使用 1-2 个月。LCD 上有电量指示器。当电量低于 15% 时,内部 LED 会持续闪烁,建议将充电器插入右侧 USB 插座。您可以使用任何 USB 充电器,但建议使用 5V/1A 充电器。
该电池应在 1 小时 45 分内充满电。
充电期间,红色 LED 灯会亮起。充满电后,蓝色 LED 灯亮起。
使用USB充电器时有短路保护和过充保护。
最大输入电压:8V(USB 端口的规格为 5V,误差范围为 5%)。
注意事项
锂离子电池可能很危险,尤其是旧电池。如果您发现它有任何变热(甚至不应该变热)或肿胀的迹象,请停止充电并更换新的。您可以用 1000mAh - 2000mAh 电池更换它,对于给定的充电电路永远不会更低。
请勿尝试将USB线插入esp8266的usb口给电池充电,USB线连接esp8266进行调试时,请勿将充电器插入充电口。该端口仅用于调试和编程,并且只能在机械开关处于关闭位置时使用。使用此端口时不要关闭开关,您将为电池提供电流,绕过充电电路,从而防止过度充电,并且很有可能损坏电池。锂离子电池过度充电会引起火灾和爆炸!
即使计算机在 USB 端口上提供低电流(通常为 250mA),所以电流还可以,但电压对于锂离子电池来说太高了(它会在 4.8V - 5V 之间,因为它通过肖特基二极管),而锂离子电池的绝对最大电压应为 4.2V。
联网
该秤可以连接到现有的 WiFi b/g/n 网络,或者在网络设置模式下可以充当热点。
默认网络设置:
当秤启动时,它会尝试连接到最后一个已知网络。LCD 将显示“连接到 ”并显示进度指示器。如果连接成功,您会在 LCD 右上角看到信号强度指示器。连接错误时,会出现带有删除线 WiFi 的指示器。您仍然可以在没有 WiFi 的情况下使用体重秤,但只能在基本称重模式下使用。
网络配置门户
第一次使用时,如果您的 WiFi 或身份验证的 SSID 发生变化,您需要重新配置连接设置。您可以通过双击 Wemos R1 Mini 芯片的重置按钮来启动配置门户。打开体重秤后,您基本上需要以 5 秒的间隔按两次重置按钮。
进入该模式时,秤的标志 LED 灯会闪烁两次,并在屏幕上显示“ Configure me ”。
要使用配置门户,请连接到体重秤创建的公共“Healthzuilla-Scale”WiFI 网络。然后访问入口:http: //192.168.4.1
如果您不配置秤,则使用门户有 5 分钟的超时时间。
从配置门户中,您可以选择 SSID、设置密码和身份验证类型。每次更改设置时,都会打开 DHCP 客户端。您需要使用 API 通过将useStaticIP设置为false和静态 IP 配置来禁用 DHCP。
之前的静态 IP 设置被禁用并启用 DHCP 以便能够连接到该网络,因为它可能与您已有的 IP 设置冲突。连接后,建议设置一个静态 IP,这样您就知道如何使用 API 访问秤。或者您可以指示路由器始终为秤的物理网络地址分配相同的 IP。
使用体重秤
体重秤开机后,当体重秤完成初始化,显示屏显示 0g 时,将物品放在绿色称重区。重量以 1 秒的间隔采样并显示在显示屏上。
要让秤同时显示体重和卡路里,请使用 API 发送食物信息。电子秤会实时显示食物名称、重量和卡路里。秤会记住食物,直到断电或您发送另一个食物信息。
去皮功能
例如,当一个空容器放在称重平台上时,去皮功能会重置秤显示器的零位,以便随后仅显示容器内容物的重量。这实际上是通过将当前秤上的内容归零来工作的,因此您可以在向同一接收者添加不同食物时使用此功能,但想要单独称重它们。
秤总是从去皮开始,所以如果你在开始秤之前放置一个空盘子,它会显示 0。
显示背光
LCD 背光根据环境照明自动控制。秤正面有一个传感器,在按钮按钮的左侧。
这个项目需要良好的焊接技能、一些创建更简单电路的背景、对电子学的基本了解以及一些 Arduino IDE 的经验。如果您是新手,我建议您先尝试一个更简单的项目,以掌握它的窍门。
电源电路
我建议在电池的正极线上安装一个机械开关,以防您想切断电池的电源。该电路依赖于一个软开关(一个按钮),因此秤能够自行关闭。仅使用机械开关,这是不可能的。
来自电池的电流由一个 47uF 大容量电解电容器 (C2) 和一个 100nF 去耦陶瓷电容器 (C1) 过滤,它们都与电池的输入并联 大容量电容器非常重要,因为它就像一个能量库对于饥饿的 esp8266 芯片,在启动时是必不可少的。esp8266 在启动时会产生 70-150 mA 的突发电流,并可能产生 300-400mA 的尖峰电流。结果,稳压器输入端的电压下降。如果电压下降太多,则可能会导致掉电。大容量电容器将平滑这些尖峰并避免稳压器输入端的电压下降,从而为稳压器提供能量缓冲。较小的陶瓷去耦电容器有助于消除 WiFi 操作产生的高频噪声,并在这些情况下提供更快的响应。
在稳压器输出端,即 HX711 和 LCD 输入端,使用了两个去耦陶瓷电容器,一个为 100nF (C4),另一个为 10nF (C5)。它们有助于隔离这些组件,尤其是应获得稳定电压的称重传感器放大器 (HX711),并且它们抑制试图覆盖更广泛频率范围的高频噪声,并在需要时提供即时能量储备。
软锁存电路采用1个P沟道场效应管(NDB6020P)-Q2,1个N沟道场效应管(2N7000)-Q1,2个10K电阻(R1和R2)。
您可以使用任何 P 通道逻辑电平 Mosfet 代替 NDB6020P,能够在 -3.3V 时提供至少 500mA 的电流。这个额定电流高达 24 安培,所以有点笨重,但没有更小的。您也可以用类似的 N 通道 Mosfet 甚至 NPN 晶体管替换 N 通道 Mosfet。如果换成三极管,通过10K电阻连接三极管的基极,限制基极电流。使用 Mosfet 的优点是功耗低得多,但它只在秤打开时消耗电流
Wemos D1 Mini 由用作开关的红色(左)按钮供电。一旦启动,它将数字引脚 GPIO16 设置为高电平,将 3.3V 馈入 N 沟道 Mosfet 栅极,从而使电流从漏极流向负侧的源极。Q1 的栅极被 R1 下拉,因此 FET 最初不导通。这使得 Q2 在漏极和源极之间导通,因为 Q2 的栅极现在被拉到地。Q2 是一个 P 沟道 Mosfet,工作方式相反——默认情况下它被 10K 电阻 R2 拉高,并且只允许电流在没有电压施加到它的栅极时流动。
微控制器可以通过将 GPIO16 设置为低电平,从 Q1 栅极移除电压,Q1 现在被 R1 拉低,从而中断到 Q2 栅极的接地路径,Q2 再次被 R2 拉高。
实体按键
秤有两个物理按钮。还有一个开关用于中断从电池到连接板的电源。
位于左侧的第一个按钮无法使用微控制器读取。它仅用作电源开关。微控制器上电后,该按钮没有任何作用。我更喜欢一种简单的方法,我通过一个按钮打开电源,然后通过软件或通过读取另一个按钮来关闭电源。您可以在长按时按下/关闭按钮,但需要更复杂的电路。
右侧的第二个按钮具有双重作用:
与尝试重复使用“开”按钮相比,将开和关按钮分开对我来说更容易。
基本上只有第二个按钮被微控制器读取。为了区分短按和长按,我只存储按钮改变状态的时间,并测量是否有足够的时间考虑长按(3 秒)。您可以研究在 loop() 中执行的函数handleTareButton()中的代码。
秤校准
在做任何事情之前校准秤非常重要。为此,使用了所谓的校准因子。如果您将秤置于校准模式,则此校准系数可由秤确定。要将秤置于校准模式,请使用 HTTP API:
校准模式会要求您在秤上放置一个已知的重量。一旦检测到重量,它就会计算校准系数,应用它,将其保存到 EEPROM 中以备下次启动时再次使用。
已知重量设置为152g。这可能听起来很奇怪,但这实际上是我的三星 S7手机的重量。使用手机本身来校准秤非常方便。该值取自规格(我猜他们已经用校准秤测量了该值:))并且我通过称重几个硬币来确认校准正确。硬币也是可以作为校准砝码的东西,因为它们都有官方的重量,但是你需要一串硬币至少称重 50 克才能进行一种准确的校准。
阅读重量
为了测量重量,我们需要两个组件
使用的这种直杆称重传感器的额定重量为 5 千克,这意味着它可以将高达 5 千克的压力(力)转化为电信号。称重传感器能够测量响应于应变(例如压力或力)并与其成比例变化的电阻。
为了能够读取这些微小的电阻波动,您需要非常精确且昂贵的仪器,或者像 HX711 这样的优质放大器,它可以将这些微小的变化转化为可读的内容。
读数应该非常准确,因为使用的称重传感器放大器 (HX711) 包含一个 24 位 ADC。要获得准确的结果,请确保秤具有稳定的底座。您可以使用橡胶腿。
从称重传感器上的惠斯通电桥引出的四根电线通常是:
从我使用的廉价秤中出来的白色和蓝色电线实际上是颠倒的,但我注意到这是因为它们在现有 PCB 上的标签。
我读过 HX711 在 5V 下工作得更好,但在 3.3V 下我得到了令人满意的结果。您的模块可能具有用于模拟和数字电源的专用电源输入,例如来自 Sparkfun 的模块。这种分离允许用 5V 为模拟部分供电,用 3.3V 为逻辑部分供电,因此您可以使用 3.3V 微控制器。我的模块没有这些选项。
标有DAT或DOUT和CLK的引脚可以连接到任何数字引脚。我使用GPIO5作为DOUT ,GPIO4作为CLK。
使用的库应该负责通信。我使用bogde/HX711作为库,大多数人都在使用
经过几次试验,我能得出的最好的读取体重的算法是:
您可以研究函数readScale()中的代码。
您可以使用 API 检索重量:
读取电池充电状态
锂离子电池的充电状态是根据电压计算的。我为不同的电压值组装了稳定的充电百分比。你会在网上找到不同的表格,或多或少准确,我所做的是查看锂离子电池数据表中的 SoC 与电压曲线,并尝试遵循它。可以通过研究代码 ( getLiPoBatteryLevel())找到转换表。
您不能直接读取电池电压,但可以使用 ADC(模数转换)来获取已知间隔内的值。ADC 只能读取特定范围内的电压,因此如果读取电压高于 ADC 范围,则必须使用分压器将其缩小以适应范围。
ESP8266 有一个 10 位 ADC 引脚。1 伏特是内部 ADC 的最大输入,原始读数为 1023。Wemos D1 Mini 已经在 ADC 引脚上包含一个分压器。这是 100 k 电阻上的 220 k 电阻。只要电压低于 3.3V,您就可以将电池直接连接到裸露的 ADC 引脚。
但是充满电的电池的 4.2V 超出了裸露的引脚所能承受的范围。通过在电池正极端子和 ADC 引脚之间连接一个额外的 220k 电阻,由于存在分压器,我们将在暴露引脚上获得小于 3.3V 的电压,在 ESP8266 的 ADC 引脚上获得小于 1V 的电压。
通过添加一个 220k 电阻,实际上总电阻为 220k + 220k + 100k = 540k。因此,如果充满电的电池电压为 4.2 伏,则 ESP8266 的 ADC 将获得 4.2 * 100/540= 0.77 伏,当 ADC 为 1V 时允许输入电压高达 5.4V,因此输入引脚和 ADC将在过电压(施加直接 USB 电压)的情况下受到保护。
我在 ADC 引脚和地之间添加了一个 100nF 的陶瓷电容器,以平滑读数并降低噪声。我只是在草图开始时取了 1 个样本,然后将其乘以一个已知的校准因子,因为读数非常稳定。如果您的读数不同,您可以尝试使用更大的电容器,读取多个样本并取平均值。但是如果你有噪音,你应该首先检查连接并确保你有短线(如 10cm)以最小化电感。
诺基亚5110 显示屏
这些旧显示器仍然在那里。诺基亚 5110 LCD 是一个 84 x 48 像素的单色显示器,它很便宜并且可以很容易地与 Adafruit GFX 库一起使用。它可以让您显示文本、形状和单色图像。它还具有 LED 背光。在没有背光的情况下,它仅消耗 6-7 毫安。
LCD 需要从 2.7 - 3.3V 供电。背光由 4 个 LED 组成。我不能让那些 LED 在我的模块中消耗超过 20mA。它可以有一个限流电阻,或者它们可以有更高的正向电压。一些模块声明它们可以使用高达 100mA 的电流,这确实是可能的,因为典型的白色 LED 可以消耗 30mA,所以看到背光消耗 120mA 我不会感到惊讶。与显示器所需的 6-7mA 相比,您应该注意这一点。这就是为什么在电池供电的设备上我只会在需要时打开背光灯。
我看到一些模块要求 LED BLT 引脚为逻辑低电平。这就是为什么您应该始终阅读数据表,如果它直接需要电源,请始终放置一个限流电阻。例如,为了安全起见,我使用了一个 22 欧姆的电阻器。
此 LCD 中内置了飞利浦 PCD8544 显示控制器,可将原始 LCD 的大量并行接口转换为更方便的串行接口。PCD8544 通过类似于SPI 的同步串行接口进行控制。有时钟 ( SCLK ) 和数据 ( DN ) 输入线,以及低电平有效的片选 ( SCE ) 输入。
在这三个串行线之上,还有另一个输入——D/ C——它告诉显示器它接收的数据是命令还是可显示数据。
对于数据传输引脚——SCLK 和 DN(MOSI)——我使用了 Arduino 的硬件SPI 引脚,这将有助于实现更快的数据传输。片选(SCE)接地,复位(RST)通过一个10K的电阻连接到Wemos R1 Mini复位管脚,以便微控制器复位时复位显示。数据/命令 (D/C) 引脚可以连接到任何数字 I/O 引脚,因此我使用了通常用于 SPI MISO 的GPIO12 ,未使用,在 D1 Mini上标记为D6 。
Sparkfun 创建了一个关于使用此 LCD 的精彩教程。
汽车液晶背光
由于背光 LCD 可能很耗电并且并不总是需要,我创建了一个电路来根据光照条件调整背光。
我使用的自动背光电路由一个 NPN 晶体管、一个 LDR(光敏电阻)和两个电阻组成。使用的NPN三极管为2N3904 ,可提供200mA电流。由于所需的电流很低,您有很多选择可以用任何 NPN 晶体管替换它。在此设置中,NPN 没有像通常用作低侧开关那样使用,而是用作高侧开关。由于 BLT 引脚需要正电压才能打开,因此无法在低端使用它(负馈电),因为接地已经连接到模块上
没有LDR,电路使背光完全点亮。使用 LDR,晶体管基极将获得或多或少的电流,这取决于 LDR 获得多少光,因为 LDR 电阻随着光从黑暗中的非常高的电阻降低到光线中的非常低的电阻。晶体管基极在光照环境下会获得非常低的电流,因为大部分电流会流过 LDR 的电阻较小的路径,因此从集电极到发射极(3.3V 到 BLT 引脚)的电流会很低,并且背-光线会非常暗或关闭。在较暗的环境中,LDR 电阻增加,允许更多电流到达晶体管的基极,从而允许更多电流从集电极传输到发射极(3.3V 到 BLT 引脚)并点亮LED。
我选择了从 3.3V 到晶体管基极的固定 1K 电阻,以及从发射极到 BLT 的 22ohms 保护电阻。保护并不是真正必要的,但始终建议在 LED 之前使用电阻器。
标志灯
每个产品都需要一个标志,还有什么比发光标志更漂亮的呢?
为此,我只是在Wemos D1 Mini上使用了标记为D3的GPIO 0 ,当徽标应点亮时将其设置为高电平,当徽标应关闭时将其设置为低电平。我还使用 PWM 和 analogWrite 将其调暗。当然,我加了一个几欧的保护电阻(我实际用的是1.2ohm,但是如果你不确定led的正向电压,我推荐一个更大的,比如22ohm)来保证led的安全。
GPIO 0 是 ESP8266 的一个特殊引脚,用于启动过程,因此它在启动时始终为高电平,但这完全没问题。启动后,您可以将其用作输出并随心所欲地使用它。
图书馆
RESTful HTTP API 可在http://healthzuilla-scale.local/api/
或通过 IP 在http://
healthzuilla-scale.local
由于秤上安装了 mDNS 响应器,因此可以正常工作。有些设备可能无法识别此主机名,例如 Android 设备,因为它们缺乏 mDNS 支持。在这种情况下,使用 IP 地址
不支持 SSL
在 v 2022.2 中尝试使用自签名的 2048 位证书,但事实证明即使在 160 Mhz 时钟下,这对于 ESP8266 芯片来说也太慢了。所以此更改已在 v 2022.3 中恢复
API 接收表单编码的输入参数。卷曲示例:
curl -XPATCH /api/settings --data "
useStaticIP=1&ip=192.168.1.11"
成功的 POST/PATCH 操作返回 HTTP 状态代码 200 和如下所示的 JSON:
{"success": true}
失败的请求返回一个非 200 的 HTTP 状态代码和一个带有两个键的 JSON 对象:
错误:bool (始终为真)
消息:字符串
例子:
{"error": "true", "message": "Invalid voltage. Must be between 3 - 4.35v"}
以下所有路径均与秤 IP 地址相关。
设备接口
检索信息
GET /api/device/info
示例响应:
{
"battery":{
"voltage":4.09,
"chargeLevel":90
},
"network":{
"deviceMac":"84:F3:EB:B3:86:75",
"ip":"192.168.1.11",
"subnetMask":"255.255.255.0",
"gateway":"192.168.1.1",
"dnsIP":"192.168.1.1",
"SSID":"tplink-est",
"BSSID":"64:66:B3:64:1D:A9",
"signalStrength":-71
}
}
校准ADC
POST /api/device/calibrate-adc
校准内部 ADC 以读取电池电压。为此,您需要将测得的电池电压作为参数发送。
必需的参数:
电压值必须介于 3 和 4.35 之间float
关机_
POST/api/device/poweroff
重置
POST/api/device/reset
确保在进行软重置时按住电源按钮,否则它会在重置过程中自行断电。如果您正在使用插入 Wemos D1 Mini 的 USB 电缆调试体重秤,这仅在不按下按钮的情况下有效。
设置接口
检索设置
GET /api/settings
示例响应:
{
"useStaticIp":true,
"ip":"192.168.1.11",
"gateway":"192.168.1.1",
"subnetMask":"255.255.255.0",
"zeroFactor":131702,
"calibrationFactor":414.19,
"calibrationWeight":152.00,
"powerOffTimerSec":300,
"idlePowerOffTimerSec":90,
"voltageCalibrationFactor":0.005226
}
带有 curl 的示例请求:
$ curl -XPATCH
http://192.168.1.11/api/settings
--data "useStaticIp=1&ip=192.168.0.10"
更改设置
PATCH /api/settings
比例函数 API
校准秤
POST /api/calibrate
启动交互式校准模式。秤会要求您放置一个已知的重量,然后它会自动校准。
检索上次设置的食物 ID 的重量
GET /api/weight
回复:
{
“foodId”:123,
“weight”:90.5,
“unit”:“g”
}
设置食物信息
POST/api/weight
必需的参数:
foodIdstring
一个唯一的 id 来识别这个食物
名称string
在秤 LCD 上显示的食物名称
卡路里热量float
/100g
样品要求:
curl -XPOST
http://192.168.1.11/api/weight
--data "foodId=123&name=Banana&calories=89.2"
皮重
POST /api/tare
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !