描述
四川雅安东北部的蒙顶山,山峦起伏,自西向东,掩映在一片绿海之中。这是 36 岁的邓先生最熟悉的景象,他是他那一代为数不多的蒙顶茶师之一,拥有 50 亩(=3.3 公顷)的种植园,海拔 1100 米。邓出身于制茶世家,但继承家族遗产并非易事。“我们的茶叶生长在高海拔的有机环境中,以确保其卓越的品质。但同时生长密度低,成本高,出芽不均匀,茶叶采收困难。这就是为什么高山茶通常是小收成,它们的价值在市场上没有体现。” 过去两年,邓一直在努力提高消费者对高山茶的认识,以提升其价值。而当他遇到范主时,
硬件连接
该项目的硬件可以分为 4 个部分:电源、传感器、节点和网关。以下文章将向您展示如何逐步完成它。
电源部分
电源部分主要包含一块太阳能电池板和一块锂电池,如果你只是为了演示而搭建这个项目,可以忽略它们。或者您可以按照上一教程安装节点电源。
传感器部分
在传感器部分,由于传感器较多,我们使用了一个气象站,还做了一个亚克力支架来安装它们。
如上图所示,Digital Light Sensor 始终位于顶部,以便它可以收集照明信息。会产生热量的传感器安装在亚克力支架的中间,例如 O2 传感器、灰尘传感器和 CO2 传感器。最后,亚克力支架底部的温湿度传感器。
此外,土壤温度和湿度传感器单独安装在土壤中。
节点部分
节点部分是一个安装在防水盒中的 Seeeduino LoRaWan,它通过水接头连接到电源和传感器。其中,灰尘传感器连接到LoRaWan的数字引脚D3,二氧化碳传感器连接到引脚D4和D5,土壤传感器连接到引脚D6和D7,O2传感器连接到模拟引脚A1,光传感器和气压传感器连接到I2C端口。
注意:应在土壤传感器的蓝色(数据)电缆和红色(Vcc)电缆之间添加一个 10k 电阻器。
Seeeduino LoRaWan 偶尔收集传感器值,并通过 LoRa 将它们发送到网关。数据格式如下:
{ [0], /* Air tempreature(℃) */ [1], /* Air humidity(%) */ [2], /* Altitude(m) high byte */ [3], /* Altitude(m) low byte */ [4], /* CO2 concentration(PPM) high byte */ [5], /* CO2 concentration(PPM) low byte */ [6], /* Dust concentration(pcs/0.01cf) high byte */ [7], /* Dust concentration(pcs/0.01cf) low byte */ [8], /* Light intensity(lux) high byte */ [9], /* Light intensity(lux) low byte */ [10], /* O2 concentration(%) */ [11], /* Soil temperature(℃) */ [12], /* Soil humidity(%) */ [13], /* Battery voltage(V) */ [14] /* Sensor error code */ }
Sensor Error Code 字节中的每一位都有不同的含义,如下所示:
{ bit0: 1; /* Barometer Sensor Error */ bit1: 1; /* CO2 Sensor Error */ bit2: 1; /* Dust Sensor Error */ bit3: 1; /* Light Sensor Error */ bit4: 1; /* O2 Sensor Error */ bit5: 1; /* Soil Sensor Error */ reserved: 2; /* Reserved */ }
网关部分
网关部分是一个Raspberry Pi,它插入了网关模块RHF0M301-868和PRI 2 Bridge RHF4T002,它安装在防水盒中并通过水接头连接到电源和USB摄像头。因为它使用专门的固件,请按照Seeed Wiki进行配置。
软件编程
作为Hardware Connection,Software Programming也可以拆分,可以拆分为3个部分:Node、Gateway和Website。
节点部分
大部分 Node Part 需要的驱动已经包含在 origin_driver 中
文件夹。下面的库需要手动安装:
Adafruit_ASFcore
由于项目复杂,我们建议您使用 Microsoft Visual Studio 而不是 Arduino IDE。一个名为 Visual Micro 的插件可以帮助您使用 Visual Studio 构建 Arduino 项目,单击此处了解更多信息。
为了更好的可读性和可维护性,我们这次使用面向对象编程。该项目的类图如下所示:
对于那些已经有 OOP 驱动程序的传感器,我们重新打包以适应这个项目,对于其他传感器,我们使用 OOP 重写了它们的驱动程序。中间件层的Sensor类用于统一实际传感器的接口,例如气压计传感器可以同时采集温度、湿度和高度,所以它有3个接口分别获取温度、湿度和高度。但是他们有不同的方法名,这会使获取传感器值的程序更加复杂,就像这样:
barometer->getTemperature(); barometer->getHumidity(); barometer->getAltitude(); // ... another_sensor->getSomeValue(); // ...
但是使用 OOP,它看起来像这样:
for (auto i = 0; i < SENSORS_COUNT; i++) { sensors[i]->getValue(); }
我们还打包了一个Application类,它实现了IApplication接口,IoTea.ino中的setup()和loop()方法可以调用Application对象中的setup()和loop()方法。
注意:USB 串行仅用于调试。调试后,请注释掉setup()方法中的初始化代码。
网关部分
Gateway Part 在主文件夹中的 Python 程序用于每小时拍照并上传到 Amazon S3 服务器。在你使用它之前,确保 fswebcam 已经安装在你的 Raspberry Pi 中:
sudo apt-get update && sudo apt-get install fswebcam
如果要上传照片,请按照以下步骤配置您的 AWS。首先,使用以下命令将 AWS SDK 和 AWS CLI 安装到您的 Raspberry Pi:
sudo pip install boto3 sudo pip install awscli
然后,运行 AWS CLI:
sudo aws configure
配置您的 AWS 访问密钥 ID、AWS 秘密访问 ID 和默认区域名称。
如果你不喜欢上传你的照片,你可以跳过 AWS 配置步骤和 photo.py 中关于上传的注释代码。为了每次启动树莓派后运行这个程序,可以在/etc/init.d中创建一个名为photo的文件,并写入如下代码。
#!/bin/bash # /etc/init.d/photo ### BEGIN INIT INFO # Provides: seeed_photo # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: photo taking initscript # Description: This service is used to manage photo taking ### END INIT INFO case "$1" in start) echo "Start taking photo" /home/rxhf/photo.py & ;; stop) echo "Stop taking photo" kill $(ps aux | grep -m 1 'python3 /home/rxhf/photo.py' | awk '{ print $2 }') ;; *) echo "Usage: service photo start|stop" exit 1 ;; esac exit 0
设置执行权限
sudo chmod 777 /etc/init.d/photo sudo chmod 777 /home/rxhf/photo.py
并测试它
sudo /etc/init.d/photo start
如果没有问题,将其停止并将其添加到启动应用程序中
sudo /etc/init.d/photo stop sudo update-rc.d photo defaults
注意:如果你想在 Raspberry Pi 启动后启动网关,请将 Seeed Wiki 中的网关启动代码添加到 /etc/rc.local,如下所示:
#!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. # Print the IP address _IP=$(hostname -I) || true if [ "$_IP" ]; then printf "My IP address is %s\n" "$_IP" fi cd /home/rxhf/loriot/1.0.2 sudo systemctl stop pktfwd sudo gwrst wget https://cn1.loriot.io/home/gwsw/loriot-risinghf-rhf2s008-rhf1257-SPI-0-latest.bin -O loriot-gw.bin chmod +x loriot-gw.bin ./loriot-gw.bin -f -s cn1.loriot.io exit 0
网站
我们把网站部署在CentOS7上。以下步骤将向您展示如何部署。
步骤 1. 安装 Python3
sudo yum -y install epel-release sudo yum -y install python36
步骤 2. 安装 Python pip 和虚拟环境
wget https://bootstrap.pypa.io/get-pip.py sudo python36 get-pip.py sudo pip install virtualenv
Setp 3. 从 GitHub 克隆我们的网站
sudo yum -y install git git clone https://github.com/SeeedDocument/iotea-hb.git
步骤 4. 创建并激活虚拟环境
virtualenv -p python36 iotea-hb cd iotea-hb source bin/activate
Step 5. 安装依赖库
pip install pymysql pip install dbutils pip install flask pip install websocket-client pip install cofigparser
步骤 6. 创建数据库
sudo yum -y install mariadb mariabd-server sudo systemctl enable mariadb sudo systemctl start mariadb mysql -uroot -p
然后使用 iotea_hb.sql 创建表。
Step 7. 创建db.ini,将这些代码写入其中
[db] db_port = 3306 db_user = root db_host = localhost db_pass = db_name = iotea
在 db.py 中更改 db.ini 的路径
# in db.py #cf.read("/data/www/python3_iotea_hb/iotea/conf/db.ini") cf.read("/home//iotea-hb/db.ini")
步骤 8. 在 app.py 中更改端口并启动网站:
# in app.py #app.run(debug=True, port=6000) app.run(debug=True, port=8080)
# in terminal pip install gunicorn gunicorn -w 5 -b 0.0.0.0:8080 app:app
现在用浏览器访问127.0.0.1:8080,可以看到网站,但是看不到实时数据。
步骤 9. 获取洛里奥特数据
打开另一个终端,重新进入虚拟环境并启动loriot app:
cd iotea-hb source bin/activate gunicorn loriot:app
稍等片刻,您会看到网站显示数据,或者您可以在 loriot.py 中更改 wss:
# in loriot.py #ws = create_connection("wss://cn1.loriot.io/app?token=vnwEuwAAAA1jbjEubG9yaW90LmlvRpscoh9Uq1L7K1zbrcBz6w==") ws = create_connection()
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !