มีคนมารอตอบแต่เช้าแล้ว… 555
ขอบคุณครับ
นี่คือ sketch ล่าสุด(28มิย.65)
//Digital pins 0—15 can be INPUT, OUTPUT, or INPUT_PULLUP
//
//D0(motor_rhodes- ไก่โร้ดส์- D0/GPIO16,INPUT_PULLDOWN),D1(ต่อmcp230017),D2(ต่อmcp230017),
//D3(rhodes_tank_sensor"ถังอาหารไก่โร้ดส์"D3 = GPIO 0),D4(upper_tank_sensor ถังบนD4 = GPIO 2),
//D5((24 มิย.switch sensor ถังไก่บ้าน)(dht_chick ลูกไก่),D6(local_tank_sensor ไก่บ้านD6 = GPIO 12),D7(ac control),
//D8(motor_local),D9(dht),D10((24 มิย.เปิดปิดไฟsensor ถังไก่โร้ดส์)
//(24 มิย.)ขอยืม /D5((24 มิย.เปิดปิดไฟsensor ถังไก่บ้าน)sensor dht2,D1((24 มิย.เปิดปิดไฟsensor ถังบน)หลอดไฟลูกเจี๊ยบ เพราะpinไม่พอ(24 มิย.)
//D1((24 มิย.เปิดปิดไฟsensor ถังบน-switch_sensor_upper_tank)
//D5(24 มิย.).เปิดปิดไฟsensor ถังไก่บ้าน-switch_sensor_local_tank)
//D10((24 มิย.เปิดปิดไฟsensor ถังไก่โร้ดส์-switch_sensor_rhodes_tank)
//
//mcp23017(1,2,3,4,5,6,7,8(solenoid_vegetable),21,22(switch_sensor_upper_tank),23(lamp),24,25,26,27,28)
//ให้ได้อุณหภูมิ32องศา ถ้าเกินให้ดับไฟ
#include <Wire.h>
//-1·แจ้งทางไลน์
#include <TridentTD_LineNotify.h>
#define LINE_TOKEN "xxxxWnJBe91kZ157DTvY2nyqq1" // ใส่ รหัส TOKEN ตะลุโบะ- xxxxLEHiuRvZQBH95PrycnXYZug7
// HIGH คือ หมด LOW คือมี
//0.ดึงเวลาจากเน็ตมาใช้
#include <NTPClient.h>
#include <time.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
////q
#include <Adafruit_MCP23X17.h>
Adafruit_MCP23X17 mcp;
////-q
//1 ขึ้น Blynk
#include <BlynkSimpleEsp8266.h>
#define BLYNK_PRINT Serial;
WidgetLED TANK1(V0);
WidgetLED TANK2(V1);
WidgetLED TANK3(V2);
WidgetLED DAYNIGHT(V3);
WidgetLED motorled(V7);
WidgetLED motor_rhodes_button_v23(V23);
WidgetLED lampblynk(V9);
WidgetLED lampchickblynk(V10);
WidgetLED upper_tank_sensor_val_high_blynkled_v15(V15);
WidgetLED rhodes_tank_sensor_val_high_blynkled_v16(V16);
WidgetLED local_tank_sensor_val_high_blynkled_v17(V17);
float temperature;
float humidity;
String formattedTime;
String currentDate;
WiFiUDP ntpUDP;
const long offsetTime = 25200; // หน่วยเป็นวินาที จะได้ 7*60*60 = 25200
NTPClient timeClient(ntpUDP, "pool.ntp.org");
//Week Days
String weekDays[7]={"อาทิตย์", "จันทร์", "อังคาร", "พุธ", "พฤหัส", "ศุกร์", "เสาร์"};
//Month names
String months[12]={"มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน", "พฤษภาคม", "มิถุนายน", "กรกฎาคม", "สิงหาคม", "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม"};
char auth[]="xxxxOS7h9SyuQUF5p-ggfv";
const char *ssid = "xxx";
const char *password = "xxxx1";
int a=0;
/////////
int timezone = 7 * 3600; //ตั้งค่า TimeZone ตามเวลาประเทศไทย
int dst = 0; //กำหนดค่า Date Swing Time
int currentHour = 0;
// กำหนดค่า offset time เนื่องจากเวลาของเซิฟเวอร์นี้เป็นเวลา UTC เราต้องทำให้เป็นเวลาของประเทศไทย
// เวลาของประเทศไทย = UTC+7 ชั่วโมง ต้องกำหนด offset time = 7 ชั่วโมง
// กำหนด object ของ WiFiUDP ชื่อว่า ntpUDP
//1.ถังอาหารที่1 คือถังอาหารที่เติมอาหารครั้งละ20ลิตร
// ถ้าอาหารลดลงมากถึงระดับต่ำ1 ให้เตือนทางline
// ถ้าอาหารลดลงมากถึงระดับต่ำ2 ให้มอเตอร์หยุดทำงาน
// แต่ต้องเวลากลางวันเท่านั้น ถ้ากลางคืนให้มอเตอร์หยุด
int ac_control = D7;// ควบคุมไฟAC
int motor_rhodes = D0;//หมุนมอเตอร์ไปตามเข็ม ให้ไก่โรดส์
int motor_local = D8;//หมุนมอเตอร์ไปทวนเข็ม ให้ไก่บ้าน
int upper_tank_sensor = D4;
#define switch_sensor_upper_tank 22
//int switch_sensor_upper_tank = 22//D1;
//int lamp_chick = D1;// 24มิย65
//D1((24 มิย.เปิดปิดไฟsensor ถังบน-switch_sensor_upper_tank)
int switch_sensor_local_tank =D5;
//D5(24 มิย.).เปิดปิดไฟsensor ถังไก่บ้าน-switch_sensor_local_tank)
int switch_sensor_rhodes_tank =D10;
//D10((24 มิย.เปิดปิดไฟsensor ถังไก่โร้ดส์-switch_sensor_rhodes_tank)
unsigned long upper_tank_sensor_duration;
//bool upper_tank_sensor_state;
unsigned long rhodes_tank_sensor_duration;
//bool rhodes_tank_sensor_state;
unsigned long local_tank_sensor_duration;
//bool local_tank_sensor_state;
#define lamp 23 // MCP23XXX pin LED is attached to
//int lamp = 23//D2;
int upper_tank_sensor_val = 0;
//int a=0;
//2.ถังอาหารที่2 คือถังที่ให้อาหารไก่ตัวใหญ่จิกกิน
// ถ้าอาหารลดลงมากถึงระดับต่ำ1 ให้มอเตอร์เริ่มทำงาน
// แต่ต้องเวลากลางวันเท่านั้น ถ้ากลางคืนให้มอเตอร์หยุด
// ถ้าอาหารลดลงมากถึงระดับต่ำ2 ให้มอเตอร์หยุดทำงาน
//ถัง2
int rhodes_tank_sensor = D3; //"ถังอาหารไก่โร้ดส์"
int rhodes_tank_sensor_val = 0;
//3.ถังอาหารที่3 คือถังที่ให้อาหารไก่ตัวเล็กจิกกิน
// ถ้าอาหารลดลงมากถึงระดับต่ำ1 ให้มอเตอร์เริ่มทำงาน
// แต่ต้องเวลากลางวันเท่านั้น ถ้ากลางคืนให้มอเตอร์หยุด
// ถ้าอาหารลดลงมากถึงระดับต่ำ2 ให้มอเตอร์หยุดทำงาน
//ถัง3
int local_tank_sensor = D6;
int local_tank_sensor_val = 0;
////w
float maxtemp = -9999; // init with absurdly low value
float mintemp = 9999; // init with absurdly high value
////-w
float currenttemp=0;
unsigned long startMillisTemp;
unsigned long currentMillisTemp;
unsigned long startMillisReadData;
unsigned long currentMillisReadData;
const unsigned long periodReadData = 1000;
int ResetEnergy = 0;
unsigned long startMillis1;
BlynkTimer timer;
//0 ตรวจสอบอุณหภูมิ
#include "DHT.h"
DHT dht;
//DHT dht_chick;24 มิย. 65
// เก็บข้อมูลอุณหภูมิ ทุกครึ่งชั่วโมง
///ผัก///
#define solenoid_vegetable 8
WidgetLED solenoid_vegetable_led_blynk_v21(V21);
//button solenoid_vegetable_button_blynk_v22
///-ผัก///
void setup()
{
//while (!Serial);
Serial.println("MCP23xxx Button Test!");
mcp.digitalWrite(solenoid_vegetable, 0);//active low 24 มิย. 65
solenoid_vegetable_led_blynk_v21.on();
// uncomment appropriate mcp.begin
if (!mcp.begin_I2C()) {
//if (!mcp.begin_SPI(CS_PIN)) {
Serial.println("Error.");
while (1);
}
startMillis1 = millis();
Serial.begin(9600);
//dht11
dht.setup(D9); // ขาD9
//24 มิย. 65 dht_chick.setup(D5); // ขาD5
// Blynk.begin(auth, ssid, password);
Blynk.begin(auth, ssid, password, "oasiskit.com", 8080);
//widget ใน blynk
TANK1.on();
TANK2.on();
TANK3.on();
DAYNIGHT.on();
motorled.on();
// lampblynk.off();
// lampchickblynk.off();
//-1·แจ้งทางไลน์
Serial.println();
Serial.println(LINE.getVersion());
//0.ดึงเวลาจากเน็ตมาใช้
Serial.setDebugOutput(true);
WiFi.mode(WIFI_STA); //เชื่อมต่อ Wifi
WiFi.begin(ssid, password);
Serial.println("\nConnecting to WiFi");
while ((WiFi.status() != WL_CONNECTED)&&(a<6)) {
Serial.print("*");
a=a+1;
delay(100);
}
//-1·แจ้งทางไลน์
// กำหนด Line Token
LINE.setToken(LINE_TOKEN);
// Initialize a NTPClient to get time
timeClient.begin();
// Set offset time in seconds to adjust for your timezone, for example:
// GMT +1 = 3600
// GMT +7 = 25200
// GMT -1 = -3600
// GMT 0 = 0
timeClient.setTimeOffset(25200);
//
configTime(timezone, dst, "pool.ntp.org", "time.nist.gov"); //ดึงเวลาจาก Server
Serial.println("\nLoading time");
while (!time(nullptr)) {
Serial.print("!time(nullptr)");
delay(100);
}
Serial.println("");
//1.ถังอาหารที่1 คือถังอาหารบนที่เติมอาหารครั้งละ20ลิตร
pinMode(motor_rhodes, OUTPUT);
pinMode(motor_local, OUTPUT);
pinMode(upper_tank_sensor, INPUT_PULLUP);
//pinMode(rhodes_tank_sensor, INPUT_PULLUP);
//pinMode(local_tank_sensor, INPUT_PULLUP);
mcp.pinMode(switch_sensor_upper_tank, OUTPUT);
//int switch_sensor_upper_tank = D1;
//D1((24 มิย.เปิดปิดไฟsensor ถังบน-switch_sensor_upper_tank)
mcp.digitalWrite(switch_sensor_upper_tank, 1);//active low 24 มิย. 65
pinMode(switch_sensor_local_tank, OUTPUT);
//int switch_sensor_local_tank =D5;
//D5(24 มิย.).เปิดปิดไฟsensor ถังไก่บ้าน-switch_sensor_local_tank)
digitalWrite(switch_sensor_local_tank, 1);//active low 24 มิย. 65
pinMode(switch_sensor_rhodes_tank, OUTPUT);
//int switch_sensor_rhodes_tank =D10;
//D10((24 มิย.เปิดปิดไฟsensor ถังไก่โร้ดส์-switch_sensor_rhodes_tank)
digitalWrite(switch_sensor_rhodes_tank, 1);//active low 24 มิย. 65
//2.ถังอาหารที่2 คือถังที่ให้อาหารไก่โรดส์กิน
pinMode(rhodes_tank_sensor, INPUT_PULLUP);// กำหนดขาทำหน้าที่ให้ขา D3 เป็น INPUT รับค่าจากเซ็นเซอิร์cntd "ถังอาหารไก่โร้ดส์: " //แทนpinMode(infrared3, INPUT);
//3.ถังอาหารที่3 คือถังที่ให้อาหารไก่บ้านกิน
pinMode(local_tank_sensor, INPUT_PULLUP);// กำหนดขาทำหน้าที่ให้ขา D6 เป็น INPUT รับค่าจากเซ็นเซอิร์local_tank_sensor //แทนpinMode(infrared3, INPUT);
digitalWrite(motor_rhodes, 1);//ปิดมอเตอร์
digitalWrite(motor_local, 1);//ปิดมอเตอร์
pinMode(ac_control, OUTPUT); //ควบคุมไฟ AC
mcp.pinMode(lamp, OUTPUT);
mcp.digitalWrite(lamp, 1);//active low
//pinMode(lamp_chick, OUTPUT);//D1(lamp_chick) 24 มิย. 65
//digitalWrite(lamp_chick, 1);//active low 24 มิย. 65
digitalWrite(ac_control, 0);//ปิดไฟ AC
///ผัก///
mcp.pinMode(solenoid_vegetable, OUTPUT);
mcp.digitalWrite(solenoid_vegetable, 1);//active low 24 มิย. 65
solenoid_vegetable_led_blynk_v21.off();
///-ผัก///
// timer.setInterval(180000L, Temptask);
timer.setInterval(12000000L, lamptask);
timer.setInterval(180000L, Temptask);
timer.setInterval(120000L, check_sensortask);
// timer.setInterval(30000L, Tempchicktask);24 มิย. 65
// timer.setInterval(12000000L, lamptask);//20 นาที
Blynk.syncAll();
}
void check_sensortask()
{
//D4(upper_tank_sensor ถังบนD4 = GPIO 2,upper_tank_sensor_val),D3(rhodes_tank_sensor"ถังอาหารไก่โร้ดส์"D3 = GPIO 0,rhodes_tank_sensor_val),D6(local_tank_sensor ไก่บ้านD6 = GPIO 12,local_tank_sensor_val),
// digitalWrite(switch_sensor_local_tank, 0);//active low 24 มิย. 65
mcp.digitalWrite(switch_sensor_upper_tank, 0);//active low 24 มิย. 65
delay(100);
upper_tank_sensor_duration = pulseIn(upper_tank_sensor, HIGH,2000);
Serial.println(upper_tank_sensor_duration);
// Blynk.virtualWrite(V18, upper_tank_sensor_duration);
if(upper_tank_sensor_duration!=0)
{
mcp.digitalWrite(switch_sensor_upper_tank, 1);//active low 24 มิย. 65
upper_tank_sensor_val_high_blynkled_v15.on();
}
else
{
upper_tank_sensor_val_high_blynkled_v15.off();
}
digitalWrite(switch_sensor_rhodes_tank, 0);//active low 24 มิย. 65
delay(100);
rhodes_tank_sensor_duration = pulseIn(rhodes_tank_sensor, HIGH,2000);
Serial.println(rhodes_tank_sensor_duration);
Blynk.virtualWrite(V19, rhodes_tank_sensor_duration);
if(rhodes_tank_sensor_duration!=0)
{
digitalWrite(switch_sensor_rhodes_tank, 1);//active low 24 มิย. 65
rhodes_tank_sensor_val = 0; //0 คิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง. แจ้งให้เต็มก่อนมิฉะนั้นมอเตอร์จะหมุน
rhodes_tank_sensor_val_high_blynkled_v16.on();
}
else
{
rhodes_tank_sensor_val_high_blynkled_v16.off();
}
digitalWrite(switch_sensor_local_tank, 0);//active low 24 มิย. 65
delay(100);
local_tank_sensor_duration = pulseIn(local_tank_sensor, HIGH,2000);
Serial.println(local_tank_sensor_duration);
Blynk.virtualWrite(V20, local_tank_sensor_duration);
if(local_tank_sensor_duration!=0 )
{
digitalWrite(switch_sensor_local_tank, 1);//active low 24 มิย. 65
local_tank_sensor_val = 0; //0 คิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง. แจ้งให้เต็มก่อนมิฉะนั้นมอเตอร์จะหมุน
local_tank_sensor_val_high_blynkled_v17.on();
}
else
{
local_tank_sensor_val_high_blynkled_v17.off();
}
Blynk.syncAll();
}
void Temptask(){
delay(dht.getMinimumSamplingPeriod());
float temperature = dht.getTemperature(); // ดึงค่าอุณหภูมิ
Serial.print("อุณหภูมิ");
Serial.println(temperature, 1);
currenttemp = temperature;
Blynk.virtualWrite(V4, temperature);
Blynk.virtualWrite(V5, humidity);
currentMillisTemp = millis();
if ((currentMillisTemp-startMillis1)<86400)// ในวันเดียวกัน
{ if (currenttemp>maxtemp) {maxtemp=currenttemp;}//if (value > maxval) { maxval = value; } // record new max value
if (currenttemp<mintemp) { mintemp = currenttemp; } // record new min value
}
else // วันใหม่
{maxtemp = currenttemp;
startMillis1 = currentMillisTemp;
}
Blynk.virtualWrite(V6, maxtemp);
Blynk.syncAll();
}
//24 มิย. 65
//void Tempchicktask()
// {
// delay(dht_chick.getMinimumSamplingPeriod());
// float temperature2 = dht_chick.getTemperature(); // ดึงค่าอุณหภูมิ
// Serial.print("อุณหภูมิรังลูกไก่");
// Serial.println(temperature2, 1);
// Blynk.virtualWrite(V11, temperature2);
// //ให้ได้อุณหภูมิ32องศา ถ้าเกิน35ให้ดับไฟ
// if (temperature2<=31)//
// {
// //เปิดหลอดไฟ
// digitalWrite(lamp_chick, 0);//active low
// Serial.println("เปิดไฟรังลูกไก่");
// lampchickblynk.on();
// }
// if (temperature2>=35)//
// {
// //ปิดหลอดไฟ
// digitalWrite(lamp_chick, 1);//active low
// Serial.println("ปิดไฟรังลูกไก่");
// lampchickblynk.off();
// }
//
//
// }
//
void lamptask()
{
if((maxtemp > 33) &&( currentHour>18) && ( currentHour<21))
{mcp.digitalWrite(lamp, 0);//เปิด active low}
}
else
{
mcp.digitalWrite(lamp, 1);// ปิด active low
}
}
void loop() {
///
check_temp();
check_time();
if ((currentHour >5) && (currentHour<14))
{ //if ((currentHour >5) && (currentHour<14))
daytime();
} //if ((currentHour >5) && (currentHour<14))
else //if ((currentHour >5) && (currentHour<14))
{ // else ((currentHour >5) && (currentHour<14))
nighttime();
} // else ((currentHour >5) && (currentHour<14))
delay(100);
//lamptask();
Blynk.run();
Blynk.syncAll();
timer.run();
}
BLYNK_WRITE(V8)
{
if (param.asInt()==1) {
digitalWrite(ac_control, 0);//เปิดไฟ AC
digitalWrite(motor_rhodes, 1);//ปิดมอเตอร์ตามเเข็ม , active low
digitalWrite(motor_local, 0);//เปิดมอเตอร์ทวนเข็ม , active low
Blynk.setProperty(V7,"color","#FF4000");// สีแดง
}
else
{
digitalWrite(ac_control, 1);//ปิดไฟ AC
delay(5000);
digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
Blynk.setProperty(V7,"color","#2EFE2E");// สีเขียว
}
}
BLYNK_WRITE(V23)
{
if (param.asInt()==1) {
digitalWrite(ac_control, 0);//เปิดไฟ AC
digitalWrite(motor_rhodes, 0);//เปิดมอเตอร์ตามเเข็ม , active low
digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
motor_rhodes_button_v23.on();
Blynk.setProperty(V7,"color","#FF4000");// สีแดง
}
else
{
digitalWrite(ac_control, 1);//ปิดไฟ AC
motor_rhodes_button_v23.off();
delay(5000);
digitalWrite(motor_rhodes, 1);//ปิดมอเตอร์ตามเเข็ม , active low
Blynk.setProperty(V7,"color","#2EFE2E");// สีเขียว
}
}
BLYNK_WRITE(V14)
{
if (param.asInt()==1) {
digitalWrite(ac_control, 0);//เปิดไฟ AC
mcp.digitalWrite(lamp, 0);//เปิด active low}
lampblynk.on();
Blynk.setProperty(V14,"color","#FF4000");// สีแดง
}
else
{
digitalWrite(ac_control, 1);//ปิดไฟ AC
// delay(5000);
mcp.digitalWrite(lamp, 1);//เปิด active low}
lampblynk.off();
Blynk.setProperty(V14,"color","#2EFE2E");// สีเขียว
}
}
/// ผัก///
BLYNK_WRITE(V22)
{
if (param.asInt()==1) {
digitalWrite(ac_control, 0);//เปิดไฟ AC
mcp.digitalWrite(solenoid_vegetable, 0);//active low 24 มิย. 65
solenoid_vegetable_led_blynk_v21.on();
}
else
{
digitalWrite(ac_control, 1);//ปิดไฟ AC
mcp.digitalWrite(solenoid_vegetable, 1);//active low 24 มิย. 65
solenoid_vegetable_led_blynk_v21.off();
}
}
///-ผัก///
void daytime()
{
Serial.println("เป็นเวลากลางวัน");
Blynk.setProperty(V3,"color","#F8ECE0");// สีครีม
//ให้มอเตอร์ทำงานได้ แต่ต้องเช็คว่าอาหารถัง1 มีไหม และ ในถัง2 หมดแล้วยัง
//ถ้าครบ2 เงื่อนไข มอเตอร์ทำงาน
upper_tank_sensor_val = digitalRead(upper_tank_sensor); // ถ้ามีอาหาร =1‚ ถ้าไม่มีอาหาร = 0 ถังอาหารบน
Serial.print("upper_tank_sensor_val: ");
Serial.println(upper_tank_sensor_val);
if (upper_tank_sensor_val == 1) // ถ้ามีอาหาร =0‚ ถ้าไม่มีอาหาร = 1 ถังอาหารบน
{
Serial.print("อาหารถังบนใกล้หมด ");
Serial.println("ปิดมอเตอร์");
Blynk.setProperty(V0,"color","#FF4000");// สีแดง
LINE.notify("อาหารไก่ใกล้หมด");
digitalWrite(motor_rhodes, 1);//ปิดมอเตอร์ตามเข็ม , active low
digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
digitalWrite(ac_control, 0);//ปิดไฟ AC
delay(5000);
} //(upper_tank_sensor_val == 1) // ถ้ามีอาหาร =0‚ ถ้าไม่มีอาหาร = 1 ถังอาหารบน
else //(upper_tank_sensor_val == 1) // ถ้ามีอาหาร =0‚ ถ้าไม่มีอาหาร = 1 ถังอาหารบน
{ //else (upper_tank_sensor_val == 1) // ถ้ามีอาหาร =0‚ ถ้าไม่มีอาหาร = 1 ถังอาหารบน
//เงื่อนไข2 ถัง2 ถ้า rhodes_tank_sensor_val== 1 คือถังไก่โร้ดส์ใกล้หมด
rhodes_tank_sensor_val = digitalRead(rhodes_tank_sensor); //"ถังอาหารไก่โร้ดส์"ในการอ่านค่าสวิตช์ที่ต่ออยู่กับ ขาD3 มาเก็บในสตัวแปล rhodes_tank_sensor_val ผ่านD3 ถ้าอาหารถัง2หมด ไฟสว่าง จะต่อวงจร จะทำให้rhodes_tank_sensor_val=0
Blynk.setProperty(V0,"color","#2EFE2E");// สีเขียว
Serial.print("ถังอาหารไก่โร้ดส์: ");
Serial.println(rhodes_tank_sensor_val);
if (rhodes_tank_sensor_val == 0) // 0=อาหารไก่โร้ดส์ยังมีอีกคิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง
{ //(rhodes_tank_sensor_val == 0) // 0=อาหารไก่โร้ดส์ยังมีอีกคิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง
Serial.print("อาหารไก่โรดยังมีอีก ");
Serial.println("ปิดมอเตอร์");
Blynk.setProperty(V1,"color","#2EFE2E");// สีเขียว
delay(2000);
digitalWrite(motor_rhodes, 1);//ปิดมอเตอร์ตามเข็ม , active low
digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
digitalWrite(ac_control, 0);// ปิดไฟ AC
delay(5000);
}//(rhodes_tank_sensor_val == 0) 0=อาหารไก่โร้ดส์ยังมีอีกคิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง
else
{ //else (rhodes_tank_sensor_val == 0) 0=อาหารไก่โร้ดส์ยังมีอีกคิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง
Serial.print("อาหารถังไก่โรดส์ใกล้หมด ");
Blynk.setProperty(V1,"color","#FF4000");// สีแดง
Serial.println("เปิดมอเตอร์");
digitalWrite(ac_control, 0);// เปิดไฟ AC
delay(2000);
digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
digitalWrite(motor_rhodes, 0);//เปิดมอเตอร์ตามเข็ม , active low
Blynk.setProperty(V7,"color","#FF4000");// สีแดง
delay(5000);//เปิดมอเตอร์ทวนเข็ม 5 วินาที
digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
Blynk.setProperty(V7,"color","#2EFE2E");// สีเขียว
delay(5000);//เปิดมอเตอร์ทวนเข็ม 5 วินาที
}//else (rhodes_tank_sensor_val == 0) 0=อาหารไก่โร้ดส์ยังมีอีกคิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง
// เริ่มตรวจถัง 3 โดยใช้ capacitive proximity sensor ยี่ห้อ CNTD
local_tank_sensor_val = digitalRead(local_tank_sensor); //ในการอ่านค่าสวิตช์ที่ต่ออยู่กับ ขาD6 มาเก็บในสตัวแปล local_tank_sensor_val ผ่านD6 ถ้าอาหารถังไก่บ้านหมด ไฟสว่าง จะต่อวงจร จะทำให้local_tank_sensor_val=0
Serial.print("ถังอาหารไก่บ้าน: ");
Serial.print("local_tank_sensor_val: ");
Serial.println(local_tank_sensor_val);
if (local_tank_sensor_val == 0) //0 คิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง
{ //(if (local_tank_sensor_val == 0) //0 คิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง
Serial.print("อาหารไก่บ้านยังมีอีก ");
Serial.println("ปิดมอเตอร์");
Blynk.setProperty(V2,"color","#2EFE2E");// สีเขียว
delay(2000);
digitalWrite(motor_rhodes, 1);//ปิดมอเตอร์ตามเข็ม , active low
digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
digitalWrite(ac_control, 0);// ปิดไฟ AC
delay(5000);
} //if (local_tank_sensor_val == 0) //0 คิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง
else //if (local_tank_sensor_val == 0) //0 คิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง
{//else if (local_tank_sensor_val == 0) //0 คิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง
Serial.print("อาหารถังไก่บ้านใกล้หมด ");
Blynk.setProperty(V2,"color","#FF4000");// สีแดง
Serial.print("อาหารถังบนยังมีอีก ");
digitalWrite(ac_control, 0);// เปิดไฟ AC
delay(2000);
digitalWrite(motor_rhodes, 1);//ปิดมอเตอร์ตามเเข็ม , active low
digitalWrite(motor_local, 0);//เปิดมอเตอร์ทวนเข็ม , active low
Blynk.setProperty(V7,"color","#FF4000");// สีแดง
delay(5000);//เปิดมอเตอร์ทวนเข็ม 5 วินาที
digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
Blynk.setProperty(V7,"color","#2EFE2E");// สีเขียว
}//else if (local_tank_sensor_val == 0) //0 คิอ อาหารยังเต็ม , ไฟเซ็นเซอร์สว่าง
} //(upper_tank_sensor_val == 1) // ถ้ามีอาหาร =0‚ ถ้าไม่มีอาหาร = 1 ถังอาหารบน
}
void nighttime()
{
Serial.println("เป็นเวลากลางคืน");// จะปิดอาหารไก่บ้าน แต่ไก่โรดส์เปิดตลอด
Blynk.setProperty(V3,"color","#6E6E6E");//Grey
//ให้มอเตอร์หยุดทำงาน
digitalWrite(motor_rhodes, 1);//ปิดมอเตอร์ตามเข็ม , active low
digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
//ให้มอเตอร์ทำงานได้ แต่ต้องเช็คว่าอาหารถัง1 มีไหม และ ในถัง2 หมดแล้วยัง
//ถ้าครบ2 เงื่อนไข มอเตอร์ทำงาน
upper_tank_sensor_val = digitalRead(upper_tank_sensor);
Serial.print("upper_tank_sensor_val: ");
Serial.println(upper_tank_sensor_val);
if (upper_tank_sensor_val == 1) //if (upper_tank_sensor_val == 1) // ถ้ามีอาหาร =0‚ ถ้าไม่มีอาหาร = 1 ถังอาหารบน
{ //if (upper_tank_sensor_val == 1) // ถ้ามีอาหาร =0‚ ถ้าไม่มีอาหาร = 1 ถังอาหารบน
Serial.print("อาหารถังบนใกล้หมด ");
Serial.println("ปิดมอเตอร์");
Blynk.setProperty(V0,"color","#FF4000");// สีแดง
LINE.notify("อาหารไก่ใกล้หมด");
digitalWrite(motor_rhodes, 1);//ปิดมอเตอร์ตามเข็ม , active low
digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
digitalWrite(ac_control, 0);//ปิดไฟ AC
delay(5000);
//break;
}//if (upper_tank_sensor_val == 1) // ถ้ามีอาหาร =0‚ ถ้าไม่มีอาหาร = 1 ถังอาหารบน
else //if (upper_tank_sensor_val == 1) // ถ้ามีอาหาร =0‚ ถ้าไม่มีอาหาร = 1 ถังอาหารบน
{ //else if (upper_tank_sensor_val == 1) // ถ้ามีอาหาร =0‚ ถ้าไม่มีอาหาร = 1 ถังอาหารบน
// เริ่มตรวจถัง 2 โดยใช้ capacitive proximity sensor แบบสีเหลือง
//เงื่อนไข2 rhodes_tank_sensor_val=1 คือถังไก่โร้ดส์ใกล้หมด
delay(2000);
rhodes_tank_sensor_val = digitalRead(rhodes_tank_sensor); //ในการอ่านค่าสวิตช์ที่ต่ออยู่กับ ขาD3 มาเก็บในสตัวแปล rhodes_tank_sensor_val ผ่านD3 ถ้าอาหารถัง2หมด ไฟสว่าง จะต่อวงจร จะทำให้rhodes_tank_sensor_val=0
Blynk.setProperty(V0,"color","#2EFE2E");// สีเขียว
Serial.print("ถังอาหารไก่โร้ดส์: ");
Serial.println(rhodes_tank_sensor_val);
if (rhodes_tank_sensor_val == 0) // ถังไก่โร้ดส์ 0=มีอีก , 1= หมด, ใช้แบบ input_pullup
//อาหารไก่โร้ดส์ยังมีอีกคิอ อาหารยังเต็ม , ไฟเซ็นเซอร์ดับ, ไม่มีไฟมาที่ ขา rhodes_tank_sensor ,HIGH คือเต็ม ยกเว้นในไก่โร้ดเพราะสลับขาที่ relay AC ที่ออกเป็น NC แต่ไก่บ้านออก NO
{ //(rhodes_tank_sensor_val == 0) // ถังไก่โร้ดส์ 0=มีอีก , 1= หมด, ใช้แบบ input_pullup
Serial.print("อาหารไก่โรดยังมีอีก ");
Serial.println("ปิดมอเตอร์");
Blynk.setProperty(V1,"color","#2EFE2E");// สีเขียว
delay(2000);
digitalWrite(motor_rhodes, 1);//ปิดมอเตอร์ตามเข็ม , active low
digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
digitalWrite(ac_control, 0);// ปิดไฟ AC
delay(5000);
}//(rhodes_tank_sensor_val == 0) // ถังไก่โร้ดส์ 0=มีอีก , 1= หมด, ใช้แบบ input_pullup
else
{ //else if(rhodes_tank_sensor_val == 0) // ถังไก่โร้ดส์ 0=มีอีก , 1= หมด, ใช้แบบ input_pullup
Serial.print("อาหารถังไก่โรดส์ใกล้หมด ");
Blynk.setProperty(V1,"color","#FF4000");// สีแดง
Serial.print("อาหารถังบนยังมีอีก ");
Serial.println("เปิดมอเตอร์");
digitalWrite(ac_control, 0);// เปิดไฟ AC
delay(2000);
digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
digitalWrite(motor_rhodes, 0);//เปิดมอเตอร์ตามเข็ม , active low,motor_rhodes=motor_rhode
Blynk.setProperty(V7,"color","#FF4000");// สีแดง
//motor3=20;
delay(5000);//เปิดมอเตอร์ทวนเข็ม 5 วินาที
digitalWrite(motor_local, 1);//ปิดมอเตอร์ทวนเข็ม , active low
Blynk.setProperty(V7,"color","#2EFE2E");// สีเขียว
}//else if(rhodes_tank_sensor_val == 0) // ถังไก่โร้ดส์ 0=มีอีก , 1= หมด, ใช้แบบ input_pullup
} //if (upper_tank_sensor_val == 1) // ถ้ามีอาหาร =0‚ ถ้าไม่มีอาหาร = 1 ถังอาหารบน
}
void check_temp()
{
//0 ตรวจสอบอุณหภูมิ
delay(dht.getMinimumSamplingPeriod());
// float motor3 = 0;
float humidity = dht.getHumidity(); // ดึงค่าความชื้น
float temperature = dht.getTemperature(); // ดึงค่าอุณหภูมิ
Serial.print("ความชื้น");
Serial.print("\t");
Serial.print(humidity, 1);
Serial.print("\t");
Serial.print("อุณหภูมิ");
Serial.println(temperature, 1);
Blynk.virtualWrite(V4, temperature);
Blynk.virtualWrite(V5, humidity);
Blynk.syncAll();
}
void check_time()
{
// //configTime(timezone, dst, "pool.ntp.org", "time.nist.gov"); //แสดงเวลาปัจจุบัน
// time_t now = time(nullptr);
// struct tm* p_tm = localtime(&now);
//1
timeClient.update();
time_t epochTime = timeClient.getEpochTime();
String formattedTime = timeClient.getFormattedTime();
Serial.print("Formatted Time: ");
Serial.println(formattedTime);
currentHour = timeClient.getHours();// int currentHour อยู่ด้านบนแล้ว เพื่อประกาศเป็น global var
Serial.print("Hour: ");
Serial.println(currentHour);
int currentMinute = timeClient.getMinutes();
Serial.print("Minutes: ");
Serial.println(currentMinute);
int currentSecond = timeClient.getSeconds();
Serial.print("Seconds: ");
Serial.println(currentSecond);
String weekDay = weekDays[timeClient.getDay()];
Serial.print("Week Day: ");
Serial.println(weekDay);
//Get a time structure
struct tm *ptm = gmtime ((time_t *)&epochTime);
int monthDay = ptm->tm_mday;
Serial.print("Month day: ");
Serial.println(monthDay);
int currentMonth = ptm->tm_mon+1;
Serial.print("Month: ");
Serial.println(currentMonth);
String currentMonthName = months[currentMonth-1];
Serial.print("Month name: ");
Serial.println(currentMonthName);
int currentYear = ptm->tm_year+1900;
Serial.print("Year: ");
Serial.println(currentYear);
//Print complete date:
String currentDate = String(weekDay) + "-" +String(monthDay) + "-" + String(currentMonth) + "-" + String(currentYear) ;
Serial.print("Current date: ");
Serial.println(currentDate);
//1
Serial.print("current Time=");
Serial.println(formattedTime);
Blynk.virtualWrite(V12, currentDate);
Blynk.virtualWrite(V13, formattedTime);
Blynk.syncAll();
}
ปัญหา
1.เซ็นเซอร์อาหารหลักไม่สว่าง แต่เซ็นเซอร์อาหารไก่บ้านและไก่โร้ดส์ สว่าง
ลำดับการทำงาน ย้อนหลัง เซ็นเซอร์ <-รีเลย์<-arduino
ที่ต้องเช็ค
อาหารในถังบนหมดอาหารเต็ม
เซ็นเซอร์ ปกติ เวลาผมต่อตรง bypass รีเลย์ เซ็นเซอร์สว่าง
รีเลย์ ปกติ เป็น low active relay , ลองต่อ gnd เข้าin จะปล่อยไฟเข้าเซ็นเซอร์
วัดโวลต์ ระหว่าง gnd กับ in ได้ 3.9v
เจอปัญหา คือ arduino ไม่ปล่อยไฟ gnd เข้าin
mcp Text