Nodemcu-เลี้ยงไก่-ปลูกผักกินเอง(ตอน2)

ใช่ครับ อยากลองแบบเพียวๆบ้าง มีตย.เยอะด้วยครับ
ที่ผมรู้ ก็มี resistorที่ต้องเพิ่มที่scl,sda
และบัดกรีต่อสายแต่ละขา
และที่สำคัญ address a0,a1,a2 ยังไม่ต่ออะไร ถ้าmoduleสำเร็จต่อลงgndแล้ว ทำให้การต่อตัวถัดไปจะทำไม่ได้(คิดเอง)

1 Likes

จะดูว่ามันเสียจริงไหมใช่ไหม งั้นลองเทสดูครับ แล้วแชร์ผลให้ดูหน่อยนะ ผมก็อยากรู้

เมื่อวานลองทั้งวันจนเหนื่อยเลย 555
ผมจะส่งตัวนี้ให้พี่ลองเอาไหมครับ
ถ้าได้ยกให้พี่เลย

ที่ผมนี้โมดูลเยอะแล้วครับ 555 เก็บไว้ก่อนนะ ตอนนี้ยังไม่มีแพลนจะใช้ อะไร

ต่อไปอาจจะทำศูนย์บริจาคของ เว็บใครไม่ได้ใช้ จะทิ้งก็ส่งมาได้ เผื่อน้องๆ ไม่มีเงินซื้ออยากเรียนก็ส่งต่อไป

ตอนนี้เว็บยังใหญ่ไม่พอ ยังเล็กๆ อยู่ อิอิ

ได้ครับ
รอให้ระบบอาหารไก่ทำงานได้ก่อน เดี๋ยวจะแยกลองทำกับnodemcuอื่นดูครับ
อย่างไรก็ตามผมจะreserved D1,D2ไว้เผื่อสามารถใช้งานได้ในอนาคต


สร้างบ้านใหม่ให้node2อยู่

1 Likes

ผมชอบเว็บนี้ลูกเล่นเยอะมากครับ
และแอดมินเก่งด้วยครับ

ทำสนอง Need ตัวเองล้วนๆ ครับ ยินดีที่ชอบ ใช้ให้เต็มที่ให้เกิดประโยชน์แก่ตัวเองให้มากที่สุดครับ เนื้อหาที่เราถามตอบกันในนี้ ต่อไปจะเป็นประโยชน์แก่ผู้คนในภายหลังอย่างแน่นอน

เหมือนกันที่ผมทำตอนนี้ สนองกิเลสเหมือนกัน เพียงได้มีโจทย์เช่นเลี้ยงไก่, ปลูกผักเป็นต้น

ผมลองใช้sketchเดียวกันนี้มาupload esp32 ปรากฏ​ว่า​ สามารถแสดงผลในserial monitorครับไม่มีอาการstack overflow แบบที่เกิดกับnodemcu

1 Likes

Esp32 มันเร็วกว่าอยู่แล้วครับ cpu มัน 2 core


สายไฟจากช้อปปี้1,2 , ลาซาด้า1, 2
ท่อไมโครเป็นของเดิมที่เก็บไว้ครับ

1 Likes

ทำสวิทช์ย่อยสำหรับตัดต่อ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

image

image

ขา 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 แล้วครับ