ใช่ครับ อยากลองแบบเพียวๆบ้าง มีตย.เยอะด้วยครับ
ที่ผมรู้ ก็มี resistorที่ต้องเพิ่มที่scl,sda
และบัดกรีต่อสายแต่ละขา
และที่สำคัญ address a0,a1,a2 ยังไม่ต่ออะไร ถ้าmoduleสำเร็จต่อลงgndแล้ว ทำให้การต่อตัวถัดไปจะทำไม่ได้(คิดเอง)
จะดูว่ามันเสียจริงไหมใช่ไหม งั้นลองเทสดูครับ แล้วแชร์ผลให้ดูหน่อยนะ ผมก็อยากรู้
เมื่อวานลองทั้งวันจนเหนื่อยเลย 555
ผมจะส่งตัวนี้ให้พี่ลองเอาไหมครับ
ถ้าได้ยกให้พี่เลย
ที่ผมนี้โมดูลเยอะแล้วครับ 555 เก็บไว้ก่อนนะ ตอนนี้ยังไม่มีแพลนจะใช้ อะไร
ต่อไปอาจจะทำศูนย์บริจาคของ เว็บใครไม่ได้ใช้ จะทิ้งก็ส่งมาได้ เผื่อน้องๆ ไม่มีเงินซื้ออยากเรียนก็ส่งต่อไป
ตอนนี้เว็บยังใหญ่ไม่พอ ยังเล็กๆ อยู่ อิอิ
ได้ครับ
รอให้ระบบอาหารไก่ทำงานได้ก่อน เดี๋ยวจะแยกลองทำกับnodemcuอื่นดูครับ
อย่างไรก็ตามผมจะreserved D1,D2ไว้เผื่อสามารถใช้งานได้ในอนาคต
ผมชอบเว็บนี้ลูกเล่นเยอะมากครับ
และแอดมินเก่งด้วยครับ
ทำสนอง Need ตัวเองล้วนๆ ครับ ยินดีที่ชอบ ใช้ให้เต็มที่ให้เกิดประโยชน์แก่ตัวเองให้มากที่สุดครับ เนื้อหาที่เราถามตอบกันในนี้ ต่อไปจะเป็นประโยชน์แก่ผู้คนในภายหลังอย่างแน่นอน
เหมือนกันที่ผมทำตอนนี้ สนองกิเลสเหมือนกัน เพียงได้มีโจทย์เช่นเลี้ยงไก่, ปลูกผักเป็นต้น
ผมลองใช้sketchเดียวกันนี้มาupload esp32 ปรากฏว่า สามารถแสดงผลในserial monitorครับไม่มีอาการstack overflow แบบที่เกิดกับnodemcu
Esp32 มันเร็วกว่าอยู่แล้วครับ cpu มัน 2 core
ทำสวิทช์ย่อยสำหรับตัดต่อpin
เพราะส่วนใหญ่ถ้าpinยังต่อกับอุปกรณ์ภายนอก มักทำให้uploadไม่สำเร็จ ผมต้องปิดการเชื่อมต่อทุกขาก่อนuploadเสมอ…
ไม่ทราบว่าเพื่อนๆจะเป็นแบบผมไหมครับ
ตู้node2 - ยังไม่เสร็จ
ตู้node1
เป็นครับ โดยเฉพาะ rx tx ต้องเอาออกก่อนถึง upload ได้
ลองดูถ้ามีเวลาครับ เผื่อเป็น กรณีเดียวกัน
สำหรับใครที่ใช้ esp32 ติดต่อ PZEM ด้วย Library ที่ให้มา จะสังเกตว่าช่วงการ UPLOAD หรือเมื่อกดปุ่มรีเซ็ตESP32 จะ Error และไม่สามารถทำงานต่อได้ วิธีการแก้ไขจะเป็นตาม Diagram นี้นะครับ #ESP32 #PZEM-004T
จากแผนภาพเราจะสังเกตว่าสาเหตุที่ไม่สามารถอัพโหลด ESP32 หรือกดปุ่มรีเซ็ต ESP32 แล้วโปรแกรมทำงานต่อได้ เนื่องจากมีไฟเลี้ยง 5 vdc ป้อนเข้าบอร์ดของ PZEM ตลอดเวลา ซึ่งมีผลทำให้ทำให้ Hardware serial ทำงานดังนั้น จึงใช้ทรานซิสเตอร์เบอร์ 2N3906 เป็นตัวตัดและต่อไฟเลี้ยง 5 โวลต์เข้าบอร์ด PZEM โดยเมื่อ ESP32 เริ่ม Boot ตัวเองจะตัดไฟเลี้ยง 5vdc ออก และเมื่อ esp32 เริ่มทำงานจึงจะต่อให้ไฟเลี้ยง 5 vdc จ่ายเข้าบอร์ดของ PZEM
ขา Collector เปฌนลูกศรขาออกนะครับ มันจะไปต่อ ขั้ว 5Vdc ของ PZEM
ขอบคุณครับ
เอาไว้โปรเจคหน้า ผมจะเริ่มใช้ esp32ล่ะ
ขอบคุณครับ
sketchวันนี้ ของnode2
// รดน้ำเช้าเย็น.เช้าเวลา 7.00น. เย็นเวลา 18.00น.
//Digital pins 0—15 can be INPUT, OUTPUT, or INPUT_PULLUP
//node2
//D0D0/GPIO16,INPUT_PULLDOWN,D1(reserved),D2(reserved),D3(dht),D4(lamp_chickไฟสำหรับลูกไก่),D5(lamp),D6((dht_chick ลูกไก่)),
//D7(solenoid_vegetable),
//ให้ได้อุณหภูมิ32องศา ถ้าเกินให้ดับไฟ
//
#include <Wire.h>
//-1·แจ้งทางไลน์
#include <TridentTD_LineNotify.h>
#define LINE_TOKEN "xxx"
// HIGH คือ หมด LOW คือมี
//0.ดึงเวลาจากเน็ตมาใช้
#include <NTPClient.h>
#include <time.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
//1 ขึ้น Blynk
#include <BlynkSimpleEsp8266.h>
#define BLYNK_PRINT Serial;
WidgetLED lampblynk(V9);
WidgetLED lamp_button_V8(V8);
WidgetLED lamp_chick_button_V14(V14);
WidgetLED lamp_chick_led_v10(V10);
bool morning_watering = 0;
bool evening_watering = 0;
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[]="cccc"
const char *ssid = "zzzzzz";
const char *password = "xxxxxx";
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 ชั่วโมง
#define switch_sensor_upper_tank 22
//int switch_sensor_upper_tank = 22//D1;
int lamp_chick = D4;// 24มิย65
int lamp = D5;
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 startMillismorning_watering=0;
unsigned long periodMillismorning_watering;
unsigned long startMillisevening_watering=0;
unsigned long periodMillisevening_watering;
unsigned long startMillisReadData;
unsigned long currentMillisReadData;
const unsigned long periodReadData = 1000;
unsigned long startMillis1;
BlynkTimer timer;
//0 ตรวจสอบอุณหภูมิ
#include "DHT.h"
DHT dht;
DHT dht_chick;//29 มิย. 65
// เก็บข้อมูลอุณหภูมิ ทุกครึ่งชั่วโมง
///ผัก///
int solenoid_vegetable=D7;
WidgetLED solenoid_vegetable_led_blynk_v21(V21);
//button solenoid_vegetable_button_blynk_v22
///-ผัก///
void setup()
{
//while (!Serial);
solenoid_vegetable_led_blynk_v21.on();
// uncomment appropriate mcp.begin
startMillis1 = millis();
Serial.begin(9600);
//dht11
dht.setup(D3); // ขาD3
dht_chick.setup(D6); // ขาD6
// Blynk.begin(auth, ssid, password);
Blynk.begin(auth, ssid, password, "oasiskit.com", 8080);
//widget ใน blynk
//-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("");
pinMode(lamp, OUTPUT);
digitalWrite(lamp, 1);//active low
pinMode(lamp_chick, OUTPUT);//D4(lamp_chick) 24 มิย. 65
digitalWrite(lamp_chick, 1);//active low 24 มิย. 65
///ผัก///
pinMode(solenoid_vegetable, OUTPUT);
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(12000000L, lamptask);//20 นาที
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();
}
void lamptask()
{
if((maxtemp > 33) &&( currentHour>18) && ( currentHour<21))
{digitalWrite(lamp, 0);//เปิด active low}
}
else
{
digitalWrite(lamp, 1);// ปิด active low
}
}
void loop() {
///
check_temp();
check_time();
check_time_for_watering();
// watering_task();
digitalWrite(lamp_chick, 0);//active low 24 มิย. 65
delay(3000);
digitalWrite(lamp_chick, 1);//active low 24 มิย. 65
delay(3000);
delay(100);
//lamptask();
Blynk.run();
Blynk.syncAll();
timer.run();
}
void check_time_for_watering()
{
periodMillismorning_watering=millis()-startMillismorning_watering;
if ((currentHour >5) && (currentHour<7) && (periodMillismorning_watering>=10800000));// 10800000ms=3hrs.
{ //if ((currentHour >5) && (currentHour<7)) && periodMillismorning_watering>=10800000;// 10800000ms=3hrs.
startMillismorning_watering=millis();
Serial.println("รดน้ำต้นไม้15นาที");
while (millis() <startMillismorning_watering +900000) //900000=15min
{
digitalWrite(solenoid_vegetable, 0); //low active
}
digitalWrite(solenoid_vegetable, 1); //low active
morning_watering = 1;
evening_watering = 0;
startMillismorning_watering=millis();
}//if ((currentHour >5) && (currentHour<7)) && periodMillismorning_watering>=10800000;// 10800000ms=3hrs.
periodMillisevening_watering=millis()-startMillisevening_watering;
if ((currentHour >17) && (currentHour<18) && (periodMillisevening_watering>=10800000));// 10800000ms=3hrs.
{ //if ((currentHour >5) && (currentHour<14))
while (millis() <startMillisevening_watering +900000) //900000=15min
{
digitalWrite(solenoid_vegetable, 0); //low active
}
digitalWrite(solenoid_vegetable, 1); //low active
startMillisevening_watering=millis();
morning_watering = 0;
evening_watering = 1;
} //if ((currentHour >5) && (currentHour<14))
}
BLYNK_WRITE(V8)
{
if (param.asInt()==1) {
digitalWrite(lamp, 0);//เปิด active low}
lampblynk.on();
}
else
{
// delay(500 0);
digitalWrite(lamp, 1);//เปิด active low}
lampblynk.off();
lamp_button_V8.on();
}
}
BLYNK_WRITE(V14) //หลอดไฟไก่เล็ก
{
if (param.asInt()==1) {
digitalWrite(lamp_chick, 0);//เปิด active low}
lamp_chick_led_v10.on();
}
else
{
// delay(500 0);
digitalWrite(lamp, 1);//เปิด active low}
lamp_chick_led_v10.off();
}
}
/// ผัก///
BLYNK_WRITE(V22)
{
if (param.asInt()==1) {
digitalWrite(solenoid_vegetable, 0);//active low 24 มิย. 65
solenoid_vegetable_led_blynk_v21.on();
}
else
{
digitalWrite(solenoid_vegetable, 1);//active low 24 มิย. 65
solenoid_vegetable_led_blynk_v21.off();
}
}
///-ผัก///
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();
}
ผมให้หลอด lamp_chick ทำงานเปิดปิดได้
แต่พอดูใน serial monitor ปกติ 80% อีก20%เป็นแบบนี้
13:45:54.456 -> >>>stack>>>
13:45:54.456 -> 3fffff00: 3fffff34 000007e6 3ffefa94 4020900c
13:45:54.503 -> 3fffff10: 00000000 00000000 00000000 00000000
13:45:54.550 -> 3fffff20: 00000000 4bc6a7f0 4189374b 00000000
13:45:54.597 -> 3fffff30: 00000000 00000000 4bc6a7f0 00000000
13:45:54.690 -> 3fffff40: 3fffdad0 3ffef900 401065f8 000025b9
13:45:54.737 -> 3fffff50: 00000000 00000000 00000000 4020b885
13:45:54.784 -> 3fffff60: 002b9e33 00000000 3ffefcc8 4020b8b0
13:45:54.831 -> 3fffff70: 00000000 00000000 0000000d 000dbba0
13:45:54.877 -> 3fffff80: 3ffe84dc 3ffef900 3ffe84dc 40207d6a
13:45:54.924 -> 3fffff90: 40208bb8 00000000 00000000 3ffefda0
13:45:54.971 -> 3fffffa0: 3fffdad0 00000000 3ffefd98 402092c2
13:45:55.018 -> 3fffffb0: 3fffdad0 00000000 3ffefd98 4020c328
13:45:55.065 -> 3fffffc0: feefeffe feefeffe 3ffe8628 40100739
13:45:55.158 -> <<<stack<<<
เราอยากทราบได้อย่างไรว่า มันเป็นerror ส่วนใดของ sketch ครับ
เคยอ่านผ่านๆว่า สามารถ decoder ได้ แต่ทำไม่เป็น
…
ผมลอง comment(//) ที่ไม่ให้เรียก void check_time_for_watering() ก็ไม่มี stack overflow แล้วครับ