รวมโค้ดArduino

เขียนโค้ดแยกเป็นส่วนๆแล้วมารวมเป็นเมนู ตอนนี้รวมเมนูที่1,2,4ได้แล้วเหลือเมนูที่3 รวมแล้วโค้ดส่วนอื่นๆไม่ทำงานค่ะ มีพี่ๆคนไหนพอจะรวมโค้ดนี้ใส่ในเมนูที่3ให้ได้บ้างคะTT
#include <Arduino.h>
#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();
}
คำตอบที่ได้รับเลือกจากเจ้าของกระทู้
ความคิดเห็นที่ 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-


#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();
}
แสดงความคิดเห็น
โปรดศึกษาและยอมรับนโยบายข้อมูลส่วนบุคคลก่อนเริ่มใช้งาน อ่านเพิ่มเติมได้ที่นี่