基于Arduino的智能環境監測與反饋系統
- 一、專案背景
- 二、效果展示
- 三、材料清單
- 1.Arduino開發板——YwRduino uno
- 2.Arduino盾板——IO Sensor Shield傳感器介面擴展板
- 3.8x7LED點陣顯示模塊
- 4.AM2302 DHT22溫濕度傳感器
- 5.火焰傳感器——類似光敏傳感器
- 6.聲音傳感器
- 四、實作思路
- 1.通過傳感器獲取環境資訊
- 2.根據環境情況做出不同回應
- 五、具體步驟
- 1.獲取環境溫濕度
- 連接電路
- 引入必要的庫和檔案
- 主要函式撰寫
- 效果展示及驗證
- 2.獲取環境聲音大小
- 連接電路
- 主要函式撰寫
- 效果展示及驗證
- 3.獲取環境亮度
- 連接電路
- 主要函式撰寫
- 效果展示及驗證
- 4.確定反饋邏輯
- 代碼實作
- 5.根據反饋邏輯輸出表情
- 連接電路
- 引入必要的庫和檔案并撰寫表情
- 主要函式撰寫
- 效果展示及驗證
- 6.根據反饋邏輯合成語音并輸出
- 通過Python獲取Arduino串口資料
- 打開串口
- 讀取串口輸出
- 通過win32com庫語音合成
- 六、代碼匯總
一、專案背景
一個小巧輕便的環境監測系統,可以幫助人們更好地了解周圍環境,
隨著社會的發展,生產技術的更新,物聯網理念如今已經深入人心,并隨著傳感器技術,通信技術和物聯網技術的發展逐漸觸及社會的每一個角落,
在當代社會資訊化,智能化快速發展的背景下,設計了“基于Arduino的智能環境監測與反饋系統”,
近幾年,工業化行程的日益發展導致環境污染問題日益突出,隨著環境狀況的不斷變化,各地霧霾天氣日益嚴重,已經影響到了人們的正常出行、生活以及健康,因此人們掌握了解自身所處周邊環境狀況資訊的需求越來越迫切,
伴隨著當前移動互聯網技術的飛速發展,人們可以隨時隨地了解自己所處的環境狀況資訊,為出行和生活提供便捷服務,為尋求更加健康的環境提供依據,
本文主要利用現有的成熟傳感技術和互聯網技術實作實時獲取環境狀況資訊,并對用戶給予相應的反饋,
二、效果展示
基于Arduino的智能環境監測與反饋系統
三、材料清單
1.Arduino開發板——YwRduino uno

市面上的開發板大同小異,一般都是使用Arduino UNO R3,新款開發板的性能可能要好一些,但是使用方法幾乎一樣
2.Arduino盾板——IO Sensor Shield傳感器介面擴展板

因為該專案需要接的傳感器較多,所以我買了一個擴展板,
如果平常使用的傳感器不多,可以不使用擴展板,
3.8x7LED點陣顯示模塊

該模塊用于顯示表情,通過表情反映當前環境的狀況
4.AM2302 DHT22溫濕度傳感器

溫濕度傳感器,顧名思義,就是用來檢測環境溫度和濕度的
5.火焰傳感器——類似光敏傳感器

火焰傳感器只是對火焰最敏感,但是對普通光也有反應
6.聲音傳感器

聲音傳感器是用于檢測聲音信號大小的傳感器
四、實作思路
在購買材料之前,我們計劃把這個系統打造成一個“人”,賦予他感知環境并根據環境做出反饋的能力,
因此整體的思路是:
1.通過傳感器獲取環境資訊
作為一個智能系統,當然是獲取的資訊越全面越好,因此這里指的傳感器可以不止是上面提到的那些傳感器,用戶可以根據需要自行添加更多種類的傳感器,
每個傳感器的使用方法其實查查檔案,基本都能找到使用方法,網上也有很多案例,基本都是可以拿來即用的,
這一步的作業量主要在代碼整理上,將各種傳感器的代碼進行整合,
2.根據環境情況做出不同回應
有了所需要的環境資訊后,便能利用環境資訊做出一定的反饋,就跟人一樣,當我們感到太熱或太冷時,我們會通過表情及言語表達出來,
這一步主要的作業量在于如何設計系統的判斷條件,即到底什么是熱,它的具體數值是多少,這是我們需要確定的,
然后再寫一些條件判斷,當條件成立時,執行某些操作;條件不成立,再去執行其他操作,
五、具體步驟
1.獲取環境溫濕度
連接電路

引入必要的庫和檔案
// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain
#include "DHT.h"
#define DHTPIN 2 // what pin we're connected to
// Uncomment whatever type you're using!
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Connect pin 1 (on the left) of the sensor to +5V
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
Serial.println("DHTxx test!");
dht.begin();
}
主要函式撰寫
// 讀取濕度
void ReadH(){
float humidity = dht.readHumidity();
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.print(" %\t");
return humidity;
}
// 讀取溫度
void ReadT(){
float temperature = dht.readTemperature();
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" *C");
return temperature;
}
效果展示及驗證

2.獲取環境聲音大小
連接電路

這里我將聲音傳感器的out引腳接到了模擬口0上
主要函式撰寫
void ReadVoice(){
int Voice = analogRead(0); //傳感器接于模擬口0
Serial.print("Voice: ");
Serial.print(Voice);
Serial.println();
return Voice;
}
效果展示及驗證

3.獲取環境亮度
連接電路

主要函式撰寫
void ReadFire(){
int Fire = analogRead(5); //傳感器接于模擬口5
Serial.print("Fire: ");
Serial.print(Fire);
Serial.println();
return Fire;
}
效果展示及驗證

在沒有光斬訓光照很弱時,火焰傳感器的輸出數值較大
當受到光斬訓有火焰時:

傳感器輸出數值變小:

4.確定反饋邏輯
根據傳感器接收到的環境資料做出相應動作,此處引數可自行修改
代碼實作
if (humidity < 25){
DrawEmoji(broken_emoji);
Serial.println("broken");
}
else if (Fire > 1000){
DrawEmoji(blush_emoji);
Serial.println("blush");
}
else if (temperature < 15){
DrawEmoji(sad_emoji);
Serial.println("sad");
}
else if (Voice > 100){
DrawEmoji(angry_emoji);
Serial.println("angry");
}
else{
DrawEmoji(smeil_emoji);
Serial.println("smeil");
}
5.根據反饋邏輯輸出表情
連接電路

引入必要的庫和檔案并撰寫表情
// 7*8點陣屏
#include <SparkFun_LED_8x7.h>
#include <Chaplex.h>
byte led_pins[] = {4, 5, 6, 7, 8, 9, 10, 11}; // Pins for LEDs
byte i;
byte x;
byte y;
byte radius;
// smeil
const byte smeil_emoji[] = {
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,1,0,0,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,0,1,0,0,1,0,1,
0,1,0,0,0,0,1,0};
// sad
const byte sad_emoji[] = {
0,0,0,0,0,0,0,0,
0,0,1,0,0,1,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,0,1,0,0,1,0,1,
0,1,0,0,0,0,1,0};
// shy
const byte shy_emoji[] = {
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,1,0,0,1,0,0,
0,1,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,1,1,0,0,1,1,0,
1,0,0,1,1,0,0,1};
// blush
const byte blush_emoji[] = {
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
1,0,1,0,0,1,0,1,
1,0,1,0,0,1,0,1,
0,1,0,0,0,0,1,0};
// angry
const byte angry_emoji[] = {
0,0,0,0,0,0,0,0,
0,1,0,0,0,1,0,0,
0,0,1,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,0,0,1,1,0,
1,0,1,0,0,1,0,1,
1,0,0,0,1,0,0,1};
// broken
const byte broken_emoji[] = {
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
1,0,1,0,0,1,0,1,
0,1,0,0,0,0,1,0,
1,0,1,0,0,1,0,1};
主要函式撰寫
void DrawEmoji(const byte emojy[]){
Plex.clear();
Plex.drawBitmap(emojy);
Plex.display();
}
效果展示及驗證
- 輸出笑臉:

- 蒙圈表情:

- 難受表情:

6.根據反饋邏輯合成語音并輸出
通過Python獲取Arduino串口資料
這里需要一個serial庫,用于和Arduino通信,使用以下命令進行安裝:
pip install pyserial

pyserial的官方檔案:https://pypi.org/project/pyserial/
這里簡單帶大家過一下pyserial庫的使用方法,
打開串口
插入Arduino后,可以看到對應的串口,一般是COM3

下面通過serial庫打開COM3:
import serial
Sensor = serial.Serial('COM3', 9600, timeout=0.2)
讀取串口輸出
strs = Sensor.readline().decode('utf-8')
if strs.strip()!='':
print(strs)
通過win32com庫語音合成
import win32com.client
speaker = win32com.client.Dispatch("SAPI.SpVoice")
text = "輸入要語音合成的內容"
speaker.Speak(text)
六、代碼匯總
本專案使用的代碼已上傳至GitHub:
https://github.com/zbp-xxxp/EMF
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/235563.html
標籤:其他
上一篇:作用域鏈和預決議機制
