สารบัญ:

ระบบควบคุมการเข้าออกอาหารแมว (ESP8266 + เซอร์โวมอเตอร์ + การพิมพ์ 3 มิติ): 5 ขั้นตอน (พร้อมรูปภาพ)
ระบบควบคุมการเข้าออกอาหารแมว (ESP8266 + เซอร์โวมอเตอร์ + การพิมพ์ 3 มิติ): 5 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: ระบบควบคุมการเข้าออกอาหารแมว (ESP8266 + เซอร์โวมอเตอร์ + การพิมพ์ 3 มิติ): 5 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: ระบบควบคุมการเข้าออกอาหารแมว (ESP8266 + เซอร์โวมอเตอร์ + การพิมพ์ 3 มิติ): 5 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: Arduino IOT Project - DIY เครื่องให้อาหารสุนัขจาก 3D Printer + ESP8266 + Relay +Blynk APP 2024, พฤศจิกายน
Anonim
Image
Image
ระบบควบคุมการเข้าออกอาหารแมว (ESP8266 + เซอร์โวมอเตอร์ + การพิมพ์ 3 มิติ)
ระบบควบคุมการเข้าออกอาหารแมว (ESP8266 + เซอร์โวมอเตอร์ + การพิมพ์ 3 มิติ)

โปรเจ็กต์นี้ครอบคลุมขั้นตอนที่ฉันใช้สร้างชามอาหารแมวอัตโนมัติสำหรับแมวสูงอายุของฉัน Chaz เห็นไหม เขาต้องกินอาหารเช้าก่อนจึงจะได้รับอินซูลิน แต่ฉันมักจะลืมหยิบจานอาหารของเขาก่อนนอน ซึ่งจะทำให้ความอยากอาหารของเขาเสียไป และทำให้ตารางอินซูลินของเขาเสียไป จานนี้ใช้เซอร์โวมอเตอร์เพื่อปิดฝาอาหารระหว่างเวลาเที่ยงคืนถึง 7:30 น. ร่าง Arduino ของไมโครคอนโทรลเลอร์ NodeMCU ESP8266 ใช้ Network Time Protocol (NTP) เพื่อควบคุมกำหนดการ

โครงการนี้อาจไม่เหมาะสำหรับแมวที่อายุน้อยกว่าและกระฉับกระเฉงมากขึ้น Chaz แก่และเปราะบางมาก เขาไม่อยากพยายามแงะชามให้เปิด แต่มันเป็นไปได้

หากคุณเพิ่งเริ่มใช้ Arduino หรือ ESP8266 คุณอาจสนุกกับคำแนะนำเบื้องต้นต่อไปนี้:

  • คลาส Arduino
  • ชั้นเรียนอินเทอร์เน็ตของสิ่งต่าง ๆ ที่สอนได้

เสบียง

  • เครื่องพิมพ์ 3 มิติ (ฉันใช้ Creality CR-10s Pro)
  • เส้นใยเครื่องพิมพ์ 3 มิติ (ฉันใช้ PLA สีทอง)
  • NodeMCU ESP8266 ไมโครคอนโทรลเลอร์ไร้สาย
  • สาย USB (A ถึง microB)
  • อะแดปเตอร์แปลงไฟ USB
  • ไมโครเซอร์โวมอเตอร์
  • ไขควงและสกรูขนาดเล็ก
  • สายเชื่อมต่อ
  • หมุดส่วนหัว
  • บอร์ด Perma-proto

เพื่อให้ทันกับสิ่งที่ฉันทำอยู่ ติดตามฉันบน YouTube, Instagram, Twitter, Pinterest และสมัครรับจดหมายข่าวของฉัน ในฐานะที่เป็น Amazon Associate ฉันได้รับรายได้จากการซื้อที่เข้าเงื่อนไขที่คุณทำโดยใช้ลิงก์พันธมิตรของฉัน

ขั้นตอนที่ 1: ชิ้นส่วนที่พิมพ์ 3 มิติ

ชิ้นส่วนพิมพ์ 3 มิติ
ชิ้นส่วนพิมพ์ 3 มิติ
ชิ้นส่วนพิมพ์ 3 มิติ
ชิ้นส่วนพิมพ์ 3 มิติ

ที่วางชามอาหารแมวมีพื้นฐานมาจากการออกแบบของ Ardy Lai บน Thingiverse ฉันทำให้มันใหญ่ขึ้นเพื่อรองรับชามแมวของฉัน และยังทำให้มันสั้นลงเนื่องจากการปรับขนาดมันทำให้มันสูงเกินไป ฉันเพิ่มที่ยึดสำหรับไมโครเซอร์โวมอเตอร์ และรูสองสามรูสำหรับวางสายเคเบิลเข้าไปด้านใน

ฉันสร้างแบบจำลองฝาที่เรียบง่ายโดยใช้ Tinkercad ซึ่งออกแบบมาเพื่อติดกับแตรของไมโครเซอร์โว คุณสามารถคว้างานออกแบบของฉันได้โดยตรงจาก Tinkercad และ/หรือดาวน์โหลด STL ที่แนบมากับขั้นตอนนี้

ฉันพิมพ์ชิ้นส่วนบนเครื่องพิมพ์ Creality CR-10s Pro ด้วยเส้นพลาสติก PLA สีทอง

การเปิดเผยข้อมูล: ในขณะที่เขียนบทความนี้ ฉันเป็นพนักงานของ Autodesk ซึ่งทำให้ Tinkercad

ขั้นตอนที่ 2: ติดฝาปิดเข้ากับเซอร์โวมอเตอร์

ติดฝาปิดเข้ากับเซอร์โวมอเตอร์
ติดฝาปิดเข้ากับเซอร์โวมอเตอร์
ติดฝาปิดเข้ากับเซอร์โวมอเตอร์
ติดฝาปิดเข้ากับเซอร์โวมอเตอร์

ฉันใช้ดอกสว่านขนาดเล็กเพื่อเพิ่มขนาดของรูบนแตรเซอร์โว จากนั้นใช้สกรูเพื่อยึดเซอร์โวเข้ากับฝาที่พิมพ์ 3 มิติ

ขั้นตอนที่ 3: สร้างวงจร NodeMCU ESP8266

สร้างวงจร NodeMCU ESP8266
สร้างวงจร NodeMCU ESP8266
สร้างวงจร NodeMCU ESP8266
สร้างวงจร NodeMCU ESP8266
สร้างวงจร NodeMCU ESP8266
สร้างวงจร NodeMCU ESP8266
สร้างวงจร NodeMCU ESP8266
สร้างวงจร NodeMCU ESP8266

วงจรนี้ควบคุมโดยไมโครคอนโทรลเลอร์ไร้สาย NodeMCU ESP8266 ฉันใช้หมุดส่วนหัวบนบอร์ด perma-proto เพื่อให้ไมโครเซอร์โวมอเตอร์ถอดออกได้ง่าย ส่วนหัวของเซอร์โวเชื่อมต่อกับ NodeMCU ดังนี้:

สายเซอร์โวสีเหลือง: NodeMCU D1

สายเซอร์โวสีแดง: กำลังไฟ NodeMCU (3V3 หรือ VIN)

สายเซอร์โวสีดำ: กราวด์ NodeMCU (GND)

ขั้นตอนที่ 4: อัปโหลดโค้ด Arduino และทดสอบ

อัปโหลดโค้ด Arduino และทดสอบ
อัปโหลดโค้ด Arduino และทดสอบ

ติดตั้งชุดมอเตอร์/ฝาปิดของคุณเข้ากับช่องเจาะรูปมอเตอร์บนส่วนที่พิมพ์ 3 มิติของที่วางชาม เสียบส่วนหัวของมอเตอร์เข้ากับหมุดส่วนหัวของบอร์ดไมโครคอนโทรลเลอร์ และเสียบวงจรเข้ากับคอมพิวเตอร์ด้วยสาย USB

ภาพร่าง Arduino ใช้ Network Time Protocol เพื่อดึงข้อมูลเวลาปัจจุบัน จากนั้นเปิดหรือปิดฝาตามกำหนดการฮาร์ดโค้ด คัดลอกโค้ดต่อไปนี้ อัปเดตข้อมูลรับรอง wifi และออฟเซ็ตเวลา UTC แล้วอัปโหลดไปยังบอร์ด NodeMCU ของคุณโดยใช้ Arduino IDE

#รวม

#รวม #รวม #รวม ESP8266WiFiMulti wifiMulti; // สร้างอินสแตนซ์ของคลาส ESP8266WiFiMulti ที่เรียกว่า 'wifiMulti' WiFiUDP UDP; // สร้างอินสแตนซ์ของคลาส WiFiUDP เพื่อส่งและรับ IPAddress timeServerIP; // time.nist.gov ที่อยู่เซิร์ฟเวอร์ NTP const char* NTPServerName = "time.nist.gov"; ค่าคงที่ NTP_PACKET_SIZE = 48; // การประทับเวลา NTP อยู่ใน 48 ไบต์แรกของข้อความไบต์ NTPBuffer[NTP_PACKET_SIZE]; // บัฟเฟอร์เพื่อเก็บแพ็กเก็ตขาเข้าและขาออก Servo myservo; // สร้างวัตถุเซอร์โวเพื่อควบคุมเซอร์โว // สามารถสร้างวัตถุเซอร์โวสิบสองรายการบนกระดานส่วนใหญ่ได้ int pos = 0; // ตัวแปรเพื่อจัดเก็บการตั้งค่าโมฆะตำแหน่งเซอร์โว () { myservo.attach (5); // ติดเซอร์โวบนพิน 5 aka D1 กับวัตถุเซอร์โว // เปิดฝาโดยค่าเริ่มต้น Serial.println("เปิดฝา"); สำหรับ (pos = 95; pos >= 0; pos -= 1) { // เปลี่ยนจาก 95 องศาเป็น 0 องศา myservo.write (pos); // บอกให้เซอร์โวไปที่ตำแหน่งในตัวแปร 'pos' delay(15); // รอ 15ms เพื่อให้เซอร์โวไปถึงตำแหน่ง } Serial.begin(115200); // เริ่มการสื่อสารแบบอนุกรมเพื่อส่งข้อความไปยังคอมพิวเตอร์ล่าช้า(10); Serial.println("\r\n"); startWiFi(); // ลองเชื่อมต่อกับจุดเชื่อมต่อที่กำหนด จากนั้นรอการเชื่อมต่อ startUDP(); if (!WiFi.hostByName (NTPServerName, timeServerIP)) { // รับที่อยู่ IP ของเซิร์ฟเวอร์ NTP Serial.println ("การค้นหา DNS ล้มเหลว การรีบูต"); Serial.flush(); ESP.รีเซ็ต(); } Serial.print("IP เซิร์ฟเวอร์เวลา:\t"); Serial.println (timeServerIP); Serial.println("\r\nกำลังส่งคำขอ NTP …"); sendNTPpacket (timeServerIP); } unsigned long intervalNTP = 60000; // ขอเวลา NTP ทุก ๆ นาที unsigned long prevNTP = 0; LastNTPResponse นานที่ไม่ได้ลงนาม = millis(); uint32_t timeUNIX = 0; prevActualTime แบบยาวที่ไม่ได้ลงนาม = 0; วงเป็นโมฆะ () { ไม่ได้ลงนาม ยาว currentMillis = มิลลิวินาที (); if (currentMillis - prevNTP > intervalNTP) {// หากผ่านไปหนึ่งนาทีตั้งแต่คำขอ NTP ครั้งล่าสุด prevNTP = currentMillis; Serial.println("\r\nกำลังส่งคำขอ NTP …"); sendNTPpacket (timeServerIP); // ส่งคำขอ NTP } uint32_t เวลา = getTime(); // ตรวจสอบว่าการตอบสนอง NTP มาถึงแล้วและรับเวลา (UNIX) หาก (เวลา) (// หากได้รับการประทับเวลาใหม่ timeUNIX = เวลา; Serial.print("การตอบสนอง NTP:\t"); Serial.println(timeUNIX); lastNTPResponse = มิลลิวินาทีปัจจุบัน; } else if ((currentMillis - lastNTPResponse) > 360000) { Serial.println("มากกว่า 1 ชั่วโมงนับตั้งแต่การตอบกลับ NTP ครั้งล่าสุด การรีบูต"); Serial.flush(); ESP.รีเซ็ต(); } uint32_t actualTime = timeUNIX + (currentMillis - lastNTPResponse)/1000; uint32_t eastTime = timeUNIX - 18000 + (currentMillis - lastNTPResponse)/1000; if (actualTime != prevActualTime && timeUNIX != 0) { // ถ้าวินาทีที่ผ่านไปตั้งแต่การพิมพ์ครั้งล่าสุด prevActualTime = realTime; Serial.printf("\rUTC time:\t%d:%d:%d ", getHours(actualTime), getMinutes(actualTime), getSeconds(actualTime)); Serial.printf("\rEST (-5):\t%d:%d:%d ", getHours(easternTime), getMinutes(easternTime), getSeconds(easternTime)); Serial.println(); } // 7:30 น. if(getHours(easternTime) == 7 && getMinutes(easternTime) == 30 && getSeconds(easternTime) == 0){ //open the lid Serial.println("opening the lid"); สำหรับ (pos = 95; pos >= 0; pos -= 1) { // เปลี่ยนจาก 95 องศาเป็น 0 องศา myservo.write (pos); // บอกให้เซอร์โวไปที่ตำแหน่งในตัวแปร 'pos' delay(15); // รอ 15ms เพื่อให้เซอร์โวไปถึงตำแหน่ง } } // เที่ยงคืน if(getHours(easternTime) == 0 && getMinutes(easternTime) == 0 && getSeconds(easternTime) == 0){ //ปิดฝา Serial. println("ปิดฝา"); สำหรับ (pos = 0; pos <= 95; pos += 1) { // เปลี่ยนจาก 0 องศาเป็น 95 องศา // ในขั้นตอน 1 องศา myservo.write (pos); // บอกให้เซอร์โวไปที่ตำแหน่งในตัวแปร 'pos' delay(15); // รอ 15ms เพื่อให้เซอร์โวไปถึงตำแหน่ง } } /* // ทดสอบ if(getHours(easternTime) == 12 && getMinutes(easternTime) == 45 && getSeconds(easternTime) == 0){ //ปิดฝา Serial.println("ปิดฝา"); สำหรับ (pos = 0; pos = 0; pos -= 1) { // เปลี่ยนจาก 95 องศาเป็น 0 องศา myservo.write (pos); // บอกให้เซอร์โวไปที่ตำแหน่งในตัวแปร 'pos' delay(15); // รอ 15ms เพื่อให้เซอร์โวไปถึงตำแหน่ง } } */ } ถือเป็นโมฆะ startWiFi () { // ลองเชื่อมต่อกับจุดเชื่อมต่อที่กำหนด จากนั้นรอการเชื่อมต่อ wifiMulti.addAP("ssid_from_AP_1", "your_password_for_AP_1"); // เพิ่มเครือข่าย Wi-Fi ที่คุณต้องการเชื่อมต่อกับ //wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2"); //wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); Serial.println("กำลังเชื่อมต่อ"); ในขณะที่ (wifiMulti.run () != WL_CONNECTED) { // รอให้ Wi-Fi เชื่อมต่อล่าช้า (250); Serial.print('.'); } Serial.println("\r\n"); Serial.print("เชื่อมต่อกับ"); Serial.println(WiFi. SSID()); // บอกเราว่าเครือข่ายใดที่เราเชื่อมต่อกับ Serial.print("IP address:\t"); Serial.print(WiFi.localIP()); // ส่งที่อยู่ IP ของ ESP8266 ไปยังคอมพิวเตอร์ Serial.println("\r\n"); } เป็นโมฆะ startUDP () { Serial.println ("กำลังเริ่มต้น UDP"); UDP.begin(123); // เริ่มฟังข้อความ UDP บนพอร์ต 123 Serial.print("Local port:\t"); Serial.println(UDP.localPort()); Serial.println(); } uint32_t getTime() { if (UDP.parsePacket() == 0) { // หากไม่มีการตอบกลับ (ยัง) ให้คืนค่า 0; } UDP.read(NTPBuffer, NTP_PACKET_SIZE); // อ่านแพ็กเก็ตลงในบัฟเฟอร์ // รวม 4 ไบต์ประทับเวลาเป็นหนึ่งหมายเลข 32 บิต uint32_t NTPTime = (NTPBuffer [40] << 24) | (NTPBuffer[41] << 16) | (NTPBuffer[42] << 8) | เอ็นทีพีบัฟเฟอร์[43]; // แปลงเวลา NTP เป็น UNIX timestamp: // เวลา Unix เริ่มต้นในวันที่ 1 มกราคม 1970 นั่นคือ 2208988800 วินาทีในเวลา NTP: const uint32_t seventyYears = 2208988800UL; // ลบเจ็ดสิบปี: uint32_t UNIXTime = NTPTime - เจ็ดสิบปี; ส่งคืน UNIXTime; } เป็นโมฆะ sendNTPpacket (ที่อยู่ IP และที่อยู่) { memset (NTPBuffer, 0, NTP_PACKET_SIZE); // ตั้งค่าไบต์ทั้งหมดในบัฟเฟอร์เป็น 0 // กำหนดค่าเริ่มต้นที่จำเป็นในการสร้างคำขอ NTP NTPBuffer[0] = 0b11100011; // LI, เวอร์ชัน, โหมด // ส่งแพ็กเก็ตที่ร้องขอการประทับเวลา: UDP.beginPacket(ที่อยู่, 123); // คำขอ NTP คือพอร์ต 123 UDP.write (NTPBuffer, NTP_PACKET_SIZE); UDP.endPacket(); } int int getSeconds (uint32_t UNIXTime) { ส่งคืน UNIXTime % 60; } int int getMinutes (uint32_t UNIXTime) { ส่งคืน UNIXTime / 60 % 60; } int int getHours (uint32_t UNIXTime) { ส่งคืน UNIXTime / 3600 % 24; }

ขั้นตอนที่ 5: ใช้มัน

ใช้มัน!
ใช้มัน!
ใช้มัน!
ใช้มัน!

เดินสายไฟของคุณไปที่ด้านในของที่วางชาม และเสียบอุปกรณ์ป้อนอาหารแมวของคุณเข้ากับเต้ารับโดยใช้อะแดปเตอร์ AC แบบ USB วิธีเขียนโค้ดอย่างง่าย คือต้องบูตเครื่องในสถานะ "เปิด" และจะเปลี่ยนตำแหน่งฝาเมื่อถึงเวลาที่กำหนดในร่าง Arduino เท่านั้น

ขอบคุณที่ติดตามกัน! หากคุณสร้างเวอร์ชันของคุณเอง ฉันชอบที่จะเห็นมันในส่วน I Made It ด้านล่าง!

หากคุณชอบโครงการนี้ คุณอาจสนใจโครงการอื่นๆ ของฉัน:

  • ที่วางปริซึมสำหรับถ่ายภาพบุคคลสีรุ้ง
  • ผนังเก็บไม้อัดพร้อมหอแมว
  • โคมไฟโถเมสัน LED (ฝาพิมพ์ 3 มิติ)
  • เครื่องพิมพ์ 3D Filament Dry Box
  • แหล่งพลังงาน USB ฉุกเฉิน (พิมพ์ 3 มิติ)
  • เรืองแสง LED Gummy Candy
  • ชาวไร่เรขาคณิตพิมพ์ 3 มิติพร้อมระบบระบายน้ำ
  • ดอกไม้พิมพ์ 3 มิติที่เร่าร้อน
  • วิธีการติดตั้งไฟ LED ใต้สกู๊ตเตอร์ (พร้อม Bluetooth)

เพื่อให้ทันกับสิ่งที่ฉันทำอยู่ ติดตามฉันบน YouTube, Instagram, Twitter และ Pinterest

แนะนำ: