Daftar Isi:

Kontrol Akses Makanan Cat (ESP8266 + Motor Servo + Pencetakan 3D): 5 Langkah (dengan Gambar)
Kontrol Akses Makanan Cat (ESP8266 + Motor Servo + Pencetakan 3D): 5 Langkah (dengan Gambar)

Video: Kontrol Akses Makanan Cat (ESP8266 + Motor Servo + Pencetakan 3D): 5 Langkah (dengan Gambar)

Video: Kontrol Akses Makanan Cat (ESP8266 + Motor Servo + Pencetakan 3D): 5 Langkah (dengan Gambar)
Video: Berjuang Untuk Rakyat? Ahhh Yang Bener? 2024, November
Anonim
Image
Image
Kontrol Akses Makanan Cat (ESP8266 + Motor Servo + Pencetakan 3D)
Kontrol Akses Makanan Cat (ESP8266 + Motor Servo + Pencetakan 3D)

Proyek ini membahas proses yang saya gunakan untuk membuat mangkuk makanan kucing otomatis, untuk kucing diabetes saya yang sudah lanjut usia, Chaz. Lihat, dia perlu sarapan sebelum dia bisa mendapatkan insulinnya, tapi aku sering lupa mengambil piring makanannya sebelum aku tidur, yang merusak nafsu makannya dan mengganggu jadwal insulinnya. Hidangan ini menggunakan motor servo untuk menutup penutup makanan antara jam tengah malam dan 7:30 pagi. Sketsa Arduino mikrokontroler NodeMCU ESP8266 menggunakan Network Time Protocol (NTP) untuk mengontrol jadwal.

Proyek ini mungkin tidak cocok untuk kucing yang lebih muda dan lebih aktif. Chaz begitu tua dan lemah, dia tidak ingin mencoba membuka mangkuk itu, tapi itu mungkin.

Jika Anda baru mengenal Arduino atau ESP8266, Anda dapat menikmati panduan prasyarat berikut:

  • Kelas Arduino yang dapat diinstruksikan
  • Kelas Internet of Things yang Dapat Diinstruksikan

Perlengkapan

  • Printer 3D (saya menggunakan Creality CR-10s Pro)
  • Filamen printer 3D (saya menggunakan PLA emas)
  • Mikrokontroler wifi NodeMCU ESP8266
  • Kabel USB (A ke mikroB)
  • Adaptor daya USB
  • Motor servo mikro
  • Obeng dan sekrup kecil
  • Kawat penghubung
  • Pin header
  • Papan perma-proto

Untuk mengikuti apa yang sedang saya kerjakan, ikuti saya di YouTube, Instagram, Twitter, Pinterest, dan berlangganan buletin saya. Sebagai Associate Amazon, saya memperoleh penghasilan dari pembelian yang memenuhi syarat yang Anda lakukan menggunakan tautan afiliasi saya.

Langkah 1: Bagian Cetakan 3D

Bagian Cetak 3D
Bagian Cetak 3D
Bagian Cetak 3D
Bagian Cetak 3D

Tempat mangkuk makanan kucing didasarkan pada desain Ardy Lai di Thingiverse. Saya membuatnya lebih besar untuk menampung mangkuk kucing saya, dan juga membuatnya lebih pendek karena memperbesarnya membuatnya terlalu tinggi. Saya menambahkan dudukan untuk motor servo mikro, dan beberapa lubang untuk kabel untuk dirutekan ke dalam.

Saya membuat model tutup sederhana menggunakan Tinkercad, yang dirancang untuk dipasang pada tanduk servo mikro. Anda dapat mengambil desain saya langsung dari Tinkercad, dan/atau mengunduh STL yang dilampirkan pada langkah ini.

Saya mencetak bagian-bagian pada printer Creality CR-10s Pro saya dengan filamen PLA emas.

Pengungkapan: pada saat penulisan ini, saya adalah karyawan Autodesk, yang membuat Tinkercad.

Langkah 2: Pasang Tutup ke Motor Servo

Pasang Tutup ke Motor Servo
Pasang Tutup ke Motor Servo
Pasang Tutup ke Motor Servo
Pasang Tutup ke Motor Servo

Saya menggunakan mata bor kecil untuk memperbesar ukuran lubang pada tanduk servo, kemudian menggunakan sekrup untuk memasang servo ke tutup cetakan 3D.

Langkah 3: Bangun Sirkuit NodeMCU ESP8266

Bangun Sirkuit NodeMCU ESP8266
Bangun Sirkuit NodeMCU ESP8266
Bangun Sirkuit NodeMCU ESP8266
Bangun Sirkuit NodeMCU ESP8266
Bangun Sirkuit NodeMCU ESP8266
Bangun Sirkuit NodeMCU ESP8266
Bangun Sirkuit NodeMCU ESP8266
Bangun Sirkuit NodeMCU ESP8266

Rangkaian ini dikendalikan oleh mikrokontroler wifi NodeMCU ESP8266. Saya menggunakan pin header pada papan perma-proto untuk membuat motor servo mikro mudah dilepas. Header servo terhubung ke NodeMCU sebagai berikut:

Kabel servo kuning: NodeMCU D1

Kabel servo merah: Daya NodeMCU (3V3 atau VIN)

Kabel servo hitam: NodeMCU ground (GND)

Langkah 4: Unggah Kode dan Uji Arduino

Unggah Kode dan Uji Arduino
Unggah Kode dan Uji Arduino

Pasang unit motor/penutup Anda ke dalam potongan berbentuk motor pada bagian cetakan 3D dudukan mangkuk. Pasang header motor ke pin header papan mikrokontroler, dan hubungkan sirkuit ke komputer Anda dengan kabel USB.

Sketsa Arduino menggunakan Protokol Waktu Jaringan untuk mengambil waktu saat ini dan kemudian membuka atau menutup tutupnya sesuai dengan jadwal yang dikodekan. Salin kode berikut, perbarui kredensial wifi Anda dan offset waktu UTC, dan unggah ke papan NodeMCU Anda menggunakan Arduino IDE.

#termasuk

#include #include #include ESP8266WiFiMulti wifiMulti; // Buat instance kelas ESP8266WiFiMulti, yang disebut 'wifiMulti' WiFiUDP UDP; // Buat instance kelas WiFiUDP untuk mengirim dan menerima IPAddress timeServerIP; // time.nist.gov Alamat server NTP const char* NTPServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // Stempel waktu NTP ada dalam 48 byte pertama dari byte pesan NTPBuffer[NTP_PACKET_SIZE]; // buffer untuk menampung paket masuk dan keluar Servo myservo; // buat objek servo untuk mengontrol servo // dua belas objek servo dapat dibuat di sebagian besar papan int pos = 0; // variabel untuk menyimpan posisi servo void setup() { myservo.attach(5); // pasang servo pada pin 5 alias D1 ke objek servo //buka tutupnya secara default Serial.println("membuka tutup"); for (pos = 95; pos >= 0; pos -= 1) { // berubah dari 95 derajat ke 0 derajat myservo.write(pos); // memberitahu servo untuk pergi ke posisi dalam variabel 'pos' delay(15); // menunggu 15 ms sampai servo mencapai posisi } Serial.begin(115200); // Mulai komunikasi Serial untuk mengirim pesan ke penundaan komputer (10); Serial.println("\r\n"); mulaiWiFi(); // Coba sambungkan ke beberapa titik akses yang diberikan. Kemudian tunggu koneksi startUDP(); if(!WiFi.hostByName(NTPServerName, timeServerIP)) { // Dapatkan alamat IP server NTP Serial.println("Pencarian DNS gagal. Reboot."); Serial.flush(); ESP.reset(); } Serial.print("IP server waktu:\t"); Serial.println(timeServerIP); Serial.println("\r\nMengirim permintaan NTP …"); sendNTPpacket(timeServerIP); } interval panjang yang tidak ditandatanganiNTP = 60000; // Meminta waktu NTP setiap menit unsigned long prevNTP = 0; unsigned long lastNTPResponse = milis(); uint32_t waktuUNIX = 0; unsigned long prevActualTime = 0; void loop() { unsigned long currentMillis = millis(); if (currentMillis - prevNTP > intervalNTP) { // Jika satu menit telah berlalu sejak permintaan NTP terakhir prevNTP = currentMillis; Serial.println("\r\nMengirim permintaan NTP …"); sendNTPpacket(timeServerIP); // Kirim permintaan NTP } uint32_t time = getTime(); // Periksa apakah respons NTP telah tiba dan dapatkan waktu (UNIX) if (time) { // Jika stempel waktu baru telah diterima timeUNIX = time; Serial.print("Tanggapan NTP:\t"); Serial.println(waktuUNIX); lastNTPResponse = currentMillis; } else if ((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) { // Jika satu detik telah berlalu sejak cetakan terakhir prevActualTime = actualTime; Serial.printf("\rUTC waktu:\t%d:%d:%d ", getHours(waktu aktual), getMinutes(Waktu aktual), getSeconds(Waktu aktual)); Serial.printf("\rEST (-5):\t%d:%d:%d ", getHours(easternTime), getMinutes(easternTime), getSeconds(easternTime)); Serial.println(); } // 7:30am if(getHours(easternTime) == 7 && getMinutes(easternTime) == 30 && getSeconds(easternTime) == 0){ //membuka tutupnya Serial.println("membuka tutupnya"); for (pos = 95; pos >= 0; pos -= 1) { // berubah dari 95 derajat ke 0 derajat myservo.write(pos); // memberitahu servo untuk pergi ke posisi dalam variabel 'pos' delay(15); // menunggu 15 ms hingga servo mencapai posisi } } // tengah malam if(getHours(easternTime) == 0 && getMinutes(easternTime) == 0 && getSeconds(easternTime) == 0){ //tutup penutup Serial. println("menutup tutupnya"); for (pos = 0; pos <= 95; pos += 1) { // berpindah dari 0 derajat ke 95 derajat // dalam langkah 1 derajat myservo.write(pos); // memberitahu servo untuk pergi ke posisi dalam variabel 'pos' delay(15); // menunggu 15 md agar servo mencapai posisi } } /* // menguji if(getHours(easternTime) == 12 && getMinutes(easternTime) == 45 && getSeconds(easternTime) == 0){ //tutup penutup Serial.println("menutup tutupnya"); for (pos = 0; pos = 0; pos -= 1) { // berubah dari 95 derajat ke 0 derajat myservo.write(pos); // memberitahu servo untuk pergi ke posisi dalam variabel 'pos' delay(15); // menunggu 15 md agar servo mencapai posisi } } */ } void startWiFi() { // Coba sambungkan ke beberapa titik akses yang diberikan. Kemudian tunggu koneksi wifiMulti.addAP("ssid_from_AP_1", "your_password_for_AP_1"); // tambahkan jaringan Wi-Fi yang ingin Anda sambungkan //wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2"); //wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); Serial.println("Menghubungkan"); while (wifiMulti.run() != WL_CONNECTED) { // Tunggu Wi-Fi terhubung delay(250); Serial.print('.'); } Serial.println("\r\n"); Serial.print("Terhubung ke "); Serial.println(WiFi. SSID()); // Beri tahu kami jaringan apa yang terhubung ke Serial.print("IP address:\t"); Serial.print(WiFi.localIP()); // Kirim alamat IP ESP8266 ke komputer Serial.println("\r\n"); } void startUDP() { Serial.println("Memulai UDP"); UDP.begin(123); // Mulai mendengarkan pesan UDP pada port 123 Serial.print("Local port:\t"); Serial.println(UDP.localPort()); Serial.println(); } uint32_t getTime() { if (UDP.parsePacket() == 0) { // Jika tidak ada respon (belum) return 0; } UDP.read(NTPBuffer, NTP_PACKET_SIZE); // membaca paket ke dalam buffer // Menggabungkan 4 byte timestamp menjadi satu nomor 32-bit uint32_t NTPTime = (NTPBuffer[40] << 24) | (NTPBBuffer[41] << 16) | (NTPBuffer[42] << 8) | NTBuffer[43]; // Konversi waktu NTP ke stempel waktu UNIX: // Waktu Unix dimulai pada 1 Januari 1970. Itu 2208988800 detik dalam waktu NTP: const uint32_t seventyYears = 2208988800UL; // kurangi tujuh puluh tahun: uint32_t UNIXTime = NTPTime - tujuh puluhTahun; kembali UNIXTime; } void sendNTPpacket(alamat & alamat IPA) { memset(NTPBuffer, 0, NTP_PACKET_SIZE); // set semua byte dalam buffer ke 0 // Inisialisasi nilai yang diperlukan untuk membentuk permintaan NTP NTPBuffer[0] = 0b11100011; // LI, Versi, Mode // mengirim paket yang meminta stempel waktu: UDP.beginPacket(alamat, 123); // Permintaan NTP ke port 123 UDP.write(NTPBuffer, NTP_PACKET_SIZE); UDP.endPacket(); } int int getSeconds(uint32_t UNIXTime) { kembali UNIXTime % 60; } int int getMinutes(uint32_t UNIXTime) { kembali UNIXTime / 60 % 60; } int int getHours(uint32_t UNIXTime) { kembali UNIXTime / 3600 % 24; }

Langkah 5: Gunakan

Gunakan!
Gunakan!
Gunakan!
Gunakan!

Rutekan kabel Anda ke bagian dalam dudukan mangkuk, dan colokkan pengumpan kucing Anda ke stopkontak menggunakan adaptor AC USB. Cara penulisan kode sederhana, dimaksudkan untuk di-boot dalam keadaan "terbuka", dan hanya akan mengubah posisi tutupnya pada ambang waktu yang ditentukan dalam sketsa Arduino.

Terima kasih telah mengikuti! Jika Anda membuat versi Anda sendiri, saya ingin melihatnya di bagian I Made It di bawah ini!

Jika Anda menyukai proyek ini, Anda mungkin tertarik dengan beberapa proyek saya yang lain:

  • Pemegang Prisma untuk Potret Pelangi
  • Dinding Penyimpanan Kayu Lapis dengan Cat Tower
  • Lentera Mason Jar LED (tutup cetak 3D)
  • Kotak Kering Filamen Printer 3D
  • Sumber Daya USB Darurat (Dicetak 3D)
  • Permen Gummy LED Bersinar
  • Penanam Geometris Cetak 3D Dengan Drainase
  • Bunga Cetak 3D Bersinar
  • Cara Memasang LED di Bawah Skuter (dengan Bluetooth)

Untuk mengikuti apa yang sedang saya kerjakan, ikuti saya di YouTube, Instagram, Twitter, dan Pinterest.

Direkomendasikan: