一、项目背景智慧农业是近年来发展迅速的领域,其目的是利用先进的传感技术、物联网技术和云计算技术等,实现自动化、智能化的农业生产管理,并提高农业生产效率和质量。本文基于cc2530设计了一种智慧农业控制系统,采用dht11模块、bh1750模块和土壤湿度传感器等传感器,通过串口协议将采集的数据上传给上位机显示。
二、系统框架本系统主要包括一下的组成部分:
【1】采集端:由cc2530单片机和各种传感器构成,负责测量环境温湿度、环境光照强度和土壤湿度等信息,并通过串口协议将采集的数据上传给上位机显示。
【2】上位机:采用qt进行开发,负责接收串口上传的数据并进行显示。
【3】传输介质:采用串口协议进行数据传输,支持异步通信,具有数据帧结构。
【4】传感器模块:包括dht11模块、bh1750模块和土壤湿度传感器等,通过采集环境温湿度、环境光照强度和土壤湿度等信息,实现对农业生产环境的监测和控制。
cc2530是德州仪器(texas instruments)推出的一款低功耗无线系统芯片,它是基于zigbee协议的soc系统,内置了arm cortex-m3处理器和ieee 802.15.4标准无线通信模块,可以实现低速率的无线数据传输和网络互连。cc2530芯片的主要特点是低功耗、高可靠性、灵活性强、易于集成和开发,被广泛应用于物联网、智能家居、智能电表、智能照明等领域的无线数据传输和控制系统中。
bh1750是一款数字式环境光传感器,可用于测量光强度。它具有高分辨率和灵敏度,并且与普通光敏电阻相比,具有更广泛的动态范围和线性性。bh1750可以通过i2c接口连接到微控制器或其他电子设备上,如arduino、树莓派等。它被广泛应用于夜间照明系统、自动控制系统、安防监控等领域。
dht11是一种数字温湿度传感器,可以测量环境的温度和相对湿度。它通常被用于家庭和工业自动化等领域,可以在各种应用中监测环境条件。
dht11有四个引脚:vcc(电源正极)、gnd(地)、data(数据信号)和nc(未使用)。它可以通过单一总线接口与微控制器连接,并以数字形式输出温度和湿度值。其温度测量范围为0℃至50℃,湿度测量范围为20%rh至90%rh。
在使用dht11传感器时,需要注意一些问题。例如,在读取数据之前,应将传感器加电并等待1至2秒钟,以使其稳定。此外,在读取数据后,还需要进行数据校验,以确保数据的准确性。
三、系统设计【1】采集端设计
采集端主要由cc2530单片机和各种传感器构成。其中,温湿度采用dht11模块,光照强度采用bh1750模块,土壤湿度采用土壤湿度传感器。通过采集这些信息,可以了解农田的环境状态,并根据需要进行相应的调节和控制,保证作物的正常生长。
【2】上位机设计
上位机采用qt进行开发,支持串口通信和数据显示。在数据传输端口的配置上,串口通信采用异步通信方式,支持数据帧结构,即每个数据包由起始位、数据位、校验码、停止位等几部分组成,以确保数据传输的稳定性和可靠性。同时,上位机还实现了数据的动态显示和历史数据的查询导出功能,以方便用户对农田环境数据进行分析和处理。
四、上位机源码实现以下是qt串口读取数据的实现代码:
#include #include #include #include int main(int argc, char *argv[]) { qcoreapplication a(argc, argv); qserialport serial; serial.setportname(com1); // 根据实际情况设置端口号 if (!serial.open(qiodevice::readwrite)) { // 打开串口 qdebug() << failed to open serial port!; return 1; } // 设置串口参数 serial.setbaudrate(qserialport::baud115200); serial.setdatabits(qserialport::data8); serial.setparity(qserialport::noparity); serial.setstopbits(qserialport::onestop); serial.setflowcontrol(qserialport::noflowcontrol); while (true) { if (serial.waitforreadyread(1000)) { // 等待数据 qbytearray data = serial.readall(); // 读取所有数据 qdebug() << received data: << data; // 打印所有数据 // 解析数据 qstringlist datalist = qstring(data).split(,); if (datalist.size() == 4) { float temperature = datalist[0].tofloat(); float humidity = datalist[1].tofloat(); float illumination = datalist[2].tofloat(); float soilmoisture = datalist[3].tofloat(); // 打印解析后的数据 qdebug() << temperature: << temperature << °c; qdebug() << humidity: << humidity << %; qdebug() << illumination: << illumination << lux; qdebug() << soil moisture: << soilmoisture << %; } } } return a.exec(); }读取数据时,采用了waitforreadyread函数等待串口数据到达,该函数的参数表示最长等待时间,单位为毫秒。在解析数据时,使用了qstring的split函数将数据按逗号分隔为多个字符串,再分别转换为对应的浮点数。
五、cc2530设备端源码【1】bh1750数据读取以下是cc2530单片机读取bh1750光敏传感器的值并打印到串口的代码:
#include hal_board_cfg.h #include hal_types.h #include hal_defs.h #include hal_uart.h #include onboard.h #include hal_i2c.h #define bh1750_addr 0x23 // bh1750默认地址 void inituart(); void sendstr(char *str); void bh1750_init(); uint16 bh1750_read(); void main() { // 初始化 halboardinit(); inituart(); bh1750_init(); while (true) { // 读取传感器数据 uint16 illumination = bh1750_read(); char str[16]; sprintf(str, %d, illumination); // 将数据打印到串口 sendstr(str); // 延时等待1秒 halmcuwaitms(1000); } } void inituart() { hal_uart_cfg_t uartcfg; uartcfg.baudrate = hal_uart_br_115200; uartcfg.flowcontrol = false; uartcfg.parity = hal_uart_parity_none; uartcfg.stopbits = hal_uart_stop_bits_1; uartcfg.startguardtime = 0; haluartinit(); haluartopen(hal_uart_port_0, &uartcfg); } void sendstr(char *str) { while (*str != '\\0') { haluartwrite(hal_uart_port_0, (uint8*)str, 1); str++; } haluartwrite(hal_uart_port_0, (uint8*)\\r\\n, 2); } void bh1750_init() { uint8 pbuf[2]; pbuf[0] = 0x01; // 开始测量命令 hali2cwrite(bh1750_addr, pbuf, 1); pbuf[0] = 0x10; // 分辨率设置为1lx hali2cwrite(bh1750_addr, pbuf, 1); } uint16 bh1750_read() { uint8 pbuf[2]; hali2cread(bh1750_addr, pbuf, 2); uint16 illumination = (pbuf[0] << 8) | pbuf[1]; return illumination; }上述代码中,inituart函数用于初始化串口,sendstr函数用于将字符串打印到串口。bh1750_init函数用于初始化bh1750传感器,包括发送开始测量指令和设置分辨率为1lx等操作。bh1750_read函数用于读取传感器数据并计算出光照强度值。在main函数中,使用了一个while循环不断从传感器读取数据,并通过串口打印输出。代码中的延时函数halmcuwaitms是cc2530提供的延时函数,可以使用其他方式实现延时等待功能。
【2】dht11温湿度数据读取以下是cc2530单片机读取dht11传感器的温度和湿度并打印到串口的代码:
#include hal_types.h #include hal_board.h #include hal_uart.h #define dht11_port 1 // dht11连接到p1口 // 发送一个dht11开始信号 void dht11_start(void) { // 设置引脚为输出模式 p1sel &= ~(1 << dht11_port); p1dir |= (1 << dht11_port); // 拉低引脚 p1_1 = 0; // 等待至少18ms haldelayms(18); // 拉高引脚 p1_1 = 1; // 等待20~40us,并切换到输入模式 haldelayus(30); p1dir &= ~(1 << dht11_port); } // 等待dht11响应信号 uint8 dht11_waitresponse(void) { uint8 timeout = 0; while(p1_1 && timeout = 200) return 1; timeout = 0; while(!p1_1 && timeout = 200) return 1; return 0; } // 读取一个位 uint8 dht11_readbit(void) { uint8 timeout = 0; while(p1_1 && timeout < 200) { // 等待低电平出现,超时返回1 haldelayus(1); timeout++; } timeout = 0; while(!p1_1 && timeout < 200) { // 等待高电平出现,超时返回1 haldelayus(1); timeout++; } haldelayus(40); // 等待40us if(p1_1) return 1; // 如果在40us内未出现低电平,返回1,表示数据错误 return 0; } // 读取一个字节 uint8 dht11_readbyte(void) { uint8 byte = 0; uint8 i; for(i=0;i<8;i++) { byte <<= 1; byte |= dht11_readbit(); } return byte; } // 从dht11读取温度和湿度数据 void dht11_readdata(uint8* temperature, uint8* humidity) { uint8 data[5]; // 发送开始信号 dht11_start(); // 等待响应信号 if(dht11_waitresponse()) { *temperature = 0; *humidity = 0; return; } // 读取数据 data[0] = dht11_readbyte(); // 湿度整数部分 data[1] = dht11_readbyte(); // 湿度小数部分 data[2] = dht11_readbyte(); // 温度整数部分 data[3] = dht11_readbyte(); // 温度小数部分 data[4] = dht11_readbyte(); // 校验和 // 计算校验和 uint8 sum = data[0] + data[1] + data[2] + data[3]; if(sum != data[4]) { *temperature = 0; *humidity = 0; return; } // 计算温度和湿度 *humidity = data[0]; *temperature = data[2]; } // 初始化串口 void uart_init(void) { haluartinit(); haluartcfg_t uartconfig; uartconfig.configured = true; uartconfig.baudrate = hal_uart_br_115200; uartconfig.flowcontrol = false; uartconfig.flowcontrolthreshold = 64; // 设置串口传输格式 uartconfig.rx.maxbufsize = 128; uartconfig.tx.maxbufsize = 128; uartconfig.idletimeout = 6; uartconfig.intenable = true; uartconfig.callbackfunc = null; haluartopen(hal_uart_port_0, &uartconfig); } // 打印温度和湿度到串口 void printdata(uint8 temperature, uint8 humidity) { char buf[32]; sprintf(buf, temperature: %dc, humidity: %d%%\\r\\n, temperature, humidity); haluartwrite(hal_uart_port_0, (uint8*)buf, strlen(buf)); } void main(void) { uint8 temperature, humidity; // 初始化串口 uart_init(); while(1) { // 从dht11读取数据 dht11_readdata(&temperature, &humidity); // 打印数据到串口 printdata(temperature, humidity); // 等待1秒钟 haldelayms(1000); } }这段代码使用cc2530单片机通过dht11传感器读取环境温度和湿度,并将其打印到串口。具体实现过程为,首先发送一个开始信号,等待dht11响应信号后,依次读取湿度整数、湿度小数、温度整数、温度小数和校验和。判断校验和是否正确后,计算得到温度和湿度,并通过串口输出。为了保证数据的准确性,每次读取数据前需要等待1秒钟。
Cosmic Circuits为ARM提供PLLs
新能源智能汽车创新峰会将在湖州举办
Anaqua被指定为通用汽车(GM)端对端知识产权管理提供商
阿里首次出现在自动驾驶计算机视觉算法集KITTI道路场景分割排行榜上
音质好的半入耳蓝牙耳机,200元内最好的蓝牙耳机
基于CC2530设计智慧农业控制系统
百度萝卜快跑已成为亦庄市民常态化的出行方式
vr是人工智能吗
三星重磅更新2021款G9 Odyssey
基于南方某市的电动汽车充电数据分析电动汽车充电负荷预测
天津科技大学:研发细菌纤维素水凝胶及其应用柔性传感器
iphone7重量是多少克,为什么苹果7重量不一样?
柔性智能机器人应用案例 | 汽车零部件智能装配及焊接系统
BEMS统一管理办公室能源,优化电力消耗
你的扫地机器人好不好,还得从这4大要素分析
单片机学了以后可以干嘛
关于PCB压接孔工艺
一加7Pro拍照到底怎么样
电信携手摩托罗拉推出双核手机XT928 售价5K
三维热仿真软件FloEFD对电机散热情况进行仿真分析