ตัวอย่างการเขียนใช้งาน ปุ่ม Button Blynk

คือผมยังงงอยู่น่ะครับ
นี้โค้ดทั้งหมดของผม

#define BLYNK_PRINT Serial
#include <MCP3008.h>
#include <ESP8266WiFi.h> //เรียกใช้ไลเบอรี่
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
#include <DHT.h>
#define DHTPIN 0   // กำหนดช่องพินของเซนเชอร์ ขาD3
#define DHTTYPE DHT22   // DHT 11  ชื่อ ของเซ็นเชอร์ที่ใช้
#define BLYNK_PRINT DebugSerial
#define CS_PIN 15
#define CLOCK_PIN 14
#define MOSI_PIN 13
#define MISO_PIN 12
MCP3008 adc(CLOCK_PIN, MOSI_PIN, MISO_PIN, CS_PIN);
int sensorValue = 0;
int sensorPin = A0;
char RelayPin = 2; //ขาD4 ปั๊มน้ำรดน้ำ ในถังผสม
char Relay1 = 16; //ขาD2 ปั๊มน้ำถัง A
char Relay2 = 5; //ขาD0 ปั๊มน้ำถัง B
char Relay3 = 4; //ขาD0 ปั๊มน้ำถังผสม

char auth[] = "34r2TCne4O8RuuWxkohVrv_sQwKHEDbe";

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "vivo1606";
char pass[] = "9876543210";
BlynkTimer timer;
DHT dht(DHTPIN, DHTTYPE);
void myTimerEvent()
{
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(h) || isnan(t))
  {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  else
  {
    Serial.print("Humidity: ");
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: ");
    Serial.println(t);
    Blynk.virtualWrite(V5, h);
    Blynk.virtualWrite(V4, t);



  }
}
void setup()
{
  Serial.begin(115200);
  pinMode(sensorPin, INPUT);
  pinMode(RelayPin, OUTPUT);
  digitalWrite(RelayPin, HIGH);
  pinMode(Relay1, OUTPUT);
  pinMode(Relay2, OUTPUT);
   pinMode(Relay3, OUTPUT);
 Serial.println("กำลังเชื่อมต่อไปที่ Blynk Server");
 Blynk.connect();




  dht.begin();

  Blynk.begin(auth, ssid, pass, "blynk.iot-cm.com", 8080);

  timer.setInterval(2000L, myTimerEvent);
}


BLYNK_WRITE(V1)
{
  
}
BLYNK_WRITE(V3)
{
  
}
BLYNK_WRITE(V6)
{
  if (param.asInt() == 1) {
    digitalWrite(Relay3, LOW);

  } else {
    digitalWrite(Relay3, HIGH);

  }
  delay(1000);
}
void loop()
{
  float EC = adc.readADC(0);
  Blynk.virtualWrite(V2, EC);
  Serial.print("EC = " );
  Serial.println(adc.readADC(0));
  
  sensorValue = analogRead(A0);

  if (sensorValue >= 640 && sensorValue <= 1024)
  {
    Serial.println(sensorValue);

    digitalWrite(RelayPin, HIGH);
    delay(1500);


  }
  else {
    Serial.println(sensorValue);
    digitalWrite(RelayPin, LOW);
    delay(1000);

  }

  delay(1000);

  Serial.print("Sensor = " );
  Serial.println(sensorValue);


  Blynk.run();
  timer.run(); // Initiates BlynkTimer
}

คือผมต้องการให้ปั๊มน้ำสองตัวทำงานแค่5วิ ของBLYNK_WRITE(V1) ,BLYNK_WRITE(V3)
ผมควรทำไงครับ

image
ผมอยากรู้ว่าในส่วนที่วงไว้นี้คือV2นี้คือตัวไหนในแอพBlynkหรอครับ


โค้ดที่พี่บอกมานี้มีเท่านี้ใช้มั้ยครับ
(ขอบคุณครับ)

ต้องอ้างอิงเวลาจาก ฟังก์ชันนี้ครับ

ส่วนนี้เป็นการใช้ display เพื่อแสดงเวลาในการนับครับเราไม่รู้ว่ามันนับเวลาไปถึงไหนแล้วเราเลยเอา display มากำหนดเป็น v2 เพื่อดูว่ามันนับไปเท่าไหร่แล้วครับ

ขอบคุณค้าบบ

แก้ไขหน่อยครับๆ ให้อ้างอิงจากฟังก์ชันนี้นะ

timer.setInterval(1000L, countCharger); คำสั่งนี้จะเข้าไปทำงานในฟังก์ชันนี้ ทุกๆ 1 วินาที

ตัวอย่างโดยประมาณที่จะหน่วง 5 วิ

int x_time = 0;
bool _x_time = false;
BLYNK_WRITE(V1)
{
    int pinValue = param.asInt();     
if ( pinValue == 1){
     x_time = 0;
    _x_time = true;
pump = HIGH; //สั่ง เปิด ปั๊ม
}else{
      _x_time = false;
}

}

void countCharger(){

if(_x_time == true){ // ถ้ามีการกดปุ่มปั๊ม 1 ครั้ง 
 x_time++; // นับไปครั้งละ 1 วิ แต่ยังจะไม่เข้า loop 5 วิ เพราะยังนับไม่ถึง
  if (x_time > 5) { //นับไปจนกว่า x_time มากกว่า 5
pump = LOW; //สั่ง ปิด ปั๊ม
Blynk.virtualWrite(V1, LOW); // คืนค่าปุ๊มกดปั๊มให้ Off
_x_time = false;
}
}

}

ผมเขียนคร่าวๆ นะครับลองไปเติมต่อเอง

ขอบคุณมากๆเลยครับ

พี่ครับ ผมลองเติมต่อแล้วแต่ก็ยังใช้งานได้ไม่ได้ ขารีเลย์เข้าขาไหนผมงงหมดเลยครับ

เอาโค้ตมาคุยกันครับ

#define BLYNK_PRINT Serial
#include <MCP3008.h>
#include <ESP8266WiFi.h> //เรียกใช้ไลเบอรี่
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
#include <DHT.h>
#define DHTPIN 0   // กำหนดช่องพินของเซนเชอร์ ขาD3
#define DHTTYPE DHT22   // DHT 11  ชื่อ ของเซ็นเชอร์ที่ใช้
#define BLYNK_PRINT DebugSerial
#define CS_PIN 15
#define CLOCK_PIN 14
#define MOSI_PIN 13
#define MISO_PIN 12
MCP3008 adc(CLOCK_PIN, MOSI_PIN, MISO_PIN, CS_PIN);
int sensorValue = 0;
int sensorPin = A0;
char RelayPin = 12; //ขาD4 ปั๊มน้ำรดน้ำ ในถังผสม
char Relay1 = 17; //ขาD2 ปั๊มน้ำถัง A
char Relay2 = 5; //ขาD0 ปั๊มน้ำถัง B
char Relay3 = 4; //ขาD0 ปั๊มน้ำถังผสม

char auth[] = "34r2TCne4O8RuuWxkohVrv_sQwKHEDbe";

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "vivo1606";
char pass[] = "9876543210";
BlynkTimer timer;
BlynkTimer sensor;         // Timer object for the DHT sensor
BlynkTimer charger;        // Timer object for the charger

DHT dht(DHTPIN, DHTTYPE);
int x_time = 16;
bool _x_time = false;
int chargeCounter = 0;
int chargeTime = 2;
int pump = LOW;
int x_time1 = 0;
bool _x_time1 = false;
int chargeCounter1 = 0;
int pump1 = LOW;
void myTimerEvent()
{
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(h) || isnan(t))
  {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  else
  {
    Serial.print("Humidity: ");
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: ");
    Serial.println(t);
    Blynk.virtualWrite(V5, h);
    Blynk.virtualWrite(V4, t);



  }
}
void setup()
{
  Serial.begin(115200);
  pinMode(sensorPin, INPUT);
  pinMode(RelayPin, OUTPUT);
  digitalWrite(RelayPin, HIGH);
  pinMode(Relay1, OUTPUT);
  pinMode(Relay2, OUTPUT);
   pinMode(Relay3, OUTPUT);
  
 Serial.println("กำลังเชื่อมต่อไปที่ Blynk Server");
 Blynk.connect();




  dht.begin();

  Blynk.begin(auth, ssid, pass, "blynk.iot-cm.com", 8080);

  timer.setInterval(5050L, myTimerEvent);
  timer.setInterval(1000L, countCharger);
  timer.setInterval(1000L, countCharger1);
}

void countCharger()
{
    
   if(_x_time == true){ // ถ้ามีการกดปุ่มปั๊ม 1 ครั้ง 
 x_time++; // นับไปครั้งละ 1 วิ แต่ยังจะไม่เข้า loop 5 วิ เพราะยังนับไม่ถึง
  if (x_time > 5) { //นับไปจนกว่า x_time มากกว่า 5
pump = LOW;
Blynk.virtualWrite(V1, LOW); // คืนค่าปุ๊มกดปั๊มให้ Off
Blynk.virtualWrite(V10,chargeCounter);
_x_time = false;
}
}
   
}
void countCharger1()
{
    
   if(_x_time1 == true){ // ถ้ามีการกดปุ่มปั๊ม 1 ครั้ง 
 x_time1++; // นับไปครั้งละ 1 วิ แต่ยังจะไม่เข้า loop 5 วิ เพราะยังนับไม่ถึง
  if (x_time1 > 5) { //นับไปจนกว่า x_time มากกว่า 5
pump1 = LOW;
Blynk.virtualWrite(V3, LOW); // คืนค่าปุ๊มกดปั๊มให้ Off
Blynk.virtualWrite(V11, chargeCounter1);
_x_time1 = false;
}
}
   
}
BLYNK_WRITE(V1)
{
  int pinValue = param.asInt();     
if ( pinValue == 1){
     x_time = 16;
    _x_time = true;
}else{
      _x_time = false;
                    // Set the internal counter value in second
    chargeCounter = chargeTime;
    Blynk.virtualWrite(V10,chargeCounter);
}
}
BLYNK_WRITE(V3)
{
  int pinValue = param.asInt();     
if ( pinValue == 1){
     x_time1 = 0;
    _x_time1 = true;
}else{
      _x_time1 = false;
                     // Set the internal counter value in second
    Blynk.virtualWrite(V11, _x_time1);
}
}
BLYNK_WRITE(V6)
{
  if (param.asInt() == 1) {
    digitalWrite(Relay3, LOW);

  } else {
    digitalWrite(Relay3, HIGH);

  }
  delay(1000);
}
void loop()
{
  float EC = adc.readADC(0);
  Blynk.virtualWrite(V2, EC);
  Serial.print("EC = " );
  Serial.println(adc.readADC(0));
  
  sensorValue = analogRead(A0);

  if (sensorValue >= 640 && sensorValue <= 1024)
  {
    Serial.println(sensorValue);

    digitalWrite(RelayPin, HIGH);
    delay(1500);


  }
  else {
    Serial.println(sensorValue);
    digitalWrite(RelayPin, LOW);
    delay(1000);

  }

  delay(1000);

  Serial.print("Sensor = " );
  Serial.println(sensorValue);


  Blynk.run();
  timer.run(); // Initiates BlynkTimer
}

ปุ่มกดในแอพตอนนี้กดค้างล่ะดับเองประมาณ5วิแล้วครับ แต่ไฟของรีเลย์ไม่ขึ้นขณะทำการกดครับ

#define BLYNK_PRINT Serial
#include <MCP3008.h>
#include <ESP8266WiFi.h> //เรียกใช้ไลเบอรี่
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
#include <DHT.h>
#define DHTPIN 0   // กำหนดช่องพินของเซนเชอร์ ขาD3
#define DHTTYPE DHT22   // DHT 11  ชื่อ ของเซ็นเชอร์ที่ใช้
#define BLYNK_PRINT DebugSerial
#define CS_PIN 15
#define CLOCK_PIN 14
#define MOSI_PIN 13
#define MISO_PIN 12
MCP3008 adc(CLOCK_PIN, MOSI_PIN, MISO_PIN, CS_PIN);
int sensorValue = 0;
int sensorPin = A0;
char RelayPin = 12; //ขาD4 ปั๊มน้ำรดน้ำ ในถังผสม
char Relay1 = 17; //ขาD2 ปั๊มน้ำถัง A
char Relay2 = 15; //ขาD0 ปั๊มน้ำถัง B
char Relay3 = 4; //ขาD0 ปั๊มน้ำถังผสม

char auth[] = "34r2TCne4O8RuuWxkohVrv_sQwKHEDbe";

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "vivo1606";
char pass[] = "9876543210";
BlynkTimer timer;
BlynkTimer sensor;         // Timer object for the DHT sensor
BlynkTimer charger;        // Timer object for the charger

DHT dht(DHTPIN, DHTTYPE);
int x_time = 16;
bool _x_time = false;
int chargeCounter = 0;
int chargeTime = 2;
int pump = LOW;
int x_time1 = 0;
bool _x_time1 = false;
int chargeCounter1 = 0;
int pump1 = LOW;
void myTimerEvent()
{
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(h) || isnan(t))
  {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  else
  {
    Serial.print("Humidity: ");
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: ");
    Serial.println(t);
    Blynk.virtualWrite(V5, h);
    Blynk.virtualWrite(V4, t);



  }
}
void setup()
{
  Serial.begin(115200);
  pinMode(sensorPin, INPUT);
  pinMode(RelayPin, OUTPUT);
  digitalWrite(RelayPin, HIGH);
  pinMode(x_time, OUTPUT);
  pinMode(Relay2, OUTPUT);
   pinMode(Relay3, OUTPUT);
   digitalWrite(x_time, HIGH);
  
 Serial.println("กำลังเชื่อมต่อไปที่ Blynk Server");
 Blynk.connect();




  dht.begin();

  Blynk.begin(auth, ssid, pass, "blynk.iot-cm.com", 8080);

  timer.setInterval(5050L, myTimerEvent);
  timer.setInterval(1000L, countCharger);
  timer.setInterval(1000L, countCharger1);
}

void countCharger()
{
    
   if(_x_time == true){ // ถ้ามีการกดปุ่มปั๊ม 1 ครั้ง 
 x_time++; // นับไปครั้งละ 1 วิ แต่ยังจะไม่เข้า loop 5 วิ เพราะยังนับไม่ถึง
  if (x_time > 5) { //นับไปจนกว่า x_time มากกว่า 5
pump = LOW;
digitalWrite(x_time, HIGH);
Blynk.virtualWrite(V1, LOW); // คืนค่าปุ๊มกดปั๊มให้ Off
Blynk.virtualWrite(V10,chargeCounter);
_x_time = false;
}
}
   
}
void countCharger1()
{
    
   if(_x_time1 == true){ // ถ้ามีการกดปุ่มปั๊ม 1 ครั้ง 
 x_time1++; // นับไปครั้งละ 1 วิ แต่ยังจะไม่เข้า loop 5 วิ เพราะยังนับไม่ถึง
  if (x_time1 > 5) { //นับไปจนกว่า x_time มากกว่า 5
pump1 = LOW;
Blynk.virtualWrite(V3, LOW); // คืนค่าปุ๊มกดปั๊มให้ Off
Blynk.virtualWrite(V11, chargeCounter1);
_x_time1 = false;
}
}
   
}
BLYNK_WRITE(V1)
{
  int pinValue = param.asInt();     
if ( pinValue == 1){
     x_time = 16;
    _x_time = true;
      digitalWrite(x_time, LOW);
}else{
      _x_time = false;
                    // Set the internal counter value in second
    chargeCounter = chargeTime;
    digitalWrite(x_time, HIGH);
    Blynk.virtualWrite(V10,chargeCounter);
}
}
BLYNK_WRITE(V3)
{
  int pinValue = param.asInt();     
if ( pinValue == 1){
     x_time1 = 0;
    _x_time1 = true;
}else{
      _x_time1 = false;
                     // Set the internal counter value in second
    Blynk.virtualWrite(V11, _x_time1);
}
}
BLYNK_WRITE(V6)
{
  if (param.asInt() == 1) {
    digitalWrite(Relay3, LOW);

  } else {
    digitalWrite(Relay3, HIGH);

  }
  delay(1000);
}
void loop()
{
  float EC = adc.readADC(0);
  Blynk.virtualWrite(V2, EC);
  Serial.print("EC = " );
  Serial.println(adc.readADC(0));
  
  sensorValue = analogRead(A0);

  if (sensorValue >= 640 && sensorValue <= 1024)
  {
    Serial.println(sensorValue);

    digitalWrite(RelayPin, HIGH);
    delay(1500);


  }
  else {
    Serial.println(sensorValue);
    digitalWrite(RelayPin, LOW);
    delay(1000);

  }

  delay(1000);

  Serial.print("Sensor = " );
  Serial.println(sensorValue);


  Blynk.run();
  timer.run(); // Initiates BlynkTimer
}

ตอนนี้รีเลย์ทำงานแล้วครับ แต่ปัญหาคือพอกดปุ่มให้ทำงานในแอพพอถึงระยะปิดเองก้ปกติ แต่พอจะกดทำงานอีกรอบรีเลย์ก็ไม่ทำงานแล้วครับ

ทำงานอีกรอบอยู่ใน loop ไหนครับ

ทำงานอีกรอบอยู่ในloop 5วิ รึมั้ยครับ ผมยังไม่ค่อยเข้าใจนะครับ แต่ต้องกดซ้ำเปิดล่ะปิดไว ปุ่มสถานะOFF แต่รีเลย์ทำงานครับ ล่ะพอกดON ล่ะกดปิดเองปกติ ล่ะก้เป็นแบบนี้เื่อยๆเลยครับ

แคปหน้าแอพมาดูหน่อยครับ เพราะผมงงว่าแต่ละ อันถูกกำหนดเป็นอะไรบ้าง

x_time ต้องเริ่มจาก 0 เท่านั้นครับ รอบสองมันต้องเริ่มต้นนับจาก 0 แบบนี้เราหมายถึงการกำหนดให้เริ่มนับจาก 16 วิ

image

กดครั้งแรกอยู่ในloop 1วิ ครั้งต่อไปจะอยู่ในloop5วิ แต่ทำไมพอเข้าloop5วิ การทำงานของรีเลย์เป็นแบบต้องเปิดปิดไว 1 ครั้ง รีเลย์จะทำงานอยู่ในสถานะ OFF หรอครับ ผมต้องการให้ตอนที่เข้าloop5วิ ทำงานแบบกด ON แค่ครั้ง ล่ะจะทำงาน5วิ ล่ะOFF เองอัตโนมัติ แบบกดON ครั้งเดียวใช้งานได้เลยครับ

คำถามคือทำไมต้องกำหนดเป็น 16

ตอนแรกผมคิดว่าเป็นขาของรีเลย์น่ะครับ ตอนนี้ผมได้ทำการแก้ไขเป้น0แล้วครับ

int x_time = 16;

ในส่วนอันนี้ก้ต้องเป็น0ด้วยใช้มั้ยครับ ถ้าเป็ฯ0ผมจะประกาศขารีเลย์ยังไงหรอครับ