設計者:STCode (公眾號同名)

第一章 緒論
1.1實訓設計背景與意義
隨著生活水平的提高和科技水平的發展,人們對自身和家庭安全方面的考慮也越來越多,越來越多的安全監測系統和設備進入到人們的生活中,如家庭防火系統、家庭防盜系統、家庭遠程監控裝置等,各種現代高科技逐漸被用于各行業和領域,為人類社會生產力的發展形成了強大動力,本設計將溫濕度檢測系統應用到家庭當中,通過檢測家庭中溫濕度的變化反應家中環境的變化,在環境出現例外時,能夠進行一定的報警,讓系統使用者及時發現家庭中存在的安全隱患,從而快速解決安全問題,具有一定的社會意義和應用價值,
1.2實訓設計任務
本設計的任務主要是應用Arduino Uno主控制器,搭載溫濕度傳感器和led、蜂鳴器、OLED顯示幕等,實作溫濕度的檢測功能和報警功能,在環境出現例外的情況下,能夠及時通知系統使用者處理例外,起到很好的安全防范的作用,
1.3實訓具體內容
實訓的具體內容如下:
設計一個家庭安全監測系統,主要可以檢測溫度和濕度這兩個關鍵的環境變數,這兩個關鍵變數將通過溫濕度傳感器DHT11獲取,獲取到資料后進行判斷,當環境出現例外,比如溫度過高時,能夠觸發蜂鳴器進行警報,提示使用者溫度例外,疑似有火情;另外,當環境中濕度變化時可以觸發LED的亮滅,當濕度較低時,點亮LED燈,提醒使用者當前環境干燥,可以進行一定的加濕處理,當前環境的溫濕度資料進行一定的可視化,將通過OLED顯示幕顯示出來,方便使用者隨時監測環境的情況,
1) 學習Arduino Uno的使用方法,熟悉Arduino的編程語法,掌握其控制與運算原理,將其作為主控制器接收來自傳感器的資料并進行資料決議進而控制一些元件的作業,
2) 學習并掌握溫濕度傳感器DHT11的使用,掌握其庫函式的用法,
3) 學習并掌握OLED顯示幕的使用,掌握其文本顯示的方法、變數顯示的方法,
4) 掌握LED、蜂鳴器的使用,
第二章 硬體設計
2.1硬體設計思路
硬體設計包括對硬體的選材、通訊方式、接線方式的設計,主控制器為Arduino Uno,其芯片為ATMEGA328P;主要應用到的傳感器為DHT11溫濕度傳感器,可以檢測溫濕度的資訊;輸出元件有OLED、蜂鳴器、LED,傳感器將獲取環境的溫濕度資訊,并將其傳輸至Arduino,Arduino獲得資料后進行資料決議,并且根據設定好的閾值進行聲光報警的設計,同時將決議出的溫濕度資訊進行OLED顯示幕的顯示,
2.2硬體選擇
硬體選材上主要用到以下材料:
1) 主控制器:Arduino Uno
2) 傳感器:DHT11溫濕度傳感器
3) 顯示元件:OLED液晶顯示幕
4) 發光元件:LED小燈
5) 發聲元件:無源蜂鳴器
6) 面包板、資料線、杜邦線若干
2.2.1 DHT11溫濕度傳感器

1)硬體描述
此傳感器是一款含有已校準數字信號輸出的溫濕度復合傳感器,它應用專用的數字模塊采集技術和溫濕度傳感技術,確保產品具有極高的可靠性與卓越的長期穩定性,傳感器包括一個電阻式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連接,因此該產品具有品質卓越、超快回應、抗干擾能力強、性價比極高等優點,每個DHT11傳感器都在極為精確的濕度校驗室中進行校準,校準系數以程式的形式儲存在OTP記憶體中,傳感器內部在檢測信號的處理程序中要呼叫這些校準系數,單線制串行介面,使系統集成變得簡易快捷,超小的體積、極低的功耗,信號傳輸距離可達20米以上,使其成為各類應用甚至最為苛刻的應用場合的最佳選則,因此,本設計選擇DHT11作為環境檢測的傳感器,
2)硬體引數:
- 作業電壓 :3.3V-5v
- 尺寸大小:40mm x 28mm
- 重量大小:3g
- 信號型別:數字信號
- 供電電流:最大2.5mA
- 溫度范圍:0-50℃,誤差±2℃
- 濕度范圍:當環境溫度在 0 ℃時為30-90%RH;當環境溫度在25℃時為20-90%RH ;當環境溫度在50℃時為20-80%RH
- 回應時間:1/e(63%) 6-30s
- 測量解析度分別為:溫度(8bit)濕度(8bit)
- 采樣周期間隔:<1s
2.2.2 OLED顯示幕

1)硬體描述
0.96寸OLED模塊采用高亮度,低功耗的OLED屏,顯示顏色純正,在陽光下有很好的可視效果,模塊供電可以是3.3V也可以是5V,不需要修改模塊電路,OLED屏具有多個控制指令,可以控制OLED的亮度、對比度、開關升壓電路等指令,操作方便,功能豐富,因此,本設計選用這款OLED作為顯示元件,
2)硬體引數
- 高解析度:12864(和12864LCD相同解析度,但該OLED屏的單位面積像素點多)
- 超廣可視角度:大于160°
- 超低功耗:正常顯示時0.06W
- 寬供電范圍:直流3V-5V
- 工業級:作業溫度范圍-30℃~70℃
- 體積小:27mm27mm*2mm
- 通信方式:SPI、IIC
- 亮度、對比度可以通程序式指令控制
- 使用壽命不少于16000小時
- OLED螢屏內部驅動芯片:SSD1306
2.2.3無源蜂鳴器

蜂鳴器是一種一體化結構電子訊響器,采用直流電源供電,廣泛應用于計算機、列印機、復印機、報警器、電子玩具、汽車電子設備、電話機、定時器等電子產品中作發聲器件,蜂鳴器主要分為有源蜂鳴器和無源蜂鳴器,本設計使用的是無源蜂鳴器,通過控制PWM的輸出可以控制蜂鳴器的鳴叫頻率,
2.2.4 LED小燈

Led小燈為一種發光二極管,能夠發出不同顏色的燈光,本設計使用led的目的在于提醒使用者環境的情況,當濕度不符合我們的要求時,led能夠進行閃爍,從而提醒使用者,
2.3電路連接
電路連接采用Altium Designer軟體繪制,溫濕度傳感器為5V供電,其中信號輸出端連接到Arduino的8號I/O引腳上;OLED顯示幕的通訊方式為IIC通訊,因此除了供電的兩根線外,只需要一根信號線SDA和一根時鐘線SCK就可以,無源蜂鳴器正極接到3號I/O引腳,原因在于Arduino的3號引腳支持PWM輸出,從而可以控制蜂鳴器的鳴叫頻率;LED小燈正極接到4號I/O引腳,

第三章 軟體設計
本設計的主控制器為Arduino Uno,控制該控制器最常用的語言為C/C++混合編程,本設計也使用此最為廣泛的語言,編譯與上傳代碼的環境為Arduino IDE軟體,軟體方面的設計主要分為兩大部分,第一為輸入元件的程式撰寫,即DHT11傳感器方面的內容;第二部分為輸出元件的程式撰寫,主要為OLED的顯示設計、LED的閃爍和蜂鳴器的鳴叫,

3.1輸入元件程式設計
本設計的輸入元件即傳感器選擇的是DHT11溫濕度傳感器,在程式設計中,本設計引入其庫函式“DHT.h”,通過初始化傳感器和呼叫獲取溫濕度的函式可以直接得出資料處理過的溫濕度變數,程式中再根據這些變數去控制輸出元件,
部分程式講解:
#include <DHT.h>
DHT11傳感器庫引入;
#define DHTPIN 8
此句話定義了DHT11傳感器信號線所接的為Arduino的數字引腳8;
#define DHTTYPE DHT11
進行宏定義;
DHT dht(DHTPIN, DHTTYPE);
定義一個物件,并且進行引腳輸入和型別匹配;
dht.begin();
溫濕度傳感器初始化;
void get_temp_humi() //獲取溫濕度資料子函式
{
HH = int(dht.readHumidity()); //獲得濕度
TT = int(dht.readTemperature()); //獲得溫度
Serial.print("Temp: "); //串口顯示溫濕度資訊
Serial.println(TT);
Serial.print("Humi: ");
Serial.println(HH);
}
上面定義了一個子函式,其中HH變數用于存盤濕度資料,TT變數用于存盤溫度資料,并且開啟了串口,使用者可以打開Arduino的串口監視器查看當前的溫濕度資料,該子函式將在回圈函式loop里面呼叫,
3.2輸出元件程式設計
輸出元件有3個,分別為OLED顯示幕、LED、蜂鳴器,
3.2.1 OLED顯示幕
由上述電路圖可以知道,OLED的資料線SDA接到A4,時鐘線SCK接到A5,因為Arduino的IIC介面正是A4\A5,當然,A4\A5介面也可以作為普通數字IO口來用,在這里是屬于引腳復用,
部分程式講解:
#include "U8glib.h"
OLED顯示幕庫函式引入;
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);
設定通訊方式為IIC通訊;
void dis_play() //OLED資料顯示子函式
{
u8g.firstPage(); // OLED首頁
do
{
char buffer1[1]; //定義字符buffer1
// 將int轉為char顯示出來
itoa(TT, buffer1, 10); //10:10進制顯示
u8g.setFont(u8g_font_gdr10r); //設定字體
u8g.drawStr(25, 26, "Temp:"); //第26行25列顯示“Temp:”
u8g.drawStr(70, 26, buffer1); //第26行70列顯示溫度資料
char buffer2[1]; //定義字符buffer2
// 將int轉為char顯示出來
itoa(HH, buffer2, 10); //10:10進制顯示
u8g.setFont(u8g_font_gdr10r); //設定字體
u8g.drawStr(25, 60, "Humi:"); //第60行25列顯示“Humi:”
u8g.drawStr(70, 60, buffer2); //第60行70列顯示濕度資料
} while (u8g.nextPage()); //執行配置
}
上述代碼為OLED顯示文本和資料的子函式,在第26行25列顯示溫度資料,在第26行70列顯示濕度資料,并且該子函式將在回圈函式loop里面呼叫,
3.2.2 LED燈
LED燈的功能在于當濕度小于某個閾值的時候閃爍,這里設定的值為30,濕度過小,代表環境干燥,提示用戶適當進行加濕,
部分代碼講解:
int led = 4;
定義LED引腳4;
pinMode(led, OUTPUT);
設定LED引腳為輸出模式;
if (HH < 30)
{
digitalWrite(led, HIGH);
delay(50);
digitalWrite(led, LOW);
delay(50);
}
當濕度小于30的時候,LED燈將進行間隔50ms的閃爍,提醒用戶當前環境的濕度情況,
3.2.3 無源蜂鳴器
無源蜂鳴器在該設計的作用是當環境的溫度大于50度的時候,產生鳴叫,從而提醒使用者環境溫度超標,可能有火情出現,
部分代碼講解:
int buzzer = 3;
定義蜂鳴器所接引腳為3;
pinMode(buzzer, OUTPUT);
設定蜂鳴器所接引腳為輸出模式;
if (TT > 50)
analogWrite(buzzer, 100);
else
analogWrite(buzzer, 0);
當溫度數值大于50度的時候,蜂鳴器響起,提醒使用者當前環境的溫度值超標,可能出現火情,當溫度值小于50的時候,蜂鳴器不鳴叫,
第四章 系統除錯
系統除錯分為硬體除錯和軟體除錯,硬體除錯中主要為確保接線的正確性,軟體部分主要為檢測各功能是否滿足預設的目標,除錯發現,給Arduino上電后,OLED顯示幕立即顯示由DHT11溫濕度傳感器獲得的資料,可以顯示出當前環境的溫濕度情況,與實際溫濕度情況大體一致,并且拿到干燥地方,led燈會閃爍,當環境溫度超過50攝氏度的時候,無源蜂鳴器會鳴叫,除錯各功能順利,基本滿足預設要求,
第四章 系統除錯
系統除錯分為硬體除錯和軟體除錯,硬體除錯中主要為確保接線的正確性,軟體部分主要為檢測各功能是否滿足預設的目標,除錯發現,給Arduino上電后,OLED顯示幕立即顯示由DHT11溫濕度傳感器獲得的資料,可以顯示出當前環境的溫濕度情況,與實際溫濕度情況大體一致,并且拿到干燥地方,led燈會閃爍,當環境溫度超過50攝氏度的時候,無源蜂鳴器會鳴叫,除錯各功能順利,基本滿足預設要求,
第五章 實物展示
1)整體實物圖

第六章 總結
這次實訓本人設計的家庭安全監測系統,可以有效地監測家庭溫度和濕度的情況,并且具有預警功能,達到很好的提醒作用,隨著人們生活水平的提高和安全防范意識的日漸加強,智能防火防盜系統也在不斷升級,防火防盜設備也在不斷更新,希望此設計能給家庭安全設備提供一定的思路,
附件:程式清單
#include <DHT.h> //引入<DHT.h>頭檔案
#include "U8glib.h" //引入Oled頭檔案
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); //設定通訊方式為IIC通訊
#define DHTPIN 8 //濕度傳感器OUT接8號口
#define DHTTYPE DHT11 //定義DHT11傳感器
DHT dht(DHTPIN, DHTTYPE); //定義濕度傳感器OUT與8號口連接并且讀取溫濕度傳感器的數值
int buzzer = 3; //定義蜂鳴器引腳3
int led = 4; //定義led引腳4
int HH; //定義HH變數,用于儲存濕度資料
int TT; //定義TT變數,用于儲存溫度資料
void setup()
{
pinMode(buzzer, OUTPUT); //設定蜂鳴器引腳為輸出模式
pinMode(led, OUTPUT); //設定led引腳為輸出模式
Serial.begin(9600); //串口波特率
dht.begin(); //溫濕度傳感器初始化
}
void loop()
{
get_temp_humi(); //獲得溫濕度子函式
dis_play(); //oled顯示資料子函式
if (TT > 50) //如果溫度大于50°,蜂鳴器響
analogWrite(buzzer, 100);
else //否則,蜂鳴器不響
analogWrite(buzzer, 0);
if (HH < 30) //如果濕度小于30,led閃爍
{
digitalWrite(led, HIGH);
delay(50);
digitalWrite(led, LOW);
delay(50);
}
else //否則,led熄滅
digitalWrite(led, LOW);
}
void get_temp_humi() //獲取溫濕度資料子函式
{
HH = int(dht.readHumidity()); //獲得濕度
TT = int(dht.readTemperature()); //獲得溫度
Serial.print("Temp: "); //串口顯示溫濕度資訊
Serial.println(TT);
Serial.print("Humi: ");
Serial.println(HH);
}
void dis_play() //OLED資料顯示子函式
{
u8g.firstPage(); // OLED首頁
do
{
char buffer1[1]; //定義字符buffer1
// 將int轉為char顯示出來
itoa(TT, buffer1, 10); //10:10進制顯示
u8g.setFont(u8g_font_gdr10r); //設定字體
u8g.drawStr(25, 26, "Temp:"); //第26行25列顯示“Temp:”
u8g.drawStr(70, 26, buffer1); //第26行70列顯示溫度資料
char buffer2[1]; //定義字符buffer2
// 將int轉為char顯示出來
itoa(HH, buffer2, 10); //10:10進制顯示
u8g.setFont(u8g_font_gdr10r); //設定字體
u8g.drawStr(25, 60, "Humi:"); //第60行25列顯示“Humi:”
u8g.drawStr(70, 60, buffer2); //第60行70列顯示濕度資料
} while (u8g.nextPage()); //執行配置
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/236659.html
標籤:其他
上一篇:NRF52833學習筆記(2)——雙UART串口使用
下一篇:藍牙基帶調制(GFSK)
