Mündəricat:

Pişik Qida Giriş Nəzarəti (ESP8266 + Servo Motor + 3D Çap): 5 addım (şəkillərlə)
Pişik Qida Giriş Nəzarəti (ESP8266 + Servo Motor + 3D Çap): 5 addım (şəkillərlə)

Video: Pişik Qida Giriş Nəzarəti (ESP8266 + Servo Motor + 3D Çap): 5 addım (şəkillərlə)

Video: Pişik Qida Giriş Nəzarəti (ESP8266 + Servo Motor + 3D Çap): 5 addım (şəkillərlə)
Video: Pişiyin dırnaqlarının tutulması və pişiyin çimizdirilmə qaydası 2024, Iyun
Anonim
Image
Image
Pişik Qida Giriş Nəzarəti (ESP8266 + Servo Motor + 3D Çap)
Pişik Qida Giriş Nəzarəti (ESP8266 + Servo Motor + 3D Çap)

Bu layihə, yaşlı diabetli pişiyim Chaz üçün avtomatlaşdırılmış pişik yeməyi qabı hazırladığım prosesi əhatə edir. Baxın, insulini almadan səhər yeməyi yeməlidir, amma yatmazdan əvvəl yemək yeməyini götürməyi unuduram, bu da iştahını korlayır və insulin proqramını pozur. Bu yemək, gecə yarısı ilə səhər 7.30 arasında qidanın üzərindəki qapağı bağlamaq üçün servo motordan istifadə edir. NodeMCU ESP8266 mikrokontrolörünün Arduino eskizi, cədvəli idarə etmək üçün Şəbəkə Zaman Protokolundan (NTP) istifadə edir.

Bu layihə daha gənc, daha aktiv pişiklər üçün uyğun olmaya bilər. Chaz o qədər qoca və zəifdir ki, qabı açmağa çalışmağa meylli deyil, amma mümkündür.

Arduino və ya ESP8266 -da yenisinizsə, aşağıdakı ön şərtlərdən istifadə edə bilərsiniz:

  • Təlimatlar Arduino sinif
  • Əşyaların İnterneti Dərsliyi

Təchizat

  • 3D printer (Creality CR-10s Pro istifadə edirəm)
  • 3D printer filamenti (qızıl PLA istifadə edirəm)
  • NodeMCU ESP8266 wifi mikro nəzarətçisi
  • USB kabeli (A - microB)
  • USB güc adapteri
  • Mikro servo motor
  • Kiçik tornavida və vintlər
  • Bağlama teli
  • Başlıq sancaqları
  • Perma-proto lövhəsi

İşlədiklərimdən xəbərdar olmaq üçün məni YouTube, Instagram, Twitter, Pinterest -də izləyin və bülletenimə abunə olun. Amazon Associate olaraq, ortaqlıq bağlantılarımdan istifadə edərək etdiyiniz satınalmalardan qazanıram.

Addım 1: 3D çaplı hissələr

3D çaplı hissələr
3D çaplı hissələr
3D çaplı hissələr
3D çaplı hissələr

Pişik yeməyi qabının sahibi Ardy Lai -nin Thingiverse dizaynına əsaslanır. Pişiyimin qabını yerləşdirmək üçün onu daha böyük etdim və ölçüsünü çox hündür hala gətirdiyindən onu da qısaltdım. Mikro servo mühərrik üçün bir tutacaq və içəri keçmək üçün kabellər üçün bir neçə deşik əlavə etdim.

Tinkercad istifadə edərək mikro servonun buynuzuna yapışdırmaq üçün sadə bir qapaq hazırladım. Dizaynımı birbaşa Tinkercad -dan götürə və/və ya bu addıma əlavə edilmiş STL -ləri yükləyə bilərsiniz.

Parçaları qızıl PLA filamentli Creality CR-10s Pro printerimdə çap etdim.

Açıqlama: bu yazı yazılarkən Tinkercad istehsal edən Autodesk işçisiyəm.

Addım 2: Qapağı Servo Motora bağlayın

Qapağı Servo Motora bağlayın
Qapağı Servo Motora bağlayın
Qapağı Servo Motora bağlayın
Qapağı Servo Motora bağlayın

Servo buynuzundakı deliklərin ölçüsünü artırmaq üçün kiçik bir matkap ucundan istifadə etdim, sonra servo 3D çaplı qapağa yapışdırmaq üçün vintlərdən istifadə etdim.

Addım 3: NodeMCU ESP8266 Dövrə qurun

NodeMCU ESP8266 dövrə qurun
NodeMCU ESP8266 dövrə qurun
NodeMCU ESP8266 dövrə qurun
NodeMCU ESP8266 dövrə qurun
NodeMCU ESP8266 dövrə qurun
NodeMCU ESP8266 dövrə qurun
NodeMCU ESP8266 dövrə qurun
NodeMCU ESP8266 dövrə qurun

Dövrə, NodeMCU ESP8266 wifi mikro nəzarətçisi tərəfindən idarə olunur. Mikro servo mühərrikin asanlıqla çıxarıla bilməsi üçün perma-proto lövhəsində baş pinlərindən istifadə etdim. Servo başlıqları NodeMCU-ya aşağıdakı kimi bağlanır:

Sarı servo tel: NodeMCU D1

Qırmızı servo tel: NodeMCU gücü (3V3 və ya VIN)

Qara servo tel: NodeMCU torpaq (GND)

Addım 4: Arduino Kodunu və Testini Yükləyin

Arduino Kodunu və Testini yükləyin
Arduino Kodunu və Testini yükləyin

Motorunuzu/qapağınızı 3 ölçülü çaplı qabdakı motor formalı kəsiklərə quraşdırın. Motorun başlığını mikrokontroller lövhəsinin başlıq pinlərinə və USB kabel ilə kompüterə qoşun.

Arduino eskizi, cari vaxtı əldə etmək üçün Şəbəkə Zaman Protokolundan istifadə edir və sonra sərt kodlu bir cədvələ uyğun olaraq qapağı açır və ya bağlayır. Aşağıdakı kodu kopyalayın, wifi etimadnamənizi və UTC vaxtı ofsetini yeniləyin və Arduino IDE -dən istifadə edərək NodeMCU lövhənizə yükləyin.

#daxil edin

#daxil edin #daxil edin #daxil edin ESP8266WiFiMulti wifiMulti; // 'wifiMulti' WiFiUDP UDP adlı ESP8266WiFiMulti sinifinin bir nümunəsini yaradın; // IPAddress timeServerIP göndərmək və almaq üçün WiFiUDP sinifinin bir nümunəsini yaradın; // time.nist.gov NTP server ünvanı const char* NTPServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // NTP vaxt möhürü mesaj baytının ilk 48 baytında NTPBuffer [NTP_PACKET_SIZE]; // daxil olan və gedən paketləri saxlamaq üçün bufer Servo myservo; // servoya nəzarət etmək üçün servo obyekt yaradın // əksər lövhələrdə on iki servo obyekt yaradıla bilər int pos = 0; // servo mövqeyini saxlamaq üçün dəyişən void setup () {myservo.attach (5); // servo obyektinə 5 -ci aka D1 -də servo bağlayır // standart olaraq qapağı açın Serial.println ("qapağın açılması"); for (pos = 95; pos> = 0; pos -= 1) {// 95 dərəcədən 0 dərəcəyə qədər gedir myservo.write (pos); // servoya dəyişən 'pos' gecikməsindəki mövqeyə getməsini söyləyin (15); // servonun mövqeyə çatması üçün 15ms gözləyir} Serial.begin (115200); // Kompüter gecikməsinə mesaj göndərmək üçün Serial ünsiyyətə başlayın (10); Serial.println ("\ r / n"); startWiFi (); // Verilmiş bəzi giriş nöqtələrinə qoşulmağa çalışın. Sonra bir bağlantının başlanmasını gözləyinUDP (); if (! WiFi.hostByName (NTPServerName, timeServerIP)) {// Serial.println NTP serverinin IP ünvanını əldə edin ("DNS axtarışı uğursuz oldu. Yenidən yüklənir."); Serial.flush (); ESP.reset (); } Serial.print ("Zaman serveri IP: / t"); Serial.println (timeServerIP); Serial.println ("\ r / nNTP sorğusu göndərilir …"); sendNTPpacket (timeServerIP); } işarəsiz uzun intervalNTP = 60000; // Hər dəqiqə imzasız uzun NTP vaxtı istəyin uzun prevNTP = 0; imzasız uzun lastNTPResponse = millis (); uint32_t vaxt UNIX = 0; imzasız uzun prevActualTime = 0; void loop () {işarəsiz uzun currentMillis = millis (); if (currentMillis - prevNTP> intervalNTP) {// Son NTP sorğusundan bir dəqiqə keçmişsə prevNTP = currentMillis; Serial.println ("\ r / nNTP sorğusu göndərilir …"); sendNTPpacket (timeServerIP); // NTP sorğusu göndərin} uint32_t time = getTime (); // Bir NTP cavabının gəlib -gəlmədiyini yoxlayın və (UNIX) vaxtını əldə edin, əgər (vaxt) {// Yeni bir zaman damgası alınmışdırsa timeUNIX = vaxt; Serial.print ("NTP cavabı: / t"); Serial.println (timeUNIX); lastNTPResponse = currentMillis; } else if ((currentMillis - lastNTPResponse)> 3600000) {Serial.println ("Son NTP cavabından 1 saatdan çoxdur. Yenidən yüklənir."); Serial.flush (); ESP.reset (); } uint32_t actualTime = timeUNIX + (currentMillis - lastNTPRESponse)/1000; uint32_t EasternTime = timeUNIX - 18000 + (currentMillis - lastNTPRESponse)/1000; if (actualTime! = prevActualTime && timeUNIX! = 0) {// Son nəşrdən bir saniyə keçmişsə prevActualTime = actualTime; Serial.printf ("\ rUTC vaxtı: / t%d:%d:%d", getHours (actualTime), getMinutes (actualTime), getSeconds (actualTime)); Serial.printf ("\ rEST (-5): / t%d:%d:%d", getHours (EasternTime), getMinutes (EasternTime), getSeconds (EasternTime)); Serial.println (); } // 7:30 am if (getHours (EasternTime) == 7 && GetMinutes (EasternTime) == 30 && GetSeconds (EasternTime) == 0) {// Serial.println qapağını açın ("qapağın açılması"); for (pos = 95; pos> = 0; pos -= 1) {// 95 dərəcədən 0 dərəcəyə qədər gedir myservo.write (pos); // servoya dəyişən 'pos' gecikməsindəki mövqeyə getməsini söyləyin (15); // servonun mövqeyə çatması üçün 15ms gözləyir}} // gecə yarısı əgər (getHours (EasternTime) == 0 && GetMinutes (EasternTime) == 0 && GetSeconds (EasternTime) == 0) {// Serial qapağını bağlayın. println ("qapağı bağlamaq"); üçün (pos = 0; pos <= 95; pos += 1) {// 0 dərəcədən 95 dərəcəyə // 1 dərəcə addımlarla gedir myservo.write (pos); // servoya dəyişən 'pos' gecikməsindəki mövqeyə getməsini söyləyin (15); // servonun mövqeyə çatması üçün 15ms gözləyir}} /* // testi (getHours (EasternTime) == 12 && GetMinutes (EasternTime) == 45 && GetSeconds (EasternTime) == 0) {// qapağı bağlayın Serial.println ("qapağı bağlamaq"); for (pos = 0; pos = 0; pos -= 1) {// 95 dərəcədən 0 dərəcəyə qədər gedir myservo.write (pos); // servoya dəyişən 'pos' gecikməsindəki mövqeyə getməsini söyləyin (15); // servonun mövqeyə çatması üçün 15 ms gözləyir}} */} void startWiFi () {// Bəzi verilən giriş nöqtələrinə qoşulmağa çalışın. Sonra wifiMulti.addAP ("ssid_from_AP_1", "your_password_for_AP_1") bağlantısı gözləyin; // qoşulmaq istədiyiniz Wi-Fi şəbəkələrini əlavə edin //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ır"); while (wifiMulti.run ()! = WL_CONNECTED) {// Wi-Fi gecikməsini bağlamaq üçün gözləyin (250); Serial.print ('.'); } Serial.println ("\ r / n"); Serial.print ("Bağlandı"); Serial.println (WiFi. SSID ()); // Serial.print ("IP ünvanı: / t") ilə hansı şəbəkəyə bağlı olduğumuzu bildirin; Serial.print (WiFi.localIP ()); // ESP8266 -nın IP ünvanını kompüterə göndərin Serial.println ("\ r / n"); } etibarsız startUDP () {Serial.println ("Başlayan UDP"); UDP.begin (123); // 123 Serial.print portunda UDP mesajlarını dinləməyə başlayın ("Yerli port: / t"); Serial.println (UDP.localPort ()); Serial.println (); } uint32_t getTime () {if (UDP.parsePacket () == 0) {// Cavab yoxdursa (hələ) 0 qaytar; } UDP.read (NTPBuffer, NTP_PACKET_SIZE); // paketi tampona oxuyun // 4 zaman damgası baytını bir 32 bitlik nömrəyə birləşdirin uint32_t NTPTime = (NTPBuffer [40] << 24) | (NTPBuffer [41] << 16) | (NTPBuffer [42] << 8) | NTPBuffer [43]; // NTP vaxtını UNIX zaman damgasına çevirin: // Unix vaxtı 1 yanvar 1970 -ci ildə başlayır. Bu, NTP vaxtında 2208988800 saniyədir: const uint32_t yetmiş il = 2208988800UL; // yetmiş il çıxart: uint32_t UNIXTime = NTPTime - yetmiş il; UNIXTime qaytarın; } etibarsız sendNTPpacket (IPAddress & address) {memset (NTPBuffer, 0, NTP_PACKET_SIZE); // tampondakı bütün baytları 0 olaraq təyin edin // NTP sorğusu yaratmaq üçün lazım olan dəyərləri başladın NTPBuffer [0] = 0b11100011; // LI, Version, Mode // zaman damgası tələb edən bir paket göndərin: UDP.beginPacket (ünvan, 123); // NTP istəkləri 123 UDP.write portu (NTPBuffer, NTP_PACKET_SIZE); UDP.endPacket (); } inline int getSeconds (uint32_t UNIXTime) {UNIXTime % 60 qaytar; } inline int getMinutes (uint32_t UNIXTime) {UNIXTime / 60 % qayıt 60; } inline int getHours (uint32_t UNIXTime) {UNIXTime / 3600 % qaytar 24; }

Addım 5: İstifadə edin

İstifadə et!
İstifadə et!
İstifadə et!
İstifadə et!

Kabellərinizi qabın içərisinə çəkin və USB AC adapterindən istifadə edərək pişik qidalandırıcınızı elektrik prizinə qoşun. Sadə kodun yazılma tərzi, "açıq" vəziyyətdə açılması nəzərdə tutulur və yalnız Arduino eskizində göstərilən vaxt eşiklərində qapaq mövqeyini dəyişəcək.

İzlədiyiniz üçün təşəkkürlər! Öz versiyanızı hazırlayırsınızsa, onu aşağıda "Mən hazırladım" bölməsində görmək istərdim!

Bu layihəni bəyənirsinizsə, digərlərindən bəziləri ilə maraqlana bilərsiniz:

  • Gökkuşağı Portretləri üçün Prizma Tutucusu
  • Pişik Qülləsi ilə Kontrplak Saxlama Divarı
  • LED Mason Kavanoz Fənərləri (3D çaplı qapaq)
  • 3D Yazıcı Filament Quru Qutu
  • Təcili USB Güc Qaynağı (3D Çap)
  • Parlaq LED Gummy Candy
  • Drenajlı 3D Çaplı Geometrik Planter
  • Parlaq 3D Çaplı Çiçəklər
  • LEDləri skuterin altına necə quraşdırmaq olar (Bluetooth ilə)

İşlədiklərimdən xəbərdar olmaq üçün məni YouTube, Instagram, Twitter və Pinterest -də izləyin.

Tövsiyə: