第06篇 ESP32類比讀取(analogRead):小夜燈

類比讀取(analogRead)是Arduino非常重要的課程,因為大部分的感測器都是提供類比腳位AO,以類比方式感測可以提供更多的數據來收集或比較,精度更高的數值可以提供使用者在程式設計上更多的選擇

我的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就不用再跨到右側會比較方便。

ESP32與光敏電阻佈線圖
配線完成實體圖

四、程式撰寫

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

Leave a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *