İçindekiler:

Cat Mama Erişim Kontrolü (ESP8266 + Servo Motor + 3D Baskı): 5 Adım (Resimlerle)
Cat Mama Erişim Kontrolü (ESP8266 + Servo Motor + 3D Baskı): 5 Adım (Resimlerle)

Video: Cat Mama Erişim Kontrolü (ESP8266 + Servo Motor + 3D Baskı): 5 Adım (Resimlerle)

Video: Cat Mama Erişim Kontrolü (ESP8266 + Servo Motor + 3D Baskı): 5 Adım (Resimlerle)
Video: Otomatik Kedi - Köpek Mama Makinesi (Süre Ayarlı & WiFi ile kontrol) - ESP8266 Nodemcu 2024, Kasım
Anonim
Image
Image
Cat Mama Erişim Kontrolü (ESP8266 + Servo Motor + 3D Baskı)
Cat Mama Erişim Kontrolü (ESP8266 + Servo Motor + 3D Baskı)

Bu proje, yaşlı diyabetik kedim Chaz için otomatik bir kedi maması kasesi oluşturmak için kullandığım süreci anlatıyor. Bakın, insülinini alabilmesi için önce kahvaltı yapması gerekiyor, ama genellikle yatmadan önce yemeğini almayı unutuyorum, bu da iştahını bozuyor ve insülin programını bozuyor. Bu çanak, gece yarısı ile 07:30 saatleri arasında yiyeceklerin üzerindeki kapağı kapatmak için bir servo motor kullanır. NodeMCU ESP8266 mikrodenetleyicinin Arduino taslağı, programı kontrol etmek için Ağ Zaman Protokolü'nü (NTP) kullanır.

Bu proje daha genç, daha aktif kediler için uygun olmayabilir. Chaz o kadar yaşlı ve çelimsiz ki, kaseyi açmaya meyilli değil, ama bu mümkün.

Arduino veya ESP8266'da yeniyseniz, aşağıdaki önkoşul kılavuzlarından yararlanabilirsiniz:

  • Eğitilebilir Arduino Sınıfı
  • Instructables Nesnelerin İnterneti Sınıfı

Gereçler

  • 3D yazıcı (Creality CR-10s Pro kullanıyorum)
  • 3D yazıcı filamenti (altın PLA kullanıyorum)
  • NodeMCU ESP8266 wifi mikrodenetleyici
  • USB kablosu (A'dan microB'ye)
  • USB güç adaptörü
  • Mikro servo motor
  • Küçük tornavida ve vidalar
  • Bağlantı teli
  • Başlık pimleri
  • Perma-proto kartı

Ne üzerinde çalıştığımı takip etmek için beni YouTube, Instagram, Twitter, Pinterest'te takip edin ve bültenime abone olun. Bir Amazon İş Ortağı olarak, bağlı kuruluş bağlantılarımı kullanarak yaptığınız nitelikli satın alımlardan kazanıyorum.

Adım 1: 3D Basılı Parçalar

3D Baskılı Parçalar
3D Baskılı Parçalar
3D Baskılı Parçalar
3D Baskılı Parçalar

Kedi maması kasesi tutucusu, Ardy Lai'nin Thingiverse üzerindeki tasarımına dayanmaktadır. Kedimin kasesini yerleştirmek için daha büyük yaptım ve ayrıca ölçeklendirmek onu çok uzun yaptığı için kısalttım. Bir mikro servo motor için bir tutucu ve kabloların içeriye yönlendirilmesi için birkaç delik ekledim.

Tinkercad kullanarak mikro servonun kornasına takmak için tasarlanmış basit bir kapak modelledim. Tasarımımı doğrudan Tinkercad'den alabilir ve/veya bu adıma ekli STL'leri indirebilirsiniz.

Parçaları Creality CR-10s Pro yazıcımda altın PLA filamentli yazdırdım.

Açıklama: Bu yazı yazılırken, Tinkercad'i yapan Autodesk'in bir çalışanıyım.

Adım 2: Kapağı Servo Motora Takın

Kapağı Servo Motora Takın
Kapağı Servo Motora Takın
Kapağı Servo Motora Takın
Kapağı Servo Motora Takın

Servo korna üzerindeki deliklerin boyutunu artırmak için küçük bir matkap ucu kullandım, ardından servoyu 3D baskılı kapağa takmak için vidalar kullandım.

Adım 3: NodeMCU ESP8266 Devresini Oluşturun

NodeMCU ESP8266 Devresini Oluşturun
NodeMCU ESP8266 Devresini Oluşturun
NodeMCU ESP8266 Devresini Oluşturun
NodeMCU ESP8266 Devresini Oluşturun
NodeMCU ESP8266 Devresini Oluşturun
NodeMCU ESP8266 Devresini Oluşturun
NodeMCU ESP8266 Devresini Oluşturun
NodeMCU ESP8266 Devresini Oluşturun

Devre, bir NodeMCU ESP8266 wifi mikrodenetleyici tarafından kontrol edilir. Mikro servo motoru kolayca ayrılabilir hale getirmek için kalıcı bir protokol kartında başlık pinleri kullandım. Servo başlıkları NodeMCU'ya şu şekilde bağlanır:

Sarı servo tel: NodeMCU D1

Kırmızı servo tel: NodeMCU gücü (3V3 veya VIN)

Siyah servo tel: NodeMCU topraklama (GND)

Adım 4: Arduino Kodunu Yükleyin ve Test Edin

Arduino Kodunu Yükleyin ve Test Edin
Arduino Kodunu Yükleyin ve Test Edin

Motor/kapak tertibatınızı, 3D baskılı kase tutucu parçasındaki motor şeklindeki oyuğa takın. Motor başlığını mikrodenetleyici kartının başlık pinlerine takın ve devreyi bir USB kablosuyla bilgisayarınıza bağlayın.

Arduino çizimi, geçerli saati almak için Ağ Zaman Protokolünü kullanır ve ardından sabit kodlanmış bir programa göre kapağı açar veya kapatır. Aşağıdaki kodu kopyalayın, wifi kimlik bilgilerinizi ve UTC saat farkını güncelleyin ve Arduino IDE'yi kullanarak NodeMCU kartınıza yükleyin.

#Dahil etmek

#include #include #include ESP8266WiFiMulti wifiMulti; // 'wifiMulti' WiFiUDP UDP adlı ESP8266WiFiMulti sınıfının bir örneğini oluşturun; // IPAddress timeServerIP göndermek ve almak için WiFiUDP sınıfının bir örneğini oluşturun; // time.nist.gov NTP sunucu adresi const char* NTPServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // NTP zaman damgası, mesajın baytının ilk 48 baytındadır NTPBuffer[NTP_PACKET_SIZE]; // gelen ve giden paketleri tutmak için arabellek Servo myservo; // bir servoyu kontrol etmek için servo nesnesi yarat // çoğu kartta on iki servo nesnesi oluşturulabilir int pos = 0; // servo pozisyonunu saklayacak değişken void setup() { myservo.attach(5); // pin 5 aka D1 üzerindeki servoyu servo nesnesine bağlar // varsayılan olarak kapağı aç Serial.println("kapağı açma"); for (konum = 95; konum >= 0; konum -= 1) { // 95 dereceden 0 dereceye gider myservo.write(poz); // servoya 'pos' gecikmesi(15) değişkeninde pozisyona gitmesini söyle; // servonun pozisyona ulaşması için 15ms bekler } Serial.begin(115200); // Bilgisayar gecikmesine(10) mesaj göndermek için seri iletişimi başlatın; Serial.println("\r\n"); başlatWiFi(); // Verilen bazı erişim noktalarına bağlanmayı deneyin. Ardından bir bağlantı bekleyin startUDP(); if(!WiFi.hostByName(NTPServerName, timeServerIP)) { // NTP sunucusunun IP adresini alın Serial.println("DNS araması başarısız. Yeniden başlatılıyor."); Seri.flush(); ESP.reset(); } Serial.print("Zaman sunucusu IP:\t"); Serial.println(timeServerIP); Serial.println("\r\nNTP isteği gönderiliyor…"); sendNTPpacket(timeServerIP); } işaretsiz uzun aralıkNTP = 60000; // Dakikada bir NTP zamanı iste unsigned long prevNTP = 0; imzasız uzun lastNTPResponse = millis(); uint32_t zamanUNIX = 0; imzasız uzun prevActualTime = 0; void loop() { unsigned long currentMillis = millis(); if (currentMillis - prevNTP > intervalNTP) { // Son NTP isteğinden bu yana bir dakika geçmişse prevNTP = currentMillis; Serial.println("\r\nNTP isteği gönderiliyor…"); sendNTPpacket(timeServerIP); // NTP isteği gönder } uint32_t time = getTime(); // NTP yanıtının gelip gelmediğini kontrol edin ve (UNIX) zamanını alın if (time) { // Yeni bir zaman damgası alındıysa timeUNIX = zaman; Serial.print("NTP yanıtı:\t"); Serial.println(timeUNIX); lastNTPResponse = currentMillis; } else if ((currentMillis - lastNTPResponse) > 3600000) { Serial.println("Son NTP yanıtının üzerinden 1 saatten fazla zaman geçti. Yeniden başlatılıyor."); Seri.flush(); ESP.reset(); } uint32_t realTime = timeUNIX + (currentMillis - lastNTPResponse)/1000; uint32_t easternTime = timeUNIX - 18000 + (currentMillis - lastNTPResponse)/1000; if (actualTime != prevActualTime && timeUNIX != 0) { // Son baskıdan bu yana bir saniye geçmişse prevActualTime = realTime; Serial.printf("\rUTC saati:\t%d:%d:%d ", getHours(actualTime), getMinutes(actualTime), getSeconds(actualTime)); Serial.printf("\rEST (-5):\t%d:%d:%d ", getHours(easternTime), getMinutes(easternTime), getSeconds(easternTime)); Seri.println(); } // 7:30am if(getHours(easternTime) == 7 && getMinutes(easternTime) == 30 && getSeconds(easternTime) == 0){ //kapağı açın Serial.println("kapağı açma"); for (konum = 95; konum >= 0; konum -= 1) { // 95 dereceden 0 dereceye gider myservo.write(poz); // servoya 'pos' gecikmesi(15) değişkeninde pozisyona gitmesini söyle; // servonun pozisyona ulaşması için 15ms bekler } } // gece yarısı if(getHours(easternTime) == 0 && getMinutes(easternTime) == 0 && getSeconds(easternTime) == 0){ //kapağı kapatın Serial. println("kapağı kapatmak"); for (konum = 0; konum <= 95; konum += 1) { // 0 dereceden 95 dereceye gider // 1 derecelik adımlarla myservo.write(poz); // servoya 'pos' gecikmesi(15) değişkeninde pozisyona gitmesini söyle; // servonun pozisyona ulaşması için 15ms bekler } } /* // if(getHours(easternTime) == 12 && getMinutes(easternTime) == 45 && getSeconds(easternTime) == 0){ //kapağı kapatın Serial.println("kapak kapatılıyor"); for (konum = 0; konum = 0; konum -= 1) { // 95 dereceden 0 dereceye gider myservo.write(poz); // servoya 'pos' gecikmesi(15) değişkeninde pozisyona gitmesini söyle; // servonun konuma ulaşması için 15ms bekler } } */ } void startWiFi() { // Verilen bazı erişim noktalarına bağlanmayı deneyin. Ardından wifiMulti.addAP("ssid_from_AP_1", "your_password_for_AP_1"); bağlantısını bekleyin. // bağlanmak istediğiniz Wi-Fi ağlarını ekleyin //wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2"); //wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); Serial.println("Bağlanıyor"); while (wifiMulti.run() != WL_CONNECTED) { // Wi-Fi bağlantısının gecikmesini bekleyin(250); Seri.print('.'); } Serial.println("\r\n"); Serial.print("Bağlandı"); Seri.println(WiFi. SSID()); // Bize hangi ağa bağlı olduğumuzu söyleyin Serial.print("IP address:\t"); Serial.print(WiFi.localIP()); // ESP8266'nın IP adresini bilgisayara Serial.println("\r\n"); } void startUDP() { Serial.println("UDP'yi Başlatıyor"); UDP.başla(123); // 123 numaralı bağlantı noktasından UDP mesajlarını dinlemeye başlayın Serial.print("Yerel bağlantı noktası:\t"); Serial.println(UDP.localPort()); Seri.println(); } uint32_t getTime() { if (UDP.parsePacket() == 0) { // Yanıt yoksa (henüz) 0 döndür; } UDP.read(NTPBuffer, NTP_PACKET_SIZE); // paketi ara belleğe oku // 4 zaman damgası baytını tek bir 32 bitlik sayı ile birleştir uint32_t NTPTime = (NTPBuffer[40] << 24) | (NTPBuffer[41] << 16) | (NTPBffer[42] << 8) | NTPBuffer[43]; // NTP zamanını UNIX zaman damgasına dönüştürün: // Unix zamanı 1 Ocak 1970'de başlar. NTP zamanında 2208988800 saniye: const uint32_t yetmişYears = 2208988800UL; // yetmiş yılı çıkar: uint32_t UNIXTime = NTPTime - yetmişYıl; UNIXTime'ı döndür; } void sendNTPpacket(IPAddress& address) { memset(NTPBuffer, 0, NTP_PACKET_SIZE); // arabellekteki tüm baytları 0'a ayarla // NTP isteği oluşturmak için gereken değerleri başlat NTPBuffer[0] = 0b11100011; // LI, Sürüm, Mod // zaman damgası isteyen bir paket gönder: UDP.beginPacket(adres, 123); // NTP istekleri 123 numaralı bağlantı noktasına UDP.write(NTPBuffer, NTP_PACKET_SIZE); UDP.endPacket(); } satır içi int getSeconds(uint32_t UNIXTime) { return UNIXTime % 60; } satır içi int getMinutes(uint32_t UNIXTime) { dönüş UNIXTime / 60 % 60; } satır içi int getHours(uint32_t UNIXTime) { return UNIXTime / 3600 % 24; }

Adım 5: Kullanın

Kullan!
Kullan!
Kullan!
Kullan!

Kablolarınızı kase tutucunun içine yönlendirin ve bir USB AC adaptörü kullanarak kedi besleyicinizi prize takın. Basit kodun yazılma şekli, "açık" durumda başlatılmak içindir ve kapak konumunu yalnızca Arduino taslağında belirtilen zaman eşiklerinde değiştirir.

Takip ettiğiniz için teşekkürler! Kendi versiyonunuzu yaparsanız, aşağıdaki Ben Yaptım bölümünde görmeyi çok isterim!

Bu projeyi beğendiyseniz, diğerlerinden bazıları da ilginizi çekebilir:

  • Gökkuşağı Portreleri için Prizma Tutucu
  • Kedi Kuleli Kontrplak Depolama Duvarı
  • LED Mason Kavanoz Fenerleri (3D baskılı kapak)
  • 3D Yazıcı Filament Kuru Kutu
  • Acil Durum USB Güç Kaynağı (3D Basılı)
  • Parlayan LED Sakızlı Şeker
  • Drenajlı 3D Baskılı Geometrik Saksı
  • Parlayan 3D Baskılı Çiçekler
  • Bir Scooter Altında LED'ler Nasıl Kurulur (Bluetooth ile)

Ne üzerinde çalıştığımı takip etmek için beni YouTube, Instagram, Twitter ve Pinterest'te takip edin.

Önerilen: