電路接線圖

ESP32類比讀入電壓範圍為 0V 到 3.3V,ADC 的解析度為 12 位元,使用 analogRead() 函數讀取類比值的範圍為 0 到 4095 。
- 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網站上進行模擬,並完成實體接線。
