基于51單片機(jī)的溫室大棚環(huán)境監(jiān)測系統(tǒng)——空氣溫濕度監(jiān)測,土壤溫濕度監(jiān)測,光照監(jiān)測,無線傳輸數(shù)據(jù)
文末尾附帶源碼
1.1 研究背景
隨著人們生活水平的不斷提高,人們對(duì)自身的健康越來越關(guān)注,對(duì)各類食物的要求也越來越高,溫室大棚作為培育瓜果蔬菜的生長基地,因此對(duì)溫室大棚中植物的生長環(huán)境進(jìn)行實(shí)時(shí)監(jiān)測是尤為重要的,所以對(duì)溫室大棚環(huán)境監(jiān)測系統(tǒng)設(shè)計(jì)的研究是很有必要的。
1.2 設(shè)計(jì)要求
(1)選擇合適的傳感器,并設(shè)計(jì)傳感器信號(hào)調(diào)理電路;
(2)用液晶顯示器12864實(shí)時(shí)顯示大棚環(huán)境參數(shù);
(3)設(shè)計(jì)按鍵電路能夠設(shè)置環(huán)境參數(shù)的上下限;
(4)設(shè)聲光報(bào)警電路,通過按鍵設(shè)置閾值,在超限后報(bào)警;
(5)通過NRF24L01模塊實(shí)現(xiàn)無線傳輸;
(6)屏幕顯示實(shí)時(shí)時(shí)間,并可進(jìn)行調(diào)整;
2.1 系統(tǒng)方案框圖
2.2 方案分析
以GY-30光照模塊,DS18B20土壤溫度模塊,YL-69土壤濕度模塊和DHT11溫濕度模塊和STC89C52單片機(jī)為控制核心組成環(huán)境監(jiān)測系統(tǒng)的發(fā)射板,實(shí)現(xiàn)對(duì)現(xiàn)場光照,土壤溫濕度以及空氣溫濕度數(shù)據(jù)的采集。
以DS1302實(shí)時(shí)時(shí)鐘模塊,LCD12864顯示模塊以及蜂鳴器報(bào)警模塊和STC89C52單片機(jī)為控制核心組成環(huán)境監(jiān)測系統(tǒng)的接收板,實(shí)現(xiàn)對(duì)實(shí)時(shí)始終數(shù)據(jù)的采集和對(duì)發(fā)射板接收數(shù)據(jù)的顯示,以及實(shí)現(xiàn)在超限后聲光報(bào)警。
通過NRF24L01無線模塊進(jìn)而實(shí)現(xiàn)發(fā)射板和接收板之間的數(shù)據(jù)通信。
1. 單片機(jī)選擇
單片機(jī)采用宏晶科技的單片機(jī)STC89C52。STC89C52是一種低功耗、高性能CMOS8位微控制器。STC89C52使用經(jīng)典的MCS-51內(nèi)核,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash。
2. 光照模塊電路
采用GY-30構(gòu)成光照模塊電路。GY-30是一款內(nèi)置ROHM-BH1750FLV芯片的數(shù)字光照強(qiáng)度模塊。芯片內(nèi)置16bitAD轉(zhuǎn)換器,可直接數(shù)字輸出,測量光照強(qiáng)度范圍為0-65535lx(精度可選)。除此之外,模塊內(nèi)置電平轉(zhuǎn)換,支持3-5V供電,可與5V單片機(jī)IO直接連接;對(duì)外提供IIC接口,方便使用。
3. 土壤溫度模塊電路
采用DS18B20構(gòu)成土壤溫度模塊電路。DS18B20是常用的數(shù)字溫度傳感器,其輸出的是數(shù)字信號(hào),具有體積小,硬件開銷低,抗干擾能力強(qiáng),精度高的特點(diǎn)。它的接線方便,封裝成后可應(yīng)用于多種場合。
4. 土壤濕度模塊電路
土壤濕度模塊電路采用YL-69。YL-69 是一個(gè)簡單的土壤濕度傳感器,是一種電容式傳感器,主要使用的是濕敏電容。當(dāng)環(huán)境的濕度發(fā)生改變時(shí),會(huì)使得濕敏電容存在的環(huán)境中的介質(zhì)發(fā)生改變,導(dǎo)致濕敏電容中的電容數(shù)值產(chǎn)生變化,電容的數(shù)值正比于濕度值 。
由于濕敏電容的靈敏度高、響應(yīng)速度快、滯后量小,此外微小的體積、極低的功耗,使得濕敏電容很容易小型化和集成化。
YL-69 采用 CMOS 工藝,可以確保其低功耗,同時(shí)還具有很高的可靠性和穩(wěn)定性。傳感器內(nèi)部含有一個(gè)電容性聚合體濕度敏感元件和一個(gè)用能隙材料做成的溫度傳感器,在同一芯片上,與 A/D 轉(zhuǎn)換器及串行接口電路實(shí)現(xiàn)連接。
5. 空氣溫濕度模塊電路
空氣溫濕度模塊電路采用DHT11模塊,DHT11數(shù)字溫濕度傳感器是一款含有已校準(zhǔn)數(shù)字信號(hào)輸出的溫濕度復(fù)合傳感器,它應(yīng)用專用的數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù),確保產(chǎn)品具有極高的可靠性和卓越的長期穩(wěn)定性。傳感器包括一個(gè)電阻式感濕元件和一個(gè)NTC測溫元件,并與一個(gè)高性能8位單片機(jī)相連接。因此該產(chǎn)品具有品質(zhì)卓越、超快響應(yīng)、抗干擾能力強(qiáng)、性價(jià)比極高等優(yōu)點(diǎn)。
6.無線模塊電路
無線模塊電路采用NRF24L01模塊,NRF24L01是一款新型單片射頻收發(fā)器件,工作于2.4 GHz~2.5 GHz ISM頻段。內(nèi)置頻率合成器、功率放大器、晶體振蕩器、調(diào)制器等功能模塊,并融合了增強(qiáng)型ShockBurst技術(shù),其中輸出功率和通信頻道可通過程序進(jìn)行配置。
7.LCD12864顯示模塊電路
帶中文字庫的128X64 是一種具有4 位/8 位并行、2 線或3 線串行多種接口方式,內(nèi)部含有國標(biāo)一級(jí)、二級(jí)簡體 中文字庫的點(diǎn)陣圖形液晶顯示模塊;其顯示分辨率為128×64, 內(nèi)置8192 個(gè)1616 點(diǎn)漢字,和128 個(gè)168 點(diǎn)ASCII 字符 集.利用該模塊靈活的接口方式和簡單、方便的操作指令,可構(gòu)成全中文人機(jī)交互圖形界面。
8.報(bào)警模塊電路
本設(shè)計(jì)的報(bào)警電路采用了一個(gè)電磁式有源蜂鳴器來實(shí)現(xiàn)。報(bào)警電路連接在單片機(jī)的某一特定管腳,隨時(shí)會(huì)根據(jù)輸出信號(hào)控制報(bào)警電路的工作與否。設(shè)定一個(gè)溫度界限,當(dāng)采集到的溫度超過界限的時(shí)候,蜂鳴器則會(huì)一直響;當(dāng)溫度在溫度界限內(nèi)時(shí),蜂鳴器停止鳴叫。
9.實(shí)時(shí)時(shí)鐘模塊電路
DS1302是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實(shí)時(shí)時(shí)鐘電路,它可以對(duì)年、月、日、周、時(shí)、分、秒進(jìn)行計(jì)時(shí),具有閏年補(bǔ)償功能,工作電壓為2.0V~5.5V。采用三線接口與CPU進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)或RAM數(shù)據(jù)。
4.1 主程序設(shè)計(jì)
整個(gè)軟件部分分為發(fā)射板空氣溫濕度,土壤溫濕度和光照數(shù)據(jù)的采集和數(shù)據(jù)的無線傳輸以及接收板數(shù)據(jù)的顯示。
首先DHT11進(jìn)行初始化,通過調(diào)用采集數(shù)據(jù)函數(shù),分別采集空氣的濕度信息,溫度信息,返回?cái)?shù)據(jù),再通過內(nèi)部AD轉(zhuǎn)換將采集到的數(shù)據(jù)串行的存入發(fā)送緩沖器;
通過YL-69初始化函數(shù)初始化模塊,再調(diào)用采集數(shù)據(jù)函數(shù),讀取當(dāng)前傳感器的探頭濕度信息,為當(dāng)前的探頭電容值,對(duì)采集土壤濕度信息,因?yàn)槟K沒有AD轉(zhuǎn)換電路,所以外接ADC0832芯片,通過對(duì)ADC0832芯片初始化,進(jìn)行AD轉(zhuǎn)換,返回?cái)?shù)據(jù),再將數(shù)據(jù)存入發(fā)送緩沖器中;
通過DS18B20初始化函數(shù)初始化模塊的工作方式,調(diào)用采集土壤溫度信息函數(shù),內(nèi)部采用減法計(jì)數(shù)器的原理,最終得到的當(dāng)前溫度數(shù)據(jù),返回?cái)?shù)據(jù),將數(shù)據(jù)串行存入發(fā)送緩沖器中;
通過GY-30初始化初始化函數(shù)初始化工作方式,調(diào)用并采集光照信息的函數(shù),采集到的信息分為8位,將數(shù)據(jù)按位取出來,分別×對(duì)應(yīng)位置的倍數(shù)得到最終的數(shù)據(jù),返回?cái)?shù)據(jù),將得到的數(shù)據(jù)存入發(fā)送緩沖器中;
通過最后通過設(shè)置NRF24L01初始化,將發(fā)送緩沖器的數(shù)組給到NRF24L01的數(shù)據(jù)發(fā)送函數(shù),NRF24L01根據(jù)對(duì)應(yīng)緩沖器中的數(shù)據(jù)長度,將發(fā)送緩沖器中的數(shù)據(jù)串行按位發(fā)送給接收板,發(fā)送給接收單片機(jī)。
將上述模塊化的程序放入while大循環(huán)里,從而實(shí)現(xiàn)了對(duì)數(shù)據(jù)的實(shí)時(shí)采集,實(shí)時(shí)發(fā)送。實(shí)現(xiàn)了本次課設(shè)的基本要求,下圖為發(fā)送板的主程序框圖:
數(shù)據(jù)接受板,通過無線模塊對(duì)數(shù)據(jù)進(jìn)行接收,將發(fā)送緩沖器的數(shù)據(jù)存入接收緩沖器,再通過對(duì)接收緩沖器中的對(duì)應(yīng)位置數(shù)據(jù)進(jìn)行顯示,分別讀取對(duì)應(yīng)索引的數(shù)值。
調(diào)用12864顯示函數(shù)對(duì)數(shù)值數(shù)字化顯示,在通過接收DS1302實(shí)時(shí)時(shí)鐘芯片對(duì)應(yīng)時(shí)、分、秒的引腳的數(shù)據(jù),通過程序控制進(jìn)位,調(diào)用對(duì)應(yīng)日期和相應(yīng)實(shí)時(shí)傳輸?shù)臄?shù)據(jù)的顯示函數(shù)進(jìn)行顯示;
在程序中定義對(duì)應(yīng)位置的按鍵,sbit定義按鍵對(duì)應(yīng)單片機(jī)的引腳,設(shè)置按鍵的功能從S1-S5對(duì)應(yīng)功能分別為:時(shí)間設(shè)置,閾值設(shè)置,加計(jì)數(shù),減計(jì)數(shù),確認(rèn)。
按下時(shí)間設(shè)置可以對(duì)時(shí)間的秒進(jìn)行設(shè)置,再次按下時(shí)可以對(duì)應(yīng)光標(biāo)為分位置,再按下可以進(jìn)入時(shí)的位置,以此類推;
按下閾值設(shè)置按鍵可以分別進(jìn)入空氣溫度,濕度設(shè)置,光照設(shè)置,土壤溫度,土壤濕度閾值設(shè)置,從而實(shí)現(xiàn)對(duì)相應(yīng)數(shù)據(jù)進(jìn)行設(shè)置。
按下S5即最后一個(gè)按鍵,可以對(duì)設(shè)置的當(dāng)前時(shí)間、閾值進(jìn)行確認(rèn);之后程序進(jìn)入對(duì)通過標(biāo)志位flag判斷為1超過閾值,對(duì)于溫度,空氣濕度,土壤溫度,土壤濕度超過閾值的當(dāng)前實(shí)時(shí)數(shù)據(jù)進(jìn)行監(jiān)測,超過閾值則蜂鳴器報(bào)警,否則flag判斷為0,繼續(xù)執(zhí)行。
將上述程序放入大的循環(huán)中,從而實(shí)現(xiàn)了對(duì)發(fā)送板發(fā)送的數(shù)據(jù)進(jìn)行實(shí)時(shí)采集的功能,下圖分別為接收板程序設(shè)計(jì)圖:
部分實(shí)物圖,PCB展示
需要實(shí)物pcb板的朋友請(qǐng)私信
部分程序源碼
部分源碼 采用keil4編寫
.
// 發(fā)射板源代碼:
#include <stc89c52.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define FOSC 11059200L //System frequency
#define BAUD 2400 //UART baudrate
unsigned char flagcom=0;
//2401IO端口定義sbit MISO =P0^2;
sbit MOSI =P0^4;
sbit SCK =P0^1;
sbit CE =P0^0;
sbit CSN =P0^5;
sbit IRQ =P0^3;
unsigned char xdata TxBuf[32]=0; //2401 發(fā)送寄存器
sbit DQ=P2^7; //DHT11
//bh1750
sbit SCL=P2^1; //IIC時(shí)鐘引腳定義
sbit SDA=P2^2; //IIC數(shù)據(jù)引腳定義
#define SlaveAddress 0x46 //定義器件在IIC總線中的從地址,根據(jù)ALT ADDRESS地址引腳不同修改
//ALT ADDRESS引腳接地時(shí)地址為0x46,接電源時(shí)地址為0x3A
typedef unsigned char BYTE;
typedef unsigned short WORD;
uchar BUF[8]; //接收數(shù)據(jù)緩存區(qū)
unsigned char xdata ge,shi,bai,qian,wan; //顯示變量
uchar tem; //溫度
uchar hum; //濕度
uint guangzhao=0; //光照
uint pm25=0; //pm2.5
uint tw=0; //土壤溫度
uint ts=0; //土壤濕度
uint flag1=0;
sbit LED1=P1^1;
sbit LED2=P1^4;
//*************************************ADC0832定義*****************/
//ADC0832
sbit CS = P1^5;
sbit CLK = P1^6;
sbit DIO = P1^7;
//*********************************************NRF24L01*************************************
#define TX_ADR_WIDTH 5 // 5 uints TX address width
#define RX_ADR_WIDTH 5 // 5 uints RX address width
#define TX_PLOAD_WIDTH 32 // 20 uints TX payload
#define RX_PLOAD_WIDTH 32 // 20 uints TX payload
uchar const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址
uchar const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址
//***************************************NRF24L01寄存器指令*******************************************************
#define READ_REG 0x00 // 讀寄存器指令
#define WRITE_REG 0x20 // 寫寄存器指令
#define RD_RX_PLOAD 0x61 // 讀取接收數(shù)據(jù)指令
#define WR_TX_PLOAD 0xA0 // 寫待發(fā)數(shù)據(jù)指令
#延時(shí)函數(shù)
void inerDelay_us(unsigned char n)
{
for(;n>0;n--)
_nop_();
}
void Delay5ms()
{
WORD n = 560;
while (n--);
}
void delay_nms(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++)
{;}}
}
void Delay5us()
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
//******************************復(fù)位ds18b20************/
void Init_ds18b20(void) {
DQ = 1;
delay(1);
DQ = 0;
delay(250);
DQ = 1;
delay(100);
}
#NRF24L01初始化
void init_NRF24L01(void)
{
inerDelay_us(100);
CE=0; // chip enable
CSN=1; // Spi disable
SCK=0; // Spi clock line init high
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 寫本地地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 寫接收端地址
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 頻道0自動(dòng) ACK應(yīng)答允許
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允許接收地址只有頻道0,如果需要多頻道可以參考Page21
SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 設(shè)置信道工作為2.4GHZ,收發(fā)必須一致
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //設(shè)置接收數(shù)據(jù)長度,本次設(shè)置為32字節(jié)
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //設(shè)置發(fā)射速率為1MHZ,發(fā)射功率為最大值0dB
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收發(fā)完成中斷響應(yīng),16位CRC,主發(fā)送
}
博客主頁:https://blog.csdn.net/weixin_51141489,需要源碼或相關(guān)資料實(shí)物的友友請(qǐng)關(guān)注、點(diǎn)贊,私信吧!