Daftar Isi:
- Perlengkapan
- Langkah 1: Bagian Cetakan 3D
- Langkah 2: Pasang Tutup ke Motor Servo
- Langkah 3: Bangun Sirkuit NodeMCU ESP8266
- Langkah 4: Unggah Kode dan Uji Arduino
- Langkah 5: Gunakan
Video: Kontrol Akses Makanan Cat (ESP8266 + Motor Servo + Pencetakan 3D): 5 Langkah (dengan Gambar)
2024 Pengarang: John Day | [email protected]. Terakhir diubah: 2024-01-30 09:54
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
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
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
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
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
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:
Kontrol Gerakan Sederhana - Kontrol Mainan RC Anda Dengan Gerakan Lengan Anda: 4 Langkah (dengan Gambar)
Kontrol Gerakan Sederhana - Kontrol Mainan RC Anda Dengan Gerakan Lengan Anda: Selamat datang di 'ible' saya #45. Beberapa waktu yang lalu saya membuat BB8 versi RC yang berfungsi penuh menggunakan bagian Lego Star Wars … https://www.instructables.com/id/Whats-Inside-My-R…Ketika saya melihat betapa kerennya itu Force Band yang dibuat oleh Sphero, saya berpikir: "Ok, saya c
Kontrol Akses Arduino YÚN Dengan MySQL, PHP5 dan Python: 11 Langkah (dengan Gambar)
Kontrol Akses Arduino YÚN Dengan MySQL, PHP5 dan Python: Halo Teman! Seperti yang Anda ketahui, pada bulan September perisai perdana baru Arduino, Arduino YUN. Teman kecil ini memiliki sistem tertanam Linux yang dengannya kami dapat menjalankan apa pun yang dapat Anda pikirkan (setidaknya sejauh ini). Meskipun sangat sedikit informasi
Bangun Kontrol Akses Anda Sendiri Dengan Please-open.it: 4 Langkah
Bangun Kontrol Akses Anda Sendiri Dengan Please-open.it: Please-open.it berbasis di Prancis dan kami akan bekerja penuh waktu dalam proyek ini. Kami ingin bisnis (Hotel, Perkemahan, stasiun, sewa…) mendapatkan manfaat dari solusi yang lebih fleksibel dan, tentu saja, dengan harga yang lebih rendah. Hubungkan setiap data internal (janji
KONTROL AKSES PINTU RFID DENGAN COUNTER: 8 Langkah
KONTROL AKSES PINTU RFID DENGAN COUNTER: KONTROL AKSES PINTU RFID DENGAN COUNTER Tutorial
Kontrol Akses RFID Dengan Arduino Yun dan Raspberry Pi: 11 Langkah
Kontrol Akses RFID Dengan Arduino Yun dan Raspberry Pi: Selamat datang di Instruksi saya! Sudahkah Anda mencari Sistem Kontrol Akses RFID secara online yang dapat memiliki banyak pengguna tanpa menggunakan kunci master untuk memprogramnya? Sebuah sistem yang dapat mencatat akses dengan nama orang? Sebuah sistem di mana Anda dapat dengan mudah menambahkan