สารบัญ:
- เสบียง
- ขั้นตอนที่ 1: ชิ้นส่วนที่พิมพ์ 3 มิติ
- ขั้นตอนที่ 2: ติดฝาปิดเข้ากับเซอร์โวมอเตอร์
- ขั้นตอนที่ 3: สร้างวงจร NodeMCU ESP8266
- ขั้นตอนที่ 4: อัปโหลดโค้ด Arduino และทดสอบ
- ขั้นตอนที่ 5: ใช้มัน
วีดีโอ: ระบบควบคุมการเข้าออกอาหารแมว (ESP8266 + เซอร์โวมอเตอร์ + การพิมพ์ 3 มิติ): 5 ขั้นตอน (พร้อมรูปภาพ)
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:03
โปรเจ็กต์นี้ครอบคลุมขั้นตอนที่ฉันใช้สร้างชามอาหารแมวอัตโนมัติสำหรับแมวสูงอายุของฉัน 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 มิติ
ที่วางชามอาหารแมวมีพื้นฐานมาจากการออกแบบของ Ardy Lai บน Thingiverse ฉันทำให้มันใหญ่ขึ้นเพื่อรองรับชามแมวของฉัน และยังทำให้มันสั้นลงเนื่องจากการปรับขนาดมันทำให้มันสูงเกินไป ฉันเพิ่มที่ยึดสำหรับไมโครเซอร์โวมอเตอร์ และรูสองสามรูสำหรับวางสายเคเบิลเข้าไปด้านใน
ฉันสร้างแบบจำลองฝาที่เรียบง่ายโดยใช้ Tinkercad ซึ่งออกแบบมาเพื่อติดกับแตรของไมโครเซอร์โว คุณสามารถคว้างานออกแบบของฉันได้โดยตรงจาก Tinkercad และ/หรือดาวน์โหลด STL ที่แนบมากับขั้นตอนนี้
ฉันพิมพ์ชิ้นส่วนบนเครื่องพิมพ์ Creality CR-10s Pro ด้วยเส้นพลาสติก PLA สีทอง
การเปิดเผยข้อมูล: ในขณะที่เขียนบทความนี้ ฉันเป็นพนักงานของ Autodesk ซึ่งทำให้ Tinkercad
ขั้นตอนที่ 2: ติดฝาปิดเข้ากับเซอร์โวมอเตอร์
ฉันใช้ดอกสว่านขนาดเล็กเพื่อเพิ่มขนาดของรูบนแตรเซอร์โว จากนั้นใช้สกรูเพื่อยึดเซอร์โวเข้ากับฝาที่พิมพ์ 3 มิติ
ขั้นตอนที่ 3: สร้างวงจร NodeMCU ESP8266
วงจรนี้ควบคุมโดยไมโครคอนโทรลเลอร์ไร้สาย NodeMCU ESP8266 ฉันใช้หมุดส่วนหัวบนบอร์ด perma-proto เพื่อให้ไมโครเซอร์โวมอเตอร์ถอดออกได้ง่าย ส่วนหัวของเซอร์โวเชื่อมต่อกับ NodeMCU ดังนี้:
สายเซอร์โวสีเหลือง: NodeMCU D1
สายเซอร์โวสีแดง: กำลังไฟ NodeMCU (3V3 หรือ VIN)
สายเซอร์โวสีดำ: กราวด์ NodeMCU (GND)
ขั้นตอนที่ 4: อัปโหลดโค้ด 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
แนะนำ:
DIY 37 Leds เกมรูเล็ต Arduino: 3 ขั้นตอน (พร้อมรูปภาพ)
DIY 37 Leds เกมรูเล็ต Arduino: รูเล็ตเป็นเกมคาสิโนที่ตั้งชื่อตามคำภาษาฝรั่งเศสหมายถึงวงล้อเล็ก
หมวกนิรภัย Covid ส่วนที่ 1: บทนำสู่ Tinkercad Circuits!: 20 ขั้นตอน (พร้อมรูปภาพ)
Covid Safety Helmet ตอนที่ 1: บทนำสู่ Tinkercad Circuits!: สวัสดีเพื่อน ๆ ในชุดสองตอนนี้ เราจะเรียนรู้วิธีใช้วงจรของ Tinkercad - เครื่องมือที่สนุก ทรงพลัง และให้ความรู้สำหรับการเรียนรู้เกี่ยวกับวิธีการทำงานของวงจร! หนึ่งในวิธีที่ดีที่สุดในการเรียนรู้คือการทำ ดังนั้น อันดับแรก เราจะออกแบบโครงการของเราเอง: th
Bolt - DIY Wireless Charging Night Clock (6 ขั้นตอน): 6 ขั้นตอน (พร้อมรูปภาพ)
Bolt - DIY Wireless Charging Night Clock (6 ขั้นตอน): การชาร์จแบบเหนี่ยวนำ (เรียกอีกอย่างว่าการชาร์จแบบไร้สายหรือการชาร์จแบบไร้สาย) เป็นการถ่ายโอนพลังงานแบบไร้สาย ใช้การเหนี่ยวนำแม่เหล็กไฟฟ้าเพื่อจ่ายกระแสไฟฟ้าให้กับอุปกรณ์พกพา แอปพลิเคชั่นที่พบบ่อยที่สุดคือ Qi Wireless Charging st
4 ขั้นตอน Digital Sequencer: 19 ขั้นตอน (พร้อมรูปภาพ)
4 ขั้นตอน Digital Sequencer: CPE 133, Cal Poly San Luis Obispo ผู้สร้างโปรเจ็กต์: Jayson Johnston และ Bjorn Nelson ในอุตสาหกรรมเพลงในปัจจุบัน ซึ่งเป็นหนึ่งใน “instruments” เป็นเครื่องสังเคราะห์เสียงดิจิตอล ดนตรีทุกประเภท ตั้งแต่ฮิปฮอป ป๊อป และอีฟ
ป้ายโฆษณาแบบพกพาราคาถูกเพียง 10 ขั้นตอน!!: 13 ขั้นตอน (พร้อมรูปภาพ)
ป้ายโฆษณาแบบพกพาราคาถูกเพียง 10 ขั้นตอน!!: ทำป้ายโฆษณาแบบพกพาราคาถูกด้วยตัวเอง ด้วยป้ายนี้ คุณสามารถแสดงข้อความหรือโลโก้ของคุณได้ทุกที่ทั่วทั้งเมือง คำแนะนำนี้เป็นการตอบสนองต่อ/ปรับปรุง/เปลี่ยนแปลงของ: https://www.instructables.com/id/Low-Cost-Illuminated-