รบกวนดู Code ให้หน่อยครับ เกี่ยวกับการรับค่า

พูดคุยกันเรื่องบอร์ด Arduino
ผมทำปุ่มส่งกลับไม่ได้ครับ TvT ไม่เข้าใจวิธีอ่านค่าของมันเลยครับ
จุดสำคัญ ตรงที่ void SW_case() ของใน case ผมทำให้มันไปอ่านฟังก์ชั่น Mode_Select_Complete() ใหม่อีกรอบเมื่อกด หรือรอ millis นับเสร็จ ทดลองแล้วครับว่าไม่ได้ พึ่งหัดเขียนโค้ดครับ ดูอาจจะมั่วๆหน่อย
ขอบคุณครับ

  #include <LiquidCrystal_I2C.h>
  LiquidCrystal_I2C lcd(0x27, 16, 2);
  #include <SimpleTimer.h>
  #define BLYNK_PRINT Serial
  #include <WiFi.h>
  #include <WiFiClient.h>
  #include <BlynkSimpleEsp32.h>
  #include <Wire.h>
  #include <EEPROM.h>
  #include <BluetoothSerial.h>
  #include <OneWire.h>
  
  
  
  //=========Timer========
  SimpleTimer timer;
  int timeCH = 0;
  int timex = 0;
  bool timex_ = false ;
  bool timestate = false ;
  bool SWNUM = false ;
  int buttonState;
  int Read_SW1_ch = 0 ;
  unsigned long timez = millis();
  
  
  #define relay 5 //ใช้LEDทดสอบไปก่อน
  
  //#define VPINSW1 V1
  #define VPIN_RELAY1 V2
  #define VPIN_TIMECOOLDOWN V3
  
  //======define SW===========
  #define SW1 26
  #define SW2 25
  #define SW3 33
  #define SW4 32
  int Read_SW1  ;
  int Read_SW2 ;
  int Read_SW3 ;
  int Read_SW4 ;
  
    int k = 1 ;
    int b = 1 ;
    bool Mode_SL = true;
    bool Mode_Enter = false;
    bool Mode_Clear = true;

  
  
  
  //char auth[] = "iDFMhoHR_59Qp6ep3vMJVAan0g6W2KMe";
  
  // Your WiFi credentials.
  // Set password to "" for open networks.
  //char ssid[] = "Toraneko";
  //char pass[] = "mushadan";
  
  
  
  void setup()
  {
    //======lcd Main==============
    //for_go;
    //timer.setInterval(1000L, for_go);
    // Debug console
    Serial.begin(115200);
   // Blynk.begin(auth, ssid, pass);
    // pinMode (VPINSW1,INPUT_PULLUP);
    pinMode (relay, OUTPUT);
    pinMode (VPIN_RELAY1, OUTPUT);
    pinMode (VPIN_TIMECOOLDOWN, OUTPUT);
    pinMode(SW1, INPUT_PULLUP);
    pinMode(SW2, INPUT_PULLUP);
    pinMode(SW3, INPUT_PULLUP);
    pinMode(SW4, INPUT_PULLUP);
    EEPROM.begin(256);
  
    //==========timer In=============
    //timer.setInterval(1000L, SwitchSelect);
    //timer.setInterval(1000L, SwitchPush); 
    lcd.begin();
    lcd.backlight();
    lcd.setCursor(0, 0);
    lcd.print("Welcome :D");
    lcd.setCursor(0, 1);
    lcd.print("by Phiyaphon");
    lcd.clear();
    delay(2000);
    lcd.setCursor(0, 0);
    lcd.print("Waiting 3 Second");
    lcd.clear(); 
     delay(3000);
   timer.setInterval(1000L,Mode_Select_Complete);
    
  
  
  }
  
  void loop()
  {
  
   //Mode_Select_Complete();
    timer.run();
    
  
  }

//=============== Button ============
void Mode_Select_Complete(){
    if (Mode_Enter) {
    CountS();
    ModeUpDown();
  } else {
    Enter_Press();
  }
  SW_case();
  
  }

void Enter_Press(){
    
  lcd.setCursor(0,1);
  lcd.print("Project Select    ");
  lcd.clear();
  Read_SW1 = digitalRead(SW1);
  if (Read_SW1 == LOW) {
    lcd.setCursor(0,0);
    lcd.print("Press Button");
    lcd.setCursor(0,1);
     lcd.print("Button >");
     
    Mode_Enter = true;
    //delay(500); 
    
    Mode_Clear = false;
  }
}
  

void ModeUpDown(){
 
  if (Mode_SL) {
    Read_SW2 = digitalRead(SW2);
    if (Read_SW2 == LOW) {
      //delay(100);
      timex = millis();
      if (digitalRead(SW2) == LOW)
      k  = k + 1;  
      while (digitalRead(SW2) == LOW);
    }
  
    Read_SW3 = digitalRead(SW3);
    if (Read_SW3 == LOW) {
     // delay(100);
      timex = millis();
      if (digitalRead(SW3) == LOW)        
      k = k - 1;    
      while (digitalRead(SW3) == LOW);
    }
    lcd.setCursor(0, 1);
    lcd.print("Project : ");
    lcd.setCursor(10, 1);
    lcd.print(k);
   
  }
}

void CountS() {
  if (Mode_SL) {
    if (k >= 6) {
      k = 6;
     // delay(1);
      timex = millis();
   
    }
    if (k <= 1) {
      k = 1;
      //delay(1); 
      timex = millis();
    }
  }
}






//===========END of BUTTON MODE================


void SW_back(){
    Read_SW1 = digitalRead(SW1);
    if (Read_SW1 == LOW){
      delay(100);
      b = 0 ;
        if(Read_SW1 = LOW && b == 0){
           Enter_Press();
          }
      }
  
  
  }


 //===================SW CASE=================== 
void SW_case() {
 unsigned long timer2 = millis();
   
   Read_SW4 = digitalRead(SW4);
   while (Read_SW4 == LOW){
   //if(Read_SW4 == LOW){
    
  
    switch (k) {
      case 1 :
      Mode_SL = false;
        lcd.setCursor(0, 1);
        lcd.print("Blynk Control");
        Set_Time_Project1();
        Blynk.run();
        SW_back();
        break;
  
      case 2 :
      Mode_SL = false;
        lcd.setCursor(0, 1);
        lcd.print("Bluetooht Mode");
        SW_back();
        break;
  
      case 3 :
      Mode_SL = false;
        lcd.setCursor(0, 1);
        lcd.print("Waithing Update");
        timez = millis();
        if (millis() - timer2  >= 2000)
       {
        timer2 =+ 500;
        b = 0 ;
        Read_SW1 = LOW ;
        if(Read_SW1 = LOW && b == 0){
          Enter_Press();
          }
        }
        
        break;
  
      case 4 :
      Mode_SL = false;
        lcd.setCursor(0, 1);
        lcd.print("Waithing Update");
        timez = millis();
        if (millis() - timer2  >= 2000)
       {
        timer2 =+ 500;
        b = 0 ;
        Read_SW1 = LOW ; 
        if(Read_SW1 = LOW && b == 0){
          Enter_Press();
          }
        }
        break;
  
      case 5 :
      Mode_SL = false;
        lcd.setCursor(0, 1);
        lcd.print("Waithing Update");
        timez = millis();
        if (millis() - timer2  >= 2000)
       {
        timer2 =+ 500;
        b = 0 ;
        Read_SW1 = LOW ; 
        if(Read_SW1 = LOW && b == 0){
          Enter_Press();
          }
        }
        break;
  
      case 6 :
      Mode_SL = false;
        lcd.setCursor(0, 1);
        lcd.print("Waithing Update");
        timez = millis();
        if (millis() - timer2  >= 2000)
       {
        timer2 =+ 500;
        b = 0 ;
        Read_SW1 = LOW ; 
        if(Read_SW1 = LOW && b == 0){
          Enter_Press();
          }
        }
        break;
  
      default:
      Mode_SL = false;
        lcd.setCursor(0, 0);
        lcd.print("Comeback again");
        lcd.setCursor(0, 1);
        lcd.print(">>>>>>>");
        timez = millis();
        if (millis() - timer2  >= 2000)
       {
        timer2 =+ 500;
        b = 0 ;
        Read_SW1 = LOW ; 
        if(Read_SW1 = LOW && b == 0){
          Enter_Press();
          }
          
        }
        break;
    }
 

  
    }
   }
   

   
  



  //========PROJECT 1 BLYNK============================================================
  
  
  
  void chargeCounter() {
  
    if ( timex_ == true) {
      timex++;
      if (timex >= 30) {
        digitalWrite(relay, LOW);
        Blynk.virtualWrite(V1, LOW);
        Blynk.virtualWrite(VPIN_RELAY1, 0);
        timex_ = false ;
      }
    }
  }
  
  void timecheack() {
  
    if (timestate == true) {
      timeCH++;
      Blynk.virtualWrite(VPIN_TIMECOOLDOWN, timeCH);
      if (timeCH >= 10) {
  
        Blynk.virtualWrite(VPIN_TIMECOOLDOWN, 0);
        timestate == false;
      }
    }
  }
  
  //=================BLYNK========
  BLYNK_WRITE(V1) {
    buttonState = param.asInt();
    Blynk_relay();
  }
  
  
  void Blynk_relay() {
    if (buttonState == 1) {
      timex = 0;
      timex_ = true;
      timeCH = 0;
      timestate = true;
      digitalWrite(relay, HIGH);
      Blynk.virtualWrite(VPIN_RELAY1, 1);
      Blynk.virtualWrite(VPIN_TIMECOOLDOWN, timeCH);
    }
    else
    {
      digitalWrite(relay, LOW);
      Blynk.virtualWrite(VPIN_RELAY1, 0);
      Blynk.virtualWrite(VPIN_TIMECOOLDOWN, 0);
      timex_ = false;
      timestate = false ;
  
    }
    delay(100);
  
  }
  
  
  //=================BLYNK END==========================================================
    
  void Set_Time_Project1() {
  
    timer.setInterval(1000L, chargeCounter);
    timer.setInterval(1000L, timecheack);
    timer.setInterval(1000L, Blynk_relay);
  
  
  
  }

โปรแกรมเมื่อเข้ามาส่วนนี้แล้วมันไม่ยอมเลือกเคสไปทำงานหรอครับ

ขออภัยนะครับ ผมอธิบายไม่ละเอียด Orz
ส่วน switch case ตรงนี้ทำงานครับ ตรงSW_back(); ผมอยากให้มีการกดกลับไปหน้า ของ Enter_Press() ได้น่ะครับ
ในส่วนของนี้ ผมทำให้มันอ่านค่าไม่เป็นเลยครับ TvT ลองผิดลองถูกอยู่

ตอนนี้ผมแก้ให้มันไปตรง default ของ switch case


แล้วลองset โดยใช้ millis ดูครับ

คือต้องการให้มันวนไปเลือก Enter_Press() ให้ทำงานอีกครั้ง อะหรอ

ใช่ครับ โดยการกด Switch 4 กลับไปทำงานฟังก์ชั่นนั้นใหม่

แล้วการทำงานมันเข้ามาถึงตรงนี้รึยัง

ยังไม่เข้าเลยครับ

ตอนนี้ชี้หน่อยว่ามันไปตันตรงไหน ต้องไล่ไปทีละจุด

void SW_back(){
  if (Read_SW4 == LOW){
      delay(100);  
      b = 0 ;
       while(Read_SW4 = LOW && b == 0){  <<<< ตันตรงนี้รึเปล่าครับ  ถ้าตามเงื่อนไขมันเข้าแล้ว แต่มันยังไม่ไปทำตัวข้างล่าง
        Enter_Press();
          }
      }
  }

หรือผมลองเปลี่ยนเป็น แบบนี้ดู

void SW_back(){
  if (Read_SW4 == LOW){
      delay(100);  
     Mode_Enter = true;
     if(Mode_Enter = true)
{
Mode_Select_Complete();
}
          }
      }
  }

ให้มันเข้าไปอ่านฟังก์ชั่นMode_Select_Complete(); ใหม่

ไฮท์ไล โค้ตมาด้วยครับ

ขออภัยนะครับ ตรงนี้ผมปรับมาใหม่
กดปุ่ม4ให้มาตรงนี้

จากนั้นก็ให้มาอ่านตรงนี้น่ะครับ


แต่ตอนนี้กลับมาติดลูป มันอ่าน case default รัวๆแทน

ปล. SW4 ที่ผมใช้กดกลับเป็น switch เดียวกับกดเข้า ฟังก์ชั่นของ switch case ครับ

คำสั่งนี้ให้ทำอะไรครับ อธิบายหน่อย

ให้มันเข้าไปอ่านค่า Switch case ในฟังก์ชั่น SW_case() ครับ
ซึ่ง k = 7 มันไม่ได้อยู่ใน case ที่ผมตั้งไว้(ตั้งไว้แค่1-6) มันก็จะไปอ่านตรงค่า default เลยครับ

ต่อมามันเข้าไปตรงนี้หรือยัง

ตอนนี้เข้าไปทำแล้วครับ แก้ไปแก้มา แต่ตรงจอ lcd หายเกลี้ยงเลยครับ

ส่วนอันนี้คือข้างในตัวฟังก์ชั่น Mode_Select_Complete() ครับ

void Mode_Select_Complete(){
    if (Mode_Enter) {
    CountS();
    ModeUpDown();
  } else {
    Enter_Press();
  }
  SW_case();
  
  }

ตัวแปรbool ที่ตั้งไว้
bool Mode_SL = true;
bool Mode_Enter = false;
bool Mode_Clear = true;

มาถึงจุด Mode_Select_Complete() นี้เราติดปัญหาอะไรครับ

ติดปัญหาตรง ตอนนี้มันเข้าไปทำแค่ case 2 อย่างเดียวเลยครับ ผมกดปุ่มที่ตั้งไปปุ๊ป ตรงจอ LCD แสดงผลแบบไม่มีตัวอักษรอะไรขึ้นเลย แต่พอกด SW4 (ที่ผมตั้งไว้เพื่อเข้าไปทำงานในฟังก์ชั่น SW_case() ) ก็แสดงผลแค่ “Bluetooht Mode” ใน ฟังก์ชั่นของ case(2) ครับ << อันนี้เพราะผมเอาคำสั่งของ SW_back ใส่ case2 ไปด้วย และใช้ case 2 ในการอ่านตัวฟังก์ชั่นนี้

ค่า K ก่อนเข้าไปทำใน SW_case() มีค่าเท่าไหร่ เช็คหรือยัง ครับ ถ้ามันไปที่ case 2 แสดงว่า k เท่ากับ 2 อ่ะสิ

ตรงนี้มันผิดอยู่นะครับ