一、项目介绍:
1. 背景介绍:
民以食为天,作为第一产业的农业对于任何国家的重要性都不言而喻。农业主要解决人们的温饱问题,但时至今日地球上仍有超过8亿人没有解决温饱问题,粮食危机每年都在爆发。爆发粮食危机的主要原因是人口爆炸、极端气侯以及耕地的减少。改革开放以来,我国农业发展取得了显著成绩,粮食产量连番新增,蔬菜、水果、肉类、禽蛋、水产品的人均占有量均排在了世界前列,但也付出了巨大代价。一是化肥农药滥用、地下水资源超采以及土壤肥力过度消耗,导致生态环境恶化,食品安全问题凸显;二是粗放经营,导致农业竞争力不强,出现农业增产、进口增加与库存增量的“三量齐增”现象,越来越多低端农产品滞销。解决这些问题就需要大力发展以运用智能设备、物联网、云计算与大数据等先进技术为主要手段的智慧农业。
目前,物联网、大数据等技术已经涉及到耕地、育种、播种、施肥、植保、收获、储运、农产品加工、销售、畜牧业生产等各环节,可以实现对作物种植、培育、成熟和销售等环节的管理。智慧农业颠覆了传统的手工劳作方式,打破了粗放式的传统生产模式,转而迈向集约化、精准化、智能化、数据化的方向。所以我考虑普通家庭如何运用智慧农业相关技术节能减排、增产致富?于是就打算利用主办方提供的器材以及学校创客教室里开源硬件模拟实现智慧农业系统。
2. 遇到的问题:
a. 行空板与sci采集模块通讯问题:
一开始,sci采集模块与行空板连接后,将编写一个简单测试程序编译运行,提示错误,查阅SCI采集模块故障说明,SCI采集模块与行空板通讯不稳定,试着更换将SCI采集模块与行空板其他I2C输入端口连接或更换USB数据线,故障依然存在,然后与技术支持联系检测,发现行空板I2C通讯端口故障。更换新的行空板后问题终于解决。
b. mqtt初始化错误:由于利用行空板自带SIOT服务,在wifi重新启动后,行空板wifi获取的地址可能存在变化,在Mqtt初始化参数模块相关配置需要根据实际情况修改。
c. Mqtt消息订阅:
在物联网控制系统中,根据Mqtt发送消息,控制掌控板子系统下开源硬件(如灯、风扇、舵机),如果同时使用“当接收到Topic_0的消息为hello模块”和“当接收到Topic/a的Mqtt消息”模块,程序也会出错。解决办法是使用“当接收到Topic_0的Mqtt消息”模块。
步骤1 1.系统架构分析:(1)确定项目需求:制作一个能实时监测室内各种环境数据,同时根据获取的数据决策控制模拟室内照明控制系统、通风系统、门窗运动的物联网控制系统。 (2)硬件准备:行空板、SCI采集模块、空气质量传感器、土壤湿度传感器、氧气传感器、数字温湿度传感器、掌控板、舵机(相当于门窗)、电机(相当于风扇)、彩色LED(相当于灯)。 (3)完成程序编写和调试。
步骤2 2.制作步骤 a.配置行空板 将行空板与电脑连接,然后访问http://10.1.2.3/pc/application-switch网站,登录行空板系统,依次连接wifi、开启SIOT服务; b.行空板:SIOT服务端兼数据采集中心 编写程序,实现将SCI采集的数据实时在行空板屏幕显示;同时将获取采集数据上传SIOT服务器; c.掌控板:物联网控制端 为了方便利用掌控板控制开源硬件,配置了Microbit掌控板兼容扩展板,将舵机、电机、彩色LED模块等与扩展板相连;
材料清单
- 行空板 X1
- SCI采集模块 X1
- 氧气传感器 X1
- 空气质量传感器 X1
- 土壤湿度传感器 X1
- 掌控板 X1
- IO扩展板 X1
- 电机 X1
- 舵机 X1
- LED彩灯模块 X1
# -*- coding: UTF-8 -*-
# MindPlus
# Python
from pinpong.libs.dfrobot_sht31 import SHT31
from pinpong.extension.unihiker import *
from pinpong.board import Board,Pin
from dfrobot_rp2040_sci import *
from pinpong.board import Board
from unihiker import Audio
from unihiker import GUI
import time
import siot
# 事件回调函数
def on_message_callback(client, userdata, msg):
global DengGuang
if (msg.topic == (str("siot/照明"))):
DengGuang = (int(float(msg.payload.decode())))
def u_thread1_function():
global YangQiNongDu
time.sleep(10)
while True:
time.sleep(0.2)
if ((float(YangQiNongDu)) < 20):
siot.publish(topic="siot/门窗", data="on")
time.sleep(1)
else:
siot.publish(topic="siot/门窗", data="off")
time.sleep(1)
def button_click1():
global DengGuang
DengGuang = (1 - DengGuang)
siot.publish_save(topic="siot/照明", data=DengGuang)
siot.init(client_id="9603035705579317",server="192.168.1.101",port=1883,user="siot",password="dfrobot")
Board().begin()
u_gui=GUI()
u_audio = Audio()
siot.connect()
siot.loop()
siot.set_callback(on_message_callback)
siot.getsubscribe(topic="siot/行空板土壤湿度")
siot.getsubscribe(topic="siot/行空板空气质量")
siot.getsubscribe(topic="siot/照明")
print("连接成功")
SCI1 = DFRobot_RP2040_SCI_IIC(addr=0x21)
while SCI1.begin() != 0:
print("Initialization Sensor Universal Adapter Board failed.")
time.sleep(1)
print("Initialization Sensor Universal Adapter Board done.")
print("sci1 ok")
p_sht31 = SHT31(0x45)
print("SHT31-F ok")
title=u_gui.draw_text(text="智慧农场监测中心",x=120,y=20,font_size=13, color="#000000")
Moisture_unit=u_gui.draw_text(text="",x=10,y=40,font_size=13, color="#000000")
Air=u_gui.draw_text(text="",x=10,y=60,font_size=13, color="#000000")
O2=u_gui.draw_text(text="氧气浓度:",x=10,y=80,font_size=13, color="#000000")
temp_air_unit=u_gui.draw_text(text="空气温度:",x=10,y=100,font_size=13, color="#000000")
light_unit=u_gui.draw_text(text="环境光值:",x=10,y=120,font_size=13, color="#000000")
light_control=u_gui.draw_text(text="",x=10,y=140,font_size=13, color="#000000")
LED控制=u_gui.add_button(text="LED控制",x=120,y=280,w=80,h=60,onclick=button_click1)
title.config(origin="center")
LED控制.config(origin="center")
DengGuang = 0
thread1=u_gui.start_thread(u_thread1_function)
while True:
GuangXianZhi = light.read()
TuRangShiDu = SCI1.get_value0("Moisture")
AQI = SCI1.get_value0("AQI")
YangQiNongDu = SCI1.get_value0("O2")
WenDu = p_sht31.temp_c()
XiangDu = u_audio.sound_level()
siot.publish_save(topic="siot/行空板土壤湿度", data=TuRangShiDu)
siot.publish_save(topic="siot/行空板空气质量", data=AQI)
siot.publish_save(topic="siot/行空板氧气", data=YangQiNongDu)
siot.publish_save(topic="siot/行空板光线", data=GuangXianZhi)
siot.publish_save(topic="siot/行空板温度", data=WenDu)
siot.publish_save(topic="siot/响度", data=XiangDu)
Moisture_unit.config(text=(str("土壤湿度:") + str((str(TuRangShiDu) + str(SCI1.get_unit0("Moisture"))))))
Air.config(text=(str("空气质量:") + str((str(AQI) + str(SCI1.get_unit0("AQI"))))))
O2.config(text=(str("氧气浓度:") + str((str(YangQiNongDu) + str(SCI1.get_unit0("O2"))))))
temp_air_unit.config(text=(str("温度:") + str((str(WenDu) + str("℃")))))
light_unit.config(text=(str("环境光值:") + str((str(GuangXianZhi) + str("lx")))))
light_control.config(text=(str("照明控制:") + str(DengGuang)))
time.sleep(0.02)
/*!
* MindPlus
* mpython
*
*/
#include <MPython.h>
#include <DFRobot_Iot.h>
#include <DFRobot_Servo.h>
#include <DFRobot_NeoPixel.h>
// 函数声明
void obloqMqttEventT2(String& message);
void obloqMqttEventT0(String& message);
void obloqMqttEventT1(String& message);
// 静态常量
const String topics[5] = {"siot/照明","siot/门窗","siot/通风","",""};
const MsgHandleCb msgHandles[5] = {obloqMqttEventT0,obloqMqttEventT1,obloqMqttEventT2,NULL,NULL};
// 创建对象
DFRobot_NeoPixel neoPixel_P16;
DFRobot_Iot myIot;
Servo servo_P0;
// 主程序开始
void setup() {
mPython.begin();
myIot.setMqttCallback(msgHandles);
servo_P0.attach(P0);
neoPixel_P16.begin(P16, 1);
neoPixel_P16.setBrightness(98);
neoPixel_P16.clear();
rgb.brightness(round(3));
myIot.wifiConnect("zlwxxrobot", "123456789");
while (!myIot.wifiStatus()) {yield();}
display.setCursorLine(1);
display.printLine("wifi ok");
myIot.init("192.168.1.101","siot","40297603373410973","dfrobot", topics, 1883);
myIot.connect();
while (!myIot.connected()) {yield();}
rgb.write(-1, 0xFF0000);
delay(1000);
rgb.write(-1, 0x000000);
display.fillScreen(0);
servo_P0.angle(abs(0));
}
void loop() {
}
// 事件回调函数
void obloqMqttEventT2(String& message) {
analogWrite(P8, (String(message).toInt()));
}
void obloqMqttEventT0(String& message) {
if (((String(message).toInt())==1)) {
rgb.write(0, 0x0000FF);
neoPixel_P16.setRangeColor(0, 0, 0xCC66CC);
}
else {
neoPixel_P16.clear();
rgb.write(-1, 0x000000);
}
}
void obloqMqttEventT1(String& message) {
if (((String(message).indexOf(String("on")) != -1))) {
rgb.write(1, 0xFF0000);
servo_P0.angle(abs(135));
}
if (((String(message).indexOf(String("off")) != -1))) {
servo_P0.angle(abs(45));
rgb.write(1, 0x000000);
}
delay(1000);
}
三春牛-创客2024.02.14
不错不错,赞赞赞!
三春牛-创客2024.02.14
太棒了!
hacker_2023.08.19
666