Blynk + servo + sensor ทำอย่างไรให้เข้ากันได้

คือตอนนี้ติดปัญหาอยู่ที่ว่า
(1 คือ sensor ไม่ตรวจจับ 0 คือ sensor ตรวจเจอ)
ผมใช้คำสั่ง if(sensor == 1){servo.write(0);} สั่งให้ servo หมุนไปที่0 องศาและผมอยากใช้ blynk เปิดได้ด้วยพอผมกดในแอพblynk ให้ servo หมุนไปที่ 90 องศา มันก็หมุนไปแล้วหมุนกลับครับ ติดที่ตรงนี้ที่เดียวที่ผมยังคิดการทำงานไม่ออกว่าควรเขียนลักษณะแบบไหน รบกวนช่วยผมด้วยนะครับ

#define  BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <Servo.h>

/**************** WiFi settings **********************/
char auth[] = ""; 
char ssid[] = "Electronics_2.4GHz";
char pass[] = "6132111EN";

BlynkTimer timer;

#define E18_sensor D1

unsigned long previousMillis = 0;
const long interval = 1000;  

WidgetLED led_open (V1);
WidgetLED led_close(V2);
WidgetLED led_process (V3);

/***************************************/
Servo myServo;

void setup() {
  Serial.begin(9600);
  myServo.attach(4);
  pinMode(E18_sensor, INPUT);
  Blynk.begin(auth, ssid, pass,);
  //timer.setInterval(500L, servo_process);
  timer.setInterval(1050L, WiFi_signal);
  led_open.off();
  led_close.off();

}

void loop() {
  Blynk.run();
  timer.run();
  servo_process();
}

void servo_process(){
  /*if(currentMillis - previousMillis >= interval){
    previousMillis = currentMillis;*/
    int E18_sensor_value=digitalRead(E18_sensor);
    if(E18_sensor_value == 0){
      myServo.write(180);
      delay(2000);
      myServo.write(0);
    }
}

BLYNK_WRITE(V10){
  if(param.asInt() == 1){
    myServo.write(0);
    led_open.on();
    led_close.off();
    Serial.print("Blynk_state : 100  ");
  }
}
BLYNK_WRITE(V11){
  if(param.asInt() == 1){
   myServo.write(150);
   led_open.off();
   led_close.on();
   Serial.print("Blynk_state : 0");
  }
}

void WiFi_signal(){
  long dbsignal;
  dbsignal = WiFi.RSSI();
  Blynk.virtualWrite(V20,dbsignal);
}

ตั้ง sw เป็นอะไรไว้ครับ

เบื่องต้นลองจัด form V10 กับ V11 ใหม่ก่อนครับ เปลี่ยน push เป็น sw ด้วย

ในแอพ Blynk ตอนนี้ปรับเป็น Push ครับ สามารถใช้ได้ปกติ แต่เมื่อ Sensor เข้าสู่ลูป if(sensor == 1){servo.write(0) มันจะทำให้ในแอพสั่งเปิดไม่ได้ครับ ผมเลยอยากหาแนวทางตรงนี้ครับ ขอบคุณครับ

โค้ตบรรทัดนี้อยู่ตรงไหนครับ ทำไมโปรแกรมที่ให้มาผมหาเงื่อนไขนี้ไม่เจอ :thinking:

อ้อ ตรงนี้ผมไม่ได้ใส่ไว้ครับ ผมทดสอบโค้ดแล้วเอาออกเลยเพราะมันวนลูปอยู่คำสั่งนั้นครับ แต่ที่อยากจะทำคือให้มันอ่านค่าครั้งเดียว จากนั้นทำแล้วเคลียร์ค่า และรอรับคำสั่งใหม่อีกรอบ ประมาณนี้ครับ

แล้วที่เอาออกนี้ ใช้ Vpin อะไรครับ

code นี้เป็นตัวอย่างให้รัน LINE notify เพียงครั้งเดียวน่าจะคล้ายๆกันครับ

#include <TridentTD_LineNotify.h>
#include <Bounce2.h>
//------------------------------------------------------------------------------------------------
#define LINE_TOKEN  "QerWyEZdBShylI3iTTxxxxxxxxxxxxxvLy2NQa7AXFgYLM"

#define BUTTON_1 D1
Bounce debouncer1 = Bounce();


//กำหนดสถานะให้กับปุ่มต่างๆ เพื่อให้สามารถแยกระหว่างการติดหรือดับของ PB
int Btn1 = 0;


//*****************************************************************************************************
//*******************************       void setup        *********************************************
//*****************************************************************************************************

void setup() {

  //****************************************************************************************************


  pinMode(BUTTON_1, INPUT_PULLUP);
  debouncer1.attach(BUTTON_1);   debouncer1.interval(5);


  //***************************************************************************************************
 
  LINE.setToken(LINE_TOKEN);

  //*****************************************************************************************************
  //*******************************     จบ  void setup        *********************************************
  //*****************************************************************************************************



  //*****************************************************************************************************
  //*******************************     void loop       *************************************************

  void loop() {


    debouncer1.update();
    int value1 = debouncer1.read();

    if ( value1 == 0 ) {
      ledCB_1.on();
      delay(10);
      Btn1 = 0;


    }
    else if (value1 == 1 && Btn1 == 0) {
      ledCB_1.off();
      delay(10);
      LINE.notify("xxxxxxx");
      Btn1 = 1;
    }

    else if (value1 == 1 && Btn1 == 1) {
      ledCB_1.off();
      delay(10);
    }

      delay(100 );

  }

  //*******************************   จบ  void loop     *************************************************
  //*****************************************************************************************************

เดิม Btn1 = 0; ถ้า if ( value1 == 0 ) Btn1 ยังคง = 0; อยู่
แต่ถ้า (value1 == 1 และ Btn1 == 0 ก็ให้ส่ง Line ออกไป และให้ Btn1 = 1;
มันก็ไปเข้าเงื่อนไข value1 == 1 && Btn1 == 1 ดังนั้นมันจะไม่ไปทำงานที่เงื่อนไข value1 == 1 && Btn1 == 0 อีกครับ และมันจะรอให้เกิดเงื่อนไข value1 == 0 อีกครั้ง เพื่อให้ Btn1 == 0 และถ้า value1 == 1 และ Btn1 == 0 อีก มันก็จะส่งLine Notify ไปอีก 1 ครั้ง ประมาณนี้ครับ
ขออภัยถ้าตอบไม่ตรงคำถาม

free
hit counter