ปุ่มกดหน้าตู้คอนโทล ทำงานผิดปกติ

ปัญหาปุ่มกดหน้าตู้ครับ คือพอรันโปรแกรมปุ๊บ ระบบออโต้จะทำงาน

ซึ่งสาเหตุเกิดจาก โค๊ดปุ่ม manual ที่ลงเพิ่มไป

bool buttonStatus = 0;
bool buttonTemp = 0;

//mode auto button1
void checkStatusButton1() {

  buttonStatus = digitalRead(button1);

  if (buttonStatus != buttonTemp)
  {
    if (buttonStatus == 1) {
      auto_on = true;
      autoprogram();
      Blynk.virtualWrite(V3, 1);
      Blynk.virtualWrite(V4, 0);
    }
    else {
      auto_on = false;
      manual_off_mode();
      Blynk.virtualWrite(V3, 0);
    }
    buttonTemp = buttonStatus;
  }
}

//mode manual button2
void checkStatusButton2() {

  buttonStatus = digitalRead(button2);

  if (buttonStatus != buttonTemp)
  {
    if (buttonStatus == 1) {
      auto_on = false;
      manual_on_mode();
      Blynk.virtualWrite(V4, 1);
      Blynk.virtualWrite(V3, 0);
    }
    else {
      auto_on = false;
      manual_off_mode();
      Blynk.virtualWrite(V4, 0);
    }
    buttonTemp = buttonStatus;
  }
}

void setup() {

  timer.setInterval(500L, checkStatusButton1);
  timer.setInterval(500L, checkStatusButton2);
}

และ พอกดปุ่ม1 ก็จะรันโปรแกรม สลับไปมา ตามรูป

แต่ไม่ทราบว่า โค๊ดมันผิดตรงไหน

หมายถึง กด manual แล้ว mode auto ทำงานด้วยอะหรอ

เอาโค้ตมาลงไม่เต็มรึป่าวครับ void loop ไม่มี ผมวิเคราะห์ไม่ถูกครับ

พอดีตัดโค๊ดมาจากกระทู้ที่แล้วครับ

ภาพจะประมาณนี้ครับ

ฟังชั่นการทำงาน จะทำงานเหมือนกับปุ่มในแอฟ blynk คือ

กดปุ่ม1=ฟังชั่น auto ทำงาน กดอีกครั้ง=ปิด

กดปุ่ม2=ฟังชั่น manual ทำงาน กดอีกครั้ง=ปิด

กดปุ่ม1 แล้วกดปุ่ม2 ปุ่ม1ปิด

กดปุ่ม2 แล้วกดปุ่ม1 ปุ่ม2ปิด

สลับกันไปมา แบบนี้ครับ

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

ขอดูโค้ตเต็ม หน่อยครับ

#define BLYNK_PRINT Serial
#include <SPI.h>
#include <Ethernet.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
#include <WidgetRTC.h>
#include <TimeLib.h>
#include <DHT.h>

#define DHTPIN 5 // D1
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
#define wifiLed    LED_BUILTIN

int wifiFlag = 0;

int dlt = 300; //set delay time

int sensor = 0;
int sensorValue = 0;
int sensorState = 0;
int lastState = 0;

int sensorPin = 16; // D0
int led1 = 4; // D2
int led2 = 0; // D3
int relay = 2; // D4
int button1 = 14; // D5
int button2 = 12; // D6
bool auto_on = false;

WidgetRTC rtc;
WidgetLED ledBlynk_1(V12); // status auto mode
WidgetLED ledBlynk_2(V13); // status manual mode
WidgetLED ledBlynk_3(V14); // status working
WidgetLED ledBlynk_4(V15); // status timer

//set Auto soil Moisture sensor slider in app on pin V10
int SetAutoprogram;
BLYNK_WRITE(V10) {
  SetAutoprogram = param.asInt();
}

char auth[] = "xxx";
char ssid[] = "xxx";
char pass[] = "xxx";
SimpleTimer timer;

// Digital clock display of the time
void clockDisplay() {
  // You can call hour(), minute(), ... at any time
  // Please see Time library examples for details
  String currentTime = String(hour()) + ":" + minute() + ":" + second();
  String currentDate = String(day()) + " " + month() + " " + year();
  Serial.print("Current time: ");
  Serial.print(currentTime);
  Serial.print(" ");
  Serial.print(currentDate);
  Serial.println();

  // Send time to the App
  Blynk.virtualWrite(V6, currentTime);
  // Send date to the App
  Blynk.virtualWrite(V11, currentDate);
}

BLYNK_CONNECTED() {
  Blynk.syncAll();
  rtc.begin(); // Synchronize time on connection
}

///mode///
void auto_on_mode() {
  digitalWrite(relay, 1);
  digitalWrite(led1, 1);
  digitalWrite(led2, 0);
  ledBlynk_1.on();
  ledBlynk_2.off();
  ledBlynk_3.on();
  delay(dlt);
}
void auto_off_mode() {
  digitalWrite(relay, 0);
  digitalWrite(led1, 1);
  digitalWrite(led2, 0);
  ledBlynk_1.on();
  ledBlynk_2.off();
  ledBlynk_3.off();
  delay(dlt);
}

void manual_on_mode() {
  digitalWrite(relay, 1);
  digitalWrite(led1, 0);
  digitalWrite(led2, 1);
  ledBlynk_1.off();
  ledBlynk_2.on();
  ledBlynk_3.on();
  delay(dlt);
}
void manual_off_mode() {
  digitalWrite(relay, 0);
  digitalWrite(led1, 0);
  digitalWrite(led2, 1);
  ledBlynk_1.off();
  ledBlynk_2.on();
  ledBlynk_3.off();
  ledBlynk_4.off();
  delay(dlt);
}

//blynk button auto mode
BLYNK_WRITE(V3) {
  if (param.asInt() == 1) {
    auto_on = true;
    autoprogram();
    Blynk.virtualWrite(V4, 0);
  }
  else {
    auto_on = false;
    manual_off_mode();
  }
}

//blynk button manual mode
BLYNK_WRITE(V4) {
  if (param.asInt() == 1) {
    auto_on = false;
    manual_on_mode();
    Blynk.virtualWrite(V3, 0);
  }
  else {
    auto_on = false;
    manual_off_mode();
  }
}

bool buttonStatus = 0;
bool buttonTemp = 0;

//auto mode buttonwithout1
void checkStatusButton1() {
  buttonStatus = digitalRead(button1);

  if (buttonStatus != buttonTemp) {
    if (buttonStatus == 1) {
      auto_on = true;
      autoprogram();
      Blynk.virtualWrite(V3, 1);
      Blynk.virtualWrite(V4, 0);
      Serial.print("buttonStatus1_on");
    }
    else {
      auto_on = false;
      manual_off_mode();
      Blynk.virtualWrite(V3, 0);
      Serial.print("buttonStatus1_off");
    }
    buttonTemp = buttonStatus;
  }
}

//manual mode buttonwithout2
void checkStatusButton2() {
  buttonStatus = digitalRead(button2);

  if (buttonStatus != buttonTemp) {
    if (buttonStatus == 1) {
      auto_on = false;
      manual_on_mode();
      Blynk.virtualWrite(V3, 0);
      Blynk.virtualWrite(V4, 1);
      Serial.print("buttonStatus2_on");
    }
    else {
      auto_on = false;
      manual_off_mode();
      Blynk.virtualWrite(V4, 0);
      Serial.print("buttonStatus2_off");
    }
    buttonTemp = buttonStatus;
  }
}

//timer 1
BLYNK_WRITE(V7) {

  if (param.asInt() == 1) {
    digitalWrite(relay, 1);
    ledBlynk_3.on();
    ledBlynk_4.on();
    delay(dlt);
  }
  else {
    manual_off_mode();
  }
}

//timer 2
BLYNK_WRITE(V8) {

  if (param.asInt() == 1) {
    digitalWrite(relay, 1);
    ledBlynk_3.on();
    ledBlynk_4.on();
    delay(dlt);
  }
  else {
    manual_off_mode();
  }
}

//timer 3
BLYNK_WRITE(V9) {

  if (param.asInt() == 1) {
    digitalWrite(relay, 1);
    ledBlynk_3.on();
    ledBlynk_4.on();
    delay(dlt);
  }
  else {
    manual_off_mode();
  }
}

void sendTemp() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  if (isnan(h) || isnan(t)) {
    return;
  }
  Blynk.virtualWrite(V1, t);
  Blynk.virtualWrite(V2, h);
}

void sendSoilValue() {
  sensorValue = analogRead(A0);
  sensorValue = map(sensorValue, 0, 1023, 100, 0);
  Blynk.virtualWrite(V5, sensorValue);
}

// called every 3 seconds by SimpleTimer
void checkBlynkStatus() {
  bool isconnected = Blynk.connected();
  if (isconnected == false) {
    wifiFlag = 1;
    digitalWrite(wifiLed, 1); //Turn off WiFi LED
    Serial.println("Turn off WiFi LED");
  }
  if (isconnected == true) {
    wifiFlag = 0;
    digitalWrite(wifiLed, 0); //Turn on WiFi LED
    Serial.println("Turn on WiFi LED");
  }
}

void autoprogram() {
  //auto pump with soil moisture sensor
  if (auto_on == true) {
    if (sensorValue <= SetAutoprogram) {
      auto_on_mode();
    }
    else if (sensorValue > SetAutoprogram) {
      auto_off_mode();
    }
  }
}

void setup() {
  pinMode(sensorPin, INPUT);
  pinMode(DHTPIN, INPUT);
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(relay, OUTPUT);

  digitalWrite(button1, 0); // button auto
  digitalWrite(button2, 0); // button manual
  digitalWrite(led1, 0); // mode auto
  digitalWrite(led2, 1); // mode manual
  digitalWrite(relay, 0); // on/off water

  //intro();
  Serial.begin(9600);
  Blynk.begin(auth, ssid, pass, "oasiskit.com", 8080);
  //Blynk.begin(auth, ssid, pass, "blynk.iot-cm.com", 8080);
  setSyncInterval(10 * 60); // Sync interval in seconds (10 minutes)
  dht.begin();
  delay(800);

  timer.setInterval(1000L, sendTemp);
  timer.setInterval(1000L, sendSoilValue);
  timer.setInterval(1000L, clockDisplay);
  timer.setInterval(1000L, autoprogram);
  timer.setInterval(1000L, checkStatusButton1);
  timer.setInterval(1000L, checkStatusButton2);
}

void loop() {

  Blynk.run();
  timer.run();

  //send LINE.notification
  sensorState = digitalRead(sensorPin);
  //Serial.println(sensorState);

  if (sensorState == 1 && lastState == 0) {
    LINE.notify("Water your plants");
    lastState = 1;
    delay(1000);
  }//do nothing, has not been watered yet
  else if (sensorState == 1 && lastState == 1) {
    delay(1000);
  }//st
  else {
    lastState = 0;
    delay(1000);
  }
}
1 Likes

ตอนนี้อะไรทำงานตามนี้ได้แล้วบ้าง

ต้องบอกให้ชัดด้วยครับว่ากด Button1 หรือ Button2

1.ตอนนี้ ปุ่มในapp blynk ทำงานได้ตามนี้แล้ว

2.เริ่มรันโปรแกรมขึ้นมา โดยที่ไม่ได้ทำอะไรเลย

ระบบจะทำงานโหมดออโต้ก่อน

ซึ่งปุ่มในapp blynk ก็ใช้งานไปได้ปกติ

กดปุ่ม button2 ไม่มีอะไรเกิดขึ้น

พอกดปุ่ม button1 ก็จะเป็นแบบในรูปจอมอนิเตอร์ คือ ติดๆ ดับๆ แล้วจะกดปุ่มไหน ทั้งในแอฟ ทั้งbutton1(auto) button2(manual) ก็ไม่มีผลอะไรเลย

ปล. button1,button2 คือ ปุ่มหน้าตู้คอนโทลเลอร์

ปุ่ม V3(auto),V4(manual) คือ ปุ่มในแอฟ blynk

ต่อของจริงรึยังครับ

ไม่ได้ต่อจริงครับ แต่ต่อคร่าวๆแบบนี้

1 Likes

ลองตั้ง bool buttonTemp = 1; ดูครับ

ปัญหาระบบออโต้เริ่มรันตั้งแต่เริ่มโปรแกรม

พอตั้ง bool buttonTemp = 1;

ระบบเริ่มรันในโหมด manual ครับ

ปัญหานี้หมดไปครับ…^^

เงื่อนไขนี้ ทำงานถูดต้องหรือยัง

พอดีไปเจอวิธีที่น่าจะง่ายกว่า คือ

ปรับปุ่มหน้าตู้คอนโทลเลอร์ให้เหลือเพียงปุ่มเดียว แต่ให้ทำงาน 2 ฟังชั่น

และเพิ่มไฟสถานะ หน้าตู้คอนโทลเลอร์ ให้มี 4 ดวง (เหมือนใน blynk)

และได้ทำ diagram มาคร่าวๆ ประมาณนี้ ถูกต้องไหม (สำหรับการต่อ LED และ ปุ่มกดหน้าตู้)

เบื้องต้นโอเคแล้วครับลองทดสอบจริงดู