มีปัญหากับระบบ Auto

พอดีผมทำพัดลมเปิดปิดแบบAuto กับ Manual +dht22+blynk โดย autoให้พัดลมหมุนตามอุณหภูมิที่ตั้งไว้ Manual กดเลือกเบอร์ได้ ต้องนี้มีปัญหากด auto แล้วรีเลย์ไม่สั่งการพอกดV0 ให้set mode ==1 แล้วมันไม่ทำงานautoให้ แต่Manualรีเลย์สั่งการได้ปกติ ช่วยดูให้หน่อยคับ

#include "DHT.h"
#define DHTPIN D3
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#include <ESP8266WiFi.h>
int timezone = 7 * 3600; //ตั้งค่า TimeZone ตามเวลาประเทศไทย
int dst = 0; //กำหนดค่า Date Swing Time
#define BLYNK_PRINT Serial // Comment this out to disable prints and save space
#include <BlynkSimpleEsp8266.h>
#include <ArduinoJson.h>
#include <ESP8266WebServer.h>
#include <FS.h>
#include <DNSServer.h>
#include <WiFiManager.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);

#define SET_PIN 0
char blynk_token[40] = "";
bool shouldSaveConfig = false;

void saveConfigCallback () {
  Serial.println("Should save config");
  shouldSaveConfig = true;
}
int setmode = 0;
#define out1 D5
#define out2 D6
#define out3 D7
void setup() {
  Serial.begin(115200);
  
  lcd.begin();
  lcd.backlight();

  pinMode(out1, OUTPUT);
  pinMode(out2, OUTPUT);
  pinMode(out3, OUTPUT);
  digitalWrite(out1, HIGH);
  digitalWrite(out2, HIGH);
  digitalWrite(out3, HIGH);

pinMode(SET_PIN, INPUT_PULLUP);
  delay(3000);

  //read configuration from FS json
  Serial.println("mounting FS...");
  if (SPIFFS.begin()) {
    Serial.println("mounted file system");
    if (SPIFFS.exists("/config.json")) {
      //file exists, reading and loading
      Serial.println("reading config file");
      File configFile = SPIFFS.open("/config.json", "r");
      if (configFile) {
        Serial.println("opened config file");
        size_t size = configFile.size();
        // Allocate a buffer to store contents of the file.
        std::unique_ptr<char[]> buf(new char[size]);

        configFile.readBytes(buf.get(), size);
        DynamicJsonBuffer jsonBuffer;
        JsonObject& json = jsonBuffer.parseObject(buf.get());
        json.printTo(Serial);
        if (json.success()) {
          Serial.println("\nparsed json");
          strcpy(blynk_token, json["blynk_token"]);

        } else {
          Serial.println("failed to load json config");
        }
        configFile.close();
      }
    }
  } else {
    Serial.println("failed to mount FS");
  }

  WiFiManagerParameter custom_blynk_token("blynk", "blynk token", blynk_token, 32);
  WiFiManager wifiManager;
  wifiManager.setSaveConfigCallback(saveConfigCallback);
  wifiManager.addParameter(&custom_blynk_token);

  if (digitalRead(SET_PIN) == LOW) {
    wifiManager.resetSettings();
  }

  if (!wifiManager.autoConnect("5555")) {
    Serial.println("failed to connect and hit timeout");
    delay(3000);
    ESP.reset();
    delay(5000);
  }

  Serial.println("wifi connected");
  strcpy(blynk_token, custom_blynk_token.getValue());

  //save the custom parameters to FS
  if (shouldSaveConfig) {
    Serial.println("saving config");
    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();
    json["blynk_token"] = blynk_token;

    File configFile = SPIFFS.open("/config.json", "w");
    if (!configFile) {
      Serial.println("failed to open config file for writing");
    }

    json.printTo(Serial);
    json.printTo(configFile);
    configFile.close();
  }
  
  Serial.println();
  Serial.print("local ip : ");
  Serial.println(WiFi.localIP());
  Serial.print("Blynk Token : ");
  Serial.println(blynk_token);
  Blynk.config(blynk_token);
  dht.begin();

}

void loop() {

  Blynk.run();
  delay(1000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
  }

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print(F("%  Temperature: "));
  Serial.print(t);
  Serial.print(F("°C "));
  Serial.print(f);
  Serial.print(F("°F  Heat index: "));
  Serial.print(hic);
  Serial.print(F("°C "));
  Serial.print(hif);
  Serial.println(F("°F"));


   if ( setmode == 1 )
  {
    if ( t < 27 )
    {
      digitalWrite(out1, LOW);
      digitalWrite(out2, HIGH);
      digitalWrite(out3, HIGH);
    }
    if ( t >= 27  &&  t <= 33 )
    {
      digitalWrite(out1, HIGH);
      digitalWrite(out2, LOW);
      digitalWrite(out3, HIGH);
    }
    if ( t > 33  )
    {
      digitalWrite(out1, HIGH);
      digitalWrite(out2, HIGH);
      digitalWrite(out3, LOW);
    }

  } // end auto

}// end loop
BLYNK_WRITE(V0)
{
  int setmode = param.asInt();
  Serial.println("                           setmode       = " + String(setmode));
  digitalWrite(out1, HIGH);
  digitalWrite(out2, HIGH);
  digitalWrite(out3, HIGH);
  delay(1000);
}
BLYNK_WRITE(V1)
{
  int level = param.asInt();
  Serial.println("                        level / Manual  = " + String(level));

  if ( level == 0 && setmode == 0 )
  {
    digitalWrite(out1, HIGH);
    digitalWrite(out2, HIGH);
    digitalWrite(out3, HIGH);
  }
  if ( level == 1 && setmode == 0 )
  {
    digitalWrite(out1, LOW);
    digitalWrite(out2, HIGH);
    digitalWrite(out3, HIGH);
  }
  if ( level == 2 && setmode == 0  )
  {
    digitalWrite(out1, HIGH);
    digitalWrite(out2, LOW);
    digitalWrite(out3, HIGH);
  }
  if ( level == 3 && setmode == 0 )
  {
    digitalWrite(out1, HIGH);
    digitalWrite(out2, HIGH);
    digitalWrite(out3, LOW);
  }


}

ใครมีปัญหา error บ้างครับ
ตอนนี้ json มีเปลี่ยนเวอร์ชั่นจาก5 ไปเป็น 6 ใน youtube มีวิธีแก้แต่ผม
แก้ไม่ถูกจึงไม่ได้ใช้ code ของ json

แน่ใจหรอว่า setmode เป็น 1 ลอง print ระหว่างทำงานมาดู

แล้วก็ปุ่ม v0 หน้าแอพ ตั้งเป็นแบบไหนไว้ เป็น switch หรือ push button

พอผมกดV0 เหมือนไม่คงค่าให้เป็น1ให้อะคับ

เท่าที่ดูคือ
ภาพ

มันจะเข้า loop นี้

ภาพ

ลองใส่ print ของในดูว่ามันเข้าไปจริงหรือไม่


   if ( setmode == 1 )
  {
    if ( t < 27 )
    {
      digitalWrite(out1, LOW);
      digitalWrite(out2, HIGH);
      digitalWrite(out3, HIGH);
      Serial.println("111111");
    }
    if ( t >= 27  &&  t <= 33 )
    {
      digitalWrite(out1, HIGH);
      digitalWrite(out2, LOW);
      digitalWrite(out3, HIGH);
      Serial.println("22222");
    }
    if ( t > 33  )
    {
      digitalWrite(out1, HIGH);
      digitalWrite(out2, HIGH);
      digitalWrite(out3, LOW);
      Serial.println("33333");
    }

  } // end auto

}// end loop
BLYNK_WRITE(V0)
{
  int setmode = param.asInt();
  Serial.println("                           setmode       = " + String(setmode));
  digitalWrite(out1, HIGH);
  digitalWrite(out2, HIGH);
  digitalWrite(out3, HIGH);
  delay(1000);
}
BLYNK_WRITE(V1)
{
  int level = param.asInt();
  Serial.println("                        level / Manual  = " + String(level));

  if ( level == 0 && setmode == 0 )
  {
    digitalWrite(out1, HIGH);
    digitalWrite(out2, HIGH);
    digitalWrite(out3, HIGH);
  }
  if ( level == 1 && setmode == 0 )
  {
    digitalWrite(out1, LOW);
    digitalWrite(out2, HIGH);
    digitalWrite(out3, HIGH);
     Serial.println("M 1 ");
  }
  if ( level == 2 && setmode == 0  )
  {
    digitalWrite(out1, HIGH);
    digitalWrite(out2, LOW);
    digitalWrite(out3, HIGH);
     Serial.println("M 2 ");
  }
  if ( level == 3 && setmode == 0 )
  {
    digitalWrite(out1, HIGH);
    digitalWrite(out2, HIGH);
    digitalWrite(out3, LOW);
     Serial.println("M 3 ");
  }

ผมลองแก้แล้ว


ลูป if อุณหภูมิไม่ทำงาน

ใส่ใน void loop ครับ แล้วกด v0 = 1 ยาวๆ เลยดูว่าผลเป็นไง

แคป v1 มาดูด้วยตั้งเป็นแบบไหนเอาไว้

ขอแก้ไข ใส่ใน loop ถูกแล้วเหลือ กด v0 ค้างไว้ครับ

ปัญหามันอยู่ตรงนี้แหละ ลองตัด if ชั้นนี้ออกก็รู้แล้วว่าทำงานไหม

ลักษณะการรับค่าจาก ปุ่ม blynk ส่วนใหญผมจะเขียนแบบนี้

แล้วดึง true หรือ false ไปใช้อีกที

พอลองให้แสดงค่า V0


พอกดมันไม่ได้ ค่า1คับ

พอตัด if (setmode == 1) ระบบก็ทำงานตามอุณหภูมิเป็นAutoได้คับ

โอเคคับเดี๋ยวจะลองแก้ใหม่ดูคับ

นี้แหละปัญหา กด 1 ไม่ได้ 1 เหมือนเราตั้ง เป็น push button ไว้เลยนะนิ

Stop app ขอดูหน้า ui หน่อยว่ามี widget อื่นใช้ v0 ซ้ำกันหรือไม่

แก้ไขตามที่บอกแล้วอัพเดทหน่อยครับ