基于51單片機的溫室大棚環(huán)境監(jiān)測系統(tǒng)——空氣溫濕度監(jiān)測,土壤溫濕度監(jiān)測,光照監(jiān)測,無線傳輸數(shù)據(jù)
文末尾附帶源碼
1.1 研究背景
隨著人們生活水平的不斷提高,人們對自身的健康越來越關(guān)注,對各類食物的要求也越來越高,溫室大棚作為培育瓜果蔬菜的生長基地,因此對溫室大棚中植物的生長環(huán)境進(jìn)行實時監(jiān)測是尤為重要的,所以對溫室大棚環(huán)境監(jiān)測系統(tǒng)設(shè)計的研究是很有必要的。
1.2 設(shè)計要求
(1)選擇合適的傳感器,并設(shè)計傳感器信號調(diào)理電路;
(2)用液晶顯示器12864實時顯示大棚環(huán)境參數(shù);
(3)設(shè)計按鍵電路能夠設(shè)置環(huán)境參數(shù)的上下限;
(4)設(shè)聲光報警電路,通過按鍵設(shè)置閾值,在超限后報警;
(5)通過NRF24L01模塊實現(xiàn)無線傳輸;
(6)屏幕顯示實時時間,并可進(jìn)行調(diào)整;
2.1 系統(tǒng)方案框圖
2.2 方案分析
以GY-30光照模塊,DS18B20土壤溫度模塊,YL-69土壤濕度模塊和DHT11溫濕度模塊和STC89C52單片機為控制核心組成環(huán)境監(jiān)測系統(tǒng)的發(fā)射板,實現(xiàn)對現(xiàn)場光照,土壤溫濕度以及空氣溫濕度數(shù)據(jù)的采集。
以DS1302實時時鐘模塊,LCD12864顯示模塊以及蜂鳴器報警模塊和STC89C52單片機為控制核心組成環(huán)境監(jiān)測系統(tǒng)的接收板,實現(xiàn)對實時始終數(shù)據(jù)的采集和對發(fā)射板接收數(shù)據(jù)的顯示,以及實現(xiàn)在超限后聲光報警。
通過NRF24L01無線模塊進(jìn)而實現(xiàn)發(fā)射板和接收板之間的數(shù)據(jù)通信。
1. 單片機選擇
單片機采用宏晶科技的單片機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ù)字光照強度模塊。芯片內(nèi)置16bitAD轉(zhuǎn)換器,可直接數(shù)字輸出,測量光照強度范圍為0-65535lx(精度可選)。除此之外,模塊內(nèi)置電平轉(zhuǎn)換,支持3-5V供電,可與5V單片機IO直接連接;對外提供IIC接口,方便使用。
3. 土壤溫度模塊電路
采用DS18B20構(gòu)成土壤溫度模塊電路。DS18B20是常用的數(shù)字溫度傳感器,其輸出的是數(shù)字信號,具有體積小,硬件開銷低,抗干擾能力強,精度高的特點。它的接線方便,封裝成后可應(yīng)用于多種場合。
4. 土壤濕度模塊電路
土壤濕度模塊電路采用YL-69。YL-69 是一個簡單的土壤濕度傳感器,是一種電容式傳感器,主要使用的是濕敏電容。當(dāng)環(huán)境的濕度發(fā)生改變時,會使得濕敏電容存在的環(huán)境中的介質(zhì)發(fā)生改變,導(dǎo)致濕敏電容中的電容數(shù)值產(chǎn)生變化,電容的數(shù)值正比于濕度值 。
由于濕敏電容的靈敏度高、響應(yīng)速度快、滯后量小,此外微小的體積、極低的功耗,使得濕敏電容很容易小型化和集成化。
YL-69 采用 CMOS 工藝,可以確保其低功耗,同時還具有很高的可靠性和穩(wěn)定性。傳感器內(nèi)部含有一個電容性聚合體濕度敏感元件和一個用能隙材料做成的溫度傳感器,在同一芯片上,與 A/D 轉(zhuǎn)換器及串行接口電路實現(xiàn)連接。
5. 空氣溫濕度模塊電路
空氣溫濕度模塊電路采用DHT11模塊,DHT11數(shù)字溫濕度傳感器是一款含有已校準(zhǔn)數(shù)字信號輸出的溫濕度復(fù)合傳感器,它應(yīng)用專用的數(shù)字模塊采集技術(shù)和溫濕度傳感技術(shù),確保產(chǎn)品具有極高的可靠性和卓越的長期穩(wěn)定性。傳感器包括一個電阻式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接。因此該產(chǎn)品具有品質(zhì)卓越、超快響應(yīng)、抗干擾能力強、性價比極高等優(yōu)點。
6.無線模塊電路
無線模塊電路采用NRF24L01模塊,NRF24L01是一款新型單片射頻收發(fā)器件,工作于2.4 GHz~2.5 GHz ISM頻段。內(nèi)置頻率合成器、功率放大器、晶體振蕩器、調(diào)制器等功能模塊,并融合了增強型ShockBurst技術(shù),其中輸出功率和通信頻道可通過程序進(jìn)行配置。
7.LCD12864顯示模塊電路
帶中文字庫的128X64 是一種具有4 位/8 位并行、2 線或3 線串行多種接口方式,內(nèi)部含有國標(biāo)一級、二級簡體 中文字庫的點陣圖形液晶顯示模塊;其顯示分辨率為128×64, 內(nèi)置8192 個1616 點漢字,和128 個168 點ASCII 字符 集.利用該模塊靈活的接口方式和簡單、方便的操作指令,可構(gòu)成全中文人機交互圖形界面。
8.報警模塊電路
本設(shè)計的報警電路采用了一個電磁式有源蜂鳴器來實現(xiàn)。報警電路連接在單片機的某一特定管腳,隨時會根據(jù)輸出信號控制報警電路的工作與否。設(shè)定一個溫度界限,當(dāng)采集到的溫度超過界限的時候,蜂鳴器則會一直響;當(dāng)溫度在溫度界限內(nèi)時,蜂鳴器停止鳴叫。
9.實時時鐘模塊電路
DS1302是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘電路,它可以對年、月、日、周、時、分、秒進(jìn)行計時,具有閏年補償功能,工作電壓為2.0V~5.5V。采用三線接口與CPU進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號或RAM數(shù)據(jù)。
4.1 主程序設(shè)計
整個軟件部分分為發(fā)射板空氣溫濕度,土壤溫濕度和光照數(shù)據(jù)的采集和數(shù)據(jù)的無線傳輸以及接收板數(shù)據(jù)的顯示。
首先DHT11進(jìn)行初始化,通過調(diào)用采集數(shù)據(jù)函數(shù),分別采集空氣的濕度信息,溫度信息,返回數(shù)據(jù),再通過內(nèi)部AD轉(zhuǎn)換將采集到的數(shù)據(jù)串行的存入發(fā)送緩沖器;
通過YL-69初始化函數(shù)初始化模塊,再調(diào)用采集數(shù)據(jù)函數(shù),讀取當(dāng)前傳感器的探頭濕度信息,為當(dāng)前的探頭電容值,對采集土壤濕度信息,因為模塊沒有AD轉(zhuǎn)換電路,所以外接ADC0832芯片,通過對ADC0832芯片初始化,進(jìn)行AD轉(zhuǎn)換,返回數(shù)據(jù),再將數(shù)據(jù)存入發(fā)送緩沖器中;
通過DS18B20初始化函數(shù)初始化模塊的工作方式,調(diào)用采集土壤溫度信息函數(shù),內(nèi)部采用減法計數(shù)器的原理,最終得到的當(dāng)前溫度數(shù)據(jù),返回數(shù)據(jù),將數(shù)據(jù)串行存入發(fā)送緩沖器中;
通過GY-30初始化初始化函數(shù)初始化工作方式,調(diào)用并采集光照信息的函數(shù),采集到的信息分為8位,將數(shù)據(jù)按位取出來,分別×對應(yīng)位置的倍數(shù)得到最終的數(shù)據(jù),返回數(shù)據(jù),將得到的數(shù)據(jù)存入發(fā)送緩沖器中;
通過最后通過設(shè)置NRF24L01初始化,將發(fā)送緩沖器的數(shù)組給到NRF24L01的數(shù)據(jù)發(fā)送函數(shù),NRF24L01根據(jù)對應(yīng)緩沖器中的數(shù)據(jù)長度,將發(fā)送緩沖器中的數(shù)據(jù)串行按位發(fā)送給接收板,發(fā)送給接收單片機。
將上述模塊化的程序放入while大循環(huán)里,從而實現(xiàn)了對數(shù)據(jù)的實時采集,實時發(fā)送。實現(xiàn)了本次課設(shè)的基本要求,下圖為發(fā)送板的主程序框圖:
數(shù)據(jù)接受板,通過無線模塊對數(shù)據(jù)進(jìn)行接收,將發(fā)送緩沖器的數(shù)據(jù)存入接收緩沖器,再通過對接收緩沖器中的對應(yīng)位置數(shù)據(jù)進(jìn)行顯示,分別讀取對應(yīng)索引的數(shù)值。
調(diào)用12864顯示函數(shù)對數(shù)值數(shù)字化顯示,在通過接收DS1302實時時鐘芯片對應(yīng)時、分、秒的引腳的數(shù)據(jù),通過程序控制進(jìn)位,調(diào)用對應(yīng)日期和相應(yīng)實時傳輸?shù)臄?shù)據(jù)的顯示函數(shù)進(jìn)行顯示;
在程序中定義對應(yīng)位置的按鍵,sbit定義按鍵對應(yīng)單片機的引腳,設(shè)置按鍵的功能從S1-S5對應(yīng)功能分別為:時間設(shè)置,閾值設(shè)置,加計數(shù),減計數(shù),確認(rèn)。
按下時間設(shè)置可以對時間的秒進(jìn)行設(shè)置,再次按下時可以對應(yīng)光標(biāo)為分位置,再按下可以進(jìn)入時的位置,以此類推;
按下閾值設(shè)置按鍵可以分別進(jìn)入空氣溫度,濕度設(shè)置,光照設(shè)置,土壤溫度,土壤濕度閾值設(shè)置,從而實現(xiàn)對相應(yīng)數(shù)據(jù)進(jìn)行設(shè)置。
按下S5即最后一個按鍵,可以對設(shè)置的當(dāng)前時間、閾值進(jìn)行確認(rèn);之后程序進(jìn)入對通過標(biāo)志位flag判斷為1超過閾值,對于溫度,空氣濕度,土壤溫度,土壤濕度超過閾值的當(dāng)前實時數(shù)據(jù)進(jìn)行監(jiān)測,超過閾值則蜂鳴器報警,否則flag判斷為0,繼續(xù)執(zhí)行。
將上述程序放入大的循環(huán)中,從而實現(xiàn)了對發(fā)送板發(fā)送的數(shù)據(jù)進(jìn)行實時采集的功能,下圖分別為接收板程序設(shè)計圖:
部分實物圖,PCB展示
需要實物pcb板的朋友請私信
部分程序源碼
部分源碼 采用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時鐘引腳定義
sbit SDA=P2^2; //IIC數(shù)據(jù)引腳定義
#define SlaveAddress 0x46 //定義器件在IIC總線中的從地址,根據(jù)ALT ADDRESS地址引腳不同修改
//ALT ADDRESS引腳接地時地址為0x46,接電源時地址為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ù)
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自動 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)資料實物的友友請關(guān)注、點贊,私信吧!