คือผมอยากทราบการทำงานของรีเลย์เมื่อค่าECต่ำแล้วต้องการให้รีเลย์ตัวแรกทำงานปล่อยปุ๋ยลงถังรดน้ำเป็นเวลา5วินาที แล้วจึงรดน้ำเองอัตโนมัติเป็นเวลา2-3ชั่วโมง หลังจากรีเลย์ตัวแรกหยุดทำงาน รีเลย์ตัวที่สองก็จะทำงานปล่อยปุ๋ยอีกชนิดลงไปเป็นเวลา5วินาที แล้วจึงรดน้ำเป็นเวลา2-3ชั่วโมงแบบเดิมเดิม โดยมีโมดุลนาฬิกาช่วยการทำงาน ผมการเขียนโค้ดยังไงครับขอพี่ช่วยแนะนำหน่อยครับ
#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[] = "Sermphan_2.4GHz";
char pass[] = "0987297146";
BlynkTimer timer;
BlynkTimer sensor; // Timer object for the DHT sensor
BlynkTimer charger; // Timer object for the charger
DHT dht(DHTPIN, DHTTYPE);
int x_time = 0;
bool _x_time = false;
int chargeCounter = 0;
int chargeTime = 1;
int x_time1 = 0;
bool _x_time1 = false;
int chargeCounter1 = 0;
int chargeTime1 = 1;
int x_time2 = 0;
bool _x_time2 = false;
int chargeCounter2 = 0;
int chargeTime2 = 2;
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);
digitalWrite(Relay1, HIGH);
digitalWrite(Relay2, HIGH);
digitalWrite(Relay3, HIGH);
Serial.println("กำลังเชื่อมต่อไปที่ Blynk Server");
Blynk.connect();
dht.begin();
Blynk.begin(auth, ssid, pass, "blynk.iot-cm.com", 8080);
timer.setInterval(2000L, myTimerEvent);
timer.setInterval(1000L, countCharger);
timer.setInterval(1000L, countCharger1);
timer.setInterval(1000L, countCharger2);
}
void countCharger()
{
if(_x_time == true){ // ถ้ามีการกดปุ่มปั๊ม 1 ครั้ง
x_time++; // นับไปครั้งละ 1 วิ แต่ยังจะไม่เข้า loop 5 วิ เพราะยังนับไม่ถึง
if (x_time > 1) { //นับไปจนกว่า x_time มากกว่า 5
digitalWrite(Relay1, 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 > 1) { //นับไปจนกว่า x_time มากกว่า 5
digitalWrite(Relay2, LOW);
Blynk.virtualWrite(V3, LOW); // คืนค่าปุ๊มกดปั๊มให้ Off
Blynk.virtualWrite(V11,chargeCounter1);
_x_time1 = false;
}
}
}
void countCharger2()
{
if(_x_time2 == true){ // ถ้ามีการกดปุ่มปั๊ม 1 ครั้ง
x_time2++; // นับไปครั้งละ 1 วิ แต่ยังจะไม่เข้า loop 5 วิ เพราะยังนับไม่ถึง
if (x_time2 > 2) { //นับไปจนกว่า x_time มากกว่า 5
digitalWrite(Relay3, LOW);
Blynk.virtualWrite(V6, LOW); // คืนค่าปุ๊มกดปั๊มให้ Off
Blynk.virtualWrite(V12,chargeCounter2);
_x_time2 = false;
}
}
}
BLYNK_WRITE(V1)
{
int pinValue = param.asInt();
if ( pinValue == 1){
x_time = 0;
_x_time = true;
digitalWrite(Relay1, HIGH);
}else{
_x_time = false;
// Set the internal counter value in second
chargeCounter = chargeTime;
digitalWrite(Relay1, LOW);
Blynk.virtualWrite(V10,chargeCounter);
}
}
BLYNK_WRITE(V3)
{
int pinValue = param.asInt();
if ( pinValue == 1){
x_time1 = 0;
_x_time1 = true;
digitalWrite(Relay2, HIGH);
}else{
_x_time1 = false;
// Set the internal counter value in second
chargeCounter1 = chargeTime1;
digitalWrite(Relay2, LOW);
Blynk.virtualWrite(V11,chargeCounter1);
}
}
BLYNK_WRITE(V6)
{
int pinValue = param.asInt();
if ( pinValue == 1){
x_time2 = 0;
_x_time2 = true;
digitalWrite(Relay3, HIGH);
}else{
_x_time2 = false;
// Set the internal counter value in second
chargeCounter2 = chargeTime2;
digitalWrite(Relay3, LOW);
Blynk.virtualWrite(V12,chargeCounter2);
}
}
void loop()
{
float vall = adc.readADC(0);
Blynk.virtualWrite(V2, vall);
delay(1000);
Serial.print("EC = " );
Serial.println(vall);
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
}
นี้โค้ดทั้งหมดครับ ผมควรเขียนไปในแนวทางไหนหรอครับ
Code ชุดนี้เป็นแนว เท่านั้นนะครับ
/**คือผมอยากทราบการทำงานของรีเลย์เมื่อค่าECต่ำแล้วต้องการให้รีเลย์ตัวแรกทำงานปล่อยปุ๋ยลงถังรดน้ำเป็นเวลา5วินาที แล้วจึงรดน้ำเองอัตโนมัติเป็นเวลา2-3ชั่วโมง
หลังจากรีเลย์ตัวแรกหยุดทำงาน รีเลย์ตัวที่สองก็จะทำงานปล่อยปุ๋ยอีกชนิดลงไปเป็นเวลา5วินาที แล้วจึงรดน้ำเป็นเวลา2-3ชั่วโมงแบบเดิมเดิม โดยมีโมดุลนาฬิกาช่วยการทำงาน
ผมการเขียนโค้ดยังไงครับขอพี่ช่วยแนะนำหน่อยครับ**/
#include <ESP8266WiFi.h> //โหลดไลบารี่ ..มาใช้งาน //https://github.com/esp8266/Arduino
#include <ESP8266WebServer.h> //โหลดไลบารี่ ..มาใช้งาน
#include <WiFiManager.h> //โหลดไลบารี่ ..มาใช้งาน //https://github.com/tzapu/WiFiManager
#include <FS.h> //โหลดไลบารี่ ..มาใช้งาน //this needs to be first, or it all crashes and burns...
#include <DNSServer.h> //โหลดไลบารี่ ..มาใช้งาน
#include <ArduinoJson.h> //โหลดไลบารี่ ..มาใช้งาน //https://github.com/bblanchon/ArduinoJson
//------------------------------------------------------------------------------------------------------------------------//
#include <BlynkSimpleEsp8266.h> //โหลดไลบรารี่ ของ BLYNK มาใช้งาน
//------------------------------------------------------------------------------------------------------------------------//
//------------------------------ การกำหนดค่าในส่วนของ Blynk ------------------------------------------------//
#define BLYNK_DEBUG
#define BLYNK_PRINT Serial // ใส่ความคิดเห็นในส่วนนี้เพื่อปิดการใช้งานพิมพ์และประหยัดพื้นที่
int blynkIsDownCount = 0; //Integer Variable ตัวแปรชื่อ blynkIsDownCount ใช้เก็บเลขจำนวนเต็ม โดยเริ่มต้นให้มีค่า = 0
char blynk_token[34] = "8dwBaSBOE8htLFrK37JPAYB1hmaw8TaQkU";//ใส่ Blynk_token ของเราที่ Blynk ส่งมาทาง Email ตอน Create Project ใหม่
BlynkTimer timer; //เรียกใช้การตั้งเวลาของ Blynk
//ฟังชั่นเปิดใช้งาน BlynkTimer ซึ่งทำหน้าที่คล้าย ๆ interrupt timer หมายถึงเมื่อครบเวลาตามที่กำหนดไว้โปรแกรมหลักจะกระโดด
//ไปทำงานในโปรแกรมตอบสนองที่กำหนดไว้
//กรณีนี้จะนำฟังชั่นที่เปิดใช้งาน BlynkTimer ไปใช้ในการ เชื่อมต่อซ้ำ (reconnecting)
//โดยรูปแบบคำสั่ง คือ timer.setInterval(30000L, reconnecting); อยู่ใน void setup
WidgetLED led_1(V10);// Relay 1 ปล่อยปุ๋ย A ลงถัง
WidgetLED led_2(V12);// ปั๊มรดน้ำทำงาน
WidgetLED led_3(V11);// Relay 2 ปล่อยปุ๋ย B ลงถัง
//---------------------------------- กำหนดหมายเลขของขาของ Node MCU ESP 8266 --------------------------------------------//
#define D0 16 // ใช้ไฟ LED สีฟ้า ของบอร์ด MCU ESP8266 ให้มีสัญญาณไฟกระพริบ ตาม Code ที่เขียน
#define D3 0 // ใช้เป็นปุ่มกด เพื่อเข้า AP Config ได้ตามความต้องการของผู้ใช้
//------------------------------------------------------------------------------------------------------------------------//
#include <Scheduler.h>
#include <DHT.h>
#define DHTTYPE DHT21
#define DHTPIN D6
DHT dht(DHTPIN, DHTTYPE);
//--Temp
int v1;//Min
int v2;//Max
int a1 = 0;
int a2 = 0;
const long oneSecond = 10000; // 1000 มิลลิวินาที = 1 วินาทีเท่ากับ
const long oneMinute = oneSecond * 60; // 1 นาที = 1 วินาที x 60 วินาที
const long oneHour = oneMinute * 60; // 1 ชั่วโมง = 1 นาที x 60 นาที
const long threeHour = oneHour * 3; // 3 ชั่วโมง = 1 ชั่วโมง x 3 ชั่วโมง
bool shouldSaveConfig = false;
//callback notifying us of the need to save config
void saveConfigCallback () {
Serial.println("Should save config");
shouldSaveConfig = true;
}
//------------------------------------------------------------------------------------------------------------------------//
//-------------สำหรับ Server local ที่แจกให้ เพิ่ม **** แค่ 2 บรรทัดนี้-------------- (ถ้าเป็น Blynk Server ปกติไม่ต้องใส่) ----------//
char server[] = "oasiskit.com";
int port = 8080;
//------------------------------------------------------------------------------------------------------------------------//
BLYNK_WRITE(V1)// ตั้งค่า อุณหภูมิ Min
{
v1 = param.asInt();
}
BLYNK_WRITE(V2)// ตั้งค่า อุณหภูมิ Max
{
v2 = param.asInt();
}
class Task_1 : public Task {
protected:
void setup() { }
void loop() {
//-----------------------------------------------------------------------------------------------------------//
if (Blynk.connected())
{
Blynk.run();
digitalWrite(D0, LOW);
} else {
digitalWrite(D0, LOW);
delay(200);
digitalWrite(D0, HIGH);
delay(100);
}
//-----------------------------------------------------------------------------------------------------------//
timer.run();//ให้เวลาของ Blynk ทำงาน
delay(100);
}
} Task_1_task;
class Task_2 : public Task {
protected:
void setup() { }
void loop() {
float t ;
t = dht.readTemperature();
Blynk.virtualWrite(V3, t);
if ( t > v1 && t <= v2 ) {
led_1.off();
led_3.off();
}
else if (a1 == 0) {
led_1.on();
delay(5000);
led_1.off();
a1 = 1;
}
}
} Task_2_task;
class Task_3 : public Task {
protected:
void setup() { }
void loop() {
if (a1 == 1) {
led_2.on();
delay(oneSecond);//ทดสอบทำแค่ 10 วินาที
led_2.off();
led_3.on();
delay(5000);
led_3.off();
led_2.on();
delay(oneSecond);//ทดสอบทำแค่ 10 วินาที
led_2.off();
a1 = 0;
}
delay(10);
}
} Task_3_task;
//------------------------------------------------------------------------------------------------------------------------//
//********************************************* void setup **************************************************//
//------------------------------------------------------------------------------------------------------------------------//
void setup() {
//-------IO NODE MCU Esp8266-------//
pinMode(D0, OUTPUT); //กำหนดโหมดใช้งานให้กับขา D0 เป็นขา สัญญาณไฟ ในสภาวะต่างๆ
pinMode(D3, INPUT_PULLUP);//กำหนดโหมดใช้งานให้กับขา D3 เป็นขา กดปุ่ม ค้าง เพื่อตั้งค่า AP config
// ให้ LED ทั้งหมดดับก่อน
digitalWrite(D0, LOW);//ให้หลอด LED สีฟ้าดับก่อน
//-------------------------------//
Serial.begin(115200);
//-------------------------------//
dht.begin();
//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");
}
}
}
} else {
Serial.println("failed to mount FS");
}
//end read
//************************** AP AUTO CONNECT ********************************************//
WiFiManagerParameter custom_blynk_token("blynk", "blynk token", blynk_token, 34);
//WiFiManager
//Local intialization. Once its business is done, there is no need to keep it around
WiFiManager wifiManager;
//set config save notify callback
wifiManager.setSaveConfigCallback(saveConfigCallback);
wifiManager.addParameter(&custom_blynk_token);
for (int i = 5; i > -1; i--) { // นับเวลาถอยหลัง 5 วินาทีก่อนกดปุ่ม AP Config
digitalWrite(D0, HIGH);
delay(500);
digitalWrite(D0, LOW);
delay(500);
Serial.print (String(i) + " ");//แสดงข้อความใน Serial Monitor
}
if (digitalRead(D3) == LOW) {
digitalWrite(D0, HIGH);
Serial.println("Button Pressed");
wifiManager.resetSettings();
if (!wifiManager.autoConnect("PUYIOT AP CONFIG")) {
Serial.println("failed to connect and hit timeout");
delay(3000);
//reset and try again, or maybe put it to deep sleep
ESP.reset();
delay(5000);
}
}
Serial.println("Connected.......OK!)");
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();
//end save
}
//************************** จบ AP AUTO CONNECT *****************************************//
Serial.println("local ip");
delay(100);
Serial.println(WiFi.localIP());
Serial.println("gateway");
delay(100);
Serial.println(WiFi.gatewayIP());
Serial.println("subnetMask");
delay(100);
Serial.println(WiFi.subnetMask());
Serial.println("SSID");
delay(100);
Serial.println(WiFi.SSID());
Serial.println("Password");
delay(100);
Serial.println(WiFi.psk());
Blynk.config(blynk_token, server, port);
////เริ่มการเชื่อมต่อ Blynk Server*********สำหรับ Server local ที่แจกให้ เพิ่ม, server, port แค่นี้จบ
timer.setInterval(30000L, reconnecting); //Function reconnect
//ตั้งเวลาส่งข้อมูลให้ Blynk Server ทุกๆ 30 วินาที
Scheduler.start(&Task_1_task);
Scheduler.start(&Task_2_task);
Scheduler.start(&Task_3_task);
Scheduler.begin();
}
//------------------------------------------------------------------------------------------------------------------------//
//********************************************* จบ void setup **************************************************//
//------------------------------------------------------------------------------------------------------------------------//
//------------------------------------------------------------------------------------------------------------------------//
//********************************************* void Loop ***************************************************//
//------------------------------------------------------------------------------------------------------------------------//
void loop() {
}
//------------------------------------------------------------------------------------------------------------------------//
//********************************************* จบ void Loop **************************************************//
//------------------------------------------------------------------------------------------------------------------------//
//------------------------------------------------------------------------------------------------------------------------//
void reconnecting()
{
if (!Blynk.connected())
{
blynkIsDownCount++;
BLYNK_LOG("blynk server is down! %d times", blynkIsDownCount);
Blynk.connect(5000);
}
}
ผมใช้ Temp แทน EC นะครับ มี Slide bar บังคับให้ เป็นค่า Min หรือ Max ได้ เพื่อทดสอบการทำงานของระบบ ส่วนเรื่องของเวลาในการทำงาน ผม Set ค่า Delay เอาครับ โดยมีการทำงาน ตามเงื่อนไขที่คุณให้นั่นแหละครับ แต่เงื่อนไขก็ยังไม่สมบูรณ์อยู่
ครับพี่ ขอบคุณมากครับผมจะนำมาใช้เป็นแนวทางแก้ไขน่ะครับ:pray:
ขอบคุณมากๆครับ