我的ESP32實做書籍:我出書了 ESP32 物聯網專題
博客來網址:https://www.books.com.tw/products/0010901195
前言
類比讀取(analogRead)是Arduino非常重要的課程,因為大部分的感測器都是提供類比腳位AO,以類比方式感測可以提供更多的數據來收集或比較,精度更高的數值可以提供使用者在程式設計上更多的選擇,ESP32可以將類比數值切成0~4095之間的範圍,例如等等要介紹利用光敏電阻所實驗的小夜燈,就可以選擇環境很亮時(數值0~500)燈號全關,普通亮時(500~1000)開一顆燈,普通暗時(1000~2000)開兩顆燈,非常暗時燈號全開,不像數位讀取(digitalRead)只有0、1兩種數值,不能了解更細部的資訊。
一、實驗目的
利用光敏電阻感測現場亮度數值,0代表亮度最大,4095代表亮度最小,並依據亮度明暗開啟不同數量的LED作為補光。
環境很亮時(0~500)燈號全關
普通亮時(500~1000)開一顆燈
普通暗時(1000~2000)開兩顆燈
非常暗時(2000以上)燈號全開
這些500、1000、2000的門檻值,請使用者依據現場環境進行調整。
二、材料準備
ESP32主板+麵包板
顏色不拘 LED燈x3,不同顏色功能相同在此測試僅作為照明用
各式杜邦線若干
四針式光敏電阻:特別說明4pin式光敏電阻(如圖),這種光敏電阻不須再加上1K電阻,教學上較為方便。若用在數位讀取時,可透過設定數位觸發敏感度來調整出發門檻值。
而接線的AO(AnalogOut)代表類比輸出,相對Arduino來說就是把AO接到要類比讀取的腳位,而DO(DigitalOut)則是數位輸出,在本實驗則沒有使用。
三、線路佈置
首先把三顆LED放置在ESP32麵包板右側序號4、5、7,對應GPIO為15、2、4。
而光敏電阻我們則將它放在ESP32麵包板左側(有粉紅色ADC標示的位置),除了VCC、GND之外,依照上述所說,我們會使用光敏的AO腳,我們預期將AO接在麵包板左側序號5也就是GPIO13。
由於我們要使用到左側,因此把VCC及GND引到左側縱向的正負極(如圖),這樣光敏接VCC及GND就不用再跨到右側會比較方便。
四、程式撰寫
1.簡易測試
簡易測試的程式的部份相當簡單,我們僅須使用類比讀取analogRead就可以讀到數值後,顯示在序列視窗,這次我們宣告一個變數去接讀到的數值(LightValue)。
void setup() {
Serial.begin(115200);
pinMode(15, OUTPUT);//選告GPIO15作為輸出(綠色LED)
pinMode(2, OUTPUT);//選告GPIO 2作為輸出(黃色LED)
pinMode(4, OUTPUT);//選告GPIO 4作為輸出(紅色LED)
pinMode(13, INPUT);//選告GPIO 13作為輸入(光敏電阻)
}
void loop() {
int LightValue;//宣告變數LightValue
LightValue = analogRead(13); //讀取的GPIO 13讀取的數值放在LightValue
Serial.println(LightValue); //LightValue顯示在序列視窗
delay(100);
}
燒錄完成後,使用者可利用手遮擋光線,也可以用手機的LED直射光敏電阻增加亮度,查看數值的變化
此外也可以開啟序列繪圖家(功能表/工具/序列繪圖家,但必須要先關閉序列監控視窗),以折線圖形觀察數值變化,下圖中,低谷部份為手機LED照射的結果,而高峰處則為刻意用手遮擋的結果。
2.光敏小夜燈測試
完成基本測試後,接下來要使用光敏的數值決定開關LED燈的數量,其程式如下
void setup() {
Serial.begin(115200);
pinMode(15, OUTPUT);//選告GPIO15作為輸出(綠色LED)
pinMode(2, OUTPUT);//選告GPIO 2作為輸出(黃色LED)
pinMode(4, OUTPUT);//選告GPIO 4作為輸出(紅色LED)
pinMode(13, INPUT);//選告GPIO 13作為輸入(光敏電阻)
}
void loop() {
int LightValue;//宣告變數LightValue
LightValue = analogRead(13); //讀取的GPIO 13讀取的數值放在LightValue
Serial.println(LightValue); //LightValue顯示在序列視窗
if (LightValue < 500) {
//小於500,代表亮度充足,關閉所有LED
digitalWrite(15, LOW);
digitalWrite(2, LOW);
digitalWrite(4, LOW);
}
if (LightValue >= 500 && LightValue < 1000) {
//500-1000之間,代表亮度中等
digitalWrite(15, HIGH);
digitalWrite(2, LOW);
digitalWrite(4, LOW);
}
if (LightValue >= 1000 && LightValue < 2000) {
//1000-2000之間,代表亮度不足
digitalWrite(15, HIGH);
digitalWrite(2, HIGH);
digitalWrite(4, LOW);
}
if (LightValue > 2000) {
//2000以上,代表完全無燈光
digitalWrite(15, HIGH);
digitalWrite(2, HIGH);
digitalWrite(4, HIGH);
}
delay(100);
}
延伸閱讀
???? 第七篇 ESP32瓦斯警報器mq2