Isi kandungan:
- Bekalan
- Langkah 1: Bahagian Bercetak 3D
- Langkah 2: Pasang Tudung ke Servo Motor
- Langkah 3: Bina Litar NodeMCU ESP8266
- Langkah 4: Muat naik Kod dan Uji Arduino
- Langkah 5: Gunakannya
Video: Kawalan Akses Makanan Kucing (ESP8266 + Motor Servo + Percetakan 3D): 5 Langkah (dengan Gambar)
2024 Pengarang: John Day | [email protected]. Diubah suai terakhir: 2024-01-30 11:07
Projek ini melengkapkan proses yang saya gunakan untuk membuat mangkuk makanan kucing automatik, untuk kucing diabetes saya yang berumur Chaz. Lihat, dia perlu makan sarapan sebelum dapat mengambil insulinnya, tetapi saya sering lupa mengambil makanannya sebelum saya tidur, yang merosakkan selera makannya dan membuang jadual insulinnya. Hidangan ini menggunakan motor servo untuk menutup penutup makanan antara jam tengah malam hingga 7:30 pagi. Sketsa Arduino mikrokontroler NodeMCU ESP8266 menggunakan Network Time Protocol (NTP) untuk mengawal jadual.
Projek ini mungkin tidak sesuai untuk kucing yang lebih muda dan aktif. Chaz begitu tua dan lemah, dia tidak cenderung untuk mencuba membuka mangkuk, tetapi mungkin.
Sekiranya anda baru menggunakan Arduino atau ESP8266, anda boleh menikmati panduan prasyarat berikut:
- Kelas Arduino Instructables
- Kelas Internet Perkara yang boleh diajar
Bekalan
- Pencetak 3D (saya menggunakan Creality CR-10s Pro)
- Filamen pencetak 3D (saya menggunakan PLA emas)
- Pengawal mikro wifi NodeMCU ESP8266
- Kabel USB (A hingga microB)
- Penyesuai kuasa USB
- Motor servo mikro
- Pemutar skru kecil dan skru
- Kawat cangkuk
- Pin pengepala
- Papan perma-proto
Untuk mengikuti apa yang sedang saya kerjakan, ikuti saya di YouTube, Instagram, Twitter, Pinterest, dan melanggan buletin saya. Sebagai Associate Amazon, saya dapat hasil dari pembelian yang layak yang anda buat menggunakan pautan afiliasi saya.
Langkah 1: Bahagian Bercetak 3D
Pemegang mangkuk makanan kucing berdasarkan reka bentuk Ardy Lai di Thingiverse. Saya menjadikannya lebih besar untuk menampung mangkuk kucing saya, dan juga membuatnya lebih pendek kerana penimbangannya menjadikannya terlalu tinggi. Saya menambah pemegang untuk motor servo mikro, dan beberapa lubang untuk kabel menuju ke bahagian dalam.
Saya memodelkan penutup sederhana menggunakan Tinkercad, yang dirancang untuk dipasang pada tanduk servo mikro. Anda boleh merebut reka bentuk saya terus dari Tinkercad, dan / atau memuat turun STL yang dilampirkan pada langkah ini.
Saya mencetak bahagian pada pencetak Creality CR-10s Pro saya dengan filamen PLA emas.
Pendedahan: pada masa penulisan ini, saya adalah pekerja Autodesk, yang menjadikan Tinkercad.
Langkah 2: Pasang Tudung ke Servo Motor
Saya menggunakan sedikit gerudi untuk menambah ukuran lubang pada tanduk servo, kemudian menggunakan skru untuk memasang servo pada penutup bercetak 3D.
Langkah 3: Bina Litar NodeMCU ESP8266
Litar dikendalikan oleh mikrokontroler wifi NodeMCU ESP8266. Saya menggunakan pin header pada papan perma-proto untuk menjadikan motor servo mikro mudah dilepas. Header servo disambungkan ke NodeMCU seperti berikut:
Kawat servo kuning: NodeMCU D1
Kawat servo merah: Kuasa NodeMCU (3V3 atau VIN)
Kawat servo hitam: NodeMCU ground (GND)
Langkah 4: Muat naik Kod dan Uji Arduino
Pasang pemasangan motor / penutup anda ke dalam potongan berbentuk motor pada bahagian cetakan 3D pemegang mangkuk. Pasangkan header motor ke pin header board mikrokontroler, dan pasangkan litar ke komputer anda dengan kabel USB.
Sketsa Arduino menggunakan Network Time Protocol untuk mengambil masa semasa dan kemudian membuka atau menutup penutup mengikut jadual yang dikodkan dengan ketat. Salin kod berikut, kemas kini kelayakan wifi dan offset waktu UTC, dan muat naik ke papan NodeMCU anda menggunakan Arduino IDE.
#sertakan
#include #include #include ESP8266WiFiMulti wifiMulti; // Buat contoh kelas ESP8266WiFiMulti, yang disebut 'wifiMulti' WiFiUDP UDP; // Buat contoh kelas WiFiUDP untuk menghantar dan menerima IPAddress timeServerIP; // time.nist.gov alamat pelayan NTP const char * NTPServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // Cap waktu NTP berada dalam 48 bait pertama NTPBuffer bait mesej [NTP_PACKET_SIZE]; // penyangga untuk menyimpan paket masuk dan keluar Servo myservo; // buat objek servo untuk mengawal servo // dua belas objek servo dapat dibuat di kebanyakan papan int pos = 0; // pemboleh ubah untuk menyimpan kedudukan servo, kekosongan persediaan () {myservo.attach (5); // melampirkan servo pada pin 5 aka D1 ke objek servo // buka penutup secara lalai Serial.println ("membuka penutup"); untuk (pos = 95; pos> = 0; pos - = 1) {// naik dari 95 darjah hingga 0 darjah myservo.write (pos); // suruh servo pergi ke kedudukan dalam kelewatan 'pos' pemboleh ubah (15); // menunggu 15ms untuk servo mencapai kedudukan} Serial.begin (115200); // Mulakan komunikasi Bersiri untuk menghantar mesej ke komputer tertunda (10); Serial.println ("\ r / n"); startWiFi (); // Cuba sambungkan ke beberapa titik akses yang diberikan. Kemudian tunggu sambungan bermulaUDP (); if (! WiFi.hostByName (NTPServerName, timeServerIP)) {// Dapatkan alamat IP pelayan NTP Serial.println ("Pencarian DNS gagal. Reboot."); Serial.flush (); ESP.reset (); } Serial.print ("IP pelayan masa: / t"); Serial.println (timeServerIP); Serial.println ("\ r / nMengirim permintaan NTP …"); sendNTPpacket (timeServerIP); } selang panjang yang tidak ditandatanganiNTP = 60000; // Minta waktu NTP setiap minit lama tidak ditandatangani prevNTP = 0; lama tidak ditandatanganiNTPResponse = millis (); uint32_t timeUNIX = 0; lama tidak ditandatangani prevActualTime = 0; gelung kekosongan () {arus panjang yang tidak ditandatanganiMillis = millis (); if (currentMillis - prevNTP> intervalNTP) {// Sekiranya satu minit telah berlalu sejak permintaan NTP terakhir prevNTP = currentMillis; Serial.println ("\ r / nMengirim permintaan NTP …"); sendNTPpacket (timeServerIP); // Kirim permintaan NTP} uint32_t time = getTime (); // Periksa sama ada respons NTP telah tiba dan dapatkan waktu (UNIX) jika (waktu) {// Sekiranya cap waktu baru telah diterima timeUNIX = waktu; Serial.print ("Respons NTP: / t"); Serial.println (timeUNIX); lastNTPResponse = currentMillis; } lain jika ((currentMillis - lastNTPResponse)> 3600000) {Serial.println ("Lebih dari 1 jam sejak respons NTP terakhir. Reboot."); Serial.flush (); ESP.reset (); } uint32_t actualTime = timeUNIX + (currentMillis - lastNTPResponse) / 1000; uint32_t eastTime = timeUNIX - 18000 + (currentMillis - lastNTPResponse) / 1000; if (actualTime! = prevActualTime && timeUNIX! = 0) {// Sekiranya satu saat berlalu sejak cetakan terakhir prevActualTime = sebenarnyaTime; Serial.printf ("\ rUTC time: / t% d:% d:% d", getHours (sebenarTime), getMinutes (sebenarTime), getSeconds (sebenarTime)); Serial.printf ("\ rEST (-5): / t% d:% d:% d", getHours (eastTime), getMinutes (eastTime), getSeconds (eastTime)); Bersiri.println (); } // 7:30 pagi jika (getHours (eastTime) == 7 && getMinutes (eastTime) == 30 && getSeconds (eastTime) == 0) {// buka penutup Serial.println ("membuka penutup"); untuk (pos = 95; pos> = 0; pos - = 1) {// naik dari 95 darjah hingga 0 darjah myservo.write (pos); // suruh servo pergi ke kedudukan dalam kelewatan 'pos' pemboleh ubah (15); // menunggu 15ms untuk servo mencapai kedudukan}} // tengah malam jika (getHours (eastTime) == 0 && getMinutes (eastTime) == 0 && getSeconds (eastTime) == 0) {// tutup penutup Serial. println ("menutup penutup"); untuk (pos = 0; pos <= 95; pos + = 1) {// naik dari 0 darjah hingga 95 darjah // dalam langkah 1 darjah myservo.write (pos); // suruh servo pergi ke kedudukan dalam kelewatan 'pos' pemboleh ubah (15); // menunggu 15ms untuk servo mencapai kedudukan}} / * // menguji jika (getHours (eastTime) == 12 && getMinutes (eastTime) == 45 && getSeconds (eastTime) == 0) {// tutup penutup Serial.println ("menutup penutup"); untuk (pos = 0; pos = 0; pos - = 1) {// naik dari 95 darjah hingga 0 darjah myservo.write (pos); // suruh servo pergi ke kedudukan dalam kelewatan 'pos' pemboleh ubah (15); // menunggu 15ms untuk servo mencapai kedudukan}} * /} batal startWiFi () {// Cuba sambungkan ke beberapa titik akses yang diberikan. Kemudian tunggu sambungan wifiMulti.addAP ("ssid_from_AP_1", "your_password_for_AP_1"); // tambahkan rangkaian Wi-Fi yang ingin anda sambungkan ke //wifiMulti.addAP("ssid_from_AP_2 "," your_password_for_AP_2 "); //wifiMulti.addAP("sid_from_AP_3 "," your_password_for_AP_3 "); Serial.println ("Menyambung"); sementara (wifiMulti.run ()! = WL_CONNECTED) {// Tunggu Wi-Fi menyambung kelewatan (250); Cetakan bersiri ('.'); } Serial.println ("\ r / n"); Serial.print ("Bersambung ke"); Serial.println (WiFi. SSID ()); // Beritahu kami rangkaian yang kami sambungkan ke Serial.print ("Alamat IP: / t"); Serial.print (WiFi.localIP ()); // Hantarkan alamat IP ESP8266 ke komputer Serial.println ("\ r / n"); } batal startUDP () {Serial.println ("Memulakan UDP"); UDP.begin (123); // Mula mendengar mesej UDP di port 123 Serial.print ("Port tempatan: / t"); Serial.println (UDP.localPort ()); Bersiri.println (); } uint32_t getTime () {if (UDP.parsePacket () == 0) {// Sekiranya tidak ada tindak balas (belum) kembali 0; } UDP.read (NTPBuffer, NTP_PACKET_SIZE); // baca paket ke dalam penyangga // Gabungkan 4 bait cap waktu menjadi satu nombor 32-bit uint32_t NTPTime = (NTPBuffer [40] << 24) | (NTPBuffer [41] << 16) | (NTPBuffer [42] << 8) | NTPBuffer [43]; // Tukar waktu NTP ke cap waktu UNIX: // Waktu Unix bermula pada 1 Jan 1970. Itu 2208988800 saat dalam waktu NTP: const uint32_t tujuh puluhTahun = 2208988800UL; // tolak tujuh puluh tahun: uint32_t UNIXTime = NTPTime - tujuh puluhTahun; kembali UNIXTime; } batal sendNTPpacket (Alamat IP & alamat) {memset (NTPBuffer, 0, NTP_PACKET_SIZE); // tetapkan semua bait dalam penyangga ke 0 // Memulakan nilai yang diperlukan untuk membentuk permintaan NTP NTPBuffer [0] = 0b11100011; // LI, Versi, Mode // hantar paket meminta cap waktu: UDP.beginPacket (alamat, 123); // Permintaan NTP adalah ke port 123 UDP.write (NTPBuffer, NTP_PACKET_SIZE); UDP.endPacket (); } sebaris int getSeconds (uint32_t UNIXTime) {kembali UNIXTime% 60; } sebaris int getMinutes (uint32_t UNIXTime) {kembali UNIXTime / 60% 60; } sebaris int getHours (uint32_t UNIXTime) {kembali UNIXTime / 3600% 24; }
Langkah 5: Gunakannya
Arahkan kabel anda ke bahagian dalam dudukan mangkuk, dan pasangkan pengumpan kucing anda ke soket menggunakan penyesuai AC USB. Cara kod sederhana ditulis, ia dimaksudkan untuk boot dalam keadaan "terbuka", dan hanya akan mengubah kedudukan penutupnya pada ambang waktu yang ditentukan dalam lakaran Arduino.
Terima kasih kerana mengikuti! Sekiranya anda membuat versi anda sendiri, saya ingin melihatnya di bahagian I Made It di bawah!
Sekiranya anda menyukai projek ini, anda mungkin berminat dengan beberapa projek saya yang lain:
- Prisma Pemegang untuk Potret Pelangi
- Dinding Penyimpanan Papan Lapis dengan Menara Kucing
- Lampu Mason Jar LED (penutup bercetak 3D)
- Kotak Kering Filamen Pencetak 3D
- Sumber Kuasa USB Kecemasan (Dicetak 3D)
- Gummy Candy LED Glowing
- Penanam Geometri Bercetak 3D Dengan Saliran
- Bunga bercetak 3D yang bercahaya
- Cara Memasang LED di bawah Skuter (dengan Bluetooth)
Untuk mengikuti apa yang sedang saya kerjakan, ikuti saya di YouTube, Instagram, Twitter, dan Pinterest.
Disyorkan:
Projek Mangkuk Makanan Makanan Automatik: 13 Langkah
Projek Pet-Makanan Mangkuk Automatik: Instruksional ini akan menggambarkan dan menerangkan bagaimana membina makanan haiwan peliharaan yang boleh diprogramkan secara automatik dengan mangkuk makanan yang dilampirkan. Saya telah melampirkan video di sini yang menggambarkan bagaimana fungsi produk dan bagaimana rupanya
Projek Arduino: Dispenser Makanan Kucing: 6 Langkah
Projek Arduino: Cat Food Dispenser: Instruksional ini dibuat untuk memenuhi keperluan projek Makecourse di University of South Florida (www.makecourse.com)
Dispenser Makanan Kucing Automatik: 7 Langkah (dengan Gambar)
Dispenser Makanan Kucing Automatik: Sekiranya anda tidak mengawal jumlah makanan yang dimakan kucing anda ini boleh menyebabkan masalah makan berlebihan dan berat badan berlebihan. Perkara ini berlaku terutamanya jika anda jauh dari rumah dan meninggalkan makanan tambahan untuk dimakan oleh kucing mengikut jadualnya sendiri. Pada masa lain anda mungkin
Peranti Penutup Mangkuk Makanan Kucing: 4 Langkah
Peranti Penutup Mangkuk Makanan Cat: Instruksional ini dibuat untuk memenuhi keperluan projek Makecourse di University of South Florida (www.makecourse.com) Dalam arahan ini saya akan menunjukkan kepada anda bagaimana saya membuat peranti Penutup Mangkuk Makanan Cat saya. Peranti ini
Catapult Automatik untuk Melemparkan Makanan Haiwan Peliharaan (anjing, Kucing, Ayam, dll), Baling Baling dan Banyak Lagi !: 4 Langkah (dengan Gambar)
Catapult Automatik untuk Melemparkan Makanan Haiwan Peliharaan (anjing, Kucing, Ayam, dll), Bola Baling dan Banyak Lagi!: Halo dan selamat datang di Instructable pertama saya! Anjing kami MENYUKAI makanannya, dia akan memakan semuanya dalam beberapa saat. Saya telah merancang cara untuk melambatkannya, dari bola dengan makanan di dalam hingga membuangnya ke halaman belakang. Hebatnya, dia