基于STM32单片机无线ZIGBEE智能大棚土壤湿度光照检测
1、系统功能介绍
- 本系统由主机和从机组成。主从机通过zigbee模块CC2530实现数据通讯。
- 主机由STM32F103C8T6单片机、光照采集、DS18B20温度检测、土壤湿度采集、zigbee模块组成。
- 从机由STM32F103C8T6单片机、LCD1602液晶显示、zigbee模块组成。
- 1、主机检测温度、光照(0-100)和土壤湿度(0-100),然后通过zigbee模块将数据传输给从机。
- 2、在从机接收到数据后,在液晶上实时显示温度、光照(0-100)和土壤湿度(0-100)。
- 3、液晶显示具有实时性,如果主机停止发送数据,从机液晶将显示xx表示数据无效链接断开。
2、演示视频
3、系统电路介绍
3.1、STM32单片机最小系统设计
- STM32的最小系统的硬件组成主要有:电源电路、复位电路、时钟电路、调试接口电路、启动电路。
- 电源 : 一般是3.3V输入作为STM32芯片的工作电压,实际中很多采用LDO将5V转换为3.3V进行供电,另外电路上还要加多个0.01uf去耦电容对输入电压进行滤波,稳定输入电压。
- 复位:STM32中有三种复位方式,分别为:上电复位、手动复位、程序自动复位。上电复位是指芯片根据外部搭建的复位电路,在上电的时候进行的复位;手动复位是指通过外部的复位电路自己手动进行复位;程序复位是在软件中通过代码对STM32芯片进行的复位。
- 单片机最小系统电路图如下图所示
- 实物图:
3.2、CC2530 zigbee无线发射接收模块(DL-20)电路设计
-
ZigBee是基于IEEE802.15.4标准的低功耗局域网协议。根据国际标准规定,ZigBee技术是一种短距离、低功耗的无线通信技术。这一名称(又称紫蜂协议)来源于蜜蜂的八字舞,由于蜜蜂(bee)是靠飞翔和“嗡嗡”(zig)地抖动翅膀的“舞蹈”来与同伴传递花粉所在方位信息,也就是说蜜蜂依靠这样的方式构成了群体中的通信网络。其特点是近距离、低复杂度、自组织、低功耗、低数据速率。主要适合用于自动控制和远程控制领域,可以嵌入各种设备。
-
DL-20无线串口透传模块是一款基于UART接口的全双工无线透明传输模块,可以工作在2400MHZZ-2450MHZ公用频段。该模块采用TI的CC2530芯片,具体型号为CC2530F256RHAR。符合IEEE802.15.4协议,通过该模块可以使传统的串口设备实现无线传输,替换掉复杂的布线工作。用于点对点通信、广播通信。即插即用,免开发,使用简单。
-
电路原理图
-
-
实物图
-
3.3、DS18B20温度传感器模块电路设计
-
DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等。
-
DS18B20温度传感器可编程的分辨率为9~12位,温度转换为12位数字格式最大值为750毫秒,用户可定义的非易失性温度报警设置,应用范围包括恒温控制、工业系统、消费电子产品温度计、或任何热敏感系统。试验证明DS18B20温度传感器满足本设计要求。
-
矩阵键盘按键电路设计如下图所示:
-
-
实物图:
-
-
3.4、LCD1602液晶显示模块电路设计
- LCD显示器分为字段显示和字符显示两种。其中字段显示与LED显示相似,只要送对应的信号到相应的管脚就能显示。字符显示是根据需要显示基本字符。本设计采用的是字符型显示。系统中采用LCD1602作为显示器件输出信息。
- 与传统的LED数码管显示器件相比,液晶显示模块具有体积小、功耗低、显示内容丰富等优点,而且不需要外加驱动电路,现在液晶显示模块已经是单片机应用设计中最常用的显示器件了。LCD1602可以显示2行16个汉字。
- 电路原理图:
- 实物图:
4、程序设计
4.1、获取土壤湿度
u16 Get_Adc(u8 ch)
{
//设置指定ADC的规则组通道,一个序列,采样时间
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采样时间为239.5周期
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
}
4.2、按键初始化
void KEY_Init(void) //IO初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
4.3、读取DS18b20温度
//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250)
short DS18B20_Get_Temp(void)
{
u8 temp;
u8 TL,TH;
short tem;
DS18B20_Start (); // ds1820 start convert
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xcc);// skip rom
DS18B20_Write_Byte(0xbe);// convert
TL=DS18B20_Read_Byte(); // LSB
TH=DS18B20_Read_Byte(); // MSB
if(TH>7)
{
TH=~TH;
TL=~TL;
temp=0;//温度为负
}else temp=1;//温度为正
tem=TH; //获得高八位
tem<<=8;
tem+=TL;//获得底八位
tem=(float)tem*0.625;//转换
if(temp)return tem; //返回温度值
else return -tem;
}