# LAB2 可變電阻調整LED
## DEMO
<iframe width="560" height="315" src="https://www.youtube.com/embed/FpCYZQQDTxw?si=g6TqX5cqcoVbMrZt" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
## 電路圖

- 不要接12!
- 不要接12!
- 不要接12!
- 不要接12!
- 這是血的教訓
## 程式碼說明
- 讀取可變電阻數值,並映射到0~255
```c++
// 讀取紅色輸入數值
int red_val = analogRead(potpinr);
red_val = map(red_val, 0, 4095, 0, 255);
// 讀取綠色輸入數值
int green_val = analogRead(potping);
green_val = map(green_val, 0, 4095, 0, 255);
// 讀取藍色輸入數值
int blue_val = analogRead(potpinb);
blue_val = map(blue_val, 0, 4095, 0, 255);
```
- LED燈輸出
```c++
color(red_val, green_val, blue_val);
```
- `color`函數
```c++
void color (unsigned char red, unsigned char green, unsigned char blue) {
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
}
```
- LCD更新
```c++
lcd.clear();
lcd.setCursor(0,0);
lcd.print("(R, G, B)");
lcd.setCursor(0, 1);
lcd.print(String(red_val) + ", " + String(green_val) + ", " + String(blue_val));
```
## 程式碼
```c++=
/*
* 電路模組用全彩LED模組、LCD模組
* ESP32 有匯入analogWrite.h,需去 草稿碼 > 匯入函式庫 > 管理函式庫
* ESP32 LiquidCrystal_I2C.h,需去 草稿碼 > 匯入函式庫 > 管理函式庫
*/
#include <analogWrite.h>
#include <LiquidCrystal_I2C.h>
// LED 和可變電阻的腳位
int redPin = 17;
int greenPin = 16;
int bluePin = 15;
int potpinr = 27;
int potping = 14;
int potpinb = 13;
LiquidCrystal_I2C lcd(0x27,16,2);
void setup() {
// 初始化 Serial
Serial.begin(9600);
// 設定 LED 腳位為輸出
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
lcd.init();
lcd.backlight();
}
void loop() {
// 讀取紅色輸入數值
int red_val = analogRead(potpinr);
red_val = map(red_val, 0, 4095, 0, 255);
// 讀取綠色輸入數值
int green_val = analogRead(potping);
green_val = map(green_val, 0, 4095, 0, 255);
// 讀取藍色輸入數值
int blue_val = analogRead(potpinb);
blue_val = map(blue_val, 0, 4095, 0, 255);
Serial.printf("r: %u g: %u b: %u\n", red_val, green_val, blue_val);
//更新LCD數值
lcd.clear();
lcd.setCursor(0,0);
lcd.print("(R, G, B)");
lcd.setCursor(0, 1);
lcd.print(String(red_val) + ", " + String(green_val) + ", " + String(blue_val));
// 更新 LED 顏色
color(red_val, green_val, blue_val);
delay(100);
}
// 控制LED顏色
void color (unsigned char red, unsigned char green, unsigned char blue) {
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
}
```