Obsah:

Řízení přístupu pro kočky (ESP8266 + servomotor + 3D tisk): 5 kroků (s obrázky)
Řízení přístupu pro kočky (ESP8266 + servomotor + 3D tisk): 5 kroků (s obrázky)

Video: Řízení přístupu pro kočky (ESP8266 + servomotor + 3D tisk): 5 kroků (s obrázky)

Video: Řízení přístupu pro kočky (ESP8266 + servomotor + 3D tisk): 5 kroků (s obrázky)
Video: ÓeFko bude v prosinci za půlku když budou ty Vánoce tak kdo váhal tak šup . Platí pro prvních 100 2024, Červen
Anonim
Image
Image
Řízení přístupu pro kočky (ESP8266 + servomotor + 3D tisk)
Řízení přístupu pro kočky (ESP8266 + servomotor + 3D tisk)

Tento projekt prochází procesem, který jsem použil pro vytvoření automatické misky pro kočky pro moji starší diabetickou kočku Chaz. Vidíte, potřebuje si dát snídani, než si může podat inzulín, ale já často zapomínám vyzvednout si jídlo, než půjdu spát, což mu kazí chuť k jídlu a odhazuje jeho inzulinový plán. Toto jídlo používá servomotor k uzavření víka nad jídlem mezi půlnocí a 7:30 hod. Náčrt Arduino mikrokontroléru NodeMCU ESP8266 používá k ovládání plánu protokol Network Time Protocol (NTP).

Tento projekt nemusí být vhodný pro mladší, aktivnější kočky. Chaz je tak starý a křehký, že není ochoten pokusit se vypáčit misku, ale je to možné.

Pokud jste v Arduinu nebo ESP8266 nováčci, můžete se těšit na následující prerekvizitní průvodce:

  • Instructables Třída Arduino
  • Třída Internet věcí věcí Instructables

Zásoby

  • 3D tiskárna (používám Creality CR-10s Pro)
  • Filament 3D tiskárny (používám zlaté PLA)
  • NodeMCU ESP8266 wifi mikrokontrolér
  • USB kabel (A na microB)
  • USB napájecí adaptér
  • Mikromotor
  • Malý šroubovák a šrouby
  • Propojovací drát
  • Kolíky záhlaví
  • Deska Perma-proto

Chcete -li držet krok s tím, na čem pracuji, sledujte mě na YouTube, Instagramu, Twitteru, Pinterestu a přihlaste se k odběru mého zpravodaje. Jako Amazon Associate vydělávám na oprávněných nákupech, které provádíte pomocí mých partnerských odkazů.

Krok 1: 3D tištěné díly

3D tištěné díly
3D tištěné díly
3D tištěné díly
3D tištěné díly

Držák misky na krmivo pro kočky vychází z designu Ardy Laie na Thingiverse. Udělal jsem to větší, abych pojal misku své kočky, a také jsem ji zkrátil, protože její zvětšení ji udělalo příliš vysokou. Přidal jsem držák pro mikro servomotor a pár otvorů pro kabely, které vedou dovnitř.

Pomocí Tinkercad jsem vymodeloval jednoduché víko, určené k přichycení k rohu mikro serva. Můj návrh můžete získat přímo z Tinkercad a/nebo stáhnout STL připojené k tomuto kroku.

Díly jsem vytiskl na své tiskárně Creality CR-10s Pro zlatým PLA filamentem.

Zveřejnění: v době psaní tohoto článku jsem zaměstnancem společnosti Autodesk, která vyrábí Tinkercad.

Krok 2: Připojte víko k servomotoru

Připojte víko k servomotoru
Připojte víko k servomotoru
Připojte víko k servomotoru
Připojte víko k servomotoru

Pomocí malého vrtáku jsem zvětšil velikost otvorů na servo houkačce a poté pomocí šroubů připevnil servo k víku s 3D potiskem.

Krok 3: Sestavte obvod NodeMCU ESP8266

Vybudujte obvod NodeMCU ESP8266
Vybudujte obvod NodeMCU ESP8266
Vybudujte obvod NodeMCU ESP8266
Vybudujte obvod NodeMCU ESP8266
Vybudujte obvod NodeMCU ESP8266
Vybudujte obvod NodeMCU ESP8266
Vybudujte obvod NodeMCU ESP8266
Vybudujte obvod NodeMCU ESP8266

Obvod je řízen wifi mikrokontrolérem NodeMCU ESP8266. Použil jsem záhlaví na desce perma-proto, aby byl mikro servomotor snadno odpojitelný. Záhlaví serva jsou připojena k NodeMCU následujícím způsobem:

Žlutý servo vodič: NodeMCU D1

Červený servo vodič: napájení NodeMCU (3V3 nebo VIN)

Černý servo vodič: uzemnění NodeMCU (GND)

Krok 4: Nahrajte kód Arduino a otestujte ho

Nahrajte kód Arduino a otestujte jej
Nahrajte kód Arduino a otestujte jej

Nainstalujte sestavu motoru/víka do výřezu ve tvaru motoru na 3D vytištěné části držáku mísy. Zapojte záhlaví motoru do kolíků konektoru desky mikrokontroléru a zapojte obvod do počítače kabelem USB.

Skica Arduino používá protokol Network Time Protocol k načtení aktuálního času a poté otevírá nebo zavírá víko podle pevně zakódovaného plánu. Zkopírujte následující kód, aktualizujte své wifi pověření a časový posun UTC a nahrajte jej na desku NodeMCU pomocí Arduino IDE.

#zahrnout

#include #include #include ESP8266WiFiMulti wifiMulti; // Vytvořte instanci třídy ESP8266WiFiMulti s názvem 'wifiMulti' WiFiUDP UDP; // Vytvořte instanci třídy WiFiUDP pro odesílání a přijímání IPAddress timeServerIP; // time.nist.gov Adresa serveru NTP const char* NTPServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // Časové razítko NTP je v prvních 48 bajtech bajtu zprávy NTPBuffer [NTP_PACKET_SIZE]; // vyrovnávací paměť pro uchovávání příchozích a odchozích paketů Servo myservo; // vytvoření objektu serva k ovládání servo // na většině desek lze vytvořit dvanáct objektů serva int pos = 0; // proměnná pro uložení polohy serva void setup () {myservo.attach (5); // připojí servo na pinu 5 alias D1 k objektu serva // ve výchozím nastavení otevře víko Serial.println ("otevření víka"); for (pos = 95; pos> = 0; pos -= 1) {// jde z 95 stupňů na 0 stupňů myservo.write (pos); // řekněte servu, aby přešlo na pozici v proměnné 'pos' delay (15); // čeká 15 ms, než servo dosáhne polohy} Serial.begin (115200); // Spusťte sériovou komunikaci pro odesílání zpráv do počítače se zpožděním (10); Serial.println ("\ r / n"); startWiFi (); // Zkuste se připojit k některým daným přístupovým bodům. Poté počkejte na připojení startUDP (); if (! WiFi.hostByName (NTPServerName, timeServerIP)) {// Získejte IP adresu serveru NTP Serial.println ("Vyhledávání DNS se nezdařilo. Restartování."); Serial.flush (); ESP.reset (); } Serial.print ("Adresa IP časového serveru: / t"); Serial.println (timeServerIP); Serial.println ("\ r / nPosílání požadavku NTP …"); sendNTPpacket (timeServerIP); } dlouhý bez znaménkaNTP = 60 000; // Žádost o čas NTP každou minutu bez znaménka dlouhá prevNTP = 0; unsigned long lastNTPResponse = millis (); uint32_t timeUNIX = 0; nepodepsané dlouhé prevActualTime = 0; void loop () {unsigned long currentMillis = millis (); if (currentMillis - prevNTP> intervalNTP) {// Pokud od posledního požadavku NTP uplynula minuta prevNTP = currentMillis; Serial.println ("\ r / nPosílání požadavku NTP …"); sendNTPpacket (timeServerIP); // Odeslání požadavku NTP} uint32_t time = getTime (); // Zkontrolujte, zda dorazila odpověď NTP, a získejte (UNIX) čas if (čas) {// Pokud bylo přijato nové časové razítko timeUNIX = čas; Serial.print ("Odpověď NTP: / t"); Serial.println (timeUNIX); lastNTPResponse = currentMillis; } else if ((currentMillis - lastNTPResponse)> 3600000) {Serial.println ("Více než 1 hodinu od poslední odpovědi NTP. Restartování."); Serial.flush (); ESP.reset (); } uint32_t actualTime = timeUNIX + (currentMillis - lastNTPResponse)/1000; uint32_t EasternTime = timeUNIX - 18000 + (currentMillis - lastNTPResponse)/1000; if (actualTime! = prevActualTime && timeUNIX! = 0) {// Pokud od posledního tisku uplynula vteřina prevActualTime = actualTime; Serial.printf ("\ rUTC čas: / 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 ráno if (getHours (EasternTime) == 7 && getMinutes (EasternTime) == 30 && getSeconds (EasternTime) == 0) {// otevřete víko Serial.println ("otevření víka"); for (pos = 95; pos> = 0; pos -= 1) {// jde z 95 stupňů na 0 stupňů myservo.write (pos); // řekněte servu, aby přešlo na pozici v proměnné 'pos' delay (15); // čeká 15 ms, než servo dosáhne polohy}} // půlnoc, pokud (getHours (EasternTime) == 0 && getMinutes (EasternTime) == 0 && getSeconds (EasternTime) == 0) {// zavřete víko Sériové. println ("zavření víka"); for (pos = 0; pos <= 95; pos += 1) {// jde z 0 stupňů na 95 stupňů // v krocích po 1 stupni myservo.write (pos); // řekněte servu, aby přešlo na pozici v proměnné 'pos' delay (15); // čeká 15 ms, než servo dosáhne polohy}} /* // testování if (getHours (EasternTime) == 12 && getMinutes (EasternTime) == 45 && getSeconds (EasternTime) == 0) {// zavřete víko Serial.println ("zavření víka"); for (pos = 0; pos = 0; pos -= 1) {// jde z 95 stupňů na 0 stupňů myservo.write (pos); // řekněte servu, aby přešlo na pozici v proměnné 'pos' delay (15); // čeká 15 ms, než servo dosáhne polohy}} */} neplatné startWiFi () {// Zkuste se připojit k některým daným přístupovým bodům. Poté počkejte na připojení wifiMulti.addAP ("ssid_from_AP_1", "your_password_for_AP_1"); // přidejte sítě Wi-Fi, ke kterým se chcete připojit //wifiMulti.addAP("ssid_from_AP_2 "," your_password_for_AP_2 "); //wifiMulti.addAP("ssid_from_AP_3 "," your_password_for_AP_3 "); Serial.println ("Připojování"); while (wifiMulti.run ()! = WL_CONNECTED) {// Počkejte na zpoždění připojení Wi-Fi (250); Serial.print ('.'); } Serial.println ("\ r / n"); Serial.print („Připojeno k“); Serial.println (WiFi. SSID ()); // Sdělte nám, k jaké síti jsme připojeni k Serial.print ("IP adresa: / t"); Serial.print (WiFi.localIP ()); // Odeslání IP adresy ESP8266 do počítače Serial.println ("\ r / n"); } void startUDP () {Serial.println ("Spouštění UDP"); UDP.begin (123); // Začněte poslouchat zprávy UDP na portu 123 Serial.print ("Místní port: / t"); Serial.println (UDP.localPort ()); Serial.println (); } uint32_t getTime () {if (UDP.parsePacket () == 0) {// Pokud žádná odpověď (zatím) vrátí 0; } UDP.read (NTPBuffer, NTP_PACKET_SIZE); // načtení paketu do vyrovnávací paměti // Sloučení 4 bytů časového razítka do jednoho 32bitového čísla uint32_t NTPTime = (NTPBuffer [40] << 24) | (NTPBuffer [41] << 16) | (NTPBuffer [42] << 8) | NTPBuffer [43]; // Převod času NTP na časové razítko UNIX: // Unixový čas začíná 1. ledna 1970. To je 2208988800 sekund v čase NTP: const uint32_t sedmdesát let = 2208988800UL; // odečíst sedmdesát let: uint32_t UNIXTime = NTPTime - sedmdesát let; vrátit UNIXTime; } void sendNTPpacket (IPAddress & address) {memset (NTPBuffer, 0, NTP_PACKET_SIZE); // nastavit všechny bajty ve vyrovnávací paměti na 0 // Inicializovat hodnoty potřebné k vytvoření požadavku NTP NTPBuffer [0] = 0b11100011; // LI, Version, Mode // odeslání paketu požadujícího časové razítko: UDP.beginPacket (adresa, 123); // Požadavky NTP jsou 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: Použijte to

Použij to!
Použij to!
Použij to!
Použij to!

Veďte vodiče do vnitřní části držáku mísy a pomocí napájecího adaptéru USB zapojte podavač koček do zásuvky. Způsob, jakým je jednoduchý kód napsán, má být spuštěn ve stavu „otevřeno“a změní polohu víka pouze v časových prahech uvedených v náčrtu Arduino.

Děkujeme za sledování! Pokud si vytvoříte vlastní verzi, rád ji uvidím v sekci I Made It níže!

Pokud se vám tento projekt líbí, můžete se zajímat o některé z mých dalších:

  • Držák hranolu pro duhové portréty
  • Úložná stěna z překližky s Cat Tower
  • LED lampičky Mason Jar (víko s 3D potiskem)
  • Suchý box s 3D tiskárnou
  • Nouzový zdroj napájení USB (3D tisk)
  • Svítící LED Gummy Candy
  • 3D vytištěný geometrický květináč s drenáží
  • Zářící 3D vytištěné květiny
  • Jak nainstalovat LED pod koloběžku (s Bluetooth)

Abyste udrželi krok s tím, na čem pracuji, sledujte mě na YouTube, Instagramu, Twitteru a Pinterestu.

Doporučuje: