×

智能垃圾管理开源硬件

消耗积分:0 | 格式:zip | 大小:0.02 MB | 2023-02-01

李志静

分享资料个

描述

现在是时候写下智慧城市的定义了。与其祖先一样,智慧城市现在具备成为现实的所有因素。从农业革命和后来的工业革命中发展起来的城市受到类似因素的驱动——人口增长和技术进步促进并推动了生活条件的改变。现代城市也有这些相同的因素,但规模要大得多;如前所述,全球人口呈指数级增长,我们需要应对的方法。

人口对资源的压力是使我们当前的城市模型更加智能化的一个主要因素。而且,这样做的技术最终以超连接、改进和更便宜的传感器、人工智能和数据分析的形式出现。这里的线索就在数据中;数据是现代智慧城市的新能源。数据,或者更确切地说,对这些数据的分析和应用,将成为智慧城市发展的支点。因此,智慧城市应该结合多种技术来改善城市的重要方面和任务,例如监测水和空气、废物管理、停车、照明和车辆。

在这个项目中,我们专注于借助智能垃圾箱和 IOTA tangle 改善一个地区(包括许多智能城市)的智能垃圾管理,以加快智能垃圾管理的进程,减少拥堵、污染,并帮助改善能源优化。

废物管理的主要问题之一是未优化的垃圾收集卡车路线。未优化的卡车路线会导致使用过多的燃料并在人口稠密的城市造成拥堵。此外,有些垃圾箱可能会因此而被装满而其他垃圾箱则可能因此而装满。所以我们真正要解决的是垃圾收集车路线的优化,以避免拥堵和过度使用燃料。

这就是该项目的运作方式。我们在垃圾箱中连接填充液位传感器,持续监测垃圾箱内的填充液位。在每天早上的固定时间(比如早上 7 点),数据会上传到 tangle。垃圾车司机能够使用合适的设备从节点检索数据,并且他可以优化卡车路线。

硬件组件

iota_6j37c6c23f_XtUnIfLkVn.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
硬件设置
 

1.红外接近传感器

可以使用下图解释红外传感器作为物体检测传感器的原理。红外传感器由红外 LED 和红外光电二极管组成;它们一起被称为光电耦合器或光电耦合器。

当 IR 发射器发射辐射时,它会到达物体,并且一些辐射会反射回 IR 接收器。根据 IR 接收器的接收强度,定义传感器的输出。

ir-sensor-working_x5xOvm0HXa.png?auto=compress%2Cformat&w=740&h=555&fit=max
红外传感器工作
 

IR 接近传感器用作液位传感器。接近传感器放置在垃圾箱顶部附近的垃圾箱内。

iota2_h997fuo3ck_RlvD8tLLOi.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
带液位传感器的垃圾桶
 

一旦垃圾箱装满,传感器返回 1,否则返回 0。(超声波传感器可以代替使用并且被广泛使用。为简单起见,我们使用 IR 接近传感器。)

2.树莓派

树莓派是用于将数据发布到 tangle 的板。对于每个垃圾箱,我们都将 Raspberry Pi zero 与红外接近传感器连接起来。传感器监控填充水平,Raspberry Pi 会在每天早上的预定时间将数据归零发布到 tangle。

layout_bb_Qd8u7V3VnU.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
用树莓派 3 填充杠杆传感器
 

软件组件

1.蟒蛇

Python 是一种解释型、高级、通用的编程语言。我们使用 python 构建整个项目。

2. PyOTA:IOTA Python API 库

这是 IOTA 核心的官方 Python 库。它实现了官方 API以及新提出的功能(例如签名、捆绑、实用程序和转换)。

3.漂亮的桌子

PrettyTable 是一个简单的 Python 库,旨在使在视觉上吸引人的 ASCII 表格中快速轻松地表示表格数据。

程序

1. 安装树莓派

通过安装 Raspbian OS 或任何其他合适的操作系统来设置 Raspberry Pi。如果需要,请遵循本教程。

2. 安装所需软件

如果之前未安装,请下载并安装Python 3.5或更高版本。然后安装其他库,如PyOTAPrettyTable。

如果安装了 pip,请在终端中输入以下命令来安装库。

pip install pyota

pip install PrettyTable

3.创建IOTA地址

我们可以使用 IOTA 手机钱包创建一个 IOTA 钱包地址。使用 IOTA 钱包生成新地址或在https://thetangle.org上搜索现有地址时,您会找到一个二维码。

whatsapp_image_2019-04-23_at_12_25_02_pm_fOKMuoATkP.jpeg?auto=compress%2Cformat&w=740&h=555&fit=max
设置 IOTA 钱包地址
 

4.代码

我们有两个用于该项目的 python 代码。一个在与传感器连接的 Raspberry Pi 零上运行。这段 python 代码不断地从传感器读取数据,并将箱子编号和箱子的状态发送给 tangle。

sensorread.py

#Developed by CodersCafe
from datetime import datetime
import time
import schedule
import RPi.GPIO as GPIO
  
#Setup sensor as input
sensor1 = 16
sensor2  = 12
  
GPIO.setmode(GPIO.BOARD)
GPIO.setup(sensor1,GPIO.IN)
GPIO.setup(sensor2,GPIO.IN)
# Import the PyOTA library
import iota
# Import json
import json
# Define IOTA address where all transactions  are stored, replace with your own address.
# IOTA addresses can be created with the IOTA Wallet
Addr = b"RLLQQVU9ZPWF9EPOVTJ9AXVJOBQWJWDPGGMALZQANY9GWR99XPITQJQBVLYCX9XLGIGLB9TBUNDTDWYBZACGWGQSLZ"

# Create IOTA object, specify full node to be used when sending transactions.  
api = iota.Iota("https://nodes.thetangle.org:443")
  
# Define static variable
city = "Smart City"
  
#Define the post function
def datapost():
   FinalBundle = api.send_transfer(depth=3, transfers=[pta], min_weight_magnitude=14)['bundle']
   FinalBundle = api.send_transfer(depth=3, transfers=[ptb], min_weight_magnitude=14)['bundle']
   print("Success")
  
#Schedule data  posting at 7 am
schedule.every().day.at("07:00").do(datapost)
  
#Main loop
try:
   while True:
       # Show welcome message
       print("\n Welcome to Smart City")
       print("Press Ctrl+C to exit the system")
       # Get bin number
       bin_number1 = sensor1
       print ("bin number = ",bin_number1)
       bin_number2 = sensor2
       print ("bin number = ",bin_number2)
       # Get status from bins
       id1 = GPIO.input(sensor1)
       if id1==1:
           status="Full"
       else:
           status="Not Full"
       id2 = GPIO.input(sensor2)
       if id1==1:
           status="Full"
       else:
           status="Not Full"        
       # Create json data to be uploaded to the tangle
       data1 = {'city': city, 'bin_number': bin_number1,'Status': status}
       data2 = {'city': city, 'bin_number': bin_number2,'Status': status}
       # Define new IOTA transaction
       pta = iota.ProposedTransaction(address = iota.Address(Addr),
                                     message = iota.TryteString.from_unicode(json.dumps(data1)),
                                     tag     = iota.Tag(b'SMARTCITY'),
                                     value   = 0)
       ptb = iota.ProposedTransaction(address = iota.Address(Addr),
                                     message = iota.TryteString.from_unicode(json.dumps(data2)),
                                     tag     = iota.Tag(b'SMARTCITY'),
                                     value   = 0)
       schedule.run_pending()
       time.sleep(50) 
# Clean up function when user press Ctrl+C (exit)
except KeyboardInterrupt:
   GPIO.cleanup()

另一个 python 代码由垃圾车司机或任何其他授权人员使用。此代码从 tangle 中读取数据并以综合方式显示 bin 的数据。

displaydata.py

#Developed by CodersCafe
# Imports from the PyOTA library
from iota import Iota
from iota import Address
from iota import Transaction
from iota import TryteString

# Import json library
import json

# Import datetime libary
import datetime

# Import from PrettyTable
from prettytable import PrettyTable

# Define IOTA address where all transactions are stored, replace with your own address.
address = [Address(b'RLLQQVU9ZPWF9EPOVTJ9AXVJOBQWJWDPGGMALZQANY9GWR99XPITQJQBVLYCX9XLGIGLB9TBUNDTDWYBZACGWGQSLZ')]

# Define full node to be used when retrieving cleaning records
iotaNode = "https://nodes.thetangle.org:443"

# Create an IOTA object
api = Iota(iotaNode)

# Create PrettyTable object
x = PrettyTable()

# Specify column headers for the table
x.field_names = [ "city", "bin_number","Status", "last_time"]

# Find all transacions for selected IOTA address
result = api.find_transactions(addresses=address)

# Create a list of transaction hashes
myhashes = result['hashes']

# Print wait message
print("Please wait while retrieving data from the tangle...")

# Loop trough all transaction hashes
for txn_hash in myhashes:
   # Convert to bytes
   txn_hash_as_bytes = bytes(txn_hash)
   # Get the raw transaction data (trytes) of transaction
   gt_result = api.get_trytes([txn_hash_as_bytes])
   # Convert to string
   trytes = str(gt_result['trytes'][0])
   # Get transaction object
   txn = Transaction.from_tryte_string(trytes)
   # Get transaction timestamp
   timestamp = txn.timestamp
   # Convert timestamp to datetime
   last_time = datetime.datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S')
   # Get transaction message as string
   txn_data = str(txn.signature_message_fragment.decode())
   # Convert to json
   json_data = json.loads(txn_data)
   # Check if json data has the expected json tag's
   if all(key in json.dumps(json_data) for key in ["city","bin_number","Status"]):
       # Add table row with json values
       x.add_row([json_data['city'], json_data['bin_number'], json_data['Status'], last_time])

# Sort table by cleaned datetime
x.sortby = "last_time"

# Print table to terminal
print(x)

5.工作

将 IR 传感器连接到 Raspberry Pi 零,并将液位传感器放入垃圾箱内。然后在树莓派零中运行代码sensorread.py,让它永远工作,它会在每天早上的固定时间无缝返回填充水平状态。

然后在 Android 设备或计算机(或其他 Raspberry Pi)中运行代码 displaydata.py。它将显示带有箱号及其填充水平状态的数据。通过查看数据,驾驶员可以优化卡车路线。

 

 


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !