>ตัวอย่างใช้งาน>
/N32G031_OLED_DHT11

แสดง 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หมายเหตุ & คำแนะนำ
DHT11DATA / OUTPA5ต้องใช้ตัวต้านทาน Pull-up 4.7kΩ–10kΩ (หากโมดูลยังไม่มีในตัว)
DHT11VCC3.3V / 5Vตรวจสอบพิกัดแรงดันไฟของเซนเซอร์
DHT11GNDGNDกราวด์ร่วมของระบบ
OLED (I2C)SCLPB6สัญญาณนาฬิกา I2C Clock
OLED (I2C)SDAPB7สายข้อมูล I2C Data
OLED (I2C)VCC3.3Vแหล่งจ่ายไฟสำหรับหน้าจอแสดงผล
OLED (I2C)GNDGNDกราวด์ร่วมของระบบ

การทำงาน & ลอจิกการทำงาน (Behaviour & Execution Logic)

รูปแบบข้อความและการแสดงผลบนหน้าจอ (Screen Prompts & Output)

1

หน้าจอเริ่มต้น (Boot Screen)

เมื่อเริ่มต้นระบบ หน้าจอจะแสดงข้อความต้อนรับเป็นเวลา 1.5 วินาที

จอแสดงผล:

System Ready

2

การทำงานปกติ (Normal Operation)

ระบบจะอัปเดตตัวเลขเฉพาะเมื่อค่ามีการเปลี่ยนแปลง เพื่อป้องกันหน้าจอกะพริบ (Flicker-free)

จอแสดงผล:

Temp:    28 °C

Humidity: 65 %

3

สถานะเกิดข้อผิดพลาด (Error State)

หากเซนเซอร์ DHT11 หลุดหรือเสียหาย ระบบจะเคลียร์หน้าจอและแสดงข้อความแจ้งเตือน

จอแสดงผล:

Sensor Error!

Check Wiring.

main.c
#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(&current_temp, &current_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 ได้ดังนี้:

1

ดัชนีความสบาย (Heat Index & Comfort Level)

เริ่มต้นโปรเจกต์ด้วยการให้ AI ช่วยวางโครงสร้างโค้ด (main.c) สำหรับไมโครคอนโทรลเลอร์ N32G031 โดยใช้ Standard Peripheral Library (SPL) เพื่ออ่านค่าเซ็นเซอร์ DHT11 และแสดงผลบนจอ OLED (128x32) พร้อมประยุกต์ใช้เงื่อนไข if-else เพื่อประเมินระดับความสบายของสภาพแวดล้อม (เช่น Warning, Hot, Cool, Comfort) รวมถึงฝึกควบคุม LED พื้นฐานด้วย Direct Register

2

ระบบบันทึกสถิติอุณหภูมิสูงสุด (Max) และต่ำสุด (Min)

ให้ AI ช่วยเขียนลอจิกเก็บข้อมูลสถิติลงในตัวแปร Global และอัปเดตค่าทุกครั้งที่อ่านเซ็นเซอร์สำเร็จ พร้อมจัดระเบียบการแสดงผลบนจอ OLED เพื่อให้แสดงค่าอุณหภูมิปัจจุบันและค่าสถิติแบบเรียลไทม์

3

ระบบแจ้งเตือนไฟกระพริบแบบ Non-blocking ด้วย Direct Register

เรียนรู้การสั่งงาน Hardware ระดับล่างโดยให้ AI ช่วยเขียนโค้ดตั้งค่า GPIO ผ่าน Direct Register (ไม่พึ่งพาไลบรารี HAL) และสร้างระบบไฟแจ้งเตือนเมื่ออุณหภูมิเกินกำหนดหรือเซ็นเซอร์เกิด Error โดยใช้เทคนิคการนับรอบ (Loop Counter) แทนการใช้ delay() เพื่อไม่ให้การทำงานส่วนอื่นของระบบถูกบล็อก

4

กราฟเส้นคู่แบบเรียลไทม์ (Mini Oscilloscope)

ให้ AI ช่วยสร้าง Framebuffer และเขียนอัลกอริทึมวาดกราฟเส้นคู่ (Bresenham's Line) แบบเลื่อนอัตโนมัติ สำหรับเปรียบเทียบอุณหภูมิและความชื้น พร้อมสร้างเส้นกริดตารางพื้นหลังเพื่อเปลี่ยนจอ OLED ให้กลายเป็นมินิออสซิลโลสโคป

คู่มือการ Build และ Flash

1

เปิดโปรเจกต์ (Open Project): เปิดโฟลเดอร์โปรเจกต์นี้ใน IDE โดยตรง

2

Build & Flash: เพียงคลิกปุ่ม Build และ Flash บนแถบเครื่องมือของอินเทอร์เฟซ