本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于称重传感器的垃圾桶监测网络系统—CheckBin

发布时间:2022-05-19
分享到:

基于称重传感器的垃圾桶监测网络系统—CheckBin

发布时间:2022-05-19
分享到:

通过智能设备网络,我们可以监控垃圾桶的填充水平,以实时了解情况。

背景

许多大城市的垃圾管理的主要问题是垃圾箱溢出。这带来了留在街道上的垃圾、难闻的气味、野生动物漫游和厌倦的市民。这是垃圾收集公司在经济和后勤方面(员工时间和垃圾车)对资源使用效率低下的结果。例如,通常的取货路线会清空尚未装满的垃圾箱,而缺少装满的垃圾箱。

物联网可以帮助解决这个问题,而无需雇用新工人或购买新卡车,这将为公司带来更多的长期开支。

通过智能设备网络,我们可以监控每个垃圾桶的填充水平并汇总这些数据,以生成有关城市垃圾箱实时情况的集中和完整的信息。利用这些知识,公司可以根据垃圾箱的填充水平规划有效的取货路线。他们还可以对收集的数据进行统计分析,以根据实际需要调整每个区域的垃圾箱数量。

原型
为了亲眼看看我们的系统如何在真实的垃圾箱上实现,我们构建了一个原型。从标准箱开始,我们使用热胶和一些 3D 打印部件放在箱上:传感器、执行器和电路板。您在这些照片中看到的是最终结果:

我们使用了以下组件:

  • LoRaWAN 兼容 STM 板:STM32L0 探索套件 LoRa、Sigfox、低功耗无线。该模块由 STM32L072CZ 微控制器和 SX1276 收发器供电。该收发器采用 LoRa 远程调制解调器,提供超远程扩频通信和高抗干扰性,最大限度地降低电流消耗。在城市里应该有一些 LoRaWAN 网关来接收垃圾箱发送的所有信号。要允许通信,必须在 main.h 文件中设置以下参数:dev_eui、app_eui、app_key。
  • 超声波传感器:测量垃圾箱中的占用体积。我们使用超声波传感器作为测量垃圾箱填充水平的主要方式。在原型中,我们只使用了一个传感器,但我们决定每次采取 3 次措施,超时时间为 30 秒。通过这种方式,我们可以丢弃在垃圾箱打开时进行的测量。使用更多的超声波传感器将提高测量的准确性,但意味着整个系统的传感器能​​量消耗的线性增加。
  • 称重传感器和称重传感器放大器:测量垃圾箱中垃圾的重量。为了检测超声波传感器读取的数据中的异常情况,我们使用称重传感器。结合基于收集数据的统计数据,我们可以比较垃圾箱中的占用体积和重量,以了解超声波测量是否存在异常。要根据超声波测量估算重量并估算最大重量,必须在 main.h 文件中设置以下参数:垃圾箱高度(cm)、垃圾箱底面积(平方米)、废物类型(塑料、金属、玻璃、纸张、食品、混合)。
  • 按钮:当箱子被锁定时打开箱子。
  • OLED 显示屏:向市民显示填充水平。OLED 显示屏将向市民提供有关填充水平的信息作为反馈。它与进度条一起显示数值。通过这种方式,他们可以更多地参与流程并承担责任。
  • 步进电机:装满时锁定仓口,清空时解锁。

接线

所有组件的接线如下图所示:

逻辑
RIOT 代码实现了在 LoRa 板上执行的逻辑计算。在主函数中,它初始化传感器、执行器、LoRa 通信参数和处理按钮的线程。然后它开始一个循环,该循环交替一个活动阶段和一个睡眠阶段。

在活动阶段,代码执行以下操作:

  • 超声波传感器进行 3 次测量,超时 30 秒
  • 在三个值中排除最终的异常并选择相关的一个
  • 然后它将其转换为 0 到 9 之间的填充水平,知道垃圾箱的高度
  • 称重传感器用于获取垃圾箱内垃圾的重量
  • 根据填充水平和垃圾类型,它计算估计的重量
  • 它还根据垃圾箱的高度、底面积和垃圾类型计算最大重量
  • 如果填充水平低于 8 但重量超过最大值(有 20% 的余量),我们就有异常;它向云端发送填充级别 9 以通知垃圾箱必须清空,但它不会关闭垃圾箱。
  • 否则,如果填充水平与之前的测量值不同,它会将填充水平发送到云端并更新 OLED 显示屏上的值。然后它还会检查:
  • 如果在料位大于或等于 8 时重量低于估计重量(余量为 20%);在这种情况下,它会使垃圾箱保持打开状态
  • 否则,如果填充水平大于或等于 8 且重量一致,则关闭垃圾箱
  • 否则它会打开垃圾箱

此外,一个单独的线程用于使用按钮处理垃圾箱的打开:

-如果按下按钮并且垃圾箱被锁定,则垃圾箱被打开。

网络图:

云:

项目的云部分由以下元素组成:

  • 物联网
  • AWS 物联网核心
  • AWS Lambda 函数
  • AWS DynamoDB
  • AWS 放大
  • 谷歌地图提供的 API。

板子发送的消息格式如下:fill_level.

数据库由一个表组成binTable(DevEUI, id, lat, lng, last_fill_level, last_fill_timestamp),其中:

  • 分配给设备的 DevEUI 用作表的主键;
  • id 用于标识 web 仪表板上的 bin;
  • lat 和 lng 是 bin 所在的地理坐标;
  • last_fill_level 是从电路板收到的最后一个填充水平;
  • last_fill_timestamp 是接收到最后填充水平的时间戳。

作为表的主键,我们决定使用分配给每个 bin 的 DevEUI。通过这种方式,我们可以使用在交换中自动发送的信息立即将接收到的消息关联到相应的 bin,而无需在消息负载中添加更多信息。我们还选择使用 ID 以更简单的方式识别 Web 仪表板中的垃圾箱。由于垃圾箱通常彼此靠近,垃圾车司机可以使用 ID 来了解需要清空哪个垃圾箱。显然,id 应该写在物理 bin 上。

消息路径:

当包含填充水平的消息发送到物联网 (TTN) 中的 LoRa 网关时。TTN 将传入消息中继到 AWS IoT Core 中的 MQTT 代理。一旦 IoT Core 在代理上收到一条新消息,它就会使用其规则引擎调用 Lambda 函数“writeBinTable_v2”。此函数更新 DB 中与刚刚到达的消息中具有相同 DevEUI 的元组。

网页界面:

用户与 AWS Amplify 交互以获取静态内容。客户端浏览器上的页面完全加载后,它会运行 javascript 代码生成带有标记的地图,其中包含垃圾箱所在的位置。用户现在可以单击标记来查看容器 ID、最后一个填充水平以及检测到最后一个填充水平的时间。

从 Web 界面,用户还可以通过填写纬度和经度字段并单击“添加箱”按钮向系统添加新箱。它调用“addBin_v2” Lambda 函数的函数 URL,该函数在“binTable”中创建一个新元组,并将新的 bin id 返回给用户。

此外,用户可以通过在相应字段中插入 id 然后单击“删除 bin”按钮从系统中删除一个 bin。通过这种方式调用 Lambda 函数“deleteBin”,并从数据库中删除与指定 bin 的 id 关联的元组。

存储在数据库中的所有数据也可以通过 REST API 访问,以简化与垃圾收集公司现有管理系统的集成。

要求:

  • 灌装液位的准确度误差不得超过10%;
  • 填充水平的更新必须在实际更改后的 2 小时内显示在仪表板中;
  • 该系统必须在至少一年内保持能源独立;
  • 垃圾箱容量减少不得超过 5%(重量和体积);
  • 系统必须符合 LoRa 占空比限制;
  • 错误液位测量值与总液位测量值的比率必须小于 5%。
  • 这些要求是对观察到的现实世界做出合理假设而设定的。

能源消耗
我们面临的一个主要限制是能源消耗。考虑到以下能源使用情况,我们希望系统至少在一年内保持能源独立:

  • OLED 屏幕将始终亮着,并且会在每次填充量变化时更新。
  • 仅当垃圾箱已满或最近清空时,才会激活步进电机。
  • 传感器将以预定义的时间间隔激活。超声波传感器将以 30 秒的间隔采取三项措施,以放弃在垃圾箱打开时采取的最终措施。称重传感器也将被激活以读取值。

采样频率分析

该项目的关键方面之一是采样的频率。周期性传感是能源消耗和数据可用性之间的良好折衷。也可以定制测量之间的间隔,在开发过程中,我们为我们的应用程序选择 1 小时的间隔。使用更大的间隔,我们将失去检测填充水平何时变化的准确性。此外,我们需要有足够的最新更新,以便卡车能够以现实主义的视角来规划他们的路线。

无线电使用分析

对能源消耗有很大影响的第二个方面是无线电的使用频率。我们选择在每次填充水平变化时进行传输:通过这种方式,我们进一步降低了能源消耗,而不会丢失任何有关垃圾箱状态的相关信息。当在超声波测量的液位测量和称重传感器测量的重量之间检测到异常时,天线也会被激活。在这种情况下,它将用于通知异常,将最大填充水平发送到云以通知必须清空垃圾箱。

总之,我们选择每隔一小时检测一次,并在每次垃圾箱填充水平发生变化或出现异常时发送数据。通过这种方式,我们还可以遵守 LoRa 占空比限制(在欧洲,它们受 ETSI EN300.220 标准监管)以及填充液位变化与仪表板中可视化结果之间的延迟要求。

测得的能耗

我们使用万用表和INA219来测量我们系统的能耗。此外,我们使用 IoTLAB 来测量我们使用的板在发送 LoRa 数据包期间的能耗。

  • 76.3mA 唤醒期间的能耗
  • 48.2mA + 6.1mA 板卡能耗 + OLED 显示屏
  • + 8.2mA 激活传感器和计算液位的能耗(总计 62.5mA)
  • + 34.5mA 使用 LoRa 传输数据的能耗(总计 88.8mA)
  • + 90.7mA 步进器能耗(总计 145mA)

测量的消耗可以在下图中可视化:

通过使用 INA219、Arduino UNO 和 Adafruit INA219 库,我们获得了运行系统能耗的更精确测量结果:

电池

为了给系统供电,我们必须使用电池,因为没有基础设施来保持设备的插入。考虑到测量的能耗和要求,我们需要一个 500A 的电池而不使用充电方法。搜索这种电池,我们发现它们的重量不少于 35 公斤。考虑到容量小于 500 公斤的标准箱,该电池将违反有关减少容量的限制。考虑到这个结论,我们必须实施某种收费方法或放松约束。

传感器精度

填充水平的精度取决于料仓的高度。填充水平是 0 到 9 之间的一个值,计算为fill_level = 9-(10*distance/max_distance)。fill_level*max_distance/10因此,填充水平的每一步都将代表和之间的垃圾高度值(fill_level+1)*max_distance/10。因此,我们的固有误差百分比最大为总高度的 10%,这符合有关填充水平精度的要求。

我们根据我们使用的转换公式测量了称重传感器的精度。从我们所做的测试中,我们发现了 2% 的错误,这是可以接受的。比较代码中的权重时使用的 20% 余量也抵消了这一点。

我们进行了一些测试来评估系统的准确性。总测量:40。检测到的异常:2。未检测到的异常:1。

填充水平的准确度:92.5%。我们希望随着样本数据集的增加,准确率会提高,从而符合错误率的要求。

网络使用

关于数据包和有效负载大小的注意事项

考虑到我们的实现,我们发送了一个负载为 1 字节的 LoRa 消息。考虑到一个 LoRa 数据包使用 13 个字节作为标头(根据我们使用的规范 1.0.2),总数据包大小为 14 个字节。已知扩频因子为 7,区域为 EU868,带宽为 125kHz。使用这些信息和 The Things Network 本身提供的计算器(您可以在此处找到),我们得出一个数据包的空中时间为 43.6 毫秒。这是一个很小的时间段,至少就我们在项目中考虑的时间间隔而言(bin 每小时测量一次)。

在项目开始时,我们考虑发送具有 7 个字节的更大负载的数据包,这样我们也可以在消息中发送 bin 的 ID。即使播出时间仅略微增加至 56.6 毫秒(我们的情况允许的时间段),我们也选择仅发送表示填充水平的单个字节。做出这个选择是因为没有理由将垃圾箱的 ID 发送到云端。实际上,数据是使用 DevEUI 而不是 ID 处理的,并且默认情况下该信息已经存在于数据包中。

关于延迟的注意事项

在我们的用例中,谈论整个系统的延迟没有多大意义,特别是如果我们考虑到 bin 中的测量间隔可能由使用机器学习计算的模型控制。

相反,需要考虑的一个更相关的方面是电路板开始测量与数据可供最终用户使用之间的延迟。这个时间间隔由三部分组成:

  • 板上时间(TBoard):计算填充水平和发送消息所需的时间;
  • Time on Air (TAir):消息从电路板传送到 LoRa 网关所需的时间;
  • 云处理时间 (TCloud):在云上处理数据所需的时间(我们还包括 TTN 将消息发送到 AWS IoT Core 所需的时间)。

更详细地说,我们有:

  • TBoard = TUltrasonic + TLogic 其中 TUltrasonic 是执行超声波测量所需的时间,TLogic 是执行填充液位计算和发送消息所需的时间。

在我们的例子中,我们有:

  • TUltrasonic = 60s,因为系统执行 3 次测量(每 30 秒一次),因此我们在 t=0、t=30s、t=60s 时进行测量;
  • TLogic = 0.05s 经验数据告诉我们,板子计算填充液位并发送它的时间不超过 50ms;
  • TAir = 0.05s 使用 The Things Network 计算器我们知道理论上播出时间为 43.6ms,为了应对最终的延迟,我们假设为 0.05s;
  • TCloud = 2s 显然我们无法控制这方面,但经验数据告诉我们它不会超过 2s。
  • TBoard + TAir + TCloud = TUltrasonic + TLogic + TAir + TCloud = 60 + 0.05 + 0.05 + 2 = 62.1s ≃ 62s

这可以在下图中以图形方式看到:

可扩展性

为了确保我们的系统能够在现实世界环境中工作,我们还测试了它的可扩展性。我们在我们的城市中选择了一个街区,并在数据库中为每个垃圾箱创建了一个实体。

我们使用 IoTLAB 并创建了一个实验,在 Saclay 站点上保留 12 个板 b-l072z-lrwan1。

我们编写了一些 RIOT OS 代码来连接 LoRa 网关,反复生成随机填充级别并将它们发送到云端。该代码使用不同的 DevEUI、AppKey 和 AppEUI 编译并在每块板上刷新,它们链接到数据库中的不同 bin 实体。实验顺利进行,证明我们的系统能够支持更多的设备。

在这里您可以看到记录的实验的摘录:

从这个项目中,我们意识到我们不能使用 WebSocket 技术在每次垃圾箱发送其填充水平时更新仪表板。由于垃圾箱数量众多,Web 仪表板无法跟上所有更新并不断刷新。此外,我们意识到云必须向每个打开的仪表板发送大量消息。分析我们的应用程序,我们意识到不需要这样的功能。实际上,从填充水平的变化到云上更新的延迟可能长达 1 小时。所以没有理由在仪表板中实现低延迟机制。最后我们决定强制 Web 界面每 10 分钟更新一次,以免请求使云过载。

未来可能的技术改进计划:

边缘计算

我们可以使用边缘来运行机器学习算法,该算法学习和调整一些相关参数,例如测量间隔或每种废物类型的特定权重。为了实现所提出的目标,边缘计算是最佳选择,因为电路板没有足够的计算能力或能量来运行复杂的算法。此外,网关已经拥有必要的数据,并且可以与板通信以发送新参数。关于云的可能用途,测量间隔是与 bin 严格相关的参数,将参数发送到云进行计算是没有意义的,因为不需要聚合数据。

用电子墨水显示屏取代 OLED

为了进一步降低能耗,我们可以用电子墨水显示屏代替 OLED。仅当值更新时,这种显示才会消耗相关的能量。事实上,在待机期间,它们的能量消耗可以忽略不计。考虑到我们系统中显示的更新频率,电子墨水选项可能更合适。

充电方式

我们可以添加一块太阳能电池板来减小所需电池的尺寸并延长使用寿命。由于标准箱的大小,我们在找到添加面板的空间时不会有任何问题。评估文件中的更多细节。

另一种选择是使用用户踩下踏板提供的能量来打开垃圾箱。这种机械能可以使用发电机转换成电能。但是,即使这个动作的频率很高,每次产生的能量也无法支撑整​​个系统的消耗。

本文中所用到的一些代码

如果您对此项目有任何想法、意见或问题,请在下方留言。

以上内容翻译自网络,原作者:Andrea Mazzitelli,如涉及侵权,可联系删除。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论