รบกวนดู 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);
  
  
  
  }

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

image

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

ตอนนี้ผมแก้ให้มันไปตรง default ของ switch case
image
แล้วลองset โดยใช้ millis ดูครับ
image

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

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

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

image

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

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

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ให้มาตรงนี้
image

จากนั้นก็ให้มาอ่านตรงนี้น่ะครับ
image
แต่ตอนนี้กลับมาติดลูป มันอ่าน case default รัวๆแทน

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

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

image

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

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

image

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

image

ส่วนอันนี้คือข้างในตัวฟังก์ชั่น 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;

1 Likes

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

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

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

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