แสดง DHT11 บน OLED
N32G031_OLED_DHT11
บทนำ (Introduction)
ระบบตรวจสอบอุณหภูมิและความชื้นแบบเรียลไทม์ที่แสดงผลข้อมูลบนหน้าจอ OLED โดยใช้ไมโครคอนโทรลเลอร์ N32G031 และเซนเซอร์ DHT11 โปรเจกต์นี้ได้รับการปรับแต่งอย่างเต็มที่สำหรับเวิร์กโฟลว์ข้ามแพลตฟอร์มโดยใช้ UnityMbed
Nations N32G031 Cortex-M0
OLED I2C (PB6: SCL, PB7: SDA)
DHT11 1-Wire Single Bus (PA5)
วิดีโอสาธิตการทำงาน
การต่อวงจร
ต่อขาของเซนเซอร์ DHT11 และหน้าจอ OLED (I2C) เข้ากับบอร์ดพัฒนา N32G031 ตามตารางด้านล่าง:
| อุปกรณ์ (Device) | ขาอุปกรณ์ (Pin) | ขาบอร์ด N32G031 | หมายเหตุ & คำแนะนำ |
|---|---|---|---|
| DHT11 | DATA / OUT | PA5 | ต้องใช้ตัวต้านทาน Pull-up 4.7kΩ–10kΩ (หากโมดูลยังไม่มีในตัว) |
| DHT11 | VCC | 3.3V / 5V | ตรวจสอบพิกัดแรงดันไฟของเซนเซอร์ |
| DHT11 | GND | GND | กราวด์ร่วมของระบบ |
| OLED (I2C) | SCL | PB6 | สัญญาณนาฬิกา I2C Clock |
| OLED (I2C) | SDA | PB7 | สายข้อมูล I2C Data |
| OLED (I2C) | VCC | 3.3V | แหล่งจ่ายไฟสำหรับหน้าจอแสดงผล |
| OLED (I2C) | GND | GND | กราวด์ร่วมของระบบ |
การทำงาน & ลอจิกการทำงาน (Behaviour & Execution Logic)
รูปแบบข้อความและการแสดงผลบนหน้าจอ (Screen Prompts & Output)
หน้าจอเริ่มต้น (Boot Screen)
เมื่อเริ่มต้นระบบ หน้าจอจะแสดงข้อความต้อนรับเป็นเวลา 1.5 วินาที
System Ready
การทำงานปกติ (Normal Operation)
ระบบจะอัปเดตตัวเลขเฉพาะเมื่อค่ามีการเปลี่ยนแปลง เพื่อป้องกันหน้าจอกะพริบ (Flicker-free)
Temp: 28 °C
Humidity: 65 %
สถานะเกิดข้อผิดพลาด (Error State)
หากเซนเซอร์ DHT11 หลุดหรือเสียหาย ระบบจะเคลียร์หน้าจอและแสดงข้อความแจ้งเตือน
Sensor Error!
Check Wiring.
#include "n32g031.h"
#include "n32g031_gpio.h"
#include "n32g031_rcc.h"
#include "core_cm0.h"
#include "dht11.h"
#include "oled.h"
#include "utils.h"
#include <stdio.h>
int main(void)
{
uint8_t current_temp = 0;
uint8_t current_humi = 0;
uint8_t last_temp = 255;
uint8_t last_humi = 255;
uint8_t was_error = 1;
// 1. เพิ่มตัวแปรนับจำนวนครั้งที่อ่านพลาด
uint8_t error_count = 0;
char buffer[20];
SystemInit();
SystemCoreClockUpdate();
delay_ms(500);
OLED_Init();
OLED_Clear();
DHT11_Init();
OLED_ShowString(10, 24, "System Ready", 16);
delay_ms(1500);
OLED_Clear();
while (1)
{
if (DHT11_Read_Data(¤t_temp, ¤t_humi) == 1)
{
// 2. ถ้าอ่านสำเร็จ ให้รีเซ็ตตัวนับ Error กลับเป็น 0 ทันที
error_count = 0;
if (was_error) {
OLED_Clear();
OLED_ShowString(0, 0, "Temp: ", 8);
OLED_ShowString(0, 32, "Humidity: ", 8);
was_error = 0;
last_temp = 255;
last_humi = 255;
}
if (current_temp != last_temp) {
sprintf(buffer, "%02d C ", current_temp);
OLED_ShowString(0, 12, buffer, 16);
OLED_ShowString(24, 12, "o", 8);
last_temp = current_temp;
}
if (current_humi != last_humi) {
sprintf(buffer, "%02d %% ", current_humi);
OLED_ShowString(0, 44, buffer, 16);
last_humi = current_humi;
}
}
else
{
// 3. ถ้าอ่านพลาด ให้นับสะสมไป 1
error_count++;
// 4. ถ้าพลาดติดกัน 3 ครั้งขึ้นไป (สายหลุดจริงๆ) ค่อยเคลียร์จอโชว์ Error
if (error_count >= 3) {
if (!was_error) {
OLED_Clear();
was_error = 1;
}
OLED_ShowString(0, 0, "Sensor Error! ", 16);
OLED_ShowString(0, 24, "Check Wiring. ", 16);
}
}
delay_ms(2000);
}
}ไอเดียการเรียนรู้ & ต่อยอดด้วย AI
จากการวิเคราะห์สถาปัตยกรรมโค้ดและโครงสร้างตัวแปร (เช่น error_count, last_temp, last_humi) ผู้เรียนสามารถต่อยอดร่วมกับ UnityMbed AI Copilot ได้ดังนี้:
ดัชนีความสบาย (Heat Index & Comfort Level)
เริ่มต้นโปรเจกต์ด้วยการให้ AI ช่วยวางโครงสร้างโค้ด (main.c) สำหรับไมโครคอนโทรลเลอร์ N32G031 โดยใช้ Standard Peripheral Library (SPL) เพื่ออ่านค่าเซ็นเซอร์ DHT11 และแสดงผลบนจอ OLED (128x32) พร้อมประยุกต์ใช้เงื่อนไข if-else เพื่อประเมินระดับความสบายของสภาพแวดล้อม (เช่น Warning, Hot, Cool, Comfort) รวมถึงฝึกควบคุม LED พื้นฐานด้วย Direct Register
ระบบบันทึกสถิติอุณหภูมิสูงสุด (Max) และต่ำสุด (Min)
ให้ AI ช่วยเขียนลอจิกเก็บข้อมูลสถิติลงในตัวแปร Global และอัปเดตค่าทุกครั้งที่อ่านเซ็นเซอร์สำเร็จ พร้อมจัดระเบียบการแสดงผลบนจอ OLED เพื่อให้แสดงค่าอุณหภูมิปัจจุบันและค่าสถิติแบบเรียลไทม์
ระบบแจ้งเตือนไฟกระพริบแบบ Non-blocking ด้วย Direct Register
เรียนรู้การสั่งงาน Hardware ระดับล่างโดยให้ AI ช่วยเขียนโค้ดตั้งค่า GPIO ผ่าน Direct Register (ไม่พึ่งพาไลบรารี HAL) และสร้างระบบไฟแจ้งเตือนเมื่ออุณหภูมิเกินกำหนดหรือเซ็นเซอร์เกิด Error โดยใช้เทคนิคการนับรอบ (Loop Counter) แทนการใช้ delay() เพื่อไม่ให้การทำงานส่วนอื่นของระบบถูกบล็อก
กราฟเส้นคู่แบบเรียลไทม์ (Mini Oscilloscope)
ให้ AI ช่วยสร้าง Framebuffer และเขียนอัลกอริทึมวาดกราฟเส้นคู่ (Bresenham's Line) แบบเลื่อนอัตโนมัติ สำหรับเปรียบเทียบอุณหภูมิและความชื้น พร้อมสร้างเส้นกริดตารางพื้นหลังเพื่อเปลี่ยนจอ OLED ให้กลายเป็นมินิออสซิลโลสโคป
คู่มือการ Build และ Flash
เปิดโปรเจกต์ (Open Project): เปิดโฟลเดอร์โปรเจกต์นี้ใน IDE โดยตรง
Build & Flash: เพียงคลิกปุ่ม Build และ Flash บนแถบเครื่องมือของอินเทอร์เฟซ