#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#if defined(ESP32)
#define ANALOG_PIN 4
#elif defined(ESP8266)
#define ANALOG_PIN A0
#endif
int meterValue = 0;
void setup() {
Serial.begin(9600);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
while (1);
}
display.clearDisplay();
}
void loop() {
#if defined(ESP8266)
meterValue = map(analogRead(ANALOG_PIN), 0, 1023, 0, 180);
#else
meterValue = map(analogRead(ANALOG_PIN), 0, 4095, 0, 180);
#endif
display.clearDisplay();
drawMeter(meterValue);
display.display();
delay(100);
}
void drawMeter(int value) {
int cx = 44, cy = 48;
// วงกลมหน้าปัด
for (int r = 30; r > 28; r--) {
display.drawCircle(cx, cy, r, SSD1306_WHITE);
}
display.fillCircle(cx, cy, 2, SSD1306_WHITE); // จุดกลาง
// ลบครึ่งวงล่าง
display.fillRect(0, 55, 75, 10, SSD1306_BLACK);
drawScale(); // ตัวเลข + ขีดสเกล
// เข็มเรียว
float angle = map(value, 0, 180, -180, 0);
float rad = angle * PI / 180;
int x1 = cx + cos(rad) * 25; // ยาวขึ้น
int y1 = cy + sin(rad) * 25;
display.drawLine(cx, cy, x1, y1, SSD1306_WHITE);
// แสดงค่า Value ขนาดใหญ่
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(90, 11);
display.print("Value:");
display.setCursor(105, 23);
display.print(value);
}
void drawScale() {
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
// ตัวเลขใหญ่ขึ้น
display.setCursor(4, 48); display.print("0");
display.setCursor(3, 28); display.print("30");
display.setCursor(19, 11); display.print("60");
display.setCursor(40, 6); display.print("90");
display.setCursor(62, 11); display.print("120");
display.setCursor(75, 28); display.print("150");
display.setCursor(80, 48); display.print("180");
// ขีดสเกลย่อย
for (int i = 0; i <= 12; i++) {
float angle = map(i * 15, 0, 180, -180, 0);
float rad = angle * PI / 180;
int x_start = 44 + (24 * cos(rad));
int y_start = 48 + (24 * sin(rad));
int x_end = 44 + (26 * cos(rad));
int y_end = 48 + (26 * sin(rad));
display.drawLine(x_start, y_start, x_end, y_end, SSD1306_WHITE);
}
}Loading
ssd1306
ssd1306