การแสดงผลในรูปแบบมิเตอร์ จอ OLED ขนาดเล็ก 128×64 พิกเซล

จอ OLED สร้างหน้าปัดมิเตอร์ ด้วย ESP32

ในการพัฒนาโปรเจ็กต์ที่เกี่ยวกับการแสดงผลข้อมูลแบบเรียลไทม์ เช่น ค่าเซนเซอร์ต่าง ๆ ที่ต้องการแสดงผลในรูปแบบมิเตอร์ จอ OLED ขนาดเล็ก 128x64 พิกเซลเป็นทางเลือกที่ดี เนื่องจากมีความคมชัด ประหยัดพลังงาน และสามารถแสดงผลข้อมูลที่ต้องการได้หลากหลาย ในบทความนี้ เราจะใช้จอ OLED ขนาด 128x64 แบบ I2C ร่วมกับไมโครคอนโทรลเลอร์ ESP32 เพื่อสร้างหน้าปัดมิเตอร์แบบครึ่งวงกลมที่แสดงค่า 0 ถึง 180 องศา โดยมีสเกลและตัวเลขที่อ่านค่าได้ง่าย

อุปกรณ์ที่ใช้

  1. ESP32 Board
  2. จอ OLED ขนาด 0.96 นิ้ว ความละเอียด 128x64 พิกเซล (I2C)
  3. ตัวต้านทานแบบปรับค่า 10k ohm
  4. สายจัมเปอร์

การต่อวงจรไฟฟ้า

  1. ต่อพินจอ 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 ก่อนใช้งานเสมอการแสดงผลในรูปแบบมิเตอร์ จอ OLED ขนาดเล็ก 128×64 พิกเซล

/*
 * โค้ดตัวอย่างนี 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

  1. การตั้งค่าเบื้องต้น:
    • โหลดไลบรารี Adafruit_GFX และ Adafruit_SSD1306 ที่ใช้ในการควบคุมจอ OLED
    • กำหนดขนาดหน้าจอ OLED ที่ 128x64 พิกเซล
    • ในฟังก์ชัน setup() ทำการเริ่มต้นการทำงานของจอ OLED และตรวจสอบการเชื่อมต่อ
  2. การวาดมิเตอร์และเข็มแสดงค่า:
    • ในฟังก์ชัน drawMeter(int value), วาดหน้าปัดวงกลมที่มีเส้นหนาโดยวาดวงกลมซ้อนกันหลายวง จากนั้นวาดจุดศูนย์กลางของหน้าปัด
    • คำนวณมุมของเข็มโดยใช้ map() เพื่อปรับค่ามิเตอร์ให้ตรงกับมุมที่กำหนดไว้
    • ใช้ฟังก์ชัน drawLine() เพื่อวาดเข็มที่ชี้ไปยังตำแหน่งที่สอดคล้องกับค่ามิเตอร์
  3. การแสดงสเกลตัวเลข:
    • วาดตัวเลขสเกลที่ตำแหน่ง 0, 30, 90, 120, 150 และ 180 องศา รวมถึงวาดขีดสเกลย่อยทุก 15 องศา โดยคำนวณตำแหน่งของขีดสเกลย่อยตามมุม
  4. การอ่านค่าและแสดงผล:
    • อ่านค่าจากพินแอนะล็อกและแปลงเป็นค่าที่ต้องการสำหรับแสดงผล
    • อัปเดตจอภาพในทุก ๆ รอบการทำงานของ loop() เพื่อล้างจอและแสดงผลใหม่

สรุป

บทความนี้แสดงถึงการใช้ ESP32 ร่วมกับจอ OLED ขนาด 128x64 เพื่อสร้างหน้าปัดมิเตอร์แบบครึ่งวงกลมที่สามารถแสดงค่าแบบเรียลไทม์ได้ โดยใช้ฟังก์ชันของไลบรารี Adafruit_GFX และ Adafruit_SSD1306 รวมถึงการคำนวณตำแหน่งขีดสเกลและเข็มอย่างละเอียด หวังว่าโค้ดตัวอย่างและคำอธิบายในบทความนี้จะช่วยให้คุณสามารถสร้างหน้าปัดมิเตอร์ที่สามารถนำไปใช้งานในโปรเจ็กต์ได้เรียนรู้เพิ่มเติมเกี่ยวกับ ESP32:
  1. ESPAsyncWebServer – สร้างหน้าเพจ Wi-Fi Manager เรียนรู้วิธีการสร้างหน้าเพจ Wi-Fi Manager ด้วยไลบรารี ESPAsyncWebServer เพื่อให้สามารถเชื่อมต่อและตั้งค่าการเชื่อมต่อ Wi-Fi ของ ESP32 ได้อย่างง่ายดาย
  2. ESPAsyncWebServer – สร้างเว็บเพจแผนภูมิแสดงค่าเซนเซอร์ ค้นพบวิธีการสร้างเว็บเพจที่แสดงแผนภูมิค่าที่อ่านจากเซนเซอร์ โดยใช้ ESPAsyncWebServer สำหรับการตรวจสอบและวิเคราะห์ข้อมูลในเวลาจริง
  3. ESP32 Web Server – ควบคุมดิจิตอลเอาพุต เรียนรู้การสร้างเว็บเซิร์ฟเวอร์บน ESP32 เพื่อควบคุมดิจิตอลเอาพุต เช่น การเปิดและปิด LED ผ่านเว็บเบราว์เซอร์
  4. การใช้งาน LiquidCrystal_I2C กับ ESP32 คำแนะนำเกี่ยวกับการใช้งานไลบรารี LiquidCrystal_I2C บน ESP32 เพื่อควบคุมจอ LCD 16x2 รวมถึงการตั้งค่าและการเขียนข้อมูลลงบนจอ LCD
  5. ESP32 WiFi การเริ่มต้นใช้งาน ESP32 WiFi ค่อนข้างง่ายและสะดวกโดยใช้ Arduino IDE ซึ่งเป็นเครื่องมือที่ได้รับความนิยมในการพัฒนาโปรแกรมสำหรับไมโครคอนโทรลเลอร์ต่างๆ
Shopping Cart
Scroll to Top