Obsah:

Kontrola prístupu k krmivu pre mačky (ESP8266 + servomotor + 3D tlač): 5 krokov (s obrázkami)
Kontrola prístupu k krmivu pre mačky (ESP8266 + servomotor + 3D tlač): 5 krokov (s obrázkami)
Anonim
Image
Image
Kontrola prístupu k krmivu pre mačky (ESP8266 + servomotor + 3D tlač)
Kontrola prístupu k krmivu pre mačky (ESP8266 + servomotor + 3D tlač)

Tento projekt prechádza procesom, ktorý som použil na vytvorenie automatizovanej misky na mačky pre moju staršiu diabetickú mačku Chaz. Vidíte, potrebuje si dať raňajky, kým si dá inzulín, ale často zabúdam vyzdvihnúť mu jedlo, než pôjdem do postele, čo mu kazí chuť do jedla a odhodí jeho inzulínový rozvrh. Toto jedlo používa servomotor na zatvorenie veka nad jedlom medzi polnocou a 7:30 hod. Náčrt Arduino mikrokontroléra NodeMCU ESP8266 používa na ovládanie plánu sieťový časový protokol (NTP).

Tento projekt nemusí byť vhodný pre mladšie, aktívnejšie mačky. Chaz je taký starý a krehký, že nie je ochotný pokúsiť sa vypáčiť misku, ale je to možné.

Ak ste novým používateľom Arduina alebo ESP8266, môžu sa vám páčiť nasledujúce sprievodcovia predpokladmi:

  • Instructables Arduino Class
  • Trieda internetu vecí s pokynmi

Zásoby

  • 3D tlačiareň (používam Creality CR-10s Pro)
  • Vlákno pre 3D tlačiareň (používam zlaté PLA)
  • WiFi mikrokontrolér NodeMCU ESP8266
  • USB kábel (A na microB)
  • USB napájací adaptér
  • Mikromotor
  • Malý skrutkovač a skrutky
  • Pripojovací drôt
  • Kolíky hlavičky
  • Doska Perma-proto

Aby ste držali krok s tým, na čom pracujem, sledujte ma na stránkach YouTube, Instagram, Twitter, Pinterest a prihláste sa na odber môjho spravodajcu. Ako spolupracovník Amazonu zarábam na kvalifikovaných nákupoch, ktoré robíte pomocou mojich pridružených odkazov.

Krok 1: 3D tlačené diely

3D tlačené diely
3D tlačené diely
3D tlačené diely
3D tlačené diely

Držiak misky na krmivo pre mačky je založený na dizajne Ardyho Laia na Thingiverse. Zväčšil som ho, aby som do neho umiestnil misku svojej mačky, a tiež som ho skrátil, pretože jeho zväčšenie bolo príliš vysoké. Pridal som držiak na mikro servomotor a pár otvorov na káble, ktoré vedú do vnútra.

Pomocou Tinkercad som vymodeloval jednoduché veko, navrhnuté tak, aby sa dalo pripevniť k rohu mikro servo. Môj návrh si môžete stiahnuť priamo z Tinkercad a/alebo si stiahnuť STL pripojené k tomuto kroku.

Diely som vytlačil na svojej tlačiarni Creality CR-10s Pro zlatým PLA vláknom.

Zverejnenie: v čase písania tohto článku som zamestnancom spoločnosti Autodesk, ktorá vyrába Tinkercad.

Krok 2: Pripojte veko k servomotoru

Pripojte veko k servomotoru
Pripojte veko k servomotoru
Pripojte veko k servomotoru
Pripojte veko k servomotoru

Malým vrtákom som zväčšil otvory v servo rohu a potom pomocou skrutiek pripevnil servo na veko s 3D potlačou.

Krok 3: Zostavte obvod NodeMCU ESP8266

Zostavte obvod NodeMCU ESP8266
Zostavte obvod NodeMCU ESP8266
Zostavte obvod NodeMCU ESP8266
Zostavte obvod NodeMCU ESP8266
Zostavte obvod NodeMCU ESP8266
Zostavte obvod NodeMCU ESP8266
Zostavte obvod NodeMCU ESP8266
Zostavte obvod NodeMCU ESP8266

Obvod je riadený wifi mikrokontrolérom NodeMCU ESP8266. Použil som kolíkové kolíky na doske perma-proto, aby bol mikro servomotor ľahko odpojiteľný. Hlavičky serva sú k NodeMCU pripojené nasledovne:

Žltý servo vodič: NodeMCU D1

Červený servo vodič: výkon NodeMCU (3V3 alebo VIN)

Čierny servo vodič: uzemnenie NodeMCU (GND)

Krok 4: Nahrajte kód Arduino a otestujte ho

Nahrajte kód Arduino a otestujte ho
Nahrajte kód Arduino a otestujte ho

Nainštalujte zostavu motora/veka do výrezu v tvare motora na 3D tlačenej časti držiaka misy. Zapojte záhlavie motora do kolíkov záhlavia dosky mikrokontroléra a zapojte obvod do počítača káblom USB.

Skica Arduino používa protokol Network Time Protocol na načítanie aktuálneho času a potom otvára alebo zatvára veko podľa pevne stanoveného plánu. Skopírujte nasledujúci kód, aktualizujte svoje poverenia wifi a časový posun UTC a nahrajte ho na dosku NodeMCU pomocou Arduino IDE.

#zahrnúť

#include #include #include ESP8266WiFiMulti wifiMulti; // Vytvorte inštanciu triedy ESP8266WiFiMulti s názvom 'wifiMulti' WiFiUDP UDP; // Vytvorte inštanciu triedy WiFiUDP na odosielanie a prijímanie IPAddress timeServerIP; // time.nist.gov Adresa servera NTP const char* NTPServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // Časová pečiatka NTP je v prvých 48 bajtoch bajtu správy NTPBuffer [NTP_PACKET_SIZE]; // vyrovnávacia pamäť na uchovávanie prichádzajúcich a odchádzajúcich paketov Servo myservo; // vytvorenie servo objektu na ovládanie servo // na väčšine dosiek je možné vytvoriť dvanásť servo objektov int pos = 0; // premenná na uloženie polohy serva void setup () {myservo.attach (5); // pripevní servo na kolíku 5 alias D1 k objektu serva // štandardne otvorí veko Serial.println („otvorenie veka“); for (pos = 95; pos> = 0; pos -= 1) {// ide z 95 stupňov na 0 stupňov myservo.write (pos); // povedz servu, aby sa dostalo do polohy v oneskorení 'pos' (15); // čaká 15 ms, kým servo dosiahne polohu} Serial.begin (115200); // Spustenie sériovej komunikácie na odosielanie správ do počítača s oneskorením (10); Serial.println ("\ r / n"); startWiFi (); // Skúste sa pripojiť k niektorým daným prístupovým bodom. Potom počkajte na pripojenie startUDP (); if (! WiFi.hostByName (NTPServerName, timeServerIP)) {// Získať IP adresu servera NTP Serial.println ("Vyhľadávanie DNS zlyhalo. Reštartovanie."); Serial.flush (); ESP.reset (); } Serial.print ("Adresa IP časového servera: / t"); Serial.println (timeServerIP); Serial.println ("\ r / nPosielanie požiadavky NTP …"); sendNTPpacket (timeServerIP); } dlhý nepodpísaný intervalNTP = 60 000; // Žiadosť o čas NTP každú minútu bez znamienka dlhá prevNTP = 0; bez znamienka dlho lastNTPResponse = millis (); uint32_t timeUNIX = 0; nepodpísané dlhé prevActualTime = 0; void loop () {unsigned long currentMillis = millis (); if (currentMillis - prevNTP> intervalNTP) {// Ak od poslednej požiadavky NTP uplynula minúta prevNTP = currentMillis; Serial.println ("\ r / nPosielanie požiadavky NTP …"); sendNTPpacket (timeServerIP); // Odoslanie požiadavky NTP} uint32_t time = getTime (); // Skontrolujte, či prišla odpoveď NTP, a získajte (UNIX) čas, ak (čas) {// Ak bola prijatá nová časová pečiatka timeUNIX = čas; Serial.print ("Odpoveď NTP: / t"); Serial.println (timeUNIX); lastNTPResponse = currentMillis; } else if ((currentMillis - lastNTPResponse)> 3600000) {Serial.println ("Viac ako 1 hodinu od poslednej odpovede NTP. Reštartovanie."); Serial.flush (); ESP.reset (); } uint32_t actualTime = timeUNIX + (currentMillis - lastNTPResponse)/1000; uint32_t EasternTime = timeUNIX - 18000 + (currentMillis - lastNTPResponse)/1000; if (actualTime! = prevActualTime && timeUNIX! = 0) {// Ak od posledného výtlačku uplynula sekunda prevActualTime = actualTime; Serial.printf ("\ rUTC čas: / t%d:%d:%d", getHours (aktuálny čas), getMinút (aktuálny čas), getSeconds (aktuálny čas)); 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) {// otvorte veko Serial.println ("otvorenie veka"); for (pos = 95; pos> = 0; pos -= 1) {// ide z 95 stupňov na 0 stupňov myservo.write (pos); // povedz servu, aby sa dostalo do polohy v oneskorení 'pos' (15); // čaká 15 ms, kým servo dosiahne pozíciu}} // polnoc, ak (getHours (EasternTime) == 0 && getMinutes (EasternTime) == 0 && getSeconds (EasternTime) == 0) {// zatvorte veko Sériové. println ("zatváranie veka"); for (pos = 0; pos <= 95; pos += 1) {// ide od 0 stupňov do 95 stupňov // v krokoch po 1 stupni myservo.write (pos); // povedz servu, aby sa dostalo do polohy v oneskorení 'pos' (15); // čaká 15 ms, kým servo dosiahne polohu}} /* // testuje, či (getHours (EasternTime) == 12 && getMinutes (EasternTime) == 45 && getSeconds (EasternTime) == 0) {// zatvorte veko Serial.println ("zatváranie veka"); for (pos = 0; pos = 0; pos -= 1) {// ide z 95 stupňov na 0 stupňov myservo.write (pos); // povedz servu, aby sa dostalo do polohy v oneskorení 'pos' (15); // čaká 15 ms, kým servo dosiahne pozíciu}} */} neplatné štartWiFi () {// Skúste sa pripojiť k niektorým daným prístupovým bodom. Potom počkajte na pripojenie wifiMulti.addAP ("ssid_from_AP_1", "your_password_for_AP_1"); // pridajte siete Wi-Fi, ku ktorým sa chcete pripojiť //wifiMulti.addAP("ssid_from_AP_2 "," your_password_for_AP_2 "); //wifiMulti.addAP("ssid_from_AP_3 "," your_password_for_AP_3 "); Serial.println ("Pripojenie"); while (wifiMulti.run ()! = WL_CONNECTED) {// Počkajte na oneskorenie pripojenia Wi-Fi (250); Serial.print ('.'); } Serial.println ("\ r / n"); Serial.print („Pripojené k“); Serial.println (WiFi. SSID ()); // Povedzte nám, k akej sieti sme pripojení k Serial.print ("IP adresa: / t"); Serial.print (WiFi.localIP ()); // Odošlite IP adresu ESP8266 do počítača Serial.println ("\ r / n"); } neplatné startUDP () {Serial.println ("Spustenie UDP"); UDP.begin (123); // Začnite počúvať správy UDP na porte 123 Serial.print ("Miestny port: / t"); Serial.println (UDP.localPort ()); Serial.println (); } uint32_t getTime () {if (UDP.parsePacket () == 0) {// Ak neexistuje žiadna odpoveď (zatiaľ) vrátiť 0; } UDP.read (NTPBuffer, NTP_PACKET_SIZE); // prečítajte paket do vyrovnávacej pamäte // Skombinujte 4 bajty časovej pečiatky do jedného 32-bitového čísla uint32_t NTPTime = (NTPBuffer [40] << 24) | (NTPBuffer [41] << 16) | (NTPBuffer [42] << 8) | NTPBuffer [43]; // Previesť čas NTP na časovú pečiatku UNIX: // Unixový čas začína 1. januára 1970. To je 2208988800 sekúnd v čase NTP: const uint32_t sedemdesiat rokov = 2208988800UL; // odpočítajte sedemdesiat rokov: uint32_t UNIXTime = NTPTime - sedemdesiat rokov; vrátiť UNIXTime; } neplatné sendNTPpacket (IP adresa a adresa) {memset (NTPBuffer, 0, NTP_PACKET_SIZE); // nastavenie všetkých bajtov vo vyrovnávacej pamäti na 0 // Inicializácia hodnôt potrebných na vytvorenie požiadavky NTP NTPBuffer [0] = 0b11100011; // LI, verzia, režim // odoslanie paketu so žiadosťou o časovú pečiatku: UDP.beginPacket (adresa, 123); // NTP požiadavky sú na port 123 UDP.write (NTPBuffer, NTP_PACKET_SIZE); UDP.endPacket (); } inline int getSeconds (uint32_t UNIXTime) {return UNIXTime % 60; } inline int getMinutes (uint32_t UNIXTime) {return UNIXTime / 60 % 60; } inline int getHours (uint32_t UNIXTime) {return UNIXTime / 3600 % 24; }

Krok 5: Využite to

Použi to!
Použi to!
Použi to!
Použi to!

Veďte vodiče do vnútornej časti držiaka misy a podávač mačiek zapojte do zásuvky pomocou sieťového adaptéra USB. Spôsob, akým je jednoduchý kód napísaný, je myslený tak, že sa má zaviesť v „otvorenom“stave a zmení svoju polohu veka iba v časových prahoch uvedených v náčrte Arduino.

Ďakujeme, že nás sledujete! Ak si vytvoríte vlastnú verziu, rád by som ju uvidel v nižšie uvedenej sekcii Vyrobil som ju!

Ak sa vám páči tento projekt, mohli by vás zaujímať niektoré z mojich ďalších:

  • Držiak hranola pre dúhové portréty
  • Úložná stena z preglejky s vežou Cat
  • LED lampa Mason Jar (veko s 3D potlačou)
  • Suchý box s 3D tlačiarenským vláknom
  • Núdzový zdroj napájania USB (3D tlač)
  • Žiarivá LED gumová cukrík
  • Geometrický kvetináč s 3D tlačou a drenážou
  • Žiarivé 3D tlačené kvety
  • Ako nainštalovať LED diódy pod kolobežku (s Bluetooth)

Aby ste držali krok s tým, na čom pracujem, sledujte ma na stránkach YouTube, Instagram, Twitter a Pinterest.

Odporúča: