Mündəricat:
- Təchizat
- Addım 1: 3D çaplı hissələr
- Addım 2: Qapağı Servo Motora bağlayın
- Addım 3: NodeMCU ESP8266 Dövrə qurun
- Addım 4: Arduino Kodunu və Testini Yükləyin
- Addım 5: İstifadə edin
Video: Pişik Qida Giriş Nəzarəti (ESP8266 + Servo Motor + 3D Çap): 5 addım (şəkillərlə)
2024 Müəllif: John Day | [email protected]. Son dəyişdirildi: 2024-01-30 07:43
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
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
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
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
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
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ə:
Pişik itələyici: 4 addım (şəkillərlə)
Pişik Kovucu: Başlamaq üçün pişiklərə nifrət etmirəm, amma quşları sevirəm. Bağımda quşların istədikləri kimi girib çıxa biləcəyi açıq qəfəslərimiz var. Orada yemək və su tapa bilərlər. Təəssüf ki, bəzən məhəllədən bir pişik bağçama girir və mən
Pəncələr Yuyulacaq - Pişik Covid Əl Yuma Layihəsi ilə Görüşdü: 5 Addım (Şəkillərlə birlikdə)
Pəncələr Yuyulacaq - Pişik Covid Əl Yuma Layihəsi ilə Görüşür: Hamımız evdə uzaqlaşdığımız üçün Paws to Wash, sağlam əl yuma vərdişlərini təşviq etmək üçün sallayan bir pişiklə sevimli bir rəy taymeri qurma prosesində valideynlərə və uşaqlara yol göstərən bir DIY layihəsidir. Covid-19 dövründə əl yumaq
Kədərli Pişik Düzəldici, Catch -Me Pişik Oyuncağı - Məktəb Layihəsi: 3 addım
Kədərli Pişik Düzəldici, Catch-Me Pişik Oyuncağı-Məktəb Layihəsi: Budur məhsulumuz, interaktiv oyuncaq siçandır: Catch-Me Cat Oyuncağı. Cəmiyyətimizdəki bir çox pişiyin qarşılaşdığı problemlərin siyahısı belədir: Bu günlərdə pişiklər heç bir iş görmədən deaktiv və depresiyaya düşürlər Əksər sahiblər iş və ya məktəblə məşğul olurlar
Alexa, SmartThings, IFTTT, Google Sheets ilə inteqrasiya olunmuş hissəcik fotonundan istifadə edərək IoT pişik yemi: 7 addım (şəkillərlə)
Alexa, SmartThings, IFTTT, Google Sheets ilə inteqrasiya olunmuş hissəcik fotonundan istifadə edərək IoT Pişik Besleyicisi: Avtomatik pişik bəsləyiciyə ehtiyac öz -özünə aydındır. Pişiklər (pişiyimizin adı Bella) ac olanda iyrənc ola bilər və əgər sənin pişiyin mənimki kimidirsə qabı hər dəfə quru yeyəcək. Nəzarət olunan miqdarda yeməyi avtomatik olaraq paylamaq üçün bir yola ehtiyacım var idi
Proqramlaşdırıla bilən Akvarium Balıq Yeməyi - Qranullaşdırılmış Qida: 7 Addım (Şəkillərlə)
Proqramlaşdırıla bilən Akvarium Balıq Yeməyi - Dizaynlı Qranullaşdırılmış Qida: Balıq yemi - akvarium balığı üçün hazırlanmış dənəvər qida. Tam avtomatik balıq bəsləyicisinin çox sadə dizaynı. Kiçik SG90 mikro servo 9g və Arduino Nano ilə idarə olunur. Bütün qidalandırıcıyı USB kabeli ilə təchiz edirsiniz (USB şarj cihazından və ya USB portundan