一、电路设计
系统示意图
硬件系统
系统由五个单片机系统组成的,其中51系列的单片机四个,STM32F407单片机一个,各个子系统之间通过NRF24L01无线模块进行通信。
系统硬件组成框图
主控制板主要由STM32F407探索板、无线通信模块以及USB转串口模块组成。主控制板负责对两个大棚传递上来的信息进行处理,打包之后发送给上位机,同时还负责将上位机下达的指令传递给两个大棚。
主控制板硬件组成框图
大棚控制板主要由STC12C5A60S2单片机、12864LCD显示、光耦隔离、继电器、无线通信模块组成。大棚控制板负责控制大棚内部装置以及转发大棚采集板采集上来的数据,一旦收到主控制板发送的信号,大棚控制板将对相应的装置进行控制。
大棚控制板硬件组成框图
大棚采集板主要由STC12C4052AD单片机、光照强度传感器、土壤湿度传感器、空气温湿度、无线通信模块以及供电电池组成。大棚采集板负责采集大棚内部的各项数据,之后发送给大棚控制板。
大棚采集板硬件组成框图
软件系统
上位机软件使用微软公司的Visual
Basic语言编写。上位机界面通过USB转串口模块与主控制板进行通信,以获取两个大棚内部的环境数据和对大棚内部设施进行控制,同时上位机软件还可以将环境数据保存到数据库中,以便日后的查询。
上位机软件界面
二、运行结果
三、部分代码
#include "main.h"
u8 flag,j,ii,tf,temp;
u8 TxBuf[13]={0x0f,0x0f,0x0f,0x0f,0x0f,0x00,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa};
u8 RxBuf0[13];
u8 RxBuf1[13]={50,50,50,50,50,50,50,50,50,50,50,50,50};
u8 RxBuf[26];
u8 RX0_flag=0,RX1_flag=0;
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断向量配置
LED_Init(); //初始化LED
COM3Init(9600); //串口3初始
MY_SPI_Init();
if(NRF24L01_Check())
{
GPIO_SetBits(GPIOD, GPIO_Pin_14);
}
else
{
GPIO_SetBits(GPIOD, GPIO_Pin_13);
}
NRF24L01_Init();
NRF24L01_TxPacket(TxBuf);
NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,0XFF);
tf=0;
while(1)
{
if(flag) //如果PC给它发了指令,则往下发送
{
USART_Cmd(USART3, DISABLE); //关串口
NRF24L01_Write_Reg(WRITE_REG_NRF+CONFIG, 0x0e);//配置为发送
for(ii=0;ii<7;ii++)
{
temp=(j&0x80);
j=(j<<1);
if(temp)TxBuf[ii]=0xf0;
else TxBuf[ii]=0x0f;
}
NRF24L01_TX_Mode(TxBuf[5]);
NRF24L01_TxPacket(TxBuf);
NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,0XFF);
delay_ms(10);
NRF24L01_Init();//当发送完毕后,重新把通道0配置为1号大棚,通道1为2号大棚
flag=0;
USART_Cmd(USART3, ENABLE);
}
NRF24L01_Write_Reg(WRITE_REG_NRF+CONFIG, 0x0f);
tf=NRF24L01_switch(); //判断通道
switch (tf)
{
case 0: NRF24L01_RxPacket(RxBuf0); //0通道为一号大棚
RX0_flag=1;
break;
case 1: NRF24L01_RxPacket(RxBuf1); //1通道为二号大棚
RX1_flag=1;
break;
}
if(RX0_flag|RX1_flag)
{
for(ii=0;ii<13;ii++)RxBuf[ii]=RxBuf0[ii];
for(ii=13;ii<26;ii++)RxBuf[ii]=RxBuf1[ii-13];
for(ii=0;ii<26;ii++)
{
USART_SendData(USART3,RxBuf[ii]);
while(!USART_GetFlagStatus(USART3,USART_FLAG_TC));
USART_ClearFlag(USART3,USART_FLAG_TC);
}
RX0_flag=0;
RX1_flag=0;
}
// GPIO_SetBits(GPIOD, GPIO_Pin_15);
// delay_ms(300);
// GPIO_ResetBits(GPIOD, GPIO_Pin_15);
// delay_ms(300);
}
}