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

แก้ใหม่
ผมย้ายมาอยู่ใน loop และ
ใช้ if แทน while ไม่มี stack overflow แล้ว แต่ มันยังข้ามเงื่อนไข if ได้อีก

    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นาที");
          if (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.                  
       if ((currentHour >17) && (currentHour<18) &&  (periodMillisevening_watering>=10800000));//  10800000ms=3hrs. 
          periodMillisevening_watering=millis()-startMillisevening_watering;
          Serial.println("รดน้ำตอนเย็น15นาที");
        { //if ((currentHour >5) && (currentHour<14))
          if (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 >17) && (currentHour<18) &&  (periodMillisevening_watering>=10800000));//  10800000ms=3hrs. 

แต่ใน serial ยังสามารถเข้าได้ใน 2เงื่อนไขรดน้ำเลย จริงยังไม่ถึงเวลา

14:53:35.213 -> รดน้ำตอนเช้า15นาที
14:53:35.213 -> รดน้ำตอนเย็น15นาที
14:53:42.641 -> ความชื้น	78.0	อุณหภูมิ31.0
14:53:43.062 -> Formatted Time: 14:53:42
14:53:43.062 -> Hour: 14
14:53:43.109 -> Minutes: 53
14:53:43.109 -> Seconds: 42
14:53:43.109 -> Week Day: ศุกร์
14:53:43.156 -> Month day: 1
14:53:43.156 -> Month: 7
14:53:43.156 -> Month name: กรกฎาคม
14:53:43.203 -> Year: 2022
14:53:43.249 -> Current date: ศุกร์-1-7-2022
14:53:43.249 -> current Time=14:53:42
14:53:43.577 -> รดน้ำตอนเช้า15นาที
14:53:43.624 -> รดน้ำตอนเย็น15นาที

เจอจุดผิด 3จุด ผมยังงงว่าทำไม ยอมให้ upload ได้, ปกติจะติดที่ verifyก่อน
พอแก้แล้วก็โอเคครับ

   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นาที");
          if (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.                  
       if ((currentHour >17) && (currentHour<18) &&  (periodMillisevening_watering>=10800000))//  10800000ms=3hrs. 
         { periodMillisevening_watering=millis()-startMillisevening_watering;
          Serial.println("รดน้ำตอนเย็น15นาที");
         //if ((currentHour >5) && (currentHour<14))
          if (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 >17) && (currentHour<18) &&  (periodMillisevening_watering>=10800000));//  10800000ms=3hrs. 

ในserial

15:10:36.440 -> Year: 2022
15:10:36.440 -> Current date: ศุกร์-1-7-2022
15:10:36.474 -> current Time=15:10:36
15:10:44.252 -> ความชื้น	78.0	อุณหภูมิ31.0
15:10:44.658 -> Formatted Time: 15:10:44
15:10:44.658 -> Hour: 15
15:10:44.692 -> Minutes: 10
15:10:44.692 -> Seconds: 44
15:10:44.692 -> Week Day: ศุกร์
15:10:44.725 -> Month day: 1
15:10:44.759 -> Month: 7
15:10:44.759 -> Month name: กรกฎาคม
15:10:44.794 -> Year: 2022
15:10:44.828 -> Current date: ศุกร์-1-7-2022
15:10:44.862 -> current Time=15:10:44

ได้แล้วครับ
โค้ดรดน้ำต้นไม้ เริ่ม ตั้งแต่เที่ยง กว่าจะเสร็จก็เย็น

ผมตั้งเงื่อนไขครั้งที่1​ว่า
รดน้ำวันละ2ครั้ง
รดช่วง6โมงเช้า และ6โมงเย็นทุกวัน
รดครั้งละ15นาที
แสดงในblynkได้ด้วย…
แค่นี้ … ปาไป4ชั่วโมง :sleepy: และลองคิดเอง ไม่อยากดูตย. แล้ว เพราะในตย.มีการเขียนโค้ดระดับมืออาชีพ สั้นๆบรรทัดเดียว และมีวงเล็บปิดเป็น4-5ชั้นแบบนี้ เราอ่านไม่เข้าใจ ก๊อปมาก็ใช้ได้ แต่ในใจยังสงสัยว่าในโค้ดเหล่านั้น เพราะความรู้น้อยของเราเอง

ผมลองหลายครั้ง สุดท้ายที่มันwork มันประหลาดชอบกล คือ ถ้าผมใช้ if ก๊อกน้ำมันจะเปิดๆปิดๆ พอผมเปลี่ยนใช้ while แทน if ตำแหน่งเดียว ก๊อกน้ำจะเปิดต่อเนื่องตามเวลาที่กำหนด แต่หลังจากwhileทำงานเสร็จผมก็ใช้ if อีกที เพื่อจะแก้เวลาเริ่มต้นใหม่
ดังข้างล่าง จึงอยากให้เพื่อนช่วยชี้แนะว่าควรเขียนแบบไหนที่เข้าท่าหน่อย 555

void   check_time_for_watering()
  {
       if ((currentHour >=6) && (currentHour<=7)&&  (periodMillismorning_watering>=10800000))//  10800000ms=3hrs. 
         { 
          periodMillismorning_watering=millis()-startMillismorning_watering;
          Serial.println("รดน้ำตอนเช้า15นาที");
          unsigned long interval=millis();
          while (millis() <interval +10000)  //900000=15min//60000=1min
          {
         digitalWrite(solenoid_vegetable, 0); //low active
         solenoid_vegetable_button_blynk_v22.on();
         solenoid_vegetable_led_blynk_v21.on();
         }
         
         if (millis() >= startMillisevening_watering +10000)  //900000=15min//60000=1min
         {
//          startMillisevening_watering=millis();
          startMillismorning_watering=millis();
         digitalWrite(solenoid_vegetable, 1); //low active
         solenoid_vegetable_button_blynk_v22.off();
         solenoid_vegetable_led_blynk_v21.off();
         
         
         } //if (millis() >= startMillisevening_watering +10000)  //900000=15min//60000=1min
         }//if ((currentHour >=6) && (currentHour<=7)&&  (periodMillismorning_watering>=10800000))//  10800000ms=3hrs. 
       if ((currentHour >=15) && (currentHour<=17)&&  (periodMillisevening_watering>=30000))//  10800000ms=3hrs. 
         { 
          periodMillisevening_watering=millis()-startMillisevening_watering;
          Serial.println("รดน้ำตอนเย็น15นาที");
          unsigned long interval=millis();
          while (millis() <interval +10000)  //900000=15min//60000=1min
          {
         digitalWrite(solenoid_vegetable, 0); //low active
         solenoid_vegetable_button_blynk_v22.on();
         solenoid_vegetable_led_blynk_v21.on();
//          startMillisevening_watering=millis();
         }
         
         if (millis() >= startMillisevening_watering +10000)  //900000=15min//60000=1min
         {
          startMillisevening_watering=millis();
         digitalWrite(solenoid_vegetable, 1); //low active
         solenoid_vegetable_button_blynk_v22.off();
         solenoid_vegetable_led_blynk_v21.off();
         } //if((currentHour >17) && (currentHour<18) &&  (periodMillisevening_watering>=10800000));//  10800000ms=3hrs. 
         }
  }


node1

node2

ขนาดnodemcuสามารถทำงานได้ขนาดนี้…
แล้วESP32จะขนาดไหน…
เท่าที่ผมลองใช้nodemcuมา
อยากเชียร์เพื่อนๆให้เริ่มใช้ ESP32ให้เร็วที่สุดครับ จะได้ไม่ต้องเสียเวลามาอัพเกรดทีหลังเหมือนผม

หากเป็นงานที่ไม่ซัพซ้อน มาก ใช้ mcu ธรรมดาก็ได้ครับ เช่น รับส่งสั่งงานธรรมดา ราคาถูกกว่า แต่ถ้าเริ่มมี sensor 2 ตัวขึ้นไป ข้ามไปใช้ esp32 ได้เลย

เดียวผมจะขยับไปเลย pi pico w ตัวไหมดูจะเสถียร มากน้อยแค่ไหน

ตอนนี้ มีiotอะไรบ้างที่มีeco systemเท่ากับหรือมากกว่าและราคาถูกกว่าๆและประสิทธิภาพ​ดีกว่าnodemcu/esp32ไหมครับ

ครับ เห็นด้วยครับ
โดยมีเงื่อนไขว่าต้องประสบเจอด้วยตัวเอง… แล้วจะเชื่อ 5555
ถ้าบอกกับคนเพิ่งเริ่ม(แบบศึกษา​ด้วยตัวเองล้วนๆ)​ ผมว่าไม่มีใครstartด้วยesp32เลย
เพราะส่วนหนึ่งสื่อต่างๆโดยเฉพาะyt. 90%เสนอแต่nodemcuเท่านั้น อันนี้​แหละคนเริ่มต้องตามสื่อก่อน เช่นผมเป็นต้น


สาย​เซ็นเซอร์​โดนหนูกัด

1 Likes

ผมว่าจะทักอยู่ว่าปล่อยสายงี้หนูไม่กัดหรอ ที่ร้านผมกล้องหมูกัดไป 2 ตัวแล้ว

วิธีแก้คือ ใส่เปป

ok ครับ เดี๋ยว​หามาใส่


ปัญหาแบตสำรอง​โวลต์ตกลงมาเรื่อยๆ วัดไฟออกจาก3กว่าเหลือ2กว่า ทั้งๆที่ ไฟเข้าวัดได้4.2v และไม่ได้ต่อโหลดใดๆ

ลองตัดสายที่เข้าแบต1เส้น ดังนั้นไฟที่ออกจากชาร์จโมดูล ควรไม่ต่ำกว่า4V
แต่ที่วัดขาออกจากโมดูลได้แค่2.4v ครับ
ด้านหลังบอร์ดมีรอยไหม้ด้วย
สรุป เป็นที่ชาร์จโมดูลชาร์จ


อแดปเตอร์สำหรับเลี้ยงบอร์ด ยังดีครับ วัดได้5v

ขาร้อนจนเอียงข้างหนึ่ง
sony ericsonก็จ่ายไหวครับ แม้ว่ากระแสเพียง 450mA

หมายเหตุแก้ไขใหม่เมื่อกี้มัลติมิเตอร์สายชำรุดครับ

1 Likes

เอ่ ผมว่ามันมีอะไรแปลกๆ นะนิ ต่ออะไรผิดรึป่าวนะ

แต่ 0.45 A มันน้อยไปจริงๆ อย่างน้อย ต้อง 1 A ละ

เทียบกันช่วงนี้ mcu นำมาก่อนเยอะครับ Arduino ก็พึ่งตามมาทีหลัง เริ่มทำตัว wifi มี ระบบ iot รองรับ แต่ความเร็วยังสู้ mcu ไม่ได้เลย ราคาก็แพงหลักพัน ผมก็มี

อีกตัวที่เป็นความหวังของหมูบ้านกำลังมาก็ ตระกูล raspberry pi pico ตอนนั้นมาแต่ไม่มี wifi มาด้วย ก็ยังไม่นับว่าเป็น iot

แต่ล่าสุดก็ติด wifi มาให้แล้ว ราคาก็เคียงบ่าเคียงไหล่กับ esp32 ที่ 200 บาท ซึ่งน่าจะมาวัดที่ความเสถียรแล้วละ

ไม่ผิดครับ มันเป็นฝุ่นในเล้าไก่ และรอยบัดกรีครับ

1 Likes

ครับ น้อยไป เดี๋ยว​จะพ่วงเพิ่มเข้าอีกครับ
จะได้เคลียร์อแดปเตอร์​เก่าๆไปใช้ 555

ชาร์จโมดูลทำงานโอเวอร์โหลดด้วย สามารถชาร์จ18650แค่ก้อนเดียว แต่ผมพ่วง2ก้อน 555
และอีก3สาเหตุ​คือ
1.ตู้ที่ตั้งแบตนี้รูระบายอากาศน้อยไป
2.ใช้2node ใช้เลี้ยงเซ็นเซอร์, รีเลย์หลายอัน
3.mcp23017 ผมยังต่อกับvcc, gndอยู่ลืมถอดออก เคยอ่านเขาว่า mcp23017กินไฟ 3-4แอมป์(แต่ไม่ชัวร์ข้อนี้)

ดังนั้นเอาชาร์จโมดูล2ตัวชาร์จต่อขนานกับแบตเดิม

แทนตัวที่เสีย

เจออแดปเตอร์​โนเกียร์5v350mAเสริมเข้าไปอีกตัว
!
16567459234647448286621356782841|500x500



เสร็จ​แล้ว​ครับ
ที่โมดูลชาร์จวัดขาเข้า 4.16v,ออก 3.96v

Arduino nano 33 iot

ราคา, ความเสถียร, ขาi/0 เทียวกับnodemcu/esp32อย่างไร​ครับ​

ราคาแพงกว่า 5 เท่า ผมเคยแปลงโค้ตหลายหมื่นบรรทัดจากที่เคยรันลื่นๆ บน esp32 ปรากฎว่ายังไม่ถึงครึ่ง ก็จอดสนิท เนื่องจากว่า speed มันน้อยกว่าอยู่แล้ว

ถ้าเทียบเฉพาะการจับ wifi การรีเซตตัวเอง wdt น่าจะดีกว่า เพราะถ้ามันไม่ไหวมันก็บอกไม่ไหว

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

node1

node2

มีการออฟไลน์node1 แต่node2ยังออนไลน์อยู่
ทั้งๆที่ใช้wifiเดียวกัน, เริ่มเวลาconnect blynk serverพร้อมกัน, แบตเตอรี่​ตัวเดียวกัน…
สาเหตุ​จากอะไรได้บ้างครับ
อัพเดท
1.ปิดswitchทุกpin ก็ยังหลุด
2.ถอดnode1 ออกจากbase ก็ยังหลุด
3.เปลี่ยนnode1 ใช้nodemcuใหม่ก็ไม่หลุดแล้ว อาจเป็นเพราะnode1มันใช้นานกว่าnode2
อัพเดท
node1หยุดการทำงานอีกแล้ว ปกติจะมีไฟไปเลี้ยงเซ็นเซอร์ แม้ว่าหลุดจากblynkก็ตาม แต่ไม่มีไฟจ่ายจากnode1 เลย
อัพเดท
เริ่มโดยปิดหมดทุกpin แล้วกดปุ่มรีเซ็ต แล้ว connect blynk,แล้วไล่เปิดแต่ละpin ห่างกัน1 นาที ปรากฏว่า เปิดจนครบทุกpin ไม่offlineจากblynkเลย…และสามารถสั่งรีเลย์ตามเงื่อนไขทุกประการ
มีการ ต่อ blynk สัก 5 นาที แล้ว Off แล้วต่อใหม่อีก
สรุป ไม่รู้ว่าเป็นจากเหตุใด

ปล. 2-3วันมานี้ไม่สามารถดูผลทาง serial monitor ได้ เลยต้องอาศัย blynk ไปก่อนครับ