Turinys:

Prieigos prie kačių maisto kontrolė (ESP8266 + servo variklis + 3D spausdinimas): 5 žingsniai (su nuotraukomis)
Prieigos prie kačių maisto kontrolė (ESP8266 + servo variklis + 3D spausdinimas): 5 žingsniai (su nuotraukomis)

Video: Prieigos prie kačių maisto kontrolė (ESP8266 + servo variklis + 3D spausdinimas): 5 žingsniai (su nuotraukomis)

Video: Prieigos prie kačių maisto kontrolė (ESP8266 + servo variklis + 3D spausdinimas): 5 žingsniai (su nuotraukomis)
Video: Sterblinukas ir maisto kontrolė 2024, Lapkritis
Anonim
Image
Image
Kačių maisto prieigos kontrolė (ESP8266 + servo variklis + 3D spausdinimas)
Kačių maisto prieigos kontrolė (ESP8266 + servo variklis + 3D spausdinimas)

Šis projektas apima procesą, kurį naudojau kurdamas automatizuotą kačių ėdalo dubenį savo pagyvenusiai diabetinei katei Chaz. Žiūrėk, jam reikia papusryčiauti, kol jis gali gauti insulino, bet aš dažnai užmirštu pasiimti jo maisto indą prieš eidama miegoti, o tai sugadina jo apetitą ir pašalina jo insulino grafiką. Šis patiekalas naudoja servo variklį, kad uždarytų maisto dangtelį nuo vidurnakčio iki 7.30 val. „NodeMCU ESP8266“mikrovaldiklio „Arduino“eskizas naudoja tinklo laiko protokolą (NTP), kad valdytų tvarkaraštį.

Šis projektas gali netikti jaunesnėms, aktyvesnėms katėms. Chazas yra toks senas ir silpnas, jis nėra linkęs bandyti atplėšti dubenėlio, bet tai įmanoma.

Jei esate naujokas „Arduino“ar ESP8266, jums gali patikti šie būtini vadovai:

  • „Arduino“klasės instrukcijos
  • Mokomųjų daiktų interneto klasė

Prekės

  • 3D spausdintuvas (naudoju „Creality CR-10s Pro“)
  • 3D spausdintuvo siūlas (naudoju auksinį PLA)
  • „NodeMCU ESP8266“belaidis mikrovaldiklis
  • USB kabelis (nuo A iki microB)
  • USB maitinimo adapteris
  • Mikro servo variklis
  • Mažas atsuktuvas ir varžtai
  • Prijungimo viela
  • Antraštės kaiščiai
  • „Perma-proto“lenta

Norėdami neatsilikti nuo to, ką dirbu, sekite mane „YouTube“, „Instagram“, „Twitter“, „Pinterest“ir užsiprenumeruokite mano naujienlaiškį. Kaip „Amazon“asocijuotas asmuo uždirbu iš kvalifikuotų pirkinių, kuriuos atliekate naudodami mano filialų nuorodas.

1 žingsnis: 3D spausdintos dalys

3D spausdintos dalys
3D spausdintos dalys
3D spausdintos dalys
3D spausdintos dalys

Kačių ėdalo dubenėlio laikiklis sukurtas pagal Ardy Lai dizainą „Thingiverse“. Padariau didesnį, kad tilptų mano katės dubuo, taip pat sutrumpinau, nes padidinus jo dydį jis tapo per aukštas. Pridėjau mikro servo variklio laikiklį ir keletą skylių kabeliams nukreipti į vidų.

Naudodamas „Tinkercad“modeliavau paprastą dangtį, skirtą pritvirtinti prie mikro servo rago. Galite paimti mano dizainą tiesiai iš „Tinkercad“ir (arba) atsisiųsti prie šio veiksmo pridėtas STL.

Aš atspausdinau dalis savo „Creality CR-10s Pro“spausdintuve su aukso spalvos PLA siūlais.

Atskleidimas: šio rašymo metu esu „Tinkercad“gaminančios „Autodesk“darbuotoja.

2 žingsnis: pritvirtinkite dangtį prie servo variklio

Pritvirtinkite dangtį prie servo variklio
Pritvirtinkite dangtį prie servo variklio
Pritvirtinkite dangtį prie servo variklio
Pritvirtinkite dangtį prie servo variklio

Aš naudoju mažą grąžtą, kad padidinčiau skylių dydį ant servo rago, tada varžtais pritvirtinau servo prie 3D atspausdinto dangčio.

3 žingsnis: sukurkite „NodeMCU ESP8266“grandinę

Sukurkite „NodeMCU ESP8266“grandinę
Sukurkite „NodeMCU ESP8266“grandinę
Sukurkite „NodeMCU ESP8266“grandinę
Sukurkite „NodeMCU ESP8266“grandinę
Sukurkite „NodeMCU ESP8266“grandinę
Sukurkite „NodeMCU ESP8266“grandinę
Sukurkite „NodeMCU ESP8266“grandinę
Sukurkite „NodeMCU ESP8266“grandinę

Grandinę valdo „NodeMCU ESP8266“belaidis mikrovaldiklis. Aš naudoju antraštės kaiščius perma-proto plokštėje, kad mikro servo variklis būtų lengvai nuimamas. Servo antraštės yra prijungtos prie „NodeMCU“taip:

Geltona servo viela: NodeMCU D1

Raudona servo viela: „NodeMCU“maitinimas (3V3 arba VIN)

Juodas servo laidas: „NodeMCU“įžeminimas (GND)

4 veiksmas: įkelkite „Arduino“kodą ir išbandykite

Įkelkite „Arduino“kodą ir išbandykite
Įkelkite „Arduino“kodą ir išbandykite

Įdėkite variklio/dangčio mazgą į variklio formos išpjovą ant dubens laikiklio 3D spausdintos dalies. Prijunkite variklio antraštę prie mikrovaldiklio plokštės antraštės kaiščių ir prijunkite grandinę prie kompiuterio naudodami USB kabelį.

„Arduino“eskizas naudoja tinklo laiko protokolą dabartiniam laikui gauti, o tada atidaro arba uždaro dangtį pagal griežtai užkoduotą tvarkaraštį. Nukopijuokite šį kodą, atnaujinkite „Wi -Fi“prisijungimo duomenis ir UTC laiko poslinkį ir įkelkite jį į „NodeMCU“plokštę naudodami „Arduino IDE“.

#įtraukti

#įtraukimas #įtraukimas #įtraukimas ESP8266WiFiMulti wifiMulti; // Sukurkite ESP8266WiFiMulti klasės egzempliorių, pavadintą „wifiMulti“WiFiUDP UDP; // Sukurkite „WiFiUDP“klasės egzempliorių, kad išsiųstumėte ir gautumėte IPAddress timeServerIP; // time.nist.gov NTP serverio adresas const char* NTPServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // NTP laiko žyma yra pirmuosiuose 48 baitų pranešimo baitu NTPBuffer [NTP_PACKET_SIZE]; // buferis įeinantiems ir išeinantiems paketams laikyti Servo myservo; // sukurti servo objektą valdyti servo // daugumoje lentų galima sukurti dvylika servo objektų int pos = 0; // kintamasis servo pozicijai saugoti void setup () {myservo.attach (5); // prie servo objekto pritvirtina 5 kaiščio servą, dar vadinamą D1 // pagal numatytuosius nustatymus atidarykite dangtį Serial.println ("dangčio atidarymas"); for (pos = 95; pos> = 0; pos -= 1) {// eina nuo 95 laipsnių iki 0 laipsnių myservo.write (pos); // liepti servo eiti į padėtį kintamajame 'pos' delay (15); // laukia 15 ms, kol servo sistema pasieks poziciją} Serial.begin (115200); // Pradėkite serijinį ryšį, kad pranešimai būtų siunčiami į kompiuterį delčia (10); Serial.println ("\ r / n"); startWiFi (); // Pabandykite prisijungti prie kai kurių nurodytų prieigos taškų. Tada palaukite, kol prasidės ryšysUDP (); if (! WiFi.hostByName (NTPServerName, timeServerIP)) {// Gauti NTP serverio Serial.println IP adresą ("DNS peržiūra nepavyko. Paleisti iš naujo."); Serial.flush (); ESP.reset (); } Serial.print ("Laiko serverio IP: / t"); Serial.println (timeServerIP); Serial.println ("\ r / nSiunčiama NTP užklausa …"); sendNTPpacket (timeServerIP); } nepasirašytas ilgas intervalasNTP = 60000; // Prašyti NTP laiko kiekvieną minutę unsigned long prevNTP = 0; unsigned long lastNTPResponse = milis (); uint32_t timeUNIX = 0; nepasirašytas ilgas prevActualTime = 0; void loop () {unsigned long currentMillis = millis (); if (currentMillis - prevNTP> intervalNTP) {// Jei nuo paskutinės NTP užklausos praėjo minutė prevNTP = currentMillis; Serial.println ("\ r / nSiunčiama NTP užklausa …"); sendNTPpacket (timeServerIP); // Siųsti NTP užklausą} uint32_t time = getTime (); // Patikrinkite, ar atvyko NTP atsakymas, ir gaukite (UNIX) laiką, jei (laikas) {// Jei gauta nauja laiko žyma timeUNIX = time; Serial.print ("NTP atsakymas: / t"); Serial.println (timeUNIX); lastNTPResponse = currentMillis; } else if ((currentMillis - lastNTPResponse)> 3600000) {Serial.println ("Daugiau nei 1 valanda nuo paskutinio NTP atsakymo. Perkraunama."); Serial.flush (); ESP.reset (); } uint32_t aktualusTime = laikasUNIX + (currentMillis - lastNTPResponse)/1000; uint32_t eastTime = timeUNIX - 18000 + (currentMillis - lastNTPResponse)/1000; if (faktinis laikas! = prevActualTime && timeUNIX! = 0) {// Jei nuo paskutinio spausdinimo praėjo sekundė prevActualTime = faktinis laikas; Serial.printf ("\ rUTC laikas: / t%d:%d:%d", getHours (faktinis laikas), getMinutes (faktinis laikas), getSeconds (faktinis laikas)); Serial.printf ("\ rEST (-5): / t%d:%d:%d", getHours (eastTime), getMinutes (eastTime), getSeconds (eastTime)); Serial.println (); } // 7:30 am if (getHours (eastTime) == 7 && getMinutes (eastTime) == 30 && getSeconds (eastTime) == 0) {// atidarykite dangtį Serial.println ("dangčio atidarymas"); for (pos = 95; pos> = 0; pos -= 1) {// eina nuo 95 laipsnių iki 0 laipsnių myservo.write (pos); // liepti servo eiti į padėtį kintamajame 'pos' delay (15); // laukia 15 ms, kol servo sistema pasieks poziciją}} // vidurnaktį, jei (getHours (eastTime) == 0 && get get Minut (eastTime) == 0 && getSeconds (eastTime) == 0) {// uždarykite dangtelį Serial. println („dangtelio uždarymas“); for (pos = 0; pos <= 95; pos += 1) {// eina nuo 0 laipsnių iki 95 laipsnių // 1 laipsnio žingsniais myservo.write (pos); // liepti servo eiti į padėtį kintamajame 'pos' delay (15); // laukia 15 ms, kol servo sistema pasieks poziciją}} /* // išbandys, ar (getHours (eastTime) == 12 && getMinutes (eastTime) == 45 && getSeconds (eastTime) == 0) {// uždarykite dangtį Serial.println („dangtelio uždarymas“); for (pos = 0; pos = 0; pos -= 1) {// eina nuo 95 laipsnių iki 0 laipsnių myservo.write (pos); // liepti servo eiti į padėtį kintamajame 'pos' delay (15); // laukia 15 ms, kol servo sistema pasieks padėtį}} * */} void startWiFi () {// Pabandykite prisijungti prie kai kurių nurodytų prieigos taškų. Tada palaukite ryšio „wifiMulti.addAP“(„ssid_from_AP_1“, „your_password_for_AP_1“); // pridėti „Wi-Fi“tinklus, prie kurių norite prisijungti //wifiMulti.addAP("ssid_from_AP_2 "," your_password_for_AP_2 "); //wifiMulti.addAP("ssid_from_AP_3 "," your_password_for_AP_3 "); Serial.println („Prisijungimas“); while (wifiMulti.run ()! = WL_CONNECTED) {// Palaukite, kol „Wi-Fi“prisijungs vėluoja (250); Serial.print ('.'); } Serial.println ("\ r / n"); Serial.print ("Prisijungta"); Serial.println (WiFi. SSID ()); // Pasakyk mums, prie kokio tinklo esame prisijungę prie Serial.print ("IP adresas: / t"); Serial.print („WiFi.localIP ()“); // Siųsti ESP8266 IP adresą į kompiuterį Serial.println ("\ r / n"); } void startUDP () {Serial.println ("UDP paleidimas"); UDP.pradžia (123); // Pradėkite klausytis UDP pranešimų 123 prievade Serial.print ("Vietinis prievadas: / t"); Serial.println (UDP.localPort ()); Serial.println (); } uint32_t getTime () {if (UDP.parsePacket () == 0) {// Jei atsakymo nėra (dar), grąžinkite 0; } UDP.read (NTPBuffer, NTP_PACKET_SIZE); // skaityti paketą į buferį // Sujunkite 4 laiko žymės baitus į vieną 32 bitų skaičių uint32_t NTPTime = (NTPBuffer [40] << 24) | (NTPBuffer [41] << 16) | (NTPBuffer [42] << 8) | NTPBuffer [43]; // NTP laiko konvertavimas į UNIX laiko žymę: // „Unix“laikas prasideda 1970 m. Sausio 1 d. Tai 2208988800 sekundžių NTP laikas: const uint32_t sevenyYears = 2208988800UL; // atimti septyniasdešimt metų: uint32_t UNIXTime = NTPTime - septyniasdešimt metų; grąžinti UNIXTime; } void sendNTPpacket (IPAddress & address) {memset (NTPBuffer, 0, NTP_PACKET_SIZE); // nustatyti visus buferio baitus į 0 // Inicijuoti reikšmes, reikalingas NTP užklausai suformuoti NTPBuffer [0] = 0b11100011; // LI, versija, režimas // atsiųsti paketą, prašantį laiko žymos: UDP.beginPacket (adresas, 123); // NTP užklausos turi būti nukreiptos į 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; }

5 žingsnis: naudokitės

Panaudok tai!
Panaudok tai!
Panaudok tai!
Panaudok tai!

Nukreipkite laidus į dubenėlio laikiklio vidų ir prijunkite kačių tiektuvą prie lizdo naudodami USB kintamosios srovės adapterį. Kaip parašytas paprastas kodas, jis turi būti įjungtas „atviroje“būsenoje ir pakeis jo dangčio padėtį tik tuo metu, kai bus nurodytos „Arduino“eskizo ribos.

Ačiū, kad sekate! Jei sukuriate savo versiją, norėčiau ją pamatyti žemiau esančioje skiltyje „Aš padariau“!

Jei jums patinka šis projektas, jus gali sudominti kai kurie kiti mano darbai:

  • Prizmės laikiklis vaivorykštiniams portretams
  • Faneros laikymo siena su kačių bokštu
  • LED Mason Jar Lanterns (3D spausdintas dangtelis)
  • 3D spausdintuvo gijų sausoji dėžutė
  • Avarinis USB maitinimo šaltinis (3D spausdintas)
  • Švytintis LED guminis saldainis
  • 3D spausdinta geometrinė sėjamoji su drenažu
  • Švytinčios 3D spausdintos gėlės
  • Kaip įdiegti šviesos diodus po paspirtuku (naudojant „Bluetooth“)

Jei norite neatsilikti nuo to, ką dirbu, sekite mane „YouTube“, „Instagram“, „Twitter“ir „Pinterest“.

Rekomenduojamas: