類比讀入、可變電阻控制LED燈亮的數目

電路接線圖

ESP32類比讀入電壓範圍為 0V 到 3.3V,ADC 的解析度為 12 位元,使用 analogRead() 函數讀取類比值的範圍為 0 到 4095 。

參考網址:Random Nerd Tutorials
  • ADC1 接腳:隨時可用,不會與 Wi-Fi 功能衝突。
    • GPIO36
    • GPIO39
    • GPIO34
    • GPIO35
    • GPIO32
    • GPIO33
  • ADC2 接腳:與 Wi-Fi 共用硬體資源,當 Wi-Fi 啟用時可能會受到影響,導致不穩定或錯誤的讀取值。
    • GPIO4
    • GPIO2
    • GPIO15
    • GPIO25
    • GPIO26
    • GPIO27
    • GPIO14
    • GPIO12
    • GPIO13
int analogPin = 34;   // 類比輸入接腳
int analogValue;      // 類比讀入值(0~4095)
float voltage;        // 電壓值(浮點數)

void setup() {
  Serial.begin(9600);         // 啟用監看視窗
  pinMode(analogPin, INPUT);  // 宣告輸入接腳
}

void loop() {
  analogValue = analogRead(analogPin);  // 儲存類比讀入值
  voltage = 3.3 * analogValue / 4095;   // 將類比讀入值 轉換為 電壓值

  Serial.print("analog value:");
  Serial.print(analogValue);      // 印出類比讀入值
  Serial.print(", voltage:");
  Serial.println(voltage);        // 印出電壓值
  delay(300);
}

若不使用delay()函式,可改用millis()函式完成:

//---------------------------------------------------------------------
int analogPin = 34;   // 類比輸入接腳
int analogValue;      // 類比讀入值(0~4095)
float voltage;        // 電壓值(浮點數)
//---------------------------------------------------------------------
unsigned long previousMillis = 0;   // 前一次的millis()時間
const long interval = 300;          // 預設計時的時間
//---------------------------------------------------------------------

void setup() {
  Serial.begin(9600);         // 啟用監看視窗
  pinMode(analogPin, INPUT);  // 宣告輸入接腳
}

void loop() {

  unsigned long currentMillis = millis();          // 當前的millis()時間

  if (currentMillis - previousMillis >= interval)  // 若達到預設計時的時間
  {
    //---------------------------------------------------------------------
    // 每經過一個interval的時間,要做的事
    //---------------------------------------------------------------------
    analogValue = analogRead(analogPin);  // 儲存類比讀入值
    voltage = 3.3 * analogValue / 4095;   // 將類比讀入值 轉換為 電壓值

    Serial.print("analog value:");
    Serial.print(analogValue);      // 印出類比讀入值
    Serial.print(", voltage:");
    Serial.println(voltage);        // 印出電壓值
    //---------------------------------------------------------------------

    previousMillis = currentMillis;  // 更新前一次的millis()時間
  }
}

若再加入一個LED燈,做類比輸出的亮度控制:

//---------------------------------------------------------------------
int analogPin = 34;   // 類比輸入接腳
int analogValue;      // 類比讀入值(0~4095)
float voltage;        // 電壓值(浮點數)
//---------------------------------------------------------------------
unsigned long previousMillis = 0;   // 前一次的millis()時間
const long interval = 300;          // 預設計時的時間
//---------------------------------------------------------------------
int led = 15;         // LED燈
int brightness;       // LED輸出亮度(0~255)
//---------------------------------------------------------------------

void setup() {
  Serial.begin(9600);         // 啟用監看視窗
  pinMode(analogPin, INPUT);  // 宣告輸入接腳
  pinMode(led, OUTPUT);       // 宣告輸出接腳
  digitalWrite(led, HIGH);    // LED初始值為熄滅
}

void loop() {

  unsigned long currentMillis = millis();          // 當前的millis()時間

  if (currentMillis - previousMillis >= interval)  // 若達到預設計時的時間
  {
    //---------------------------------------------------------------------
    // 每經過一個interval的時間,要做的事
    //---------------------------------------------------------------------
    analogValue = analogRead(analogPin);    // 儲存類比讀入值
    voltage = 3.3 * analogValue / 4095;     // 將類比讀入值 轉換為 電壓值
    brightness = 255 * analogValue / 4095;  // 將類比讀入值 轉換為 輸出亮度

    Serial.print("analog value:");
    Serial.print(analogValue);      // 印出類比讀入值
    Serial.print(", voltage:");
    Serial.print(voltage);          // 印出電壓值
    Serial.print(", brightness:");
    Serial.println(brightness);     // 印出輸出亮度值
    analogWrite(led, brightness);   // 類比輸出到LED
    //---------------------------------------------------------------------

    previousMillis = currentMillis;  // 更新前一次的millis()時間
  }
}

作業練習:

  • 開機後,8個LED燈全亮,1秒後全滅。
  • 當調整可變電阻時,由8個LED燈亮的數目(全滅←→1個燈←→2個燈←→ …… ←→8個燈),線性對應目前可變電阻所處的位置。
  • 各種燈亮的狀態必須顯示在監看視窗上。
  • 在Wokwi網站上進行模擬,並完成實體接線。