ในการพัฒนาโปรเจ็กต์ที่เกี่ยวกับการแสดงผลข้อมูลแบบเรียลไทม์ เช่น ค่าเซนเซอร์ต่าง ๆ ที่ต้องการแสดงผลในรูปแบบมิเตอร์ จอ OLED ขนาดเล็ก 128x64 พิกเซลเป็นทางเลือกที่ดี เนื่องจากมีความคมชัด ประหยัดพลังงาน และสามารถแสดงผลข้อมูลที่ต้องการได้หลากหลาย ในบทความนี้ เราจะใช้จอ OLED ขนาด 128x64 แบบ I2C ร่วมกับไมโครคอนโทรลเลอร์ ESP32 เพื่อสร้างหน้าปัดมิเตอร์แบบครึ่งวงกลมที่แสดงค่า 0 ถึง 180 องศา โดยมีสเกลและตัวเลขที่อ่านค่าได้ง่าย
อุปกรณ์ที่ใช้
- ESP32 Board
- จอ OLED ขนาด 0.96 นิ้ว ความละเอียด 128x64 พิกเซล (I2C)
- ตัวต้านทานแบบปรับค่า 10k ohm
- สายจัมเปอร์
การต่อวงจรไฟฟ้า
- ต่อพินจอ OLED กับ ESP32 ตามการตั้งค่าต่อไปนี้:
- GND (จอ OLED) ต่อกับ GND (ESP32)
- VCC (จอ OLED) ต่อกับ 3.3V (ESP32)
- SCL (จอ OLED) ต่อกับ GPIO 22 (SCL ของ ESP32)
- SDA (จอ OLED) ต่อกับ GPIO 21 (SDA ของ ESP32)
หมายเหตุ: ที่อยู่ I2C ของจอ OLED โดยทั่วไปจะเป็น
0x3C แต่บางรุ่นอาจเป็น
0x3D ตรวจสอบที่อยู่ I2C ก่อนใช้งานเสมอ

/*
* โค้ดตัวอย่างนี Devadiy สร้างขึ้นเพื่อการเรียนรู้และการพัฒนาโครงการอิเล็กทรอนิกส์แบบเปิด (Open Source)
* โดยทุกคนสามารถใช้งานเนื้อหานี้ได้ฟรี เพื่อประโยชน์ส่วนตัวหรือการศึกษา
* ขอบคุณที่สนใจและสนับสนุน www.devadiy.com
*/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // ความกว้างของจอ OLED
#define SCREEN_HEIGHT 64 // ความสูงของจอ OLED
#define OLED_RESET -1 // ไม่มีพินรีเซ็ต
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
int meterValue = 0; // ค่ามิเตอร์
void setup() {
Serial.begin(9600);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // ที่อยู่ I2C ของจอ OLED
Serial.println(F("SSD1306 allocation failed"));
}
display.clearDisplay();
}
void loop() {
// จำลองค่ามิเตอร์จาก 0 ถึง 180
meterValue = analogRead(4) / 22.75; // อ่านค่าและปรับให้อยู่ในช่วง 0-180
display.clearDisplay(); // ล้างหน้าจอก่อนวาดใหม่
drawMeter(meterValue); // วาดหน้าปัดมิเตอร์พร้อมสเกล
display.display(); // แสดงผลบนจอ
delay(100);
}
void drawMeter(int value) {
// วาดวงกลมหน้าปัด
for (int r = 30; r > 28; r--) {
display.drawCircle(44, 48, r, SSD1306_WHITE); // วงกลมหลักสำหรับหน้าปัด
}
display.fillCircle(44, 48, 2, SSD1306_WHITE); // จุดศูนย์กลางของหน้าปัด
display.fillRect(0, 55, 75, 10, SSD1306_BLACK); // วาดแถบทึบลบครึ่งวงกลมด้านล่าง
// วาดสเกล 0, 90, 180
drawScale();
// วาดเข็มตามค่ามิเตอร์
float angle = map(value, 0, 180, -180, 0); // คำนวณมุมของเข็ม
float radian = angle * PI / 180;
// คำนวณตำแหน่งปลายเข็ม
int x1 = 44 + (22 * cos(radian));
int y1 = 48 + (22 * sin(radian));
// วาดเข็ม
display.drawLine(45, 48, x1, y1, SSD1306_WHITE);
// แสดงค่าตัวเลขด้านล่างของหน้าจอ
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(90, 11);
display.print("Value: ");
display.setCursor(105, 23);
display.print(value);
}
void drawScale() {
// สร้างสเกลตัวเลข 0, 30, 60, 90, 120, 150, 180 รอบหน้าปัด
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
// สเกล 0
display.setCursor(4, 48);
display.print("0");
// สเกล 30
display.setCursor(3, 28);
display.print("30");
// สเกล 60
display.setCursor(19, 11);
display.print("60");
// สเกล 90
display.setCursor(40, 6);
display.print("90");
// สเกล 120
display.setCursor(62, 11);
display.print("120");
// สเกล 150
display.setCursor(75, 28);
display.print("150");
// สเกล 180
display.setCursor(80, 48);
display.print("180");
// วาดขีดสเกลย่อยทุกๆ 15 หน่วย
for (int i = 0; i <= 12; i++) { // 180 / 15 = 12 ช่อง
float angle = map(i * 15, 0, 180, -180, 0); // กำหนดมุมของแต่ละสเกลย่อย
float radian = angle * PI / 180;
int x_start = 44 + (24 * cos(radian));
int y_start = 48 + (24 * sin(radian));
int x_end = 44 + (26 * cos(radian));
int y_end = 48 + (26 * sin(radian));
display.drawLine(x_start, y_start, x_end, y_end, SSD1306_WHITE);
}
}
อธิบายโค้ดมิเตอร์บนจอ OLED
- การตั้งค่าเบื้องต้น:
- โหลดไลบรารี
Adafruit_GFX และ Adafruit_SSD1306 ที่ใช้ในการควบคุมจอ OLED - กำหนดขนาดหน้าจอ OLED ที่ 128x64 พิกเซล
- ในฟังก์ชัน
setup() ทำการเริ่มต้นการทำงานของจอ OLED และตรวจสอบการเชื่อมต่อ
- การวาดมิเตอร์และเข็มแสดงค่า:
- ในฟังก์ชัน
drawMeter(int value), วาดหน้าปัดวงกลมที่มีเส้นหนาโดยวาดวงกลมซ้อนกันหลายวง จากนั้นวาดจุดศูนย์กลางของหน้าปัด - คำนวณมุมของเข็มโดยใช้
map() เพื่อปรับค่ามิเตอร์ให้ตรงกับมุมที่กำหนดไว้ - ใช้ฟังก์ชัน
drawLine() เพื่อวาดเข็มที่ชี้ไปยังตำแหน่งที่สอดคล้องกับค่ามิเตอร์
- การแสดงสเกลตัวเลข:
- วาดตัวเลขสเกลที่ตำแหน่ง 0, 30, 90, 120, 150 และ 180 องศา รวมถึงวาดขีดสเกลย่อยทุก 15 องศา โดยคำนวณตำแหน่งของขีดสเกลย่อยตามมุม
- การอ่านค่าและแสดงผล:
- อ่านค่าจากพินแอนะล็อกและแปลงเป็นค่าที่ต้องการสำหรับแสดงผล
- อัปเดตจอภาพในทุก ๆ รอบการทำงานของ
loop() เพื่อล้างจอและแสดงผลใหม่
สรุป
บทความนี้แสดงถึงการใช้ ESP32 ร่วมกับจอ OLED ขนาด 128x64 เพื่อสร้างหน้าปัดมิเตอร์แบบครึ่งวงกลมที่สามารถแสดงค่าแบบเรียลไทม์ได้ โดยใช้ฟังก์ชันของไลบรารี
Adafruit_GFX และ
Adafruit_SSD1306 รวมถึงการคำนวณตำแหน่งขีดสเกลและเข็มอย่างละเอียด หวังว่าโค้ดตัวอย่างและคำอธิบายในบทความนี้จะช่วยให้คุณสามารถสร้างหน้าปัดมิเตอร์ที่สามารถนำไปใช้งานในโปรเจ็กต์ได้
เรียนรู้เพิ่มเติมเกี่ยวกับ ESP32:- ESPAsyncWebServer – สร้างหน้าเพจ Wi-Fi Manager
เรียนรู้วิธีการสร้างหน้าเพจ Wi-Fi Manager ด้วยไลบรารี ESPAsyncWebServer เพื่อให้สามารถเชื่อมต่อและตั้งค่าการเชื่อมต่อ Wi-Fi ของ ESP32 ได้อย่างง่ายดาย
- ESPAsyncWebServer – สร้างเว็บเพจแผนภูมิแสดงค่าเซนเซอร์
ค้นพบวิธีการสร้างเว็บเพจที่แสดงแผนภูมิค่าที่อ่านจากเซนเซอร์ โดยใช้ ESPAsyncWebServer สำหรับการตรวจสอบและวิเคราะห์ข้อมูลในเวลาจริง
- ESP32 Web Server – ควบคุมดิจิตอลเอาพุต
เรียนรู้การสร้างเว็บเซิร์ฟเวอร์บน ESP32 เพื่อควบคุมดิจิตอลเอาพุต เช่น การเปิดและปิด LED ผ่านเว็บเบราว์เซอร์
- การใช้งาน LiquidCrystal_I2C กับ ESP32
คำแนะนำเกี่ยวกับการใช้งานไลบรารี LiquidCrystal_I2C บน ESP32 เพื่อควบคุมจอ LCD 16x2 รวมถึงการตั้งค่าและการเขียนข้อมูลลงบนจอ LCD
- ESP32 WiFi
การเริ่มต้นใช้งาน ESP32 WiFi ค่อนข้างง่ายและสะดวกโดยใช้ Arduino IDE ซึ่งเป็นเครื่องมือที่ได้รับความนิยมในการพัฒนาโปรแกรมสำหรับไมโครคอนโทรลเลอร์ต่างๆ