發布日期:2022-05-11 點擊率:7
濕度傳感器程序,單片機土壤濕度傳感器設計 程序編譯錯誤 第1張" title="土壤傳感器程序:c語言做土壤濕度傳感器程序,單片機土壤濕度傳感器設計 程序編譯錯誤 第1張-傳感器知識網"/>
捕獲.PNG (74.97 KB, 下載次數: 1)
沒有聲明,這里怎么解決
2019-12-19 16:18 上傳
#include //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
#include "intrins.h"
#ifndef _XPT2046_H_
#define _XPT2046_H_
#define? ?u8? ?unsigned char
#define? ?u16? ? unsigned int
#define? ?uchar? ?unsigned char
#define? ?uint? ? unsigned int
uchar yushe_Moisture=30;? ?//Moisture預設值
uchar Moisture;? ?//用于讀取ADC數據
//運行模式
uchar Mode=0;? ?//=1是設置濕度閥值? ?=0是正常監控模式
uchar Mode_1=0;? ?//0:自動 1;手動
//管腳聲明
sbit Relay= P1^6;? ?//濕度報警
void delay_ms(uint q)
{
uint i,j;
for(i=0;i
for(j=0;j
for(y=110;y>0;y--);
}
//寫命令
void write_com(uchar com)
{
LCDRS=0;
LCDRW=0;
P0=com;
LCDdelay(5);
LCDEN=1;
LCDdelay(5);
LCDEN=0;
}
//寫數據
void write_data(uchar date)
{
LCDRS=1;
//? ?LCD_WriteData(date);
LCDRW=0;
P0=date;
LCDdelay(5);
LCDEN=1;
LCDdelay(5);
LCDEN=0;
}
void SelectPosition(unsigned char x,unsigned char y)
{
if (x == 0)
{
write_com(0x80 + y);? ?//表示第一行
}
else
{
write_com(0xC0 + y);? ?//表示第二行
}
}
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{
SelectPosition(x,y) ;
while (*s)
{
write_data( *s);
s ++;
}
}
void LCD_Write_Char(u8 x,u8 y,u16 s,u8 l)
{
SelectPosition(x,y) ;
if(l>=5)
write_data(0x30+s/%10);? ?//萬位
if(l>=4)
write_data(0x30+s/1000%10);? ? //千位
if(l>=3)
write_data(0x30+s/100%10);? ? //百位
if(l>=2)
write_data(0x30+s/10%10);? ?//十位
if(l>=1)
write_data(0x30+s%10);? ? //個位
}
//1602初始化
void Init1602()
{
uchar i=0;
write_com(0x38);//屏幕初始化
write_com(0x0C);//打開顯示 無光標 無光標閃爍
write_com(0x06);//當讀或寫一個字符是指針后一一位
write_com(0x01);//清屏
}
void Display_1602(yushe_Moisture,temp)
{
//顯示預設濕度
LCD_Write_Char(1,12,yushe_Moisture,3) ;
//時時濕度
LCD_Write_Char(0,10,temp,3) ;
}
sbit DOUT = P3^7;? ? //輸出
sbit CLK= P3^6;? ? //時鐘
sbit DIN= P3^4;? ? //輸入
sbit CS? ?= P3^5;? ? //片選
uint Read_AD_Data(uchar cmd);
uint SPI_Read(void);
void SPI_Write(uchar dat);
void SPI_Start(void)
{
CLK = 0;
CS= 1;
DIN = 1;
CLK = 1;
CS= 0;
}
void SPI_Write(uchar dat)
{
uchar i;
CLK = 0;
for(i=0; i
dat <<= 1; CLK = 0;? ?//上升沿放置數據 CLK = 1; } } uint SPI_Read(void) { uint i, dat=0; CLK = 0; for(i=0; i<12; i++)? ? //接收12位數據 { dat <
CLK = 1;? ? //發送一個時鐘周期,清除BUSY
_nop_();
_nop_();
CLK = 0;
_nop_();
_nop_();
AD_Value=SPI_Read();
CS = 1;
return AD_Value;
}
sbit Key1=P3^1;? ?//設置鍵
sbit Key2=P3^0;? ?//加按鍵
sbit Key3=P3^2;? ?//減按鍵
#define KEY_SET? ?1? ? //設置
#define KEY_ADD? ?2? ? //加
#define KEY_MINUS? ? 3? ? //減
u8 Key_Scan()
{
static u8 key_up=1;//按鍵按松開標志
if(key_up&&(Key1==0||Key2==0||Key3==0))
{
delay_ms(10);//去抖動
key_up=0;
if(Key1==0)? ?return 1;
else if(Key2==0)return 2;
else if(Key3==0)return 3;
}
else if(Key1==1&&Key2==1&&Key3==1)
key_up=1;
return 0;// 無按鍵按下
}
void main (void)
{
u8 key;
Moisture=XPT2046;? ?//讀取濕度值
Moisture=100-(Moisture*100/256);? ?//讀取濕度值
Init1602();? ?//調用初始化顯示函數
LCD_Write_String(0,0," Moisture:000%");//開機界面
LCD_Write_String(1,0,"MODE:ASET:000%");//
delay_ms(1000);
Moisture=XPT2046(0);? ?//讀取濕度值
Moisture=100-(Moisture*100/256);? ?//讀取濕度值
while (1)? ?//主循環
{
key=Key_Scan();? ? //按鍵掃描
Moisture=XPT2046(0);? ?//讀取濕度值
Moisture=100-(Moisture*100/256);? ?//讀取濕度值
if(key==KEY_SET)
{
Mode++;
}
switch(Mode)? ?//判斷模式的值
{
case 0:? ? //監控模式
{
if(key==KEY_ADD)
{
Mode_1=!Mode_1;
if(Mode_1)
LCD_Write_String(1,5,"H");//
else
LCD_Write_String(1,5,"A");//
}
if(Mode_1)
{
if(key==KEY_MINUS)
{
Relay=!Relay;
}
}
Display_1602(yushe_Moisture,Moisture);//顯示預設濕度,濕度值
if(!Mode_1)
{
if(Moisture>=yushe_Moisture)? ? //濕度值大于等于預設值時
{
Relay=1;? ?//關閉繼電器
}
else? ? //濕度值小于預設值時
{
Relay=0;? ?//打開繼電器
}
}
break;
}
case 1:? ?//預設濕度模式
{
SelectPosition(1,11) ;? ?//指定位置
write_com(0x0d);? ?//打開顯示 無光標 光標閃爍
if(key==KEY_ADD)? ?//加鍵按下
{
if(yushe_Moisture>=99)? ?//當閥值加到大于等于99時
yushe_Moisture=99;? ?//閥值固定為99
yushe_Moisture++;? ?//預設濕度值(閥值)加1,最大為100
LCD_Write_Char(1,12,yushe_Moisture,3) ;//顯示預設濕度
}
if(key==KEY_MINUS)? ?//減鍵按下
{
if(yushe_Moisture<=1)? ? //當濕度上限值減小到1時 yushe_Moisture=1;? ?//固定為1 yushe_Moisture--;? ?//預設溫度值減一,最小為0 LCD_Write_Char(1,12,yushe_Moisture,3) ;//顯示預設濕度 } break; } default? ?: { write_com(0x38);//屏幕初始化 write_com(0x0C);//打開顯示 無光標 無光標閃爍 Mode=0;? ?//恢復正常模式 break; } } } }
37款傳感器與模塊的提法,在網絡上廣泛流傳,其實Arduino能夠兼容的傳感器模塊肯定是不止37種的。鑒于本人手頭積累了一些傳感器和模塊,依照實踐(動手試試)出真知的理念,以學習和交流為目的,這里準備逐一做做實驗,不管能否成功,都會記錄下來---小小的進步或是搞不掂的問題,希望能夠拋磚引玉。
【Arduino】168種傳感器模塊系列實驗(資料+代碼+圖形+仿真)
實驗五十三: 土壤濕度水分傳感器模塊(電阻式)
水
是一切生命機體的組成物質,也是生命代謝活動所必需的物質,又是人類進行生產活動的重要資源。 地球上的水分布在海洋、湖泊、沼澤、河流、冰川、雪山,以及大氣、生物體、土壤和地層。水的總量約為1.4×109km3,其中96.5%在海洋中,約覆蓋地球總面積的70%。陸地上、大氣和生物體中的水只占很少的一部分。
水循環
是指地球上不同的地方上的水,通過吸收太陽的能量,改變狀態到地球上另外一個地方。例如地面的水分被太陽蒸發成為空氣中的水蒸氣。而水在地球的狀態包括固態、液態和氣態。而地球中的水多數存在于大氣層、地面、地底、湖泊、河流及海洋中。水會通過一些物理作用,例如:蒸發、降水、滲透、表面的流動和地底流動等,由一個地方移動到另一個地方。如水由河川流動至海洋。由16,17世紀佩羅和馬略特發現。
土壤濕度
亦稱土攘含水率,表示土壤干濕程度的物理量。是土壤含水量的一種相對變量。通常用土壤含水量占干土重的百分數是示,亦稱土壤質量溫度,如用土壤水分榮基占土壤總容積的百分數表示,則稱土壤容積濕度。通常說的土攘濕度,即指質量濕度。還有用土壤含水量相當于田間持水量的百分數來表示土壤濕潤程度的,稱土攘相對濕度。土壤濕度決定農作物的水分供應狀況。土壤濕度過低,形成土壤干旱,作用光合作用不能正常進行,降低作物的產量和品質;嚴重缺水導致作物凋萎和死亡。土壤濕度過高,惡化土壤通氣性,影響土壤微生物的活動,使作物根系的呼吸、生長等生命活動受到阻礙,從而影響作物地上部分的正常生長,造成徒長、倒伏、病害滋生等。土壤水分的多少還影響田間耕作措施和播種質量,并影響土壤溫度的高低。
土壤水分測定方法
①重量法。取土樣烘干,稱量其干土重和含水重加以計算。
②電阻法。使用電阻式土壤濕度測定儀測定。根據土壤溶液的電導性與土壤水分含量的關系測定土壤濕度。
③負壓計法。使用負壓計測定。當未飽和土壤吸水力與器內的負壓力平衡時,壓力表所示的負壓力即為土壤吸水力,再據以求算土壤含水量。
④中子法。使用中子探測器加以測定。中子源放出的快中子在土壤中的慢化能力與土壤含水量有關,借助事先標定,便可求出土壤含水量。
⑤遙感法。通過對低空或衛星紅外遙感圖象的判讀,確定較大范圍內地表的土壤濕度。
土壤濕度水分傳感器模塊,電阻式的,手頭有二種,一種紅色款是三線制(估計模擬量的),另一種是四線制(數字加模擬)
土壤濕度傳感器
就是監測土壤的濕度,將其的硬件控制電路埋在作物根部的土壤水分傳感器監測根部土壤的水分,該傳感器經檢測電路將“濕度過高”和“濕度過低”信號經編碼器傳至主控制器,由主控制器決定控制狀態?!皾穸冗^高”則停止灌溉;“濕度過低”則通過光電隔離、繼電器控制接在水源的電磁閥。該系統還具有故障報警功能。主控制器通過通訊接口與上位機通訊,可以實時監測系統運行狀況或對歷史數據進行分析。
三線制工作原理
土壤濕度傳感器是判斷土壤中水分含量的多少來判定土壤的濕度大小。如圖所示,當土壤濕度傳感器探頭懸空時,三極管基極處于開路狀態,三極管截止輸出為0;當插入土壤中時由于土壤中水分含量不同,土壤的電阻值就不同,三極管的基極就提供了大小變化的導通電流,三極管集電極到發射極的導通電流受到基極控制,經過發射極的下拉電阻后轉換成電壓。
技術指標
電源電壓: 3.3v or 5v
輸出電壓: 0~2.3v
工作電流: 最大20mA
接口定義:1腳信號,2腳地,3腳電源正
使用壽命:1年左右
模塊尺寸: 60x20x5mm
典型電壓值(測試平臺:10位AD,基準電壓5V):
0 ~300 : 干燥土壤
300~700 : 濕潤土壤
700~950 : 放到水中(大概數據)
這是一個簡易的水分傳感器可用于檢測土壤的水分,當土壤缺水時,傳感器輸出值將減小,反之將增大。使用這個傳感器制作一款自動澆花裝置,讓您的花園里的植物不用人去管理。傳感器表面做了鍍金處理,可以延長它的使用壽命。將它插入土壤,然后使用AD轉換器讀取它。在他的幫助下,植物會提醒您:嘿,我渴了,請給我一點水。
void setup(){
Serial.begin();
}
void loop(){
Serial.print("Moisture Sensor Value:");
Serial.println(analogRead(0));
delay(500);
}
四線制模塊
1 這是一個簡易的水分傳感器可用于檢測土壤的水分,當土壤缺水時,模塊輸出一個高電平,反之輸出低電平。使用這個傳感器制作一款自動澆花裝置,讓您的花園里的植物不用人去管理。
2 靈敏度可調(圖中藍色數字電位器調節)
4 工作電壓3.3V-5V
5 模塊雙輸出模式,數字量輸出簡單,模擬量輸出更精確。
6 設有固定螺栓孔,方便安裝
7 小板PCB尺寸:3cm * 1.6cm
8 電源指示燈(紅色)和數字開關量輸出指示燈(綠色)
9 比較器采用LM393芯片,工作穩定
四線制電原理圖
小板接口說明(4線制)
1 VCC 外接3.3V-5V
2 GND 外接GND
3 DO 小板數字量輸出接口(0和1)
4 AO 小板模擬量輸出接口
使用說明
1、土壤濕度模塊對環境濕度最敏感,一般用來檢測土壤的濕度。
2、模塊在土壤濕度達不到設定閾值時,DO口輸出高電平,當土壤濕度超過設定閾值時,模塊D0輸出低電平;
3、小板數字量輸出D0可以與單片機直接相連,通過單片機來檢測高低電平,由此來檢測土壤濕度;
4、小板數字量輸出DO可以直接驅動本店繼電器模塊,蜂鳴器模塊等,由此可以組成一個土壤濕度報警設備;
5、小板模擬量輸出AO可以和AD模塊相連,通過AD轉換,可以獲得土壤濕度更精確的數值。
#define AO A0
#define DO 7
void setup()
{
pinMode(AO, INPUT);
pinMode(DO, INPUT);
Serial.begin(9600);
}
void loop()
{
Serial.print("AO=");
Serial.print(analogRead(A0));
Serial.print("|DO=");
Serial.println(digitalRead(DO));
delay(1000);
}
展開全文
土壤濕度? 土壤濕度,即表示一定深度土層的土壤干濕度程度的物理量,又稱土壤水分含量。土壤濕度的高低受農田水分平衡各個分量的制約。
土壤濕度傳感器? 土壤濕度傳感器又名土壤水分傳感器,土壤含水量農業傳感器。土壤水分傳感器由不銹鋼探針和防水探頭構成,可長期埋設于土壤和堤壩內使用,對表層和深層土壤進行墑情的定點監測和在線測量。與數據采集器配合使用,可作為水分定點監測或移動測量的工具測量土壤容積含水量,主要用于土壤墑情檢測以及農業灌溉和林業防護。
土壤濕度表示方法? 土壤濕度,即土壤的實際含水量,可用土壤含水量占烘干土重的百分數表示:土壤含水量=水分重/烘干土重×100%。也可以相當于土壤含水量與田間持水量的百分比,或相對于飽和水量的百分比等相對含水量表示。?
根據土壤的相對濕度可以知道,土壤含水的程度,還能保持多少水量,在灌溉上有參考價值。土壤濕度大小影響田間氣候,土壤通氣性和養分分解,是土壤微生物活動和農作物生長發育的重要條件之一。?
土壤濕度受大氣、土質、植被等條件的影響。在野外判斷土壤濕度通常用手來鑒別,一般分為四級:
(1)濕,用手擠壓時水能從土壤中流出;
(2)潮,放在手上留下濕的痕跡可搓成土球或條,但無水流出;
(3)潤,放在手上有涼潤感覺,用手壓稍留下印痕;
(4)干,放在手上無涼快感覺,粘土成為硬塊。? 農業氣象上土壤濕度常采用下列方法與單位表示:? ①重量百分數。即土壤水的重量占其干土重的百分數(%)。此法應用普遍,但土壤類型不同,相同的土壤濕度其土壤水分的有效性不同,不便于在不同土壤間進行比較。? ②田間持水量百分數。即土壤濕度占該類土壤田間持水量的百分數(%)。利于在不同土壤間進行比較,但不能給出具體水量的概念。? ③土壤水分貯存量。指一定深度的土層中含水的絕對數量,通常以毫米為單 位,便于與降水量、蒸發量比較。土壤水分貯存量W(毫米)的計算公式為:W=0.1·h·d·w。式中h是土層厚度,d為土壤容重(克/厘米3),0.1是單位換算系數,w為土壤濕度(重量百分數)。
土壤檢測傳感器將檢測的模擬量(電壓值)通過PCF8591轉化為數字量。PCF8591采用典型的I2C總線接口器件尋址方法,即總線地址由器件地址、引腳地址和方向位組成。規定A/D器件地址為1001,引腳地址為A2A1A0,其值由用戶選擇,因此I2C系統中最多可接23=8個具有I2C總線接口的A/D器件。地址的最后一位為方向位R/ ,當主控器對A/D器件進行讀操作時為1,進行寫操作時為0??偩€操作時,由器件地址、引腳地址和方向位組成的從地址為主控器發送的第一字節。
當系統為A/D轉換時,模擬輸出允許為0。模擬量輸入選擇位取值由輸入方式決定:四路單端輸入時取00,三路差分輸入時取01,單端與差分輸入時取10,二路差分輸入時取11。最低兩位時通道編號位,當對0通道的模擬信號進行A/D轉換時取00,當對1通道的模擬信號進行A/D轉換時取01,當對2通道的模擬信號進行A/D轉換時取10,當對3通道的模擬信號進行A/D轉換時取11。在進行數據操作時,首先是主控器發出起始信號,然后發出讀尋址字節,被控器做出應答后,主控器從被控器讀出第一個數據字節,主控器發出應答,主控器從被控器讀出第二個數據字節,主控器發出應答…一直到主控器從被控器中讀出第n個數據字節,主控器發出非應答信號,最后主控器發出停止信號。程序設計如下:
下一篇: PLC、DCS、FCS三大控
上一篇: 電氣控制線路圖控制原