คำตอบที่ได้รับเลือกจากเจ้าของกระทู้
ความคิดเห็นที่ 1
-ต่อจากข้างบน-
void handleDateTimeMode() {
if (isButtonPressed(pinUP, lastUP)) {
if (step == 6) {
currentMode = MENU_MODE;
step = 0;
} else {
if (step == 0) setYY++;
else if (step == 1) setMM = (setMM % 12) + 1;
else if (step == 2) setDD = (setDD % 31) + 1;
else if (step == 3) setH = (setH + 1) % 24;
else if (step == 4) setM = (setM + 1) % 60;
else if (step == 5) setS = (setS + 1) % 60;
}
}
if (isButtonPressed(pinDOWN, lastDOWN)) {
if (step < 6) {
if (step == 0) setYY--;
else if (step == 1) setMM = (setMM > 1) ? setMM - 1 : 12;
else if (step == 2) setDD = (setDD > 1) ? setDD - 1 : 31;
else if (step == 3) setH = (setH > 0) ? setH - 1 : 23;
else if (step == 4) setM = (setM > 0) ? setM - 1 : 59;
else if (step == 5) setS = (setS > 0) ? setS - 1 : 59;
}
}
if (isButtonPressed(pinOK, lastOK)) {
step++;
if (step > 6) step = 6;
}
if (step < 6) {
display.setTextSize(1);
display.setCursor(30, 0); display.print("SET DATETIME");
display.drawFastHLine(0, 12, 128, WHITE);
display.setTextSize(2);
display.setCursor(0, 30);
if (step == 0) display.print("YEAR: " + String(setYY));
else if (step == 1) display.print("MONTH: " + String(setMM));
else if (step == 2) display.print("DAY: " + String(setDD));
else if (step == 3) display.print("HOUR: " + String(setH));
else if (step == 4) display.print("MIN: " + String(setM));
else if (step == 5) display.print("SEC: " + String(setS));
} else {
display.setTextSize(1); display.setCursor(25, 0); display.print("CURRENT TIME");
display.drawFastHLine(0, 10, 128, WHITE);
display.setTextSize(2);
display.setCursor(5, 20);
if (setDD < 10) display.print('0'); display.print(setDD); display.print("/");
if (setMM < 10) display.print('0'); display.print(setMM); display.print("/");
display.print(setYY);
display.setCursor(15, 38);
if (setH < 10) display.print('0'); display.print(setH); display.print(":");
if (setM < 10) display.print('0'); display.print(setM); display.print(":");
if (setS < 10) display.print('0'); display.print(setS);
display.setTextSize(1); display.setCursor(20, 56); display.print("W:Back to Menu");
}
}
void showTempMode() {
sensors.requestTemperatures();
float t = sensors.getTempCByIndex(0);
if (t > -50 && t < 125) {
if (t > maxTemp) maxTemp = t;
if (t < minTemp) minTemp = t;
}
display.setTextSize(1);
display.setCursor(15, 0);
display.println(F("[ MAX-MIN TEMP ]"));
display.drawFastHLine(0, 11, 128, WHITE);
display.setCursor(0, 18);
display.print(F("Now : ")); display.print(t, 1); display.println(F(" C"));
display.setCursor(0, 33);
display.print(F("Max : ")); display.print(maxTemp, 1); display.println(F(" C"));
display.setCursor(0, 48);
display.print(F("Min : ")); display.print(minTemp, 1); display.println(F(" C"));
display.setCursor(0, 56);
}
void drawMenu() {
display.setTextSize(1);
display.setCursor(45, 0);
display.print(" MENU ");
display.drawFastHLine(0, 10, 128, WHITE);
for (int i = 0; i < 4; i++) {
display.setCursor(0, 18 + (i * 11));
if (i == menuIndex) { display.print("> "); display.print(menus); }
else { display.print(" "); display.print(menus); }
}
}

หน้าเมนูหลักประมาณนี้ค่ะ
-โค้ดที่อยากเพิ่มเข้าในเมนูTemp Alert-
void handleDateTimeMode() {
if (isButtonPressed(pinUP, lastUP)) {
if (step == 6) {
currentMode = MENU_MODE;
step = 0;
} else {
if (step == 0) setYY++;
else if (step == 1) setMM = (setMM % 12) + 1;
else if (step == 2) setDD = (setDD % 31) + 1;
else if (step == 3) setH = (setH + 1) % 24;
else if (step == 4) setM = (setM + 1) % 60;
else if (step == 5) setS = (setS + 1) % 60;
}
}
if (isButtonPressed(pinDOWN, lastDOWN)) {
if (step < 6) {
if (step == 0) setYY--;
else if (step == 1) setMM = (setMM > 1) ? setMM - 1 : 12;
else if (step == 2) setDD = (setDD > 1) ? setDD - 1 : 31;
else if (step == 3) setH = (setH > 0) ? setH - 1 : 23;
else if (step == 4) setM = (setM > 0) ? setM - 1 : 59;
else if (step == 5) setS = (setS > 0) ? setS - 1 : 59;
}
}
if (isButtonPressed(pinOK, lastOK)) {
step++;
if (step > 6) step = 6;
}
if (step < 6) {
display.setTextSize(1);
display.setCursor(30, 0); display.print("SET DATETIME");
display.drawFastHLine(0, 12, 128, WHITE);
display.setTextSize(2);
display.setCursor(0, 30);
if (step == 0) display.print("YEAR: " + String(setYY));
else if (step == 1) display.print("MONTH: " + String(setMM));
else if (step == 2) display.print("DAY: " + String(setDD));
else if (step == 3) display.print("HOUR: " + String(setH));
else if (step == 4) display.print("MIN: " + String(setM));
else if (step == 5) display.print("SEC: " + String(setS));
} else {
display.setTextSize(1); display.setCursor(25, 0); display.print("CURRENT TIME");
display.drawFastHLine(0, 10, 128, WHITE);
display.setTextSize(2);
display.setCursor(5, 20);
if (setDD < 10) display.print('0'); display.print(setDD); display.print("/");
if (setMM < 10) display.print('0'); display.print(setMM); display.print("/");
display.print(setYY);
display.setCursor(15, 38);
if (setH < 10) display.print('0'); display.print(setH); display.print(":");
if (setM < 10) display.print('0'); display.print(setM); display.print(":");
if (setS < 10) display.print('0'); display.print(setS);
display.setTextSize(1); display.setCursor(20, 56); display.print("W:Back to Menu");
}
}
void showTempMode() {
sensors.requestTemperatures();
float t = sensors.getTempCByIndex(0);
if (t > -50 && t < 125) {
if (t > maxTemp) maxTemp = t;
if (t < minTemp) minTemp = t;
}
display.setTextSize(1);
display.setCursor(15, 0);
display.println(F("[ MAX-MIN TEMP ]"));
display.drawFastHLine(0, 11, 128, WHITE);
display.setCursor(0, 18);
display.print(F("Now : ")); display.print(t, 1); display.println(F(" C"));
display.setCursor(0, 33);
display.print(F("Max : ")); display.print(maxTemp, 1); display.println(F(" C"));
display.setCursor(0, 48);
display.print(F("Min : ")); display.print(minTemp, 1); display.println(F(" C"));
display.setCursor(0, 56);
}
void drawMenu() {
display.setTextSize(1);
display.setCursor(45, 0);
display.print(" MENU ");
display.drawFastHLine(0, 10, 128, WHITE);
for (int i = 0; i < 4; i++) {
display.setCursor(0, 18 + (i * 11));
if (i == menuIndex) { display.print("> "); display.print(menus); }
else { display.print(" "); display.print(menus); }
}
}

หน้าเมนูหลักประมาณนี้ค่ะ
-โค้ดที่อยากเพิ่มเข้าในเมนูTemp Alert-
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
const int pinUP = 2; // ปุ่มเพิ่มค่า
const int pinDOWN = 3; // ปุ่มลดค่า
const int pinOK = 4; // ปุ่มตกลง / เปลี่ยนหน้า
const int ONE_WIRE_BUS = 5;
const int pinBuzzer = 6;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int step = 0; // 0: หน้าหลัก(Monitor), 1: หน้าตั้งค่า(Set Alert)
float setTemp = 30.0; // ค่าอุณหภูมิแจ้งเตือน (Default)
float currentTemp = 0;
bool alarmActive = false;
bool lastUP = HIGH, lastDOWN = HIGH, lastOK = HIGH;
unsigned long lastReadTime = 0;
unsigned long lastBlinkTime = 0;
void setup() {
Serial.begin(115200);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
sensors.begin();
pinMode(pinUP, INPUT_PULLUP);
pinMode(pinDOWN, INPUT_PULLUP);
pinMode(pinOK, INPUT_PULLUP);
pinMode(pinBuzzer, OUTPUT);
display.clearDisplay();
display.display();
}
bool isButtonPressed(int pin, bool &lastState) {
bool currentState = digitalRead(pin);
if (currentState == LOW && lastState == HIGH) {
delay(50); // กันปุ่มลั่น
if (digitalRead(pin) == LOW) {
lastState = LOW;
return true;
}
}
lastState = currentState;
return false;
}
void loop() {
if (millis() - lastReadTime > 1000) {
sensors.requestTemperatures();
float tempRead = sensors.getTempCByIndex(0);
if (tempRead != -127.00) {
currentTemp = tempRead;
}
lastReadTime = millis();
if (currentTemp >= setTemp) {
alarmActive = true;
} else {
alarmActive = false;
digitalWrite(pinBuzzer, LOW); // ปิดเสียงเมื่ออุณหภูมิปกติ
}
}
if (alarmActive) {
if (millis() % 500 < 250) {
digitalWrite(pinBuzzer, HIGH);
} else {
digitalWrite(pinBuzzer, LOW);
}
}
display.clearDisplay();
display.setTextColor(WHITE);
if (isButtonPressed(pinOK, lastOK)) {
step = (step == 0) ? 1 : 0; // สลับหน้าจอ
}
if (step == 1) {
if (isButtonPressed(pinUP, lastUP)) setTemp += 0.5;
if (isButtonPressed(pinDOWN, lastDOWN)) setTemp -= 0.5;
}
if (step == 0) {
// --- หน้าหลัก: Monitoring ---
display.setTextSize(1);
display.setCursor(30, 0);
display.print("TEMP MONITOR");
display.drawFastHLine(0, 12, 128, WHITE);
// ตรรกะการกระพริบตัวเลข (Blink Logic)
bool showValue = true;
if (alarmActive && (millis() % 500 < 250)) {
showValue = false;
}
if (showValue) {
display.setTextSize(2);
display.setCursor(35, 25);
display.print(currentTemp, 1);
display.print("C");
}
display.setTextSize(1);
display.setCursor(0, 55);
display.print("Limit: ");
display.print(setTemp, 1);
display.print(" C");
if (alarmActive) {
display.setCursor(85, 55);
display.print("!!OVER!!");
}
}
else if (step == 1) {
display.setTextSize(1);
display.setCursor(30, 0);
display.print("SET ALERT");
display.drawFastHLine(0, 12, 128, WHITE);
display.setTextSize(1);
display.setCursor(20, 20);
display.print("Set Max Temp:");
display.setTextSize(2);
display.setCursor(20, 35);
display.print(">");
display.print(setTemp, 1);
display.setTextSize(1);
display.setCursor(85, 55);
display.print("[OK]");
}
display.display();
}
แสดงความคิดเห็น
รวมโค้ดArduino
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <RtcDS1302.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
ThreeWire myWire(7, 8, 6); // ขา DAT, CLK, RST (ถ้าต่อขาอื่นให้เปลี่ยนเลขครับ)
RtcDS1302<ThreeWire> Rtc(myWire);
OneWire oneWire(5);
DallasTemperature sensors(&oneWire);
float maxTemp = -999.0;
float minTemp = 999.0;
const int pinUP = 2, pinDOWN = 3, pinOK = 4;
enum Mode { MENU_MODE, TIMER_MODE, TEMP_MODE, DATETIME_MODE };
Mode currentMode = MENU_MODE;
String menus[] = {"Set Date/Time", "Max/Min Temp", "Temp Alert", "Timer/Stopwatch"};
int menuIndex = 0;
int setYY = 2026, setMM = 3, setDD = 19;
int setH = 12, setM = 0, setS = 0;
unsigned long previousMillis = 0;
unsigned long prevMillisClock = 0;
int timerH = 0, timerM = 0, timerS = 0;
int timerStep = 0;
int step = 0;
unsigned long remainingTime = 0;
unsigned long pausedTime = 0;
unsigned long startTime = 0;
bool isRunning = false;
bool isPaused = false;
bool lastUP = HIGH, lastDOWN = HIGH, lastOK = HIGH;
void drawMenu();
void showTempMode();
void handleDateTimeMode();
void setup() {
sensors.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
pinMode(pinUP, INPUT_PULLUP);
pinMode(pinDOWN, INPUT_PULLUP);
pinMode(pinOK, INPUT_PULLUP);
delay(100);
lastUP = digitalRead(pinUP);
lastDOWN = digitalRead(pinDOWN);
lastOK = digitalRead(pinOK);
}
bool isButtonPressed(int pin, bool &lastState) {
bool currentStateBtn = digitalRead(pin);
if (currentStateBtn == LOW && lastState == HIGH) {
delay(50);
if (digitalRead(pin) == LOW) {
lastState = LOW;
return true;
}
}
lastState = currentStateBtn;
return false;
}
void loop() {
if (millis() - previousMillis >= 1000) {
previousMillis = millis();
if(step == 6 || currentMode != DATETIME_MODE) {
setS++;
if (setS >= 60) { setS = 0; setM++; }
if (setM >= 60) { setM = 0; setH++; }
if (setH >= 24) { setH = 0; setDD++; }
}
}
display.clearDisplay();
display.setTextColor(WHITE);
if (millis() - prevMillisClock >= 1000&& currentMode != DATETIME_MODE) {
prevMillisClock = millis();
setS++;
if (setS >= 60) { setS = 0; setM++; }
if (setM >= 60) { setM = 0; setH++; }
if (setH >= 24) { setH = 0; setDD++; }
}
if (currentMode == MENU_MODE) {
if (isButtonPressed(pinUP, lastUP)) {
menuIndex = (menuIndex > 0) ? menuIndex - 1 : 3;
}
if (isButtonPressed(pinDOWN, lastDOWN)) {
menuIndex = (menuIndex < 3) ? menuIndex + 1 : 0;
}
if (isButtonPressed(pinOK, lastOK)) {
if (menuIndex == 0) { currentMode = DATETIME_MODE; step = 0; }
else if (menuIndex == 1) { currentMode = TEMP_MODE; }
else if (menuIndex == 3) { currentMode = TIMER_MODE; step = 0; }
timerStep = 0;
timerH = 0;
timerM = 0;
timerS = 0;
isRunning = false;
isPaused = false;
remainingTime = 0;
}
drawMenu();
}
else if (currentMode == DATETIME_MODE) {
handleDateTimeMode();
}
else if (currentMode == TEMP_MODE) {
if (isButtonPressed(pinUP, lastUP)) {
currentMode = MENU_MODE;
}
showTempMode();
}
else if (currentMode == TIMER_MODE) {
if (isButtonPressed(pinUP, lastUP)) {
if (timerStep < 3) {
if (timerStep == 0) { timerH = (timerH + 1) % 24; }
else if (timerStep == 1) { timerM = (timerM + 1) % 60; }
else if (timerStep == 2) { timerS = (timerS + 1) % 60; }
} else if (timerStep == 4) {
if (isRunning) {
if (!isPaused) { pausedTime = remainingTime - (millis() - startTime); isPaused = true; }
else { startTime = millis() - (remainingTime - pausedTime); isPaused = false; }
} else {
remainingTime = (unsigned long)(timerH * 3600 + timerM * 60 + timerS) * 1000;
startTime = millis(); isRunning = true; isPaused = false;
}
}
}
if (isButtonPressed(pinDOWN, lastDOWN)) {
if (timerStep < 3) {
if (timerStep == 0) { timerH = (timerH > 0) ? timerH - 1 : 23; }
else if (timerStep == 1) { timerM = (timerM > 0) ? timerM - 1 : 59; }
else if (timerStep == 2) { timerS = (timerS > 0) ? timerS - 1 : 59; }
} else if (timerStep == 4) {
if (isRunning) { timerStep = 0; isRunning = false; isPaused = false; }
else { currentMode = MENU_MODE; isRunning = false; }
}
}
if (isButtonPressed(pinOK, lastOK)) {
if (timerStep < 3) { timerStep++; }
else if (timerStep == 3) {
remainingTime = (unsigned long)(timerH * 3600 + timerM * 60 + timerS) * 1000;
startTime = millis(); isRunning = true; isPaused = false; timerStep = 4;
} else if (timerStep == 4 && !isRunning) { timerStep = 0; }
}
if (timerStep < 3) {
display.setTextSize(1); display.setCursor(40, 0); display.print("SET TIMER");
display.drawFastHLine(0, 12, 128, WHITE);
display.setTextSize(2); display.setCursor(15, 30);
if (timerStep == 0) display.print(">");
if (timerH < 10) display.print('0'); display.print(timerH); display.print(":");
if (timerStep == 1) display.print(">");
if (timerM < 10) display.print('0'); display.print(timerM); display.print(":");
if (timerStep == 2) display.print(">");
if (timerS < 10) display.print('0'); display.print(timerS);
}
else if (timerStep == 3) {
display.setTextSize(1); display.setCursor(45, 10); display.print("START?");
display.setTextSize(2); display.setCursor(15, 30);
if (timerH < 10) display.print('0'); display.print(timerH); display.print(":");
if (timerM < 10) display.print('0'); display.print(timerM); display.print(":");
if (timerS < 10) display.print('0'); display.print(timerS);
}
else if (timerStep == 4) {
unsigned long curT;
if (isPaused) curT = pausedTime;
else if (isRunning) {
unsigned long elap = millis() - startTime;
if (elap >= remainingTime) { curT = 0; isRunning = false; }
else curT = remainingTime - elap;
} else curT = 0;
if (curT == 0 && !isRunning) {
display.setTextSize(1); display.setCursor(20, 20); display.print("--- FINISH ! ---");
display.setCursor(0, 45); display.print(" W:Rep B:Menu R:Set");
} else {
int h = curT / 3600000;
int m = (curT % 3600000) / 60000;
int s = (curT % 60000) / 1000;
display.setTextSize(1); display.setCursor(40, 0); display.print(isPaused ? "PAUSED" : "RUNNING");
display.setTextSize(2); display.setCursor(15, 25);
if (h < 10) display.print('0'); display.print(h); display.print(":");
if (m < 10) display.print('0'); display.print(m); display.print(":");
if (s < 10) display.print('0'); display.print(s);
display.setTextSize(1); display.setCursor(20, 55); display.print("W:P/R B:RESET");
}
}
}
display.display();
}