86602程式碼

基礎篇

主題一、閃爍的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秒

}

主題按鈕開關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腳位設定為低電位

  }


}

主題可變電阻調控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不會亮

}

主題四、聲與光、蜂鳴器與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

}

主題LCD 1602顯示模組

#include <Wire.h> 

#include <LiquidCrystal_I2C.h>


LiquidCrystal_I2C lcd(0x27,16,2);  //0x27 是一個常見的預設地址

                                                       //20:LCD 的行數,表示液晶顯示器每列可有多少字。

                                                       //2 :LCD 的列數,表示可以顯示多少列。


void setup()

{

  lcd.init();            //初始化 LCD                  

  lcd.backlight();       //打開 LCD 的背光

  lcd.setCursor(0,0);    //游標被設定在第一列的第一個位置,也就是左上角

  lcd.print("Hi ESP32"); //LCD 上顯示了這段文字


}

void loop()

{

}

主題溫溼度偵測與顯示

#include <DHT.h>                //DHT simple 程式庫

#include <Wire.h>               // 匯入 I2C 通訊的函式庫

#include <LiquidCrystal_I2C.h>  // 匯入 I2C LCD 的函式庫


DHT dht11(4, DHT11);

LiquidCrystal_I2C lcd(0x27, 16,2);  // 使用 LiquidCrystal_I2C 類別建立一個 lcd 物件,I2C 位址為 0x27,LCD 尺寸為 16x2


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-1ESP32連接WiFi

#include <WiFi.h>

#include <LiquidCrystal_I2C.h>

#include <Wire.h>  


LiquidCrystal_I2C lcd(0x27, 16,2);  // 使用 LiquidCrystal_I2C 類別建立一個 lcd 物件,I2C 位址為 0x27,LCD 尺寸為 16x2


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-2ESP32網頁調控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, 16,2);


void setup() {

  // 啟動串口通信

  Serial.begin(115200);

  // 初始化 LCD

  lcd.init();

  // 打開 LCD 背光

  lcd.backlight();


  // 設定 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-3ESP32+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-4ESP32+溫度過高警示+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, 16,2);  // 使用 LiquidCrystal_I2C 類別建立一個 lcd 物件,I2C 位址為通常為0x20~ 0x27或是0x3F,LCD 尺寸為 16x2


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 = "0966856720";


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

}