490 likes | 502 Views
物 聯 網 IoT Level-01 https://goo.gl/BSNZYP. 設備檢查 一、環境設定 二、程式基礎( LED 測試) 三、數位讀取. 四、類比讀取 五、蜂鳴器 六、溫溼度計 七、 LCD 八、超音波. 一、開發環境設定. NodeMcu-32s 布局. ESP32 Pin map. 18 x Analog-to-Digital :可接類比或數位感測 ( 粉紅色標示 ) 3 x SPI interfaces(MOSI,MISO,SCK,SS) : SD card, RFID( 藍色標示 )
E N D
物聯網IoTLevel-01https://goo.gl/BSNZYP 設備檢查 一、環境設定 二、程式基礎(LED測試) 三、數位讀取 四、類比讀取 五、蜂鳴器 六、溫溼度計 七、LCD 八、超音波
ESP32 Pin map • 18 x Analog-to-Digital:可接類比或數位感測(粉紅色標示) • 3 x SPI interfaces(MOSI,MISO,SCK,SS): SD card, RFID(藍色標示) • 3 x UART interfaces:藍芽、相機(不限腳位編號) • 2 x I2C interfaces(SDA,SCL) and I2S interfaces:LCD、氣壓、陀螺儀(GPIO 21,22) • 16 x PWM output channels:數位輸出也可類比輸出(不限定腳位編號) • 2 x Digital-to-Analog Converters (DAC):不太需要用 • 10 x Capacitive sensing GPIOs:提供觸控電容(棕色標示) • GPIO 34,35,36,39:Input only • GPIO 1,2,3,6,7,8,9,10,11:系統用,勿使用(淺灰色標示) • GPIO 18:重開機
一、環境設定 • 下載ESP32驅動程式 • 下載Arduino IDE • 下載ESP32核心檔案 • 設定Arduino IDE for NodeMcu-32s1~4的打包檔案:https://goo.gl/M32fbS • 簡單測試程式:HelloWorld • ESP32函式庫安裝
解壓縮到指定的資料夾 • 下載1~4打包檔案:https://goo.gl/M32fbS本版本為免安裝版,解壓縮後即可執行 • 建議解壓縮到D硬碟中,也可放到USB中 • 例如本例,解壓縮到d:\arduino1.8.5\
安裝驅動 • 解壓縮後後,將NodeMcu-32s插入USB • 此時會出現安裝畫面,但由於沒有驅動程式,因此自行指定驅動程式 • ESP32驅動程式位於以下資料夾D:\arduino-1.8.5\drivers\CP210x_6.7.4 • 安裝驅動完畢後 • 在我的電腦/右鍵/管理/,開啟電腦管理 • 點選左側裝置管理員 • 點選右側連接埠,檢查是否有一個Silicon Lab CP210x USB to UART (COMX) • 請注意最後的ComX代表獲得的COM位置,每次可能都會不同,請紀錄在記事本,以後會用到。
設定Arduino開發界面 • 開啟arduino-1.8.5下的Arduino主程式:arduino.exe • 點選功能表/工具/開發版並往下拉,直到選擇NodeMCU-32s • 更改序列埠為COMX,依照投影片頁碼6的第6點選擇 • UploadSpeed選擇:921600 8
簡單測試程式:HelloWorld • 1.HelloWorld.txt
注意事項 • Arduino IDE 上傳程式碼,出現……______.......____時,須按住右側Flash鍵 • 後續程式撰寫與一般Arudino幾乎無異 • 若需要函式庫,請Google關鍵字:ESP32+所需功能 • Reset Flash
麵包版結構 • 中間左右通路 • 兩側上下通路 • 一般我們會將正電5V及GND接至兩側就像電源分接一樣
二、基礎語法 • 程式結構 • LED燈(長正短負) • 將三色LED分別接在7,8,9的序號上 • 實際的編號其實是4,16,17
1.Arduino程式結構 Void Setup() { 設定的部份僅執行一次 //代表註解 } Void loop() { 工作內容 例如:讀取 例如:輸出電壓 }
常用語法 • 數位感測輸入(人體、觸摸) • pinMode(腳位編號,INPUT); //宣告為輸入 • Statue=digitalRead(腳位編號);//讀取的值(1或0) • 數位輸出(LED、繼電器) • pinMode(腳位編號, OUTPUT); //宣告為輸出 • digitalWrite(腳位編號,HIGH);//輸出5V • digitalWrite(腳位編號,LOW);//輸出0V • 數位模擬類比PWM輸出(RGB LED、DC馬達) • 須宣告PWMchannels=0~15, FREQ=5000, resolution = 8 • ledcAttachPin(GPIO, channel) • ledcWrite(channel, dutycycle)
常用語法-2 • 類比輸入(火焰、水位、光敏、振動)sensorValue= analogRead(腳位編號); //讀取的數值 • 序列監視視窗可以觀察類比輸入的數值 • 在setup()加入此行 • Serial.begin(9600);//宣告讀取數值及速率 • 在loop()加入以下 • delay(500); • int sensorValue = analogRead(腳位); //讀取數值 • Serial.println(sensorValue);//輸出數值
2.LED燈第一個程式:讓LED亮起 • Blink,讓LED亮起 在setup的地方宣告 pinMode(4, OUTPUT); //宣告pin4是輸出 在loop的地方執行 digitalWrite(4, HIGH);// pin4輸出5V
讓LED隔一秒閃耀 • 思路:開停一秒關停一秒 在loop的地方執行 digitalWrite(4, HIGH); delay(1000); digitalWrite(4, LOW); delay(1000);
完整程式 void setup() { // 宣告4為輸出 pinMode(4, OUTPUT); } //loop內重複執行不停止 void loop() { digitalWrite(4,HIGH);// turn the LED on delay(1000); // wait for a second digitalWrite(4,LOW); // turn the LED off delay(1000); // wait for a second }
數位感測裝置 • Arduino感測環境參數須使用感測器,主要分成三大類 • 數位讀取:只有1或0,例如人體、觸控 • 類比讀取:火焰、水位、土壤、氣體等 • 特定函數讀取:須透過特定函數讀取設備感測資訊,例如溫濕度DHT11、超音波、陀螺儀、相機 • Arduino互動裝置,用於與使用者產生互動 • 燈號:LED、LCM、OLED、TFT等顯示裝置 • 聲音:蜂鳴器、喇叭、MP3等 • 動作:伺服馬達、步進馬達 • 遙控:藍芽、無線、紅外線、WIFI
三、人體感測器 • 利用紅外線來偵測是否有物體經過 • 請將旋鈕逆時針轉至最底 • 狀態約五秒才能再啟動
基礎練習 將紅外線的OUT接在GPIO 15(順序4) void setup(){ pinMode(15, INPUT); Serial.begin(9600); delay(1000); } void loop(){ int val=digitalRead(15); Serial.println(val); delay(1000); } 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
互動式紅綠燈實做 • 目標:無人時為紅燈,偵測到有人等候時,立即開啟綠燈,並延遲10秒後轉為黃燈,再3秒後轉紅燈 if(val==1) {//有人 …. } else {//沒人 …. }
觸控裝置 • 感測人體靜電,預設0,觸摸時則顯示1 • 改成平常為紅燈,觸控時綠燈10秒,黃燈,再3秒後轉紅燈
一、類比讀取 • 類比讀取語法 • 類比讀取設備 • 序列數值顯示 • 序列繪圖家 • 氣體感測器(MQ系列) • 在setup處宣告pin為 Serial.begin(9600);pinMode(腳位,INPUT); • 讀取值方法,在loop處 int val=analogRead(腳位); Serial.print("狀態="); Serial.println(val);
小夜燈練習 • 當亮度>=1000,意思環境很暗,就把三顆LED點亮 • 否則當亮度<1000,意思是環境夠亮,就把LED關掉 if(val>=1000){ digitalWrite(4,HIGH); } else{ digitalWrite(4,LOW); }
2.類比讀取設備 • 氣體品質 • 雨滴感測 • 光度感測 • 火焰感測 • 特徵:腳位會有編號A0代表analog • 是否提供類比請查詢規格書或詢問賣家 • ESP32腳位不分數位類比,但UNO系列有區分 數位腳位 類比腳位
實做:亮度警報器 • 接綠色、紅色LED • 接亮度感測器 • 持續偵測數值 • 先了解現在的環境的偵測數值,例如X • 再設定一個門檻值X=6/5x,例如穩定狀態200,門檻值設定為240,如果超過門檻值,就開啟紅色LED,如果沒有超過門檻值,就開啟綠色LED。
3.序列數值顯示 通常在setup中第一句為: Serial.begin(9600);//代表9600速率傳輸到序列監控
4.序列繪圖家 • 工具/序列繪圖家 • 須先關閉序列視窗,不可與序列視窗共用 • Print必須只有數值,意思是:intstatus=analogRead(腳位);Serial.print("狀態=");Serial.println(status);
5.氣體感測器 • 一般為MQ系列 • 價格約在90-150之間 • 無法偵測詳細數值 • 僅能作為測試
Datasheet規格表 • 其實是很不準? • 該怎麼辦? • 長期讀取一般狀態數值設定為正常數值然後再設定一個門檻值,超越即發布警報 RL=20; Vout = analogRead(); Rs = RL * (6204.5 – Vout)/Vout;
危險氣體警示 • 噴了酒精以後,要亮燈,並發出警示聲音。 • 10秒後,恢復關燈,關閉聲音
蜂鳴器 ESP32 蜂鳴器函式庫下載 EasyBuzzer https://goo.gl/pHKczH
發出Do,Ri,Mi各一秒 • 注意事項 • 蜂鳴器設定響時間,同時必須預留相同的delay時間 • 蜂鳴器範例:https://goo.gl/aSCnMJ
1.溫濕度 • LM35三極體感測器 • DHT-11溫濕度傳感器 • DHT須載入dht lib函式庫 • 函式庫請至此處下載https://goo.gl/sJU1r1
引入函式庫方式 • 下載函式庫後,將函式庫包裝為資料夾,例如DHT,內部包含兩個程式 • 將函式庫複製到規定的位置UNO系列->D:\arduino-1.8.5\librariesESP32系列->D:\arduino-1.8.5\hardware\espressif\esp32\libraries
DHT11關鍵語法 • dht DHT11;//宣告一個DHT11為dht的物件類別 • DHT11.read11(15);//讀取溫度計資料,接在15,序號4 • 執行read11後 • 濕度為DHT11.humidity • 溫度為DHT11.temperature
#include <dht.h> dhtDHT11;//宣告一個DHT為dht11的物件類別 void setup() { Serial.begin(9600);//序列傳輸9600 Serial.println("溫濕度測試"); delay(1000);//等候一秒暖機 } void loop() { DHT11.read11(15);//讀取溫度計資料 Serial.print("濕度="); Serial.print(DHT11.humidity); Serial.print("%,"); Serial.print("溫度="); Serial.print(DHT11.temperature); Serial.println("C"); delay(1000);//讀取資料的頻率 }
利用LCD提供訊息 • 將LCD接上Arduino設備 • 透過LCD顯示訊息 • 不可換腳位,接法固定 旋轉至適當亮度
利用i2C • i2C是一種序列轉換IC,用於傳輸複雜的資料。由於控制LCD需要大量接腳,因此可透過I2C用傳輸資料的方式。 • 利用方式: • 1.掃描I2C位址:獲得位址之後,在步驟2使用 • 2.連線I2C裝置,並顯示資料 • 決定顯示的位置:例如第一行第一個字開始 • 決定顯示內容:例如hello world
i2C掃描 • 由於i2C裝置不同版本會有不同的位置,建議先行掃描 • 請複製範例程式I2C掃描.txthttps://goo.gl/ykRGeC • 執行後觀察序列視窗,取得0x3F
i2C函式庫取得 • 下載i2clib,並複製到lib資料夾https://goo.gl/rPxY6D • 下載LCD範例程式 • https://goo.gl/VR6fPh • 修改LiquidCrystal_I2C lcd(0x3F,16,2);//16個字、2行 • lcd.begin();//啟動LCD • lcd.backlight();//開啟背光 • lcd.setCursor(3,0);//將游標移動到第0行第三個字 • lcd.print(“Hello, world!”);//顯示Hello, world • 注意背光亮度
結合進度四:溫度計進度五:LCD將溫度濕度顯示在LCD上結合進度四:溫度計進度五:LCD將溫度濕度顯示在LCD上
超音波 • 用超音波發射來回計算時間來偵測距離 • 有效距離約2cm~200cm • CM_Value = pulseIn(EchoPin, HIGH); • CM_Value = CM_Value * 34 / 1000 / 2; • 一般來說聲音在空氣中傳遞的速度, 大約會是每秒中340公尺. 溫度和氣壓都可能改變聲音傳遞的速度. 但我們先簡單化問題, 這裡乎略不計. • 所以公式如下 • 1秒 : 340公尺 = EhcoTime() : S(距離)/2 • S(距離) = EchoTime * 34 / 1000毫秒 / 2
const int TrigPin=39;//發出聲波 constintEchoPin=36 ;//接收聲波 float CM_Value; void setup(){ Serial.begin(9600); pinMode(TrigPin, OUTPUT); pinMode(EchoPin, INPUT); } void loop() { digitalWrite(TrigPin, LOW); //關閉 delayMicroseconds(2); digitalWrite(TrigPin, HIGH);//啟動 delayMicroseconds(10); digitalWrite(TrigPin, LOW); //關閉 CM_Value = pulseIn(EchoPin, HIGH); //傳回時間 CM_Value = CM_Value * 34 / 1000 / 2; //轉換成距離 Serial.print(CM_Value); //Serial.print(" cm"); delay(1000); }
練習:靠近警示 • 當物體太過靠近時,發出聲音警告
實做、火災警報或氣體警報 • 目標:每一秒都讀取數值,若正常則關閉警報,若出現異常數值時,就響警報,直到以下狀況1.手動解除2.狀況復原
觸摸感測器 • 用來作為解除按鈕 • 規格:數位 • 當觸摸時,靜電會讓SIG傳入1,否則0 • 是否人工解除代表觸摸是否=1