一、前言
1.1 项目介绍
本项目设计里用到的全部工具软件、模块的源代码都可以在这里下载(放在网盘里了)。
https://pan.quark.cn/s/145a9b3f7f53
【1】项目开发背景
随着现代农业技术的发展,精准农业和智能农业逐渐成为提高农作物产量与质量的重要手段。基于物联网技术的育苗管理系统为种植者提供一套集环境监测、自动控制与远程管理于一体的解决方案。这套系统不仅能够帮助用户实时掌握育苗环境的各项关键指标,还能根据实际情况自动调节或允许用户远程干预,以确保作物处于最佳生长状态。
考虑到传统农业中育苗阶段对环境条件的高度敏感性,比如土壤温度、湿度以及光照等自然因素都直接影响到幼苗的成长情况,因此本项目开发了一套专为育苗设计的智能化管理系统。通过集成多种传感器来收集包括但不限于土壤温湿度、环境温湿度、光照强度及空气质量在内的数据,并利用这些信息来做出相应的决策。例如,在检测到土壤过于干燥时,系统能够自动启动灌溉装置补充水分;当发现环境参数偏离预设安全范围时,则会触发警报机制提醒管理人员注意。
此外,为了实现更高效便捷的操作体验,该项目还特别注重于构建一个完整的物联网架构。一方面,通过ESP8266 WiFi模块将采集的数据上传至云端服务器,使得无论身处何地,用户都能够通过手机应用程序或是电脑端软件查看最新状态并进行必要的调整;另一方面,在本地也设置了LCD屏幕用于即时显示重要信息,并且支持直接通过物理按键来进行基本操作。这样一来,即使在网络连接不稳定的情况下,依然可以保证系统的正常运作。
此项目的实施不仅是对现有农业科技的一次创新尝试,也是推动智慧农业发展的重要一步。它不仅仅局限于提供一种工具或服务,更重要的是希望通过这样一套全面覆盖监测-分析-控制全过程的平台,从根本上改善农业生产方式,促进资源节约型社会建设的同时提升农产品竞争力。
【2】设计实现的功能
环境监测:系统集成了多种传感器,包括用于测量土壤温度与湿度的传感器、DHT11温湿度传感器、BH1750光强传感器以及MQ135空气质量传感器等,能够实时检测并记录关键环境参数如土壤状况、周围空气质量和光照条件等。这些数据对于确保幼苗处于最佳生长条件下至关重要。
智能灌溉控制:根据土壤湿度传感器反馈的信息,系统能够自动判断是否需要浇水,并通过四个电磁阀分别对四个不同区域进行精确补水。此外,还支持用户通过本地按钮或远程APP手动启动/停止灌溉过程,增强了系统的灵活性。
报警机制:当监测到的任何一项指标(如环境温度、湿度或空气质量)超出预设的安全范围时,系统将立即激活蜂鸣器发出警报声,提醒管理人员及时采取措施以避免潜在损害。报警阈值可通过上位机应用程序灵活调整,以适应不同的作物需求。
物联网连接:利用ESP8266 WiFi模块,整个装置可以无缝接入互联网,借助MQTT协议将收集的数据上传至自建的EMQX MQTT服务器。这不仅便于长期存储分析,也为后续开发移动应用及桌面客户端提供了基础。
远程监控与管理:结合上述物联网特性,项目进一步开发了适用于智能手机和平板电脑的应用程序以及Windows平台上的桌面软件,允许用户无论身在何处都能方便地查看当前的环境状态报告,并执行诸如更改设置、触发特定动作等操作。
本地显示界面:为保证即使在网络不可用的情况下也能正常工作,系统配备了一块SPI接口的小型LCD屏幕,用以直观展示各种传感器读数及其他重要信息,同时提供基本的操作指引。
【3】项目硬件模块组成
主控芯片 - STM32F103RCT6:
作为整个系统的控制核心,负责处理来自传感器的数据、执行逻辑判断、控制输出设备等。
具有丰富的外设接口,包括ADC(模拟-数字转换器)、SPI(串行外设接口)、I2C(两线式串行总线)以及GPIO(通用输入/输出端口),便于连接各种外围设备。
环境光照强度检测 - BH1750:
通过I2C接口与主控板通信,用于测量周围环境的光照强度。
提供精确的照度值,帮助评估植物所需的光照条件是否适宜。
环境温湿度检测 - DHT11:
采用单线数字信号输出方式,提供相对湿度和温度数据。
是一种低成本且易于集成的解决方案,适合监测室内或温室内的环境状况。
LCD显示屏 - SPI协议显示屏:
通过SPI接口与STM32相连,用于实时显示当前的各项环境参数。
小巧轻便,能够清晰地呈现信息,方便现场查看。
空气质量检测 - MQ135传感器:
检测空气中的一氧化碳、氨气、甲烷等有害气体浓度。
输出模拟电压信号,需配合ADC读取并转换成数字格式进行分析。
声音报警 - 蜂鸣器:
当系统检测到异常情况时,如温湿度超出设定范围,蜂鸣器将发出警报声以提醒用户注意。
使用GPIO控制其开关状态。
土壤湿度检测 - ADC模拟量接口的土壤湿度传感器:
通过插入土壤中来感知水分含量,并将结果以模拟信号的形式输出。
STM32内部ADC将其转换为数字值,以便于进一步处理。
联网 - ESP8266-WIFI模块:
为系统提供无线网络接入能力,支持WiFi标准。
通过AT指令集与STM32交互,实现数据上传至云端服务器。
补水控制 - 继电器+电磁阀:
四个继电器分别控制四个电磁阀,对应不同的灌溉区域。
根据土壤湿度情况或其他预设条件自动开启或关闭电磁阀,进行精准灌溉。
电源侧连接自来水管道,确保供水稳定可靠。
电源供应 - 外部5V 2A电源适配器:
为整个系统供电,保证各个组件正常工作。
选择合适规格的电源适配器非常重要,既要满足所有电子元件的工作需求,也要考虑安全性和稳定性。
1.2 设计思路
本项目的设计思路围绕着构建一个高效、智能且用户友好的育苗管理系统展开。设计之初,认识到传统育苗过程中存在许多依赖人工经验判断的情况,这不仅效率低下,而且容易受到人为因素的影响。因此,目标是利用现代物联网技术和嵌入式系统来实现对育苗环境的精确控制与远程管理。
选择STM32F103RCT6作为主控芯片,是因为它具有强大的处理能力以及丰富的外设接口,能够满足系统对于数据采集和处理的需求。此外,该芯片还支持多种通信协议,便于与其他硬件模块进行交互。传感器的选择则基于其准确性和可靠性,例如使用DHT11来监测温湿度,BH1750用于光照强度检测,这些都经过了广泛的市场验证,适合在农业环境中应用。
为了确保系统的智能化水平,引入了自动灌溉功能。通过土壤湿度传感器实时监控土壤水分状态,并结合预设的阈值来决定是否启动灌溉。四个独立控制的电磁阀允许针对不同区域实施差异化浇水策略,从而达到节水效果并促进植物健康生长。同时,考虑到实际操作中可能遇到的各种情况,系统也提供了手动控制选项,用户可以通过本地按钮或远程APP灵活地调整灌溉计划。
报警机制的设计则是出于安全考虑,当关键参数如温度、湿度或空气质量超出正常范围时,系统将立即触发蜂鸣器发出警报,提醒管理人员采取措施。这样的即时反馈机制有助于防止潜在的问题恶化,保障作物的安全成长。
物联网连接是整个项目的核心之一。借助ESP8266 WiFi模块,系统可以轻松接入互联网,并通过MQTT协议与部署在云端的EMQX服务器通信。这样做的好处在于,一方面实现了数据的远程传输与存储;另一方面也为后续开发移动应用和桌面软件奠定了基础,使得无论身处何地,用户都能随时了解育苗状况并对系统进行配置。
在用户体验方面,也做了充分考量。除了提供直观易用的手机应用程序和Windows上位机界面之外,还在本地设置了LCD显示屏,以便于现场工作人员查看即时信息。这种多渠道的信息展示方式增强了系统的可用性,无论是专业人士还是普通农户都能够快速上手。
本项目的整体设计思路是从提升育苗效率出发,综合运用传感器技术、微处理器编程及物联网解决方案,创建一个既能自主运作又能接受远程指挥的现代化农业管理系统。通过对环境条件的精细化管理和及时响应,最终达到优化资源利用、提高产量品质的目的。
1.3 系统功能总结
功能模块 | 功能描述 |
---|---|
环境监测 | 实时检测并记录土壤温度、土壤湿度、环境温度、环境湿度、环境光强、空气质量等信息。 |
智能灌溉控制 | 本地手动按钮控制补水;远程控制四个独立区域的电磁阀进行自动或手动补水。 |
报警机制 | 当环境参数(如温度、湿度、空气质量)超出预设范围时,通过蜂鸣器发出声音报警。 |
物联网连接 | 通过ESP8266 WiFi模块连接到MQTT服务器,使用MQTT协议上传数据至云端。 |
远程监控与管理 | 开发手机APP和Windows上位机软件,允许用户远程查看数据、调整设置及执行控制操作。 |
本地显示 | SPI接口LCD显示屏用于现场显示采集的数据及其他重要信息。 |
数据处理与存储 | 在云端EMQX MQTT服务器上接收并存储来自设备的数据,便于长期分析和管理。 |
灵活配置 | 用户可以通过上位机应用程序自定义各项阈值,例如报警条件、灌溉策略等。 |
电源管理 | 系统采用外部5V 2A电源适配器供电,确保稳定运行,并为所有组件提供必要的电力支持。 |
传感器集成 | 集成多种传感器(BH1750, DHT11, MQ135, 土壤湿度传感器),实现对育苗环境的全面监测。 |
安全与可靠性 | 设计考虑到了系统的安全性,包括数据传输加密、异常情况下的自动保护措施等,以保证系统的可靠运行。 |
这个表格简洁地列出了各个主要功能模块以及它们的具体作用,有助于快速理解整个育苗管理系统的功能布局。每个功能都在提升农业生产的智能化水平,同时保持易于操作和维护的特点。
1.4 开发工具的选择
【1】设备端开发
STM32的编程语言选择C语言,C语言执行效率高,大学里主学的C语言,C语言编译出来的可执行文件最接近于机器码,汇编语言执行效率最高,但是汇编的移植性比较差,目前在一些操作系统内核里还有一些低配的单片机使用的较多,平常的单片机编程还是以C语言为主。C语言的执行效率仅次于汇编,语法理解简单、代码通用性强,也支持跨平台,在嵌入式底层、单片机编程里用的非常多,当前的设计就是采用C语言开发。
开发工具选择Keil,keil是一家世界领先的嵌入式微控制器软件开发商,在2015年,keil被ARM公司收购。因为当前芯片选择的是STM32F103系列,STMF103是属于ARM公司的芯片构架、Cortex-M3内核系列的芯片,所以使用Kile来开发STM32是有先天优势的,而keil在各大高校使用的也非常多,很多教科书里都是以keil来教学,开发51单片机、STM32单片机等等。目前作为MCU芯片开发的软件也不只是keil一家独大,IAR在MCU微处理器开发领域里也使用的非常多,IAR扩展性更强,也支持STM32开发,也支持其他芯片,比如:CC2530,51单片机的开发。从软件的使用上来讲,IAR比keil更加简洁,功能相对少一些。如果之前使用过keil,而且使用频率较多,已经习惯再使用IAR是有点不适应界面的。
【2】上位机开发
上位机的开发选择Qt框架,编程语言采用C++;Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。Qt能轻松创建具有原生C++性能的连接设备、用户界面(UI)和应用程序。它功能强大且结构紧凑,拥有直观的工具和库。
1.5 模块的技术详情介绍
【1】ESP8266-WIFI模块
ESP8266是一款广受欢迎的低成本、低功耗的Wi-Fi模块,广泛应用于物联网(IoT)领域。它由乐鑫科技(Espressif Systems)开发,最初作为一款简单易用的无线模块推向市场,但因其强大的功能和灵活性迅速获得了开发者们的青睐。ESP8266内置了Tensilica L106超低功耗32位微处理器,主频最高可达160MHz,并且拥有512KB的SRAM,这使得它不仅能够作为一个简单的Wi-Fi模块使用,还可以作为独立的微控制器来执行复杂的任务。
ESP8266模块支持IEEE 802.11 b/g/n标准,能够工作在2.4GHz频段上。它具有多种工作模式,包括Station模式(客户端)、Access Point模式(热点)以及Station+AP模式(同时作为客户端和热点)。这意味着它可以连接到现有的Wi-Fi网络,也可以自己创建一个Wi-Fi热点供其他设备连接,极大地增加了其在不同应用场景中的适用性。
对于开发者而言,ESP8266的一个重要优势在于其丰富的开发资源和支持。乐鑫科技提供了详细的开发文档,包括硬件接口说明、固件升级指南和API参考手册等。此外,ESP8266还支持多种编程语言,如C/C++和Lua,同时还有成熟的开发框架如Arduino IDE的支持,使得开发者能够快速上手,并利用各种库函数简化开发流程。
ESP8266的低功耗特性也是一大亮点,它提供了多种省电模式,可以根据实际应用需求调整工作状态,以延长电池寿命。这对于那些依赖电池供电的物联网设备来说尤为重要。
ESP8266凭借其出色的性价比、强大的功能、易于开发的特性以及广泛的社区支持,已经成为许多DIY项目、智能家居设备和小型物联网应用的理想选择。无论是作为独立的微控制器还是作为Wi-Fi模块,ESP8266都能够满足大多数物联网项目的需求。
【2】MQ135传感器
MQ135 传感器是一种常用于检测多种气体的气敏元件,它特别适用于检测有害气体如一氧化碳(CO)、氨气(NH3)、甲烷(CH4)以及其他一些有机挥发性化合物。这种传感器因其成本低廉、使用方便而广泛应用于家庭安全、空气质量监测以及工业环境监控等领域。
MQ135 传感器的工作原理基于金属氧化物半导体(MOS)技术。其核心是一个由二氧化锡(SnO2)制成的敏感层,该材料在清洁空气中具有较高的电阻值。当周围环境中存在被测气体时,这些气体会与敏感层表面发生化学反应,导致敏感层的电阻发生变化。这种电阻的变化与气体浓度成正比关系,通过测量电阻值就可以推断出气体的浓度。通常,传感器会连接一个加热器来保持敏感层在一个特定的温度下工作,这个温度对于提高传感器的灵敏度和响应速度至关重要。
在实际应用中,MQ135 传感器需要配合电路来完成信号处理。常见的做法是将传感器接入一个简单的分压电路中,然后利用微控制器上的模拟输入端口读取电压变化。由于传感器输出的是模拟信号,因此需要进行适当的放大和滤波处理,以确保数据的准确性和稳定性。此外,为了得到更精确的结果,还需要对传感器进行校准,这通常涉及到在已知气体浓度条件下采集样本并建立相应的转换模型。
需要注意的是,虽然MQ135能够感知多种气体,但它并不具备区分不同气体的能力。也就是说,如果环境中同时存在几种不同的气体,那么最终读数将是所有气体共同作用的结果。因此,在使用MQ135进行空气质量监测时,通常会结合其他类型的传感器或采用特定算法来提高识别精度。例如,在育苗管理系统中,可以结合温湿度等其他环境参数,综合判断空气的质量状况。
MQ135 传感器凭借其低成本、易于集成的特点,成为了许多应用场景中的理想选择。不过,正确地配置和使用传感器对于获取可靠的数据同样重要,特别是在复杂多变的环境下,合理的电路设计和有效的数据分析方法都是必不可少的。
【4】DHT11传感器
DHT11 传感器是一种常用的数字温湿度复合传感器,它能够同时测量环境的温度和相对湿度。这款传感器因其成本低廉、使用简单而广泛应用于各种项目中,特别是那些需要基本温湿度监测功能的应用场合,如智能家居、气象站、农业环境监控等。
DHT11 传感器采用了一体化设计,集成了一个电阻式湿敏元件和一个NTC(负温度系数)热敏电阻。这两个元件共同工作,以提供准确的温度和湿度读数。湿敏元件用于检测空气中的水分含量,而热敏电阻则用于测量温度。通过内部电路处理后,DHT11 能够输出数字化的信号,这使得数据采集变得非常直接且无需额外的模拟-数字转换器(ADC)。
该传感器的工作原理基于电容变化和电阻变化。当空气中水蒸气浓度增加时,湿敏元件的电容值会发生改变;同样地,随着温度的变化,热敏电阻的阻值也会相应变化。这些变化被传感器内部的微处理器捕获并转换为数字信号,然后通过单线制通信接口发送给外部设备,如微控制器或单片机。
DHT11 的通信协议是其特点之一,它使用了一个简单的单总线协议来传输数据。这意味着只需要一根数据线就可以完成与主机之间的通信。每次读取数据时,主机首先发送一个开始信号,随后DHT11 会响应并返回40位的数据包,其中包括了8位整数温度、8位整数湿度以及各8位的校验和。这种通信方式虽然简单,但在实际应用中需要注意适当的时序控制,以确保数据的正确接收。
尽管DHT11 具有较高的性价比,但它的性能也有一定的局限性。例如,它的工作温度范围通常在0°C至50°C之间,湿度范围在20%至90%RH之间,并且精度相对较低。温度测量的精度约为±2°C,湿度测量的精度约为±5%RH。因此,在对测量精度要求较高的应用场景中,可能需要考虑更高精度的传感器,如DHT22/AM2302。
在硬件连接方面,DHT11 非常简便。除了电源和地线外,仅需一根数据线即可与微控制器相连。为了保证可靠的数据传输,通常建议在数据线上添加一个上拉电阻。此外,由于DHT11 对电源电压有一定的要求(推荐3.3V到5V),因此在设计电路时应确保供电电压稳定。
DHT11 是一种非常适合初学者和低成本项目的温湿度传感器,它提供了基本的环境监测功能,并且易于集成到各种电子系统中。不过,对于需要高精度测量的应用,用户可能需要考虑其他更高级别的传感器选项。
【5】B1750传感器
BH1750 是一款高精度的数字光强度传感器,广泛应用于需要精确测量环境光照强度的各种场合。这款传感器由ROHM Semiconductor公司生产,以其低功耗、高灵敏度和易于集成的特点而受到欢迎。它能够检测从0.5 lux到65,535 lux(即0.5 lx至65535 lx)范围内的光照强度,这覆盖了从非常暗到明亮阳光下的多种光照条件。
BH1750 传感器的核心是一个光电二极管,它能将接收到的光信号转换成电信号。该传感器内部集成了一个16位ADC(模数转换器),可以将光电二极管产生的电流信号转换为数字信号。这种设计使得BH1750 能够提供高度准确的数字输出,无需外部ADC或其他复杂的信号处理电路。传感器支持I2C通信协议,这意味着它可以轻松地与各种微控制器或单片机连接,如STM32、Arduino等。
在使用BH1750 时,用户可以通过I2C接口设置不同的工作模式来适应具体的应用需求。例如,可以选择连续高分辨率模式(1 lux分辨率)、连续高灵敏度模式(0.5 lux分辨率)或者一次性的测量模式。此外,还可以调整测量时间以平衡功耗和响应速度。这些灵活的配置选项使BH1750 成为了适用于不同应用场景的理想选择。
BH1750 的另一个优点是其低功耗特性。在正常工作状态下,它的平均电流消耗仅为120 μA左右,而在待机模式下,电流消耗可降至0.5 μA以下。这对于电池供电设备来说尤其重要,因为它有助于延长电池寿命。同时,由于采用了表面贴装技术(SMT),传感器的尺寸非常紧凑,适合集成在小型化的产品中。
在实际应用中,BH1750 常用于智能家居系统中的自动调光、户外显示屏亮度调节、农业温室光照监测以及移动设备中的屏幕亮度自动调节等功能。通过实时监测光照强度,系统可以根据当前的光照条件自动调整相关参数,从而提高用户体验并节省能源。
BH1750 是一种高性能且易于使用的数字光强度传感器,它提供了广泛的光照范围测量能力,并具有低功耗和小尺寸的优点。无论是对于专业开发者还是业余爱好者,BH1750 都是一个理想的选择,能够满足多种光照监测的需求。
二、准备服务器
EMQX-服务器部署目前支持以下操作系统:
RedHat CentOS RockyLinux AmazonLinux Ubuntu Debian macOS Linux Windows(旧版本是支持的,新版不支持Windows系统,官网没有下载链接了
)
前期测试阶段,华为云、阿里云、腾讯云这些平台都有免费试用的服务器,可以领取一个月ECS服务器试用测试。
也可以自己本地电脑上搭建服务器,这个我在另一篇文章里有详细介绍,还有对应的视频(Windows系统搭建)。
我下面是领取了华为云一个月的ECS服务器搭建此项目的服务器用于进行整体项目的测试。
2.1 登录官网
https://www.huaweicloud.com/
2.2 领取一个月的服务器
【1】选择服务器
配置过程中,系统选择ubuntu18.04
。
【2】返回弹性服务器的控制台
服务器领取配置好之后回到主界面。
【3】点击服务器名字,可以进入到详情页面。
2.3 配置安全组
要确保MQTT服务器常用的几个端口已经开放出出来。
2.4 安装FinalShell
Windows下安装 FinalShell 终端,方便使用SSH协议远程登录到云服务器。(当然,使用其他方式登录也是一样的)
2.5 远程登录到云服务器终端
【1】新建连接,选择SSH连接。
【2】填入IP地址、用户名、密码
这里的主机就是填服务器的公网IP地址,密码就是创建服务器输入的密码,用户名直接用root。
【3】点击连接服务器
【4】第一次登录会弹出提示框,选择接受并保存
【5】接下来可以看到服务器已经登录成功了。
三、Linux下安装EMQX
本章节将介绍如何在 Ubuntu 系统中下载安装并启动 EMQX。
支持的 Ubuntu 版本:
Ubuntu 22.04
Ubuntu 20.04
Ubuntu 18.04
2.1 官网地址
链接:https://www.emqx.io/docs/zh/v5.2/deploy/install-ubuntu.html
2.2 通过Apt源安装
EMQX 支持通过 Apt 源安装,免除了用户需要手动处理依赖关系和更新软件包等的困扰,具有更加方便、安全和易用等优点。
在命令行终端,复制下面的命令过去,按下回车键。
【1】通过以下命令配置 EMQX Apt 源:
curl -s https://assets.emqx.com/scripts/install-emqx-deb.sh | sudo bash
【2】运行以下命令安装 EMQX:
sudo apt-get install emqx
【3】运行以下命令启动 EMQX:
sudo systemctl start emqx
过程如下:
2.3 EMQX常用的命令
sudo systemctl emqx start 启动
sudo systemctl emqx stop 停止
sudo systemctl emqx restart 重启
四、配置EMQX-MQTT服务器
4.1 登录EMQX内置管理控制台
EMQX 提供了一个内置的管理控制台,即 EMQX Dashboard。方便用户通过 Web 页面就能轻松管理和监控 EMQX 集群,并配置和使用所需的各项功能。
在浏览器里输入: http://122.112.225.194:18083
就可以访问EMQX的后台管理页面。可以管理以连接的客户端或检查运行状态。
这里面的IP地址,就是自己ECS云服务器的公网IP地址。
打开浏览器后,输入地址后打开的效果:
默认用户名和密码:
用户名:admin
密码:public
第一次登录会提示你修改新密码,如果不想设置,也可以选择跳过(公网服务器部署,还是要修改密码安全些)。
下面修改新密码:
登录成功的页面显示如下:
4.2 MQTT配置
这里可以配置MQTT的一些参数,根据自己的需求进行配置。
4.3 测试MQTT通信
新建一个客户端,点击连接。
连接之后,然后点击订阅,和发布,如果下面消息能正常的接收。说明MQTT服务器通信是已经正常,没问题了。
并且在这个页面也可以看到主题发布
和主题订阅
的格式。
4.4 MQTT客户端登录服务器测试
接下来就打开我们自己的MQTT客户端登录MQTT服务器进行测试数据的通信。
端口选择: 1883
根据软件参数填入参数,登录,进行主题的发布和订阅。
说明:目前还没有配置客户端认证,现在只要IP和端口输入正确,MQTT三元组可以随便输入,都可以登录上服务器的,服务器没有对三元组做校验。
EMQ X 默认配置中启用了匿名认证,任何客户端都能接入 EMQX。没有启用认证插件或认证插件没有显式允许/拒绝(ignore)连接请求时,EMQX 将根据匿名认证启用情况决定是否允许客户端连接。
然后打开EMQX
的管理后台,可以看到我们的设备已经登录服务器了,名字为test1
。
在订阅主题的页面也可以看到我们客户端设备订阅的主题。
4.5 客户端认证配置
EMQX 默认配置中启用了匿名认证,任何客户端都能接入 EMQX。没有启用认证插件或认证插件没有显式允许/拒绝(ignore)连接请求时,EMQX 将根据匿名认证启用情况决定是否允许客户端连接。
在正式产品里肯定是要启用认证的,不然任何设备都能接入。
下面就介绍如何配置 客户端认证。
【1】打开客户端认证页面
【2】选择密码认证
【3】选择内置数据库
【4】设置认证方式(都可以默认,不用改),直接点击创建。
【5】创建成功后,点击用户管理
【6】添加用户
【7】添加成功
【8】添加完毕之后,打开MQTT客户端可以进行测试。
登录的时候,MQTT用户名和密码必须输入正确,按照上一步添加的信息进行如实填写,否则是无法登录服务器的。
4.6 客户端授权配置
客户端授权页面可以配置每个客户端(设备)的主题发布,订阅权限。限制它是否可以发布主题,订阅主题。如果有需要就可以进行配置。
http://127.0.0.1:18083/#/authorization/detail/built_in_database?tab=users
【1】创建数据源
【2】选择内置数据库
【3】完成创建
【4】点击权限管理
【5】选择客户端ID,点击添加
【6】配置权限
4.7 数据转发(集成)
在集成选项里,可以对设备数据处理。比如:转发到自己的HTTP服务器,转发到自己其他的MQTT服务器,创建规则,某些事件触发某些动作等等。
选择数据桥接。
可以把数据发送端自己的HTTP服务器,或者发送到其他的MQTT服务器。
选择HTTP服务 (如果自己有HTTP服务器,可以将数据转发给自己的HTTP服务器)。
五、MQTT客户端消息互发测试
5.1 添加2个设备
为了方便测试设备间互相订阅主题,数据收发,在客户端认证页面至少添加2个设备。我这里分别添加了test1
和test2
。
5.2 设备间测试
设备A订阅设备B的主题,设备B订阅设备A的主题,实现数据互发。
设备A的MQTT信息:
MQTT服务器地址:122.112.225.194
MQTT服务器端口号:1883
MQTT客户端ID:AAA
MQTT用户名:test1
MQTT登录密码:12345678
订阅主题:BBB/#
发布主题:AAA/1
发布的消息:{ "msg": "我是AAA设备" }
设备B的MQTT信息:
MQTT服务器地址:122.112.225.194
MQTT服务器端口号:1883
MQTT客户端ID:BBB
MQTT用户名:test2
MQTT登录密码:12345678
订阅主题:AAA/#
发布主题:BBB/1
发布的消息:{ "msg": "我是BBB设备" }
五、单片机设备上云
只要是MQTT客户端能正常上云通信了,那么单片机也是一样的。
上位机也可以采用MQTT协议接入服务器,订阅设备的主题,就可以实时接收设备的消息(当然,也可以采用HTTP协议接入)。
六、数据桥接
EMQX支持将设备上传的数据转发到其他地方,比如,自己的HTTP服务器。方便自己服务器进行其他的处理。
通过数据桥接,用户可以实时地将消息从 EMQX 发送到外部数据系统,或者从外部数据系统拉取数据并发送到 EMQX 的某个主题。而 EMQX Dashboard 提供了可视化创建数据桥接的能力,只需在页面中配置相关资源即可。
本章节就介绍如何搭建自己的HTTP服务器。配置EMQX转发数据到自己的HTTP服务器,保存处理数据。
6.1 搭建HTTP服务器
我这里直接使用python写代码搭建一个HTTP服务器。ECS服务器上默认没有安装python3
,需要先安装一下。
【1】安装python3
root@emqx:~/emqx# apt install python3
Reading package lists... Done
Building dependency tree
Reading state information... Done
python3 is already the newest version (3.6.7-1~18.04).
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
【2】编写代码
from flask import Flask, json, request
app = Flask(__name__)
@app.route('/', methods=['POST'])
def print_messages():
reply= {"result": "ok", "message": "success"}
print("got post request: ", request.get_data())
return json.dumps(reply), 200
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000)
将以上代码保存到一个名为 server.py
的文件中。
这段代码创建了一个使用 Flask 框架的 Web 服务器,可以接收根路径的 POST 请求。当接收到 POST 请求时,服务器会将请求的数据打印到终端,并返回一个 JSON 格式的响应给客户端。服务器将在本地运行,并监听默认的 8000
端口。
【3】运行程序
# 安装 flask 依赖
pip install flask
pip3 install flask
# 启动服务
python3 server.py
在命令行中执行 python3 server.py
,就可以启动一个简单的HTTP服务器,可以接收并处理POST请求。当有POST请求发生时,服务器将返回收到的POST数据。可以根据自己的需要,进一步扩展处理POST请求的逻辑。
运行示例: (代码可以在本地写好上传到服务器,也可以直接 vim server.py
打开编辑器直接编写 )
可以通过发送 POST 请求到 http://your-server-ip:8000/
的方式来测试这个服务器。
比如:
http://122.112.225.194:8000/
6.2 数据转发配置
【1】在集成选项里,可以对设备数据处理,将数据转发到自己的HTTP服务器。
【2】选择Webhook。
Webhook,使用 Webhook 来转发数据到 HTTP 服务;
使用 Webhook 其实就是将 EMQX 接收并处理后的数据发送到一个 HTTP 服务上,再根据预设好的 HTTP 服务来处理和集成业务数据。
同样用户需要有一个预先搭建好的 HTTP 服务,需要在配置信息页面填写 HTTP 请求的服务地址,选择一个请求方法 POST、GET、PUT 或 DELETE,配置请求头,将需要发送的数据使用模板语法填写到请求体(body)中即可。
【3】选配置Webhook
触发器选择所有消息和事件,URL里填自己的服务器地址。
【4】点击测试。测试服务器是否OK。
【6】没问题就直接点击保存
【7】创建成功
【8】保存之后。会自动创建规则
和数据桥接
。非常方便。
6.3 测试转发效果
【1】打开MQTT客户端,发送数据测试。
【2】看python服务器的终端,可以看到收到了EMQX服务器转发过来的数据。
如果自己接下来想要进行其他的操作,服务器写代码进行对应的处理即可。
【3】 点击这个服务可以看到已经触发转发的详情。
七、API接口说明
一般开发一套完整的物联网产品。一般会分为设备端,服务器,上位机部分。
设备端:就是硬件端。采集本地传感器的数据上传到服务器,或者接收服务器下发的指令完成某些控制。
比如:STM32 + ESP8266 + 各种传感器 就是一个硬件设备端。可以通过ESP8266联网上传数据。
服务器:也就是MQTT服务器端,比如: 自己采用EMQX搭建的MQTT服务器,或者采用阿里云、华为云、OneNet这些平台的IOT服务器。
上位机:上位机就是给用户使用的,用于远程控制设备,查看设备。比如:微信小程序、手机APP、电脑上位机、web网页端等等。
那么这个章节,就介绍利用EMQX提供的API接口与MQTT客户端设备进行通信,完成数据上传,命令下发等功能,可以利用此接口完成上位机的开发。
7.1 查看全部的API接口
帮助文档地址: https://www.emqx.io/docs/zh/v5.0/admin/api.html#%E8%AE%A4%E8%AF%81
EMQX 提供了管理监控 REST API,这些 API 遵循 OpenAPI (Swagger) 3.0 规范。 EMQX 在 REST API 上做了版本控制,EMQX 5.0.0 以后的所有 API 调用均以 /api/v5 开头。
EMQX 服务启动后,可以访问 http://localhost:18083/api-docs/index.html (opens new window)来查看 API 的文档。还可以直接在 Swagger UI 上尝试执行一些 API。
比如: 我的EMQX服务器是在华为云ECS服务器上搭建,公网IP是: 122.112.225.194
那我访问API文档的地址就是下面这样的格式: 在浏览器里打开即可。
http://122.112.225.194:18083/api-docs/index.html
访问效果如下:
7.2 创建API密匙
【1】登录EMQX的后台管理页面: http://122.112.225.194:18083/
【2】找到菜单里的 系统设置选项-->API密匙。
【3】创建密匙。
【4】填写密匙名称
【5】创建成功
【6】得到API Key 和 Secret Key
API Key : f072a6e9758b8cdf
Secret Key : LzwPB71Yf7PTED39C7RGboz9C9ANhv83ULUynTANgog4hG
7.3 测试API: 获取节点信息
上一步已经创建好API的访问密匙,这里就以 获取节点信息为例,调用获取节点信息的API接口,获取节点 信息。
接口在API文档里的介绍:
根据前面的API访问路径规则说明;那么,获取节点信息的API完整访问路径为:
http://122.112.225.194:18083/api/v5/nodes
接下来就用python写一份代码,测试一下接口是否可以正常访问。python代码直接放服务器运行(主要是我本地没有安装python环境,云服务器的环境是已经安装OK的,测试方便)。
【1】在云服务器上创建一个python文件,方便测试代码
【2】创建之后FinaShell
自动上传到服务器
【3】编辑代码
在这里双击
要编辑的文件,就可以打开文件进行编辑。默认采用内置的编辑器,也可以选择自己电脑上的外置编辑器。
【4】代码编辑完成,按下键盘快捷键Ctrl + S
保存文件内容,保存之后文件内容会自动同步到服务器。
保存后提示,自动上传。
写入的代码如下:
import urllib.request
import json
import base64
username = 'f072a6e9758b8cdf'
password = 'LzwPB71Yf7PTED39C7RGboz9C9ANhv83ULUynTANgog4hG'
url = 'http://122.112.225.194:18083/api/v5/nodes'
req = urllib.request.Request(url)
req.add_header('Content-Type', 'application/json')
auth_header = "Basic " + base64.b64encode((username + ":" + password).encode()).decode()
req.add_header('Authorization', auth_header)
with urllib.request.urlopen(req) as response:
data = json.loads(response.read().decode())
print(data)
【5】执行代码,返回结果
通过返回信息来看,节点信息获取是没有问题的。
root@emqx:~/emqx# python3 http_api_test.sh
[{'connections': 0, 'edition': 'Opensource', 'live_connections': 0, 'load1': 0.0, 'load15': 0.0, 'load5': 0.0, 'log_path': '/var/log/emqx', 'max_fds': 1048576, 'memory_total': '3.66G', 'memory_used': '612.59M', 'node': 'emqx@127.0.0.1', 'node_status': 'running', 'otp_release': '25.3.2-2/13.2.2', 'process_available': 2097152, 'process_used': 543, 'role': 'core', 'sys_path': '/usr/lib/emqx', 'uptime': 84000040, 'version': '5.3.1-alpha.1'}]
root@emqx:~/emqx# python3 http_api_test.sh
[{'connections': 0, 'edition': 'Opensource', 'live_connections': 0, 'load1': 0.0, 'load15': 0.0, 'load5': 0.0, 'log_path': '/var/log/emqx', 'max_fds': 1048576, 'memory_total': '3.66G', 'memory_used': '613.23M', 'node': 'emqx@127.0.0.1', 'node_status': 'running', 'otp_release': '25.3.2-2/13.2.2', 'process_available': 2097152, 'process_used': 543, 'role': 'core', 'sys_path': '/usr/lib/emqx', 'uptime': 84008046, 'version': '5.3.1-alpha.1'}]
7.4 在线调试(获取主题列表)
在编写代码之前,可以先测试下API接口的效果,可以直接在Swagger UI
界面直接调试API。
地址: http://122.112.225.194:18083/api-docs/index.html#/
例如:以获取以订阅主题列表的API接口为例。
【1】在Swagger UI
界面上找到对应的API接口。
【2】点击API说明,展开详情
【3】点击右边的试试看
按钮。
【4】点击执行
【5】然后会弹出提示框,让你填入用户名和密码。
这个用户名和密码就是前面创建API密匙生成的API Key(用户名)
和 Secret Key(密码)
。
API Key : f072a6e9758b8cdf
Secret Key : LzwPB71Yf7PTED39C7RGboz9C9ANhv83ULUynTANgog4hG
【6】根据提示输入用户名和密码,再点击登录。
【7】再次点击执行,就可以看到接口返回的数据了。
并且在页面上也写出了,请求的信息。使用curl
命令行给出详细的请求过程,参考这个就可以自己写代码了。
【8】API调用,curl
命令行执行代码如下:
curl -X 'GET' \
'http://122.112.225.194:18083/api/v5/topics?node=emqx%40127.0.0.1&page=1&limit=50' \
-H 'accept: application/json'
【9】python代码实现
import requests
url = 'http://122.112.225.194:18083/api/v5/topics?node=emqx%40127.0.0.1&page=1&limit=50'
headers = {'accept': 'application/json'}
response = requests.get(url, headers=headers)
if response.status_code == 200:
data = response.json()
# 在这里处理返回的数据
print(data)
else:
print("请求失败,状态码:", response.status_code)
7.5 在线调试(发布主题)
API里也支持发布主题,利用HTTP协议发布主题消息,如果设备端订阅了该主题,就可以收到API接口发布的消息。
【1】先找到发布主题的API接口
【2】点击API名字,展开详情
【3】点击右边的Try it out
按钮。
【4】参数填写说明
因为这个接口是发送主题的,需要填参数,填自己需要发布什么主题,什么消息。
出来的框框里就是发布信息,根据自己需要修改。
topic
就是发布的主题。 payload
就是发布的消息内容。只要MQTT客户端订阅了这个主题,就可以收到发布的消息。
这个主题的名字可以随便改的。我这里就用默认的名字和内容测试。
{
"payload_encoding": "plain",
"topic": "api/example/topic",
"qos": 0,
"payload": "hello emqx api",
"properties": {
"payload_format_indicator": 0,
"message_expiry_interval": 0,
"response_topic": "some_other_topic",
"correlation_data": "string",
"user_properties": {
"foo": "bar"
},
"content_type": "text/plain"
},
"retain": false
}
【5】MQTT客户端登录。
打开MQTT客户端,登录服务器,订阅api/example/topic
主题。
【6】在API调试页面,点击执行
【7】执行之后,在MQTT客户端的就可以收到API下发的消息了。
【8】API接口调用,curl
命令行执行的代码如下:
curl -X 'POST' \
'http://122.112.225.194:18083/api/v5/publish' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"payload_encoding": "plain",
"topic": "api/example/topic",
"qos": 0,
"payload": "hello emqx api",
"properties": {
"payload_format_indicator": 0,
"message_expiry_interval": 0,
"response_topic": "some_other_topic",
"correlation_data": "string",
"user_properties": {
"foo": "bar"
},
"content_type": "text/plain"
},
"retain": false
}'
【9】Python代码实现
import requests
import json
url = 'http://122.112.225.194:18083/api/v5/publish'
headers = {
'accept': 'application/json',
'Content-Type': 'application/json'
}
data = {
"payload_encoding": "plain",
"topic": "api/example/topic",
"qos": 0,
"payload": "hello emqx api",
"properties": {
"payload_format_indicator": 0,
"message_expiry_interval": 0,
"response_topic": "some_other_topic",
"correlation_data": "string",
"user_properties": {
"foo": "bar"
},
"content_type": "text/plain"
},
"retain": False
}
response = requests.post(url, headers=headers, data=json.dumps(data))
if response.status_code == 200:
print("消息发布成功")
else:
print("消息发布失败,状态码:", response.status_code)
八、STM32代码开发
下面是项目的主函数里的项目逻辑代码(其他子模块的代码太多,文档无法全部贴出)。
可以去网盘里下载传感器模块的代码:https://pan.quark.cn/s/145a9b3f7f53
#include "stm32f10x.h"
#include "lcd.h" // LCD显示相关的头文件
#include "dht11.h" // DHT11温湿度传感器相关的头文件
#include "bh1750.h" // BH1750光照强度传感器相关的头文件
#include "mq135.h" // MQ135空气质量传感器相关的头文件
#include "soil_moisture.h" // 土壤湿度传感器相关的头文件
#include "wifi.h" // ESP8266 WiFi模块相关的头文件
#include "mqtt.h" // MQTT协议相关的头文件
#include "buzzer.h" // 蜂鸣器相关的头文件
#include "relay.h" // 继电器(控制电磁阀)相关的头文件
// 定义全局变量
float temperature, humidity, light_intensity, air_quality, soil_moisture;
uint8_t irrigation_status[4] = {0}; // 4个灌溉区域的状态
uint8_t alarm_status = 0; // 报警状态
// 初始化所有硬件
void System_Init(void) {
GPIO_Init(); // 初始化GPIO
LCD_Init(); // 初始化LCD
DHT11_Init(); // 初始化DHT11
BH1750_Init(); // 初始化BH1750
MQ135_Init(); // 初始化MQ135
SoilMoisture_Init(); // 初始化土壤湿度传感器
WiFi_Init(); // 初始化WiFi
MQTT_Init(); // 初始化MQTT
Buzzer_Init(); // 初始化蜂鸣器
Relay_Init(); // 初始化继电器
}
// 读取传感器数据
void Read_Sensors(void) {
temperature = DHT11_ReadTemperature();
humidity = DHT11_ReadHumidity();
light_intensity = BH1750_ReadLightIntensity();
air_quality = MQ135_ReadAirQuality();
soil_moisture = SoilMoisture_Read();
}
// 处理报警逻辑
void Handle_Alarm(void) {
if (temperature > TEMPERATURE_THRESHOLD ||
humidity > HUMIDITY_THRESHOLD ||
air_quality > AIR_QUALITY_THRESHOLD) {
alarm_status = 1;
Buzzer_On();
} else {
alarm_status = 0;
Buzzer_Off();
}
}
// 发送数据到云端
void Send_Data_To_Cloud(void) {
char data[128];
sprintf(data, "temp=%.2f&humid=%.2f&light=%.2f&air=%.2f&soil=%.2f",
temperature, humidity, light_intensity, air_quality, soil_moisture);
MQTT_Publish(TOPIC_DATA, data);
}
// 主函数
int main(void) {
System_Init(); // 系统初始化
while (1) {
Read_Sensors(); // 读取传感器数据
Handle_Alarm(); // 处理报警逻辑
Send_Data_To_Cloud(); // 发送数据到云端
// 更新LCD显示
LCD_Clear();
LCD_Display("Temp: %.2f C", temperature);
LCD_Display("Humid: %.2f %%", humidity);
LCD_Display("Light: %.2f lx", light_intensity);
LCD_Display("Air: %.2f", air_quality);
LCD_Display("Soil: %.2f %%", soil_moisture);
// 检查并处理按钮输入
if (Button_IsPressed(BUTTON_IRRIGATION_1)) {
Relay_Toggle(RELAY_1);
irrigation_status[0] = !irrigation_status[0];
}
if (Button_IsPressed(BUTTON_IRRIGATION_2)) {
Relay_Toggle(RELAY_2);
irrigation_status[1] = !irrigation_status[1];
}
if (Button_IsPressed(BUTTON_IRRIGATION_3)) {
Relay_Toggle(RELAY_3);
irrigation_status[2] = !irrigation_status[2];
}
if (Button_IsPressed(BUTTON_IRRIGATION_4)) {
Relay_Toggle(RELAY_4);
irrigation_status[3] = !irrigation_status[3];
}
// 延时一段时间
Delay(1000); // 延时1秒
}
}
九、总结
本项目设计并实现一个基于STM32与物联网技术的育苗管理系统,该系统集成了多种传感器以实时监测并管理育苗环境的关键参数,同时支持远程监控与控制功能,以提升育苗效率与成功率。
系统核心采用STM32F103RCT6作为主控芯片,该芯片强大的处理能力和丰富的外设接口能够满足项目对数据采集、处理及通信的需求。通过集成DHT11温湿度传感器、BH1750光照强度传感器、MQ135空气质量传感器以及ADC接口的土壤湿度传感器,系统能够全面监测并记录育苗环境中的土壤温度、土壤湿度、环境温度、环境湿度、环境光强及空气质量等关键数据。这些数据不仅能在本地通过1.44寸SPI协议LCD显示屏直观展示,还能通过ESP8266-WIFI模块实时上传至MQTT物联网服务器。
为了增强系统的远程交互能力,项目采用了EMQX作为MQTT服务器,并部署在华为云ECS服务器上,利用Ubuntu系统提供稳定可靠的运行环境。通过MQTT协议,系统能够将采集到的数据高效、安全地传输至服务器,为远程监控提供数据支持。同时,项目还设计了基于Qt(C++)的手机APP和Windows上位机软件,用户可以通过这些终端远程查看育苗环境的各项参数,并设定报警阈值,当环境参数超出设定范围时,系统将自动触发蜂鸣器报警,提醒用户及时采取措施。
此外,系统还支持本地与远程的补水控制功能。用户可以通过本地按钮或远程APP/上位机软件控制4个继电器,进而驱动4个电磁阀模块对不同的灌溉区域进行精准灌溉,实现自动化与智能化的水资源管理。系统采用外部5V 2A电源供电,确保系统稳定运行。
本项目通过综合运用STM32、物联网技术、传感器技术及软件开发技术,构建了一个功能全面、操作便捷的育苗管理系统,为现代农业的智能化发展提供了有力支持。