Isi kandungan:

Kawalan Akses Makanan Kucing (ESP8266 + Motor Servo + Percetakan 3D): 5 Langkah (dengan Gambar)
Kawalan Akses Makanan Kucing (ESP8266 + Motor Servo + Percetakan 3D): 5 Langkah (dengan Gambar)

Video: Kawalan Akses Makanan Kucing (ESP8266 + Motor Servo + Percetakan 3D): 5 Langkah (dengan Gambar)

Video: Kawalan Akses Makanan Kucing (ESP8266 + Motor Servo + Percetakan 3D): 5 Langkah (dengan Gambar)
Video: How to give your cat food 2024, Jun
Anonim
Image
Image
Kawalan Akses Makanan Kucing (ESP8266 + Motor Servo + Percetakan 3D)
Kawalan Akses Makanan Kucing (ESP8266 + Motor Servo + Percetakan 3D)

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

Bahagian Bercetak 3D
Bahagian Bercetak 3D
Bahagian Bercetak 3D
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

Pasang Tudung ke Servo Motor
Pasang Tudung ke Servo Motor
Pasang Tudung ke Servo Motor
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

Bina Litar NodeMCU ESP8266
Bina Litar NodeMCU ESP8266
Bina Litar NodeMCU ESP8266
Bina Litar NodeMCU ESP8266
Bina Litar NodeMCU ESP8266
Bina Litar NodeMCU ESP8266
Bina Litar NodeMCU ESP8266
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

Muat naik Kod dan Uji Arduino
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

Gunakannya!
Gunakannya!
Gunakannya!
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: