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", "反轉");

}