INHOUDSOPGAWE:

Toegangsbeheer vir katte (ESP8266 + servomotor + 3D -druk): 5 stappe (met foto's)
Toegangsbeheer vir katte (ESP8266 + servomotor + 3D -druk): 5 stappe (met foto's)

Video: Toegangsbeheer vir katte (ESP8266 + servomotor + 3D -druk): 5 stappe (met foto's)

Video: Toegangsbeheer vir katte (ESP8266 + servomotor + 3D -druk): 5 stappe (met foto's)
Video: Vir The Robot Boy | Hindi Cartoon For Kids | Vir ek villian | Animated Series| Wow Kidz 2024, Junie
Anonim
Image
Image
Toegangsbeheer vir katte (ESP8266 + servomotor + 3D -druk)
Toegangsbeheer vir katte (ESP8266 + servomotor + 3D -druk)

Hierdie projek gaan oor die proses waarmee ek 'n outomatiese bak vir katte vir my bejaarde diabeet kat Chaz gemaak het. Sien, hy moet ontbyt eet voordat hy sy insulien kan kry, maar ek vergeet gereeld om sy kosskottel op te tel voor ek gaan slaap, wat sy eetlus bederf en sy insulienprogram afskakel. Hierdie gereg gebruik 'n servomotor om 'n deksel oor die kos tussen middernag en 07:30 toe te maak. Die Arduino -skets van die NodeMCU ESP8266 mikrokontroleerder gebruik Network Time Protocol (NTP) om die skedule te beheer.

Hierdie projek is moontlik nie geskik vir jonger, meer aktiewe katte nie. Chaz is so oud en broos, hy is nie geneig om die bak oop te maak nie, maar dit is moontlik.

As u nuut is by die Arduino of die ESP8266, kan u die volgende vereiste gidse geniet:

  • Onderrigbare Arduino -klas
  • Instructables Internet of Things -klas

Voorrade

  • 3D-drukker (ek gebruik 'n Creality CR-10s Pro)
  • 3D -printer filament (ek gebruik goue PLA)
  • NodeMCU ESP8266 wifi -mikrobeheerder
  • USB -kabel (A na mikroB)
  • USB -kragadapter
  • Mikro servomotor
  • Klein skroewedraaier en skroewe
  • Aansluitdraad
  • Kopspelde
  • Perma-proto bord

Volg my op YouTube, Instagram, Twitter, Pinterest en teken in op my nuusbrief om tred te hou met waaraan ek werk. As Amazon -medewerker verdien ek uit kwalifiserende aankope wat u doen met my aangeslote skakels.

Stap 1: 3D -gedrukte onderdele

3D -gedrukte onderdele
3D -gedrukte onderdele
3D -gedrukte onderdele
3D -gedrukte onderdele

Die houer vir kattekos is gebaseer op die ontwerp van Ardy Lai op Thingiverse. Ek het dit groter gemaak vir my kat se bak, en ek het dit ook korter gemaak, aangesien die opskaling dit te lank gemaak het. Ek het 'n houer vir 'n mikro -servomotor bygevoeg en 'n paar gate vir kabels om na binne te lei.

Ek het 'n eenvoudige deksel gemaak met behulp van Tinkercad, wat ontwerp is om aan die horing van die mikroservo vasgemaak te word. U kan my ontwerp direk van Tinkercad aflaai en/of die STL's wat by hierdie stap aangeheg is, aflaai.

Ek het die dele op my Creality CR-10s Pro-drukker gedruk met 'n goue PLA-filament.

Openbaarmaking: ten tyde van hierdie skrywe is ek 'n werknemer van Autodesk, wat Tinkercad vervaardig.

Stap 2: Bevestig deksel op servomotor

Bevestig deksel aan servomotor
Bevestig deksel aan servomotor
Bevestig deksel aan servomotor
Bevestig deksel aan servomotor

Ek gebruik 'n klein boorpunt om die gate op die servohoring te vergroot, en gebruik dan skroewe om die servo aan die 3D -gedrukte deksel vas te maak.

Stap 3: Bou NodeMCU ESP8266 -stroombaan

Bou NodeMCU ESP8266 -stroombaan
Bou NodeMCU ESP8266 -stroombaan
Bou NodeMCU ESP8266 -stroombaan
Bou NodeMCU ESP8266 -stroombaan
Bou NodeMCU ESP8266 -stroombaan
Bou NodeMCU ESP8266 -stroombaan
Bou NodeMCU ESP8266 -stroombaan
Bou NodeMCU ESP8266 -stroombaan

Die kring word beheer deur 'n NodeMCU ESP8266 wifi -mikrobeheerder. Ek het kopstukke op 'n perma-proto-bord gebruik om die mikro-servomotor maklik afneembaar te maak. Die servokoppe is soos volg aan die NodeMCU gekoppel:

Geel servodraad: NodeMCU D1

Rooi servodraad: NodeMCU -krag (3V3 of VIN)

Swart servodraad: NodeMCU -grond (GND)

Stap 4: Laai Arduino -kode op en toets

Laai Arduino -kode en -toets op
Laai Arduino -kode en -toets op

Installeer u motor/deksel-eenheid in die motorvormige uitsny op die 3D-gedrukte deel van die houer. Koppel die motorkop in die koppenne van die mikrokontrollerbord en steek die stroombaan in u rekenaar met 'n USB -kabel.

Die Arduino-skets gebruik Network Time Protocol om die huidige tyd te haal en maak dan die deksel oop of toe volgens 'n hardgekodeerde skedule. Kopieer die volgende kode, werk u wifi -geloofsbriewe en UTC -tydverskuiwing op, en laai dit op u NodeMCU -bord op met die Arduino IDE.

#insluit

#include #include #include ESP8266WiFiMulti wifiMulti; // Skep 'n voorbeeld van die ESP8266WiFiMulti -klas, genaamd 'wifiMulti' WiFiUDP UDP; // Skep 'n voorbeeld van die WiFiUDP -klas om IPAddress timeServerIP te stuur en te ontvang; // time.nist.gov NTP -bedieneradres const char* NTPServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // NTP tydstempel is in die eerste 48 grepe van die boodskap greep NTPBuffer [NTP_PACKET_SIZE]; // buffer vir inkomende en uitgaande pakkies Servo myservo; // skep servo -voorwerp om 'n servo te beheer // twaalf servo -voorwerpe kan op die meeste borde int pos = 0 geskep word; // veranderlike om die servoposisie leemte op te stel () {myservo.attach (5); // plak die servo op pen 5 aka D1 aan die servo -voorwerp // maak standaard die deksel oop Serial.println ("maak die deksel oop"); vir (pos = 95; pos> = 0; pos -= 1) {// gaan van 95 grade tot 0 grade myservo.write (pos); // sê vir servo om in posisie te gaan met veranderlike 'pos' -vertraging (15); // wag 15 ms vir die servo om die posisie te bereik} Serial.begin (115200); // Begin die seriële kommunikasie om boodskappe na die rekenaarvertraging (10) te stuur; Serial.println ("\ r / n"); startWiFi (); // Probeer om aan te meld by sekere gegewe toegangspunte. Wag dan vir 'n verbinding beginUDP (); if (! WiFi.hostByName (NTPServerName, timeServerIP)) {// Kry die IP -adres van die NTP -bediener Serial.println ("DNS -opsporing misluk. Herlaai."); Serial.flush (); ESP.reset (); } Serial.print ("Tydbediener -IP: / t"); Serial.println (timeServerIP); Serial.println ("\ r / nStuur NTP -versoek …"); sendNTPpacket (timeServerIP); } ongetekende lang intervalNTP = 60000; // Versoek NTP -tyd elke minuut ongetekend lang prevNTP = 0; ongetekende lang laasteNTPResponse = millis (); uint32_t tydUNIX = 0; ongetekende lang prevActualTime = 0; leemte -lus () {ongetekende lang stroomMillis = millis (); if (currentMillis - prevNTP> intervalNTP) {// As 'n minuut verloop het sedert die laaste NTP -versoek prevNTP = currentMillis; Serial.println ("\ r / nStuur NTP -versoek …"); sendNTPpacket (timeServerIP); // Stuur 'n NTP -versoek} uint32_t time = getTime (); // Kontroleer of 'n NTP -antwoord gekom het en kry die (UNIX) tyd as (tyd) {// As 'n nuwe tydstempel ontvang is timeUNIX = tyd; Serial.print ("NTP -antwoord: / t"); Serial.println (timeUNIX); lastNTPResponse = currentMillis; } anders if ((currentMillis - lastNTPResponse)> 3600000) {Serial.println ("Meer as 1 uur sedert die laaste NTP -reaksie. Herlaai."); Serial.flush (); ESP.reset (); } uint32_t actualTime = timeUNIX + (currentMillis - lastNTPResponse)/1000; uint32_t eastTime = timeUNIX - 18000 + (currentMillis - lastNTPResponse)/1000; if (actualTime! = prevActualTime && timeUNIX! = 0) {// As 'n sekonde verloop het sedert die vorige druk prevActualTime = actualTime; Serial.printf ("\ rUTC -tyd: / t%d:%d:%d", getHours (actualTime), getMinutes (actualTime), getSeconds (actualTime)); Serial.printf ("\ rEST (-5): / t%d:%d:%d", getHours (eastTime), getMinutes (eastTime), getSeconds (eastTime)); Serial.println (); } // 07:30 as (getHours (eastTime) == 7 && getMinutes (eastTime) == 30 && getSeconds (eastTime) == 0) {// maak die deksel oop Serial.println ("maak die deksel oop"); vir (pos = 95; pos> = 0; pos -= 1) {// gaan van 95 grade tot 0 grade myservo.write (pos); // sê vir servo om in posisie te gaan met veranderlike 'pos' -vertraging (15); // wag 15 ms vir die servo om die posisie te bereik}} // middernag as (getHours (eastTime) == 0 && getMinutes (eastTime) == 0 && getSeconds (eastTime) == 0) {// sluit die deksel Serial. println ("sluit die deksel"); vir (pos = 0; pos <= 95; pos += 1) {// gaan van 0 grade tot 95 grade // in stappe van 1 graad myservo.write (pos); // sê vir servo om in posisie te gaan met veranderlike 'pos' -vertraging (15); // wag 15 ms totdat die servo die posisie bereik}} /* // toets of (getHours (eastTime) == 12 && getMinutes (eastTime) == 45 && getSeconds (eastTime) == 0) {// die deksel sluit Serial.println ("sluit die deksel"); vir (pos = 0; pos = 0; pos -= 1) {// gaan van 95 grade tot 0 grade myservo.write (pos); // sê vir servo om in posisie te gaan met veranderlike 'pos' -vertraging (15); // wag 15 ms vir die servo om die posisie te bereik}} */} ongeldig startWiFi () {// Probeer om aan te meld by 'n gegewe toegangspunt. Wag dan vir 'n verbinding wifiMulti.addAP ("ssid_from_AP_1", "your_password_for_AP_1"); // voeg Wi-Fi-netwerke by waarmee u wil skakel //wifiMulti.addAP("ssid_from_AP_2 "," your_password_for_AP_2 "); //wifiMulti.addAP("ssid_from_AP_3 "," your_password_for_AP_3 "); Serial.println ("Verbind"); terwyl (wifiMulti.run ()! = WL_CONNECTED) {// Wag totdat die Wi-Fi vertraag het (250); Serial.print ('.'); } Serial.println ("\ r / n"); Serial.print ("gekoppel aan"); Serial.println (WiFi. SSID ()); // Vertel ons met watter netwerk ons gekoppel is aan Serial.print ("IP -adres: / t"); Serial.print (WiFi.localIP ()); // Stuur die IP -adres van die ESP8266 na die rekenaar Serial.println ("\ r / n"); } ongeldig startUDP () {Serial.println ("Begin UDP"); UDP.begin (123); // Begin luister na UDP -boodskappe op poort 123 Serial.print ("Local port: / t"); Serial.println (UDP.localPort ()); Serial.println (); } uint32_t getTime () {if (UDP.parsePacket () == 0) {// As daar (nog) geen antwoord is nie, gee 0 terug; } UDP.read (NTPBuffer, NTP_PACKET_SIZE); // lees die pakkie in die buffer // Kombineer die 4 tydstempel grepe in een 32-bis nommer uint32_t NTPTime = (NTPBuffer [40] << 24) | (NTPBuffer [41] << 16) | (NTPBuffer [42] << 8) | NTPBuffer [43]; // Skakel NTP -tyd om na 'n UNIX -tydstempel: // Unix -tyd begin op 1 Januarie 1970. Dit is 2208988800 sekondes in NTP -tyd: const uint32_t seventyYears = 2208988800UL; // trek sewentig jaar af: uint32_t UNIXTime = NTPTime - sewentig jaar; stuur UNIXTime terug; } void sendNTPpacket (IPAddress & address) {memset (NTPBuffer, 0, NTP_PACKET_SIZE); // stel alle grepe in die buffer op 0 // Initialiseer waardes wat nodig is om NTP -versoek te vorm NTPBuffer [0] = 0b11100011; // LI, weergawe, modus // stuur 'n pakkie wat 'n tydstempel versoek: UDP.beginPacket (adres, 123); // NTP -versoeke moet 123 UDP.write (NTPBuffer, NTP_PACKET_SIZE) na 123 poort; 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; }

Stap 5: Gebruik dit

Gebruik dit!
Gebruik dit!
Gebruik dit!
Gebruik dit!

Lei u drade na die binnekant van die houer en steek u katvoeder met 'n USB -wisselstroomadapter in 'n uitlaat. Die manier waarop die eenvoudige kode geskryf is, is bedoel om in die 'oop' toestand op te laai, en dit verander slegs die deksel se posisie op die tyddrempels wat in die Arduino -skets gespesifiseer word.

Dankie dat u saamgevolg het! As u u eie weergawe maak, sien ek dit graag in die gedeelte I Made It hieronder!

As u van hierdie projek hou, sal u dalk in sommige van my ander belangstel:

  • Prismahouer vir reënboogportrette
  • Houtmuur van laaghout met Cat Tower
  • LED Mason Jar Lanterns (3D -gedrukte deksel)
  • 3D -drukker filament droë boks
  • Nood USB -kragbron (3D -gedruk)
  • Gloeiende LED Gummy Candy
  • 3D -gedrukte meetkundige planter met dreinering
  • Gloeiende 3D -gedrukte blomme
  • Hoe om LED's onder 'n bromponie te installeer (met Bluetooth)

Volg my op YouTube, Instagram, Twitter en Pinterest om tred te hou met waaraan ek werk.

Aanbeveel: