#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);
#define BUZZER_PIN 9 // ขาที่เชื่อมต่อกับ buzzer
bool randomMode = true; // ตั้งค่าเริ่มต้นสำหรับการเปิดใช้งานการสุ่ม (1 = เปิด, 0 = ปิด)
int loadingDuration = 100; // ตั้งค่าเริ่มต้นสำหรับเวลาของแถบโหลด (มิลลิวินาที)
int randomLoadingDuration = 150; // เวลาสำหรับหน่วงแบบสุ่ม (มิลลิวินาที)
void setup() {
// เริ่มต้นหน้าจอ SSD1306
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay();
display.display();
randomSeed(analogRead(0)); // ตั้งค่า seed สำหรับฟังก์ชัน random
}
void setRandomMode(bool mode) {
randomMode = mode;
}
void setLoadingDuration(int duration) {
loadingDuration = duration; // กำหนดเวลาสำหรับ loading animation bar แบบคงที่
}
void setRandomLoadingDuration(int duration) {
randomLoadingDuration = duration; // กำหนดเวลาสำหรับ loading animation bar เมื่อเปิดการสุ่ม
}
void loop() {
setRandomMode(0); // ใส่ค่า 1 เพื่อเปิดการสุ่ม หรือ 0 เพื่อปิดการสุ่ม
setLoadingDuration(25); // ตั้งค่าระยะเวลาการโหลดแบบคงที่ (มิลลิวินาที)
setRandomLoadingDuration(25); // ตั้งค่าระยะเวลาการโหลดเมื่อสุ่ม (มิลลิวินาที)
// วาดแถบการโหลดพร้อมเสียง buzzer
for (int i = 0; i <= 100; i++) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 20);
display.print("Loading: ");
display.print(i);
display.print("%");
// วาดแถบโหลด
int barWidth = map(i, 0, 100, 0, 100);
display.drawRect(10, 40, 100, 10, SSD1306_WHITE); // กรอบแถบโหลด
display.fillRect(10, 40, barWidth, 10, SSD1306_WHITE); // แถบโหลดที่ถูกเติม
display.display();
// กำหนดความถี่ของ buzzer ตามความคืบหน้า
int frequency = map(i, 0, 100, 18000, 20000); // เปลี่ยนความถี่จาก 18000 Hz ไป 20000 Hz
if (randomMode) {
// ถ้าเปิดการสุ่ม ใช้ความถี่แบบสุ่มในช่วง 18000-20000 Hz
frequency = random(18000, 20000);
}
tone(BUZZER_PIN, frequency, 50); // เล่นเสียงที่กำหนดเป็นเวลา 50 มิลลิวินาที
// หน่วงเวลาการอัพเดต
int delayTime = loadingDuration; // ใช้ค่าหน่วงเวลาตามที่กำหนด
if (randomMode) {
// ถ้าเปิดการสุ่ม ใช้ค่าหน่วงเวลาแบบสุ่มที่กำหนด
delayTime = randomLoadingDuration;
}
delay(delayTime);
}
noTone(BUZZER_PIN); // หยุดเสียงหลังจากแถบการโหลดเสร็จสิ้น
delay(2000); // หน่วงเวลา 2 วินาทีก่อนแสดงข้อความ
// แสดงข้อความ Loading และ Complete ตรงกลางหน้าจอและกระพริบ 3 ครั้ง พร้อมเสียง
for (int j = 0; j < 3; j++) {
display.clearDisplay();
display.setTextSize(2); // ขนาดข้อความใหญ่ขึ้น
display.setTextColor(SSD1306_WHITE);
// คำนวณตำแหน่งข้อความ Loading ให้อยู่ตรงกลาง
int16_t x1, y1;
uint16_t w, h;
display.getTextBounds("Loading", 0, 0, &x1, &y1, &w, &h);
display.setCursor((SCREEN_WIDTH - w) / 2, 10);
display.print("Loading");
// คำนวณตำแหน่งข้อความ Complete ให้อยู่ตรงกลาง
display.getTextBounds("Complete", 0, 0, &x1, &y1, &w, &h);
display.setCursor((SCREEN_WIDTH - w) / 2, 34);
display.print("Complete");
display.display();
// เล่นเสียงที่ความถี่ 15000 Hz
tone(BUZZER_PIN, 15000, 500); // เล่นเสียงเป็นเวลา 500 มิลลิวินาที
delay(500); // แสดงข้อความ
display.clearDisplay();
display.display();
delay(500); // ซ่อนข้อความ
}
// ครั้งที่ 4 แสดงข้อความและเล่นเสียงยาว 3 วินาที
display.clearDisplay();
display.setTextSize(2); // ขนาดข้อความใหญ่ขึ้น
display.setTextColor(SSD1306_WHITE);
// คำนวณตำแหน่งข้อความ Loading ให้อยู่ตรงกลาง
int16_t x1, y1;
uint16_t w, h;
display.getTextBounds("Loading", 0, 0, &x1, &y1, &w, &h);
display.setCursor((SCREEN_WIDTH - w) / 2, 10);
display.print("Loading");
// คำนวณตำแหน่งข้อความ Complete ให้อยู่ตรงกลาง
display.getTextBounds("Complete", 0, 0, &x1, &y1, &w, &h);
display.setCursor((SCREEN_WIDTH - w) / 2, 34);
display.print("Complete");
display.display();
// เล่นเสียงที่ความถี่ 15000 Hz ยาว 3 วินาที
tone(BUZZER_PIN, 15000, 3000);
delay(3000); // แสดงข้อความและเสียงยาว 3 วินาที
noTone(BUZZER_PIN); // หยุดเสียง
delay(3000); // ค้างหน้าจอแสดงผล "Loading Complete" 3 วินาที
}