前言:
這個課程是針對資訊科單晶片程式設計有興趣的學生而建置的自學網站,
對於有心在晶片程式設計與參加工業電子全國技能競賽或工科技藝競賽的同學提供學習指引。
學習路徑:
Arduino UNO 程式設計
C語言程式設計::ESP32程式設計::STM32程式設計
目錄
準備工作:
啟動Google Chrome:右上角登入電子郵件。
Google Chrome瀏覽器帳號登入同步與刪除說明:這樣你登入ChatGPT、Gemini...登入上課用軟體就方便多了。
安全說明:使用別人的電腦別再登出Chrome瀏覽器?請注意自己帳號的安全,共用電腦或公共電腦使用之後請記得登出。
ChatGPT:就是OPEN AI的人工智慧對話軟體,詢問簡單的問題可以用免費版就好。註冊、登入。
Gemini:Google 的AI人工智慧對話軟體。註冊、登入。
Perplexity:是一個即時整合多種 AI 模型與網絡的智能搜尋引擎
NotebookLM AI:Google 的AI資料整理。註冊、登入。
Gamma :投影片生成軟體用這個聯結推薦+200點AI點
雅婷逐字稿 :語音轉文字的軟體。
GPT4o:就是chatGPT4o。註冊、登入。
Github:放置程式與版本變遷的管理系統
我的Github網頁:範例程式指引(建置中)
下載並安裝codeblocks-25.03mingw-setup.exe Sourceforge.net
學習的目的:資訊科考科、學習C#、晶片程式設計...等基礎
自我挑戰:
高中生程式解題系統 :挑戰自己的能力並且有模擬試題
電腦軟體設計丙級檢定:勞動部證照
APCS測驗:升學特招
資安攻防戰CTF:升學特招
------------------------------------------------
入門課程推薦
連鴨子都看得懂的C語言入門講義 :先看這篇入門
劉和師的C語言入門 :先看這篇入門
C語言程式設計講義 :先看這篇入門
C 語言入門 :先看這篇入門
線上輔助學習資源:
進階課程:
資料結構
演算法
CodeBlocks操作環境介紹:黃建庭的教學網站,目前任教於臺北市立中山女子高級中學
=============================================
ARM系列: STM32
專業電路硬體知識:
CPU、MPU、數位邏輯、電子學、基本電學
軟體程式能力:以C語言為主。
=============================================
使用套件 keysking開發板實習套件相關文件與範例
準備工作:
下載STM32CubeIDE-->解壓縮 --> 安裝
下載STM32MAX-->解壓縮 --> 安裝
波特律动文档站:學習資源網站,說明文字,自學教材。
波特律动GitHub站:YT說明的程式範例
【keysking的stm32教程】:YouTube影片教材原廠課程。
STM32CubeIDE创建基于CubeMX (.ioc)工程文件经验分享
=============================================
準備工作:
準備:
進入教學網站:www.myiot.idv.tw
登入Google 帳號
登入 ChatGPT 網址:https://chatgpt.com/ 或
Gemini 網址:https://gemini.google.com/app
啟動Arduino IDE,或下載後安裝 網址:https://www.arduino.cc/
連接上 Arduino 開發板,確認 板子型號(ARDUINO UNO)與序列埠(不使用COM1、COM2)。
文件:
ESP32C3 悟空板 ESP32-C3 MiNi开发板 晶片使用ESP32-C3FN4晶片:技術資料
Arduino UNO 開發板設定為 Adafruit QT Py ESP32-C3
開發板來源 :
https://arduino.me/packages/esp32.json
https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json
https://raw.githubusercontent.com/digistump/arduino-boards-index/master/package_digistump_index.json
WS2812 程式庫:Adafruit NeoPixel 、Adafruit NeoMatrix 、Adafruit GFX Library By Adafruit、FastLED By Daniel Carcia
按鈕button: GPIO09
WS2812LED:GPIO08,一顆
自己設計外加環形WS2812LED:PIO10
ESP32C3 ABrobot板 ESP32-C3 MiNi OLED开发板 晶片使用ESP32-C3FN4晶片:技術資料
按鈕button: GPIO09
藍色LED:GPIO08
OLED:SDA GPIO05、SCL GPIO06
微雪 ESP32开发板 ESP32-S3FH4R2 带8X8LED矩阵 wifi蓝牙:技術資料、範例程式
控制板 esp32s3 ,选择 ESP32S3 Dev Module
程式庫:安装 SensorLib By Lews He 用于 QMI8658
WS2812 程式庫:Adafruit NeoPixel 、Adafruit NeoMatrix 、Adafruit GFX Library By Adafruit、FastLED By Daniel Carcia
WS2812 RGB矩阵控制接脚:GPIO14
按鈕button: GPIO0
QMI8658C:SDA GPIO11、SCL GPIO12、INT1 GPIO10、INT1 GPIO13
波特律动GitHub站:YT說明的程式範例
【keysking的stm32教程】:YouTube影片教材原廠課程。
--------------------------------------------------------------------------------------------------------------------
野火的影片課程:影片課程
--------------------------------------------------------------------------------------------------------------------
STM32 HAL库教程:正點原子的課程影片
---------------------------------------------------------------------------------------------------------------------
STM32F4教學 :成大教學資料,含GPIO、Git、數位示波器...
資料手冊datasheet閱讀
文字
影片
Wokwi 線上模擬軟體 :英文為主,零件眾多。
電路模擬軟體 https://www.falstad.com/circuit/circuitjs.html:它使用電路圖繪製加上示波器來顯示電路模擬狀況。
ARM網站
STM網站:STM32L053R8,註冊
STM32Cube:微雪電子講義
使用STM32CubeMX與Keil開發環境:目前個人建議可以用STM32CubeMX即可
影片
【keysking的stm32教程】:實驗室發給的教學版,原廠課程。
BaudDance:原廠文件
STM32F4教學 :交大線上遠距上課實況。
第1集 STM32视频整体介绍:刘凯老师STM32培训视频
STM32Cube高效开发教程:@Kevin_WWW获《STM32Cube高效开发教程》作者王维波老师与出版社录制视频授权。
麥格羅希爾出版的「揭秘系列」 https://theswissbay.ch/pdf/Gentoomen Library/Misc/Demystified Series/
其中的
McGraw-Hill - Digital Electronics Demystified
McGraw-Hill - Electricity Demystified
McGraw-Hill - Electronics Demystified
第1題:
電源開始(或按下Reset後),LED呈現紅綠交互閃爍,間隔1秒。
按下KEY1後,LED以紅綠藍順序交互閃爍,間隔1秒。
按下KEY2後,LED以藍綠紅順序交互閃爍,間隔1秒。
PW ON: R -> G 間隔1秒
KEY1: R -> G -> B 間隔1秒
KEY2: R <- G <- B 間隔1秒
動作異常原因:
1. 輸入端沒有設定pull up電阻
2. 測試==1 要改成==0
================================================
第2題:
電源開始(或按下Reset後),LED呈現橘色與紫色交互閃爍,間隔2秒。
按下KEY1後,綠色LED立刻以間隔2秒週期亮滅。
按下KEY2後,藍色LED立刻以間隔3秒週期亮滅。
PW ON:橘色 -> 紫色 間隔2秒
KEY1: G -> OFF 間隔2秒 (可以立刻反應)
KEY2: B -> OFF 間隔3秒 (可以立刻反應)
================================================
第3題:
電源開始(或按下Reset後),LED呈現紅藍交互閃爍亮度50%,間隔2秒。
按下KEY1,立刻降低綠色LED亮度,100% -> 70% -> 50% -> 25% ->0%
按下KEY2,立刻提高綠色LED亮度,100% <- 70% <- 50% <- 25% <-0%
PW ON:R -> B 間隔2秒
KEY1:綠色亮度降低 (可以立刻反應)
KEY2:綠色亮度提高 (可以立刻反應)
研習資料 :2024-11-10台中高工INA3221
The Ultimate Multi Power Module - Part 1
The Ultimate Multi Power Module - Part 2
The INA3221 Breakout Board 模組資料
Tougher INA3221 Power Monitor 電源監控用
Basic library for controlling all features of the INA3221. ARM .h的參考檔
INA3221, weird wiring 輸入端電阻連接方式
INA3221 3-Channel DC Current Sensor
ADXL345硬體I2C讀寫範例(標準庫、HAL庫) I2C的寫作
How to properly write and read a 16 bit I2C register with HAL_I2C_Mem_Write/Read()?
STM32G030F6P6基于HAL库硬件IIC驱动1.54寸OLED屏幕 ST論壇
購物網站資料:AliExpress
The INA3221 Breakout Board 用Raspberry Pi 的例子
参考译文] INA3221:仅感测电压跟进 INA3221電壓量測
Arduino- RFID(RC522) 與 MIFARE:兩者比較
Arduino RFID教學:RC522完整指南,包含程式碼和項目
MFRC522v2:這個程式庫
The PN532 NFC RFID Module 與Arduino 連接:有I2C與ISP連線
訓練題目:
2026-02-2 :
請使用指定的類比元件,設計一個具備「邏輯辨識」能力的燈光控制電路。電路必須根據按下的按鈕編號,點亮對應數量的 LED。
輸入元件: 按鈕開關 (SW) $\times 3$、電阻若干、直流電源。
處理元件: 運算放大器 (Op-Amp) 若干(型號不限,如 LM324 或 TL084)。
輸出元件: LED $\times 3$。
運作邏輯:
按下 SW1: LED1 亮;其餘熄滅。
按下 SW2: LED1、LED2 亮;其餘熄滅。
按下 SW3: LED1、LED2、LED3 全亮。
放開按鈕: 所有 LED 立即熄滅。
註:若考生設計為「互鎖」或「優先權」邏輯亦可接受,但須符合上述數量對應。
我建議將評分分為 理論設計、邏輯正確性 與 工程細節 三個維度:
A. 電路構想與原理說明 (30%)
關鍵點: 是否正確選擇 Op-Amp 的運作模式(比較器、加法器或電壓隨耦器)。
評分:
能繪製正確的方塊圖並解釋電壓分配原理 (20%)。
正確計算出各階層的參考電壓 (Vref) (10%)。
B. 電路圖完整度 (40%)
關鍵點: 電路是否能真實運作。
評分:
分壓網路: 是否設計了合理的電阻分壓來區分三個按鈕的狀態 (15%)。
比較器電路: 運算放大器的正負輸入端連接邏輯是否正確 (15%)。
輸出驅動: LED 是否有加上限流電阻,避免元件燒毀 (10%)。
C. 工程細節與防錯設計 (30%)
關鍵點: 展現「資深」或「細心」程度。
評分:
遲滯電壓(Hysteresis): 是否考慮到按鈕彈跳或電壓不穩,加入正回授設計(雖然此題為簡易開關,但有此考量者加分) (10%)。
輸入端狀態: 是否有設計下拉或上拉電阻,避免按鈕放開時輸入端處於浮接(Floating)狀態 (10%)。
能源效率: 電阻阻值選擇是否合理(不至於太小導致功耗過大,也不至於太大導致雜訊干擾) (10%)。
解法一(電壓階梯):
三個開關分別接在不同的電阻分壓點上。按下不同按鈕時,產生 V{in} 為 1V, 2V, 3V。後端使用三個運算放大器作為比較器,基準電壓分別設為 0.5V, 1.5V, 2.5V。
解法二(優先權邏輯): 雖然題目沒規定,但優秀的工程師可能會考慮到「同時按下兩個按鈕」的情況。
訓練題目:
2026-01-27 :連結
在設計電路前,學生須理解其實際運作功能:
參與者輸入:共有 3 名參賽者,每人前方有一個按鈕(S1, S2, S3)。
主持人控制:主持人擁有一個清除/重置按鈕(Reset)。
搶答鎖定(核心功能):
當第一位參賽者按下按鈕時,對應的指示燈(L1, L2 或 L3)應立即發光。
互鎖機制:一旦有人搶答成功,電路必須自動封鎖其他兩人的輸入。即使後續有人按下按鈕,指示燈也不會有反應。
狀態保持:指示燈在按鈕放開後必須維持發光狀態(需要記憶功能)。
重置功能:只有當主持人按下 Reset 按鈕後,發光的指示燈才會熄滅,系統重新回到待命狀態,準備下一輪搶答。
2026-01-25:連結
【測驗編號:DL-2026-02】
【測驗時間:100 分鐘】
一、 測驗目標
本測驗旨在評估學生整合時脈產生電路、組合邏輯控制閘以及序向邏輯計數系統的能力。學生須獨立完成從訊號產生、邏輯判斷到終端顯示的完整電路設計。
二、 任務說明與功能需求
請利用實驗室提供之邏輯元件(如 555 定時器、基本邏輯閘、計數器 IC、解碼器 IC 等)完成以下電路功能:
時脈產生單元 (1Hz Pulse Generation)
設計一個穩態多諧振盪器(Astable Multivibrator),產生頻率為 $1\text{Hz}$ 的方波脈波(Pulse)。
脈波輸出應穩定,作為後續計數單元的時脈來源。
控制閘與指示單元 (Gating & Indicator)
使用一個指撥開關或按鈕,搭配基本邏輯閘(AND, OR, NOT, NAND 或 NOR)設計控制電路。
控制邏輯:當開關切換至「接地(Logic 0)」狀態時,允許 1Hz 脈波通過至計數單元。
視覺回饋:當脈波通過時,電路中的一顆 LED 燈必須隨脈波同步閃爍;當開關為高電位(Logic 1)時,脈波應被封鎖,LED 熄滅或恆亮(依設計規格而定)。
計數與顯示單元 (0-9 Counter & Display)
將通過控制閘的脈波送入十進位計數器。
使用七段顯示器解碼器驅動七段顯示器,正確顯示 $0$ 至 $9$ 的循環計數。
計數器需在接收到第 10 個脈波時自動歸零,並重新由 0 開始計數。
三、 評分標準
電路正確性 (60%):各單元功能是否符合描述,接線是否確實。
設計效率 (20%):是否使用最精簡的元件達成控制邏輯。
訊號穩定度 (10%):脈波頻率是否準確,顯示器是否有跳碼現象。
實驗紀錄與說明 (10%):繪製正確的邏輯圖與接線圖。
#include <WiFi.h>
#include <WiFiUdp.h>
// 網路設定
const char* ssid = "您的WiFi名稱";
const char* password = "您的WiFi密碼";
// UDP 設定
WiFiUDP udp;
unsigned int localUdpPort = 4210; // 監聽的埠號
char incomingPacket[255]; // 接收緩衝區
void setup() {
Serial.begin(115200);
// 連接 WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi 已連接");
Serial.print("ESP32-C3 IP 位址: ");
Serial.println(WiFi.localIP()); // 請記下這個 IP,填入 Processing 中
// 開始監聽 UDP
udp.begin(localUdpPort);
}
void loop() {
int packetSize = udp.parsePacket();
if (packetSize) {
// 讀取封包
int len = udp.read(incomingPacket, 255);
if (len > 0) {
incomingPacket[len] = 0; // 字串結束符
}
Serial.printf("收到來自 %s 的資料: %s\n", udp.remoteIP().toString().c_str(), incomingPacket);
// 簡單邏輯:收到 "1" 開燈,收到 "0" 關燈
if (incomingPacket[0] == '1') {
// digitalWrite(LED_PIN, HIGH);
Serial.println("狀態:開啟");
} else if (incomingPacket[0] == '0') {
// digitalWrite(LED_PIN, LOW);
Serial.println("狀態:關閉");
}
}
}
import hypermedia.net.*;
UDP udp; // 定義 UDP 物件
String ip = "192.168.x.x"; // ***請替換為 ESP32 串口輸出的 IP 位址***
int port = 4210; // 與 ESP32 設定的埠號一致
void setup() {
size(200, 200);
udp = new UDP(this, 6000); // 建立 UDP 物件,6000 為 Processing 本地埠號
// udp.log(true); // 如需除錯可開啟
}
void draw() {
background(0);
fill(255);
text("按 '1' 發送開啟\n按 '0' 發送關閉", 20, 50);
}
void keyPressed() {
if (key == '1') {
udp.send("1", ip, port);
println("已發送: 1");
} else if (key == '0') {
udp.send("0", ip, port);
println("已發送: 0");
}
}
2026-02-02 ESP32 C3 BLE與網頁
部分修改的
/*
整合網頁通訊功能的 BLE Server 範例
支援:讀取 (Read)、寫入 (Write)、以及序列埠顯示
*/
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
// UUID 保持不變,確保網頁端能正確對接
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
const int ledPin = 8; // 定義 LED 接在第 8 腳
// 建立一個類別來處理網頁「寫入」的動作
class MyCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
// 修改這裡:將 std::string 改成 String
String value = pCharacteristic->getValue();
if (value.length() > 0) {
Serial.println("========= 收到網頁訊息 =========");
Serial.print("內容: ");
Serial.println(value); // Arduino 的 String 可以直接 println
Serial.println("================================");
}
// 邏輯判斷:控制 GPIO 8
if (value == "on") {
digitalWrite(ledPin, LOW);
Serial.println("LED 已開啟");
pCharacteristic->setValue("LED 已開啟");
}
else if (value == "off") {
digitalWrite(ledPin, HIGH);
Serial.println("LED 已關閉");
}
}
};
void setup() {
Serial.begin(115200);
Serial.println("Starting BLE work!");
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
// 初始化藍牙裝置名稱
BLEDevice::init("ESP32_Guo_Dong");
// 1. 建立 Server
BLEServer *pServer = BLEDevice::createServer();
// 2. 建立 Service
BLEService *pService = pServer->createService(SERVICE_UUID);
// 3. 建立特徵值 (Characteristic),並賦予讀取與寫入權限
BLECharacteristic *pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE
);
// 4. 【重要】將處理訊息的回呼函式連結到特徵值上
pCharacteristic->setCallbacks(new MyCallbacks());
// 設定初始顯示的值
pCharacteristic->setValue("Hello World says Neil");
// 5. 啟動服務
pService->start();
// 6. 設定廣播
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(SERVICE_UUID);
pAdvertising->setScanResponse(true);
pAdvertising->setMinPreferred(0x06); // 幫助 iOS 連線的優化參數
pAdvertising->setMaxPreferred(0x12);
BLEDevice::startAdvertising();
Serial.println("特徵值已定義!現在您可以透過網頁控制我了。");
}
void loop() {
// loop 保持簡潔,主要的資料處理都在回呼函式中自動完成
delay(2000);
}