Codes
A-1.程式碼:閃爍LED
int LEDPin = 23; //定義GPIO 23為LED的腳位
void setup() {
pinMode(LEDPin,OUTPUT); //將LED設定為輸出模式
}
void loop() { //點亮LED並閃爍
digitalWrite(LEDPin,1); //將LED腳位設定為高電位
delay(500); //延遲0.5秒
digitalWrite(LEDPin,0); //將LED腳位設定為低電位
delay(500); //延遲0.5秒
}
A-2.程式碼:按鈕開關LED
int LEDPin = 23; //定義23腳位為LEDPin
int Button = 22; //定義22腳位為Button
void setup() {
pinMode(LEDPin,OUTPUT); //將LEDPin設定為輸出
pinMode(Button,INPUT_PULLUP); //將Button設為輸入並且為高電位
}
void loop() { //按下按鈕後LED燈點亮
if(digitalRead(Button) ==0){ //讀取按鈕得電位
digitalWrite(LEDPin,1); //將LED腳位設定為高電位
}
else{
digitalWrite(LEDPin,0); //將LED腳位設定為低電位
}
}
A-3.程式碼:可變電阻調控LED
int LEDPin = 23; // 定義 pin 23 為 LEDPin
int potPin = 34; // 定義模擬輸入 pin 34 為 potPin
void setup() {
pinMode(LEDPin, OUTPUT); // 設定 LEDPin 為輸出
}
void loop() { //利用可變電阻調整LED亮度
int potValue = analogRead(potPin); // 讀取可變電阻的數值(範圍 0 到 4095)
int brightness = map(potValue, 0, 4095, 0, 255); // 將可變電阻數值映射到 LED 亮度的範圍(0 到 255)
analogWrite(LEDPin, brightness); // 使用 analogWrite 設定 LED 亮度
delay(10); //沒有delay不會亮
}
A-4.程式碼:聲與光、蜂鳴器與LED
int BeePin = 22; //定義22腳位為蜂鳴器
int LEDPin = 23; //定義23腳位為LED
void setup() {
pinMode(LEDPin,OUTPUT); //將LED設定為輸出
pinMode(BeePin,OUTPUT); //將蜂鳴器設定為輸出
}
void loop() { //電亮LED並閃爍,加入蜂鳴器
digitalWrite(LEDPin,1); //將LED腳位設定為高電位
digitalWrite(BeePin,1); //將蜂鳴器腳位設定為高電位
delay(1000); //延遲1s
digitalWrite(LEDPin,0); //將LED腳位設定為低電位
digitalWrite(BeePin,0); //將蜂鳴器腳位設定為低電位
delay(1000); //延遲1s
}
A-5.程式碼:LCD 1602顯示模組
先安裝LiquidCrystal_I2C程式庫。
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4); //0x27 是一個常見的預設地址
//20:LCD 的列數,表示液晶顯示器有多少列文字
//4 :LCD 的列數,表示每列可以顯示多少個文字
void setup() {
lcd.init(); //初始化 LCD
lcd.backlight(); //打開 LCD 的背光
lcd.setCursor(0,0); //游標被設定在第一列的第一個位置,也就是左上角
lcd.print("Hi ESP32"); //LCD 上顯示了這段文字
}
void loop() {
//空白即可,文字已於初始化時顯示。
}
A-6.程式碼:溫溼度偵測與顯示
先安裝DHT 11程式庫,不同製造商須用不同程式庫。
#include <DHT.h> //適合本產品的DHT 11 程式庫
#include <Wire.h> // 匯入 I2C 通訊的函式庫
#include <LiquidCrystal_I2C.h> // 匯入 I2C LCD 的函式庫
DHT dht11(4, DHT11);
LiquidCrystal_I2C lcd(0x27, 20, 4); // 使用 LiquidCrystal_I2C 類別建立一個 lcd 物件,I2C 位址為 0x27,LCD 尺寸為 20x4
void setup() {
lcd.init(); // 初始化 LCD
lcd.backlight(); // 打開 LCD 背光
dht11.begin(); //初始化DHT11
}
void loop() {
lcd.setCursor(0, 0); // 設定 LCD 游標位置為第一行第一列
lcd.print("Temp: ");
lcd.print((int)dht11.readTemperature()); // 讀取溫度值並印出,轉換為整數顯示
lcd.print(" C"); // 在 LCD 上印出溫度單位
lcd.setCursor(0, 1); // 設定 LCD 游標位置為第二行第一列
lcd.print("Humidity: ");
lcd.print((int)dht11.readHumidity()); // 讀取濕度值並印出,轉換為整數顯示
lcd.print(" %"); // 在 LCD 上印出濕度單位
delay(1000);
}
B-1.程式碼:ESP32連接WiFi
#include <WiFi.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // 使用 LiquidCrystal_I2C 類別建立一個 lcd 物件,I2C 位址為 0x27,LCD 尺寸為 20x4
const char* ssid = "wifi ssid"; // WiFi 網路名稱
const char* password = "wifi 密碼"; // WiFi 密碼
int btnState = false; // 按鈕狀態(未使用)
void setup() {
lcd.init(); // 初始化 LCD
lcd.backlight(); // 打開 LCD 背光
Serial.begin(115200); // 初始化串口通訊,波特率為 115200
delay(10);
Serial.println();
Serial.print("[WiFi] Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password); // 嘗試連接到 WiFi 網路
int tryDelay = 500; // 連接嘗試之間的延遲時間(毫秒)
int numberOfTries = 20; // 最大連接嘗試次數
while (true) {
switch(WiFi.status()) {
case WL_CONNECTED:
lcd.setCursor(0, 0); // 設定 LCD 游標位置為第一行第一列
lcd.print("WiFi connected!"); // 在 LCD 上印出 WiFi 連接成功的訊息
return; // 離開 setup 函式
break;
}
delay(tryDelay);
if(numberOfTries <= 0){
Serial.print("[WiFi] Failed to connect to WiFi!"); // 串口印出失敗的訊息
WiFi.disconnect(); // 斷開 WiFi 連接
return; // 離開 setup 函式
} else {
numberOfTries--; // 減少剩餘嘗試次數
}
}
}
void loop() {
// 這是 loop 函式,主要用於持續執行的程式邏輯,但在這裡是空的,什麼也不做。
}
B-2.程式碼:ESP32網頁伺服器-調控LED亮度
#include <WiFi.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
//請修改以下參數--------------------------------------------
const char* ssid = "WiFi SSID";
const char* password = "WiFi密碼";
// 定義 LED 的引腳
const int ledPin = 4;
// 定義伺服器物件和 LCD 物件
WiFiServer server(80);
LiquidCrystal_I2C lcd(0x27, 20, 4);
void setup() {
// 啟動串口通信
Serial.begin(115200);
lcd.init(); // 初始化 LCD
lcd.backlight(); // 打開 LCD 背光
// 設定 LED 引腳為輸出並關閉 LED
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
// 連接 Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
// 顯示連線成功後的 IP
Serial.print("Connected! IP address: ");
Serial.println(WiFi.localIP());
// 在 LCD 顯示 Wi-Fi 連線成功
lcd.setCursor(0, 0);
lcd.print("WiFi Connected!");
// 開啟伺服器
server.begin();
}
void loop() {
// 檢查是否有客戶端連接到伺服器
WiFiClient client = server.available();
if (client) {
String currentLine = "";
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (c == '\n') {
// 處理 HTTP 請求
if (currentLine.length() == 0) {
// 送回網站
serveWebsite(client);
break;
} else if (currentLine.startsWith("GET /brightness")) {
// 處理亮度設定
handleBrightness(client, currentLine);
}
currentLine = "";
} else if (c != '\r') {
currentLine += c;
}
}
}
delay(10);
client.stop();
}
}
void serveWebsite(WiFiClient client) {
// 送回簡單的 HTML 頁面,包含亮度設定的 UI 元素
client.println("<html><head><meta charset='UTF-8'></head><body>");
// HTML 標題
client.println("<h1>LED 控制</h1>");
// 亮度設定的表單
client.println("<form action='/brightness' method='GET'>");
client.println("亮度: <input type='range' name='brightness' min='0' max='255'><br>");
client.println("<input type='submit' value='設定亮度'>");
client.println("</form>");
// HTML 頁面結束標記
client.println("</body></html>");
}
void handleBrightness(WiFiClient client, String request) {
// 從 HTTP 請求中提取亮度值
int brightness = request.substring(request.indexOf("brightness=") + 11).toInt();
// 更新 LED 亮度
analogWrite(ledPin, brightness);
// 設定 LCD 游標位置為第一行第一列
lcd.setCursor(0, 0);
// 在 LCD 顯示相應的訊息
if (brightness == 0) {
lcd.setCursor(0, 1);
lcd.print("turn off ");
} else {
lcd.setCursor(0, 1);
lcd.print("turn on " + String(brightness));
}
// 送回 HTTP 回應
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html; charset=UTF-8");
client.println("Connection: close");
client.println();
client.println("<html><body><h1>亮度已設定為 " + String(brightness) + "</h1></body></html>");
}
B-3.程式碼:ESP32+Line Notify
#include <WiFi.h>
#include <WiFiClientSecure.h>
//請修改以下參數--------------------------------------------
char SSID[] = "wifi ssid"; // 你的手機熱點名稱
char PASSWORD[] = "wifi 密碼"; // 熱點密碼
String Linetoken = "LINE 權杖"; // 跟LINE申請的權杖
int sensor = 18; // 你的感應器編號
//---------------------------------------------------------
WiFiClientSecure client; // 網路連線物件
char host[] = "notify-api.line.me"; // LINE Notify API網址
String message; // 要發送的訊息
void setup()
{
Serial.begin(115200); // 初始化串口通信
// 連線到指定的WiFi SSID
Serial.print("Connecting Wifi: ");
Serial.println(SSID);
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(500);
}
// 連線成功,顯示取得的IP
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
IPAddress ip = WiFi.localIP();
Serial.println(ip);
client.setInsecure(); // 使用不安全的連線
message = "ESP32 補充本"; // 設置要發送的訊息
messages(); // 呼叫發送訊息的函數
}
void loop()
{
}
void messages()
{
if (client.connect(host, 443)) // 連線到指定的主機和埠
{
int LEN = message.length(); // 獲取訊息長度
String url = "/api/notify"; // 設置要請求的URL
client.println("POST " + url + " HTTP/1.1"); // 發送HTTP POST請求
client.print("Host: ");
client.println(host); // 主機名稱
client.print("Authorization: Bearer ");
client.println(Linetoken); // 設置權杖
client.println("Content-Type: application/x-www-form-urlencoded"); // 設置內容類型
client.print("Content-Length: ");
client.println(String((LEN + 8))); // 設置內容長度
client.println();
client.print("message=");
client.println(message); // 發送訊息
client.println(); // 空行
delay(2000); // 延遲 2 秒
String response = client.readString(); // 讀取伺服器回應
}
}
B-4.程式碼:ESP32+溫度過高警示+Line Notify
#include <DHT.h> //DHT simple 程式庫
#include <Wire.h> // 匯入 I2C 通訊的函式庫
#include <LiquidCrystal_I2C.h> // 匯入 I2C LCD 的函式庫
#include <WiFiClientSecure.h> // 匯入安全的 WiFiClient 函式庫
DHT dht11(4, DHT11);
LiquidCrystal_I2C lcd(0x27, 20, 4); // 使用 LiquidCrystal_I2C 類別建立一個 lcd 物件,I2C 位址為 0x27,LCD 尺寸為 20x4
char SSID[] = "wifi ssid"; //你的手機熱點名稱
char PASSWORD[] = "wifi 密碼"; //熱點密碼
String Linetoken = "LINE 權杖"; // 跟LINE申請的權杖
//---------------------------------------------------------
WiFiClientSecure client; //網路連線物件
char host[] = "notify-api.line.me"; // LINE Notify API網址
String message;
void setup() {
lcd.init(); // 初始化 LCD
lcd.backlight(); // 打開 LCD 背光
dht11.begin(); // 初始化DHT11
Serial.begin(115200);
//連線到指定的WiFi SSID
Serial.print("Connecting Wifi: ");
Serial.println(SSID);
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(500);
}
//連線成功,顯示取得的IP
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
IPAddress ip = WiFi.localIP();
Serial.println(ip);
client.setInsecure();
}
void loop() {
float temperature = dht11.readTemperature(); // 讀取溫度值
if (temperature > 30.0) {
message = "溫度過高"; //訊息內容
messages(); //發送訊息
}
lcd.setCursor(0, 0); // 設定 LCD 游標位置為第一行第一列
lcd.print("Temp: ");
lcd.print((int)temperature); // 讀取溫度值並印出,轉換為整數顯示
lcd.print(" C"); // 在 LCD 上印出溫度單位
lcd.setCursor(0, 1); // 設定 LCD 游標位置為第二行第一列
lcd.print("Humidity: ");
lcd.print((int)dht11.readHumidity()); // 讀取濕度值並印出,轉換為整數顯示
lcd.print(" %"); // 在 LCD 上印出濕度單位
delay(10000); //每隔10秒偵測一次
}
void messages()
{
if (client.connect(host, 443)) // 連線到指定的主機和埠
{
int LEN = message.length(); // 獲取訊息長度
String url = "/api/notify"; // 設置要請求的URL
client.println("POST " + url + " HTTP/1.1"); // 發送HTTP POST請求
client.print("Host: ");
client.println(host); // 主機名稱
client.print("Authorization: Bearer ");
client.println(Linetoken); // 設置權杖
client.println("Content-Type: application/x-www-form-urlencoded"); // 設置內容類型
client.print("Content-Length: ");
client.println(String((LEN + 8))); // 設置內容長度
client.println();
client.print("message=");
client.println(message); // 發送訊息
client.println(); // 空行
delay(2000); // 延遲 2 秒
String response = client.readString(); // 讀取伺服器回應
}
}
B-5.程式碼:機電整合舵機控制
#include <WiFi.h>
#include <WebServer.h>
#include <ESP32Servo.h>
// 定義 WiFi 網路的 SSID 和密碼
const char *ssid = "WiFi SSID";
const char *password = "WiFi密碼";
// 建立 WebServer 和 Servo 物件
WebServer server(80);
Servo sg90;
void setup() {
Serial.begin(115200);
// 連接 WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("連接到WiFi...");
}
Serial.println("連接完成");
// 啟動 Web 伺服器
server.on("/", HTTP_GET, handleRoot);
server.on("/forward", HTTP_GET, handleForward);
server.on("/backward", HTTP_GET, handleBackward);
server.begin();
// 顯示 ESP32 的 IP 地址
Serial.print("IP地址:");
Serial.println(WiFi.localIP());
// 初始化 Servo
sg90.attach(4); // 選擇一個可用的 GPIO 引腳
sg90.write(90); // 設置舵機初始位置
}
void loop() {
server.handleClient();
}
// 處理根目錄的 HTTP 請求
void handleRoot() {
// 建立 HTML 控制界面
String html = "<h1>ESP32 SG90 控制</h1>\
<button onclick=\"sendCommand('/forward')\">正轉</button>\
<button onclick=\"sendCommand('/backward')\">反轉</button>\
<script>\
function sendCommand(path) {\
var xhr = new XMLHttpRequest();\
xhr.open('GET', path, true);\
xhr.send();\
}\
</script>";
// 發送 HTML 響應,設置字符集為 UTF-8
server.send(200, "text/html; charset=utf-8", html);
}
// 處理正轉的 HTTP 請求
void handleForward() {
sg90.write(0); // 設置舵機正轉角度
delay(1000); // 停頓 1 秒
sg90.write(90); // 使舵機停止
server.send(200, "text/plain", "正轉");
}
// 處理反轉的 HTTP 請求
void handleBackward() {
sg90.write(180); // 設置舵機反轉角度
delay(1000); // 停頓 1 秒
sg90.write(90); // 使舵機停止
server.send(200, "text/plain", "反轉");
}