Inhoudsopgave:

Toegangscontrole kattenvoer (ESP8266 + servomotor + 3D-printen): 5 stappen (met afbeeldingen)
Toegangscontrole kattenvoer (ESP8266 + servomotor + 3D-printen): 5 stappen (met afbeeldingen)

Video: Toegangscontrole kattenvoer (ESP8266 + servomotor + 3D-printen): 5 stappen (met afbeeldingen)

Video: Toegangscontrole kattenvoer (ESP8266 + servomotor + 3D-printen): 5 stappen (met afbeeldingen)
Video: RFID Cat Food Dispenser Prototype 2024, Juni-
Anonim
Image
Image
Toegangscontrole kattenvoer (ESP8266 + servomotor + 3D-printen)
Toegangscontrole kattenvoer (ESP8266 + servomotor + 3D-printen)

Dit project gaat over het proces dat ik gebruikte om een geautomatiseerde kattenvoerbak te maken voor mijn oudere diabetische kat Chaz. Kijk, hij moet ontbijten voordat hij zijn insuline kan krijgen, maar ik vergeet vaak zijn etensbakje op te halen voordat ik naar bed ga, wat zijn eetlust bederft en zijn insulineschema verstoort. Dit gerecht maakt gebruik van een servomotor om tussen middernacht en 7.30 uur een deksel over het eten te sluiten. De Arduino-schets van de NodeMCU ESP8266-microcontroller gebruikt Network Time Protocol (NTP) om het schema te besturen.

Dit project is mogelijk niet geschikt voor jongere, actievere katten. Chaz is zo oud en broos dat hij niet geneigd is om de kom open te wrikken, maar het is mogelijk.

Als de Arduino of de ESP8266 nieuw voor je is, kun je genieten van de volgende vereiste handleidingen:

  • Instructables Arduino-klasse
  • Instructables Internet of Things-klasse

Benodigdheden

  • 3D-printer (ik gebruik een Creality CR-10s Pro)
  • 3D-printerfilament (ik gebruik gouden PLA)
  • NodeMCU ESP8266 wifi-microcontroller
  • USB-kabel (A naar microB)
  • USB-stroomadapter
  • Micro-servomotor
  • Kleine schroevendraaier en schroeven
  • Aansluitdraad
  • Header pinnen
  • Perma-proto bord

Om op de hoogte te blijven van waar ik aan werk, volg me op YouTube, Instagram, Twitter, Pinterest en abonneer je op mijn nieuwsbrief. Als Amazon Associate verdien ik met kwalificerende aankopen die je doet via mijn gelieerde links.

Stap 1: 3D-geprinte onderdelen

3D-geprinte onderdelen
3D-geprinte onderdelen
3D-geprinte onderdelen
3D-geprinte onderdelen

De kattenvoerbakhouder is gebaseerd op het ontwerp van Ardy Lai op Thingiverse. Ik heb het groter gemaakt om plaats te bieden aan de kom van mijn kat, en ook korter gemaakt omdat het opschalen te groot was geworden. Ik heb een houder voor een micro-servomotor toegevoegd en een paar gaten voor kabels om naar binnen te leiden.

Ik heb een eenvoudig deksel gemodelleerd met Tinkercad, ontworpen om aan de hoorn van de microservo te bevestigen. U kunt mijn ontwerp rechtstreeks uit Tinkercad halen en/of de STL's downloaden die aan deze stap zijn gekoppeld.

Ik heb de onderdelen op mijn Creality CR-10s Pro-printer afgedrukt met gouden PLA-filament.

Openbaarmaking: op het moment van schrijven ben ik een medewerker van Autodesk, dat Tinkercad maakt.

Stap 2: Bevestig het deksel aan de servomotor

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

Ik gebruikte een kleine boor om de gaten op de servohoorn te vergroten en gebruikte vervolgens schroeven om de servo aan het 3D-geprinte deksel te bevestigen.

Stap 3: Bouw NodeMCU ESP8266 Circuit

Bouw NodeMCU ESP8266 Circuit
Bouw NodeMCU ESP8266 Circuit
Bouw NodeMCU ESP8266 Circuit
Bouw NodeMCU ESP8266 Circuit
Bouw NodeMCU ESP8266 Circuit
Bouw NodeMCU ESP8266 Circuit
Bouw NodeMCU ESP8266 Circuit
Bouw NodeMCU ESP8266 Circuit

Het circuit wordt aangestuurd door een NodeMCU ESP8266 wifi-microcontroller. Ik heb header-pinnen op een perma-proto-bord gebruikt om de micro-servomotor gemakkelijk afneembaar te maken. De servo-headers zijn als volgt op de NodeMCU aangesloten:

Gele servodraad: NodeMCU D1

Rode servodraad: NodeMCU-voeding (3V3 of VIN)

Zwarte servodraad: NodeMCU-aarde (GND)

Stap 4: Arduino-code uploaden en testen

Arduino-code uploaden en testen
Arduino-code uploaden en testen

Installeer uw motor / deksel-assemblage in de motorvormige uitsparing op het 3D-geprinte onderdeel van de komhouder. Sluit de motorheader aan op de headerpinnen van de microcontrollerkaart en sluit het circuit aan op uw computer met een USB-kabel.

De Arduino-schets gebruikt Network Time Protocol om de huidige tijd op te halen en opent of sluit vervolgens het deksel volgens een hardgecodeerd schema. Kopieer de volgende code, werk uw wifi-inloggegevens en UTC-tijdverschuiving bij en upload deze naar uw NodeMCU-bord met behulp van de Arduino IDE.

#erbij betrekken

#include #include #include ESP8266WiFiMulti wifiMulti; // Maak een instantie van de ESP8266WiFiMulti-klasse, genaamd 'wifiMulti' WiFiUDP UDP; // Maak een instantie van de WiFiUDP-klasse om IPAddress timeServerIP te verzenden en te ontvangen; // time.nist.gov NTP-serveradres const char* NTPServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // NTP-tijdstempel bevindt zich in de eerste 48 bytes van de berichtbyte NTPBuffer [NTP_PACKET_SIZE]; // buffer om inkomende en uitgaande pakketten vast te houden Servo myservo; // maak een servo-object om een servo te besturen // twaalf servo-objecten kunnen op de meeste borden worden gemaakt int pos = 0; // variabele om de servopositie op te slaan void setup() { myservo.attach(5); // bevestigt de servo op pin 5 aka D1 aan het servo-object // open standaard het deksel Serial.println ("het deksel openen"); for (pos = 95; pos >= 0; pos -= 1) {// gaat van 95 graden naar 0 graden myservo.write(pos); // vertel servo om naar positie te gaan in variabele 'pos' vertraging (15); // wacht 15 ms totdat de servo de positie bereikt } Serial.begin (115200); // Start de seriële communicatie om berichten naar de computer te sturen vertraging (10); Serial.println("\r\n"); startWiFi(); // Probeer verbinding te maken met bepaalde toegangspunten. Wacht vervolgens op een verbinding startUDP(); if(!WiFi.hostByName(NTPServerName, timeServerIP)) { // Haal het IP-adres op van de NTP-server Serial.println ("DNS-lookup mislukt. Opnieuw opstarten."); Serieel.flush(); ESP.reset(); } Serial.print("Tijdserver IP:\t"); Serial.println(timeServerIP); Serial.println("\r\nNTP-verzoek wordt verzonden …"); sendNTPpacket(timeServerIP); } ongetekende lange intervalNTP = 60000; // Verzoek NTP-tijd elke minuut unsigned long prevNTP = 0; unsigned long lastNTPResponse = millis(); uint32_t tijdUNIX = 0; niet-ondertekende lange prevActualTime = 0; void loop() { unsigned long currentMillis = millis(); if (currentMillis - prevNTP > intervalNTP) { // Als er een minuut is verstreken sinds het laatste NTP-verzoek prevNTP = currentMillis; Serial.println("\r\nNTP-verzoek wordt verzonden …"); sendNTPpacket(timeServerIP); // Stuur een NTP-verzoek} uint32_t time = getTime(); // Controleer of er een NTP-antwoord is ontvangen en ontvang de (UNIX) tijd if (time) { // Als een nieuwe tijdstempel is ontvangen timeUNIX = time; Serial.print("NTP-antwoord:\t"); Serial.println(timeUNIX); lastNTPResponse = huidigeMillis; } else if ((currentMillis - lastNTPResponse) > 3600000) { Serial.println("Meer dan 1 uur sinds de laatste NTP-reactie. Opnieuw opstarten."); Serieel.flush(); ESP.reset(); } uint32_t actualTime = timeUNIX + (currentMillis - lastNTPResponse)/1000; uint32_t EasternTime = timeUNIX - 18000 + (currentMillis - lastNTPResponse)/1000; if (actualTime != prevActualTime && timeUNIX != 0) { // Als er een seconde is verstreken sinds de laatste afdruk prevActualTime = actualTime; Serial.printf("\rUTC time:\t%d:%d:%d ", getHours(actualTime), getMinutes(actualTime), getSeconds(actualTime)); Serial.printf("\rEST (-5):\t%d:%d:%d ", getHours(easternTime), getMinutes(easternTime), getSeconds(easternTime)); Serieel.println(); } // 7:30am if(getHours(easternTime) == 7 && getMinutes(easternTime) == 30 && getSeconds(easternTime) == 0){ //open het deksel Serial.println ("het deksel openen"); for (pos = 95; pos >= 0; pos -= 1) {// gaat van 95 graden naar 0 graden myservo.write(pos); // vertel servo om naar positie te gaan in variabele 'pos' vertraging (15); // wacht 15 ms totdat de servo de positie bereikt } } // middernacht if(getHours(easternTime) == 0 && getMinutes(easternTime) == 0 && getSeconds(easternTime) == 0){ // sluit het deksel Serial. println("sluit het deksel"); for (pos = 0; pos <= 95; pos += 1) { // gaat van 0 graden naar 95 graden // in stappen van 1 graad myservo.write(pos); // vertel servo om naar positie te gaan in variabele 'pos' vertraging (15); // wacht 15 ms totdat de servo de positie bereikt } } /* // testen if(getHours(easternTime) == 12 && getMinutes(easternTime) == 45 && getSeconds(easternTime) == 0){ // sluit het deksel Serial.println("sluit het deksel"); for (pos = 0; pos = 0; pos -= 1) {// gaat van 95 graden naar 0 graden myservo.write(pos); // vertel servo om naar positie te gaan in variabele 'pos' vertraging (15); // wacht 15 ms totdat de servo de positie bereikt } } */ } void startWiFi() { // Probeer verbinding te maken met bepaalde toegangspunten. Wacht vervolgens op een verbinding wifiMulti.addAP("ssid_from_AP_1", "your_password_for_AP_1"); // voeg Wi-Fi-netwerken toe waarmee u verbinding wilt maken //wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2"); //wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); Serial.println("Verbinden"); while (wifiMulti.run() != WL_CONNECTED) { // Wacht tot de wifi verbinding maakt vertraging (250); Serieel.print('.'); } Serial.println("\r\n"); Serial.print("Verbonden met "); Seriële.println(WiFi. SSID()); // Vertel ons met welk netwerk we zijn verbonden Serial.print("IP-adres:\t"); Serial.print(WiFi.localIP()); // Stuur het IP-adres van de ESP8266 naar de computer Serial.println ("\r\n"); } void startUDP() { Serial.println("UDP starten"); UDP.begin(123); // Begin te luisteren naar UDP-berichten op poort 123 Serial.print ("Lokale poort:\t"); Serial.println(UDP.localPort()); Serieel.println(); } uint32_t getTime() {if (UDP.parsePacket() == 0) { // Als er (nog) geen reactie is, retourneer dan 0; } UDP.lezen (NTPBuffer, NTP_PACKET_SIZE); // lees het pakket in de buffer // Combineer de 4 tijdstempelbytes tot één 32-bits getal uint32_t NTPTime = (NTPBuffer[40] << 24) | (NTPBuffer[41] << 16) | (NTPBuffer[42] << 8) | NTP-buffer[43]; // Converteer NTP-tijd naar een UNIX-tijdstempel: // Unix-tijd begint op 1 januari 1970. Dat is 2208988800 seconden in NTP-tijd: const uint32_t seventyYears = 2208988800UL; // trek zeventig jaar af: uint32_t UNIXTime = NTPTime - zeventigYears; UNIXTime retourneren; } void sendNTPpacket (IP-adres en adres) { memset (NTPBuffer, 0, NTP_PACKET_SIZE); // stel alle bytes in de buffer in op 0 // Initialiseer de waarden die nodig zijn om NTP-verzoek te vormen NTPBuffer [0] = 0b11100011; // LI, Version, Mode // stuur een pakket met het verzoek om een tijdstempel: UDP.beginPacket(address, 123); // NTP-verzoeken zijn naar poort 123 UDP.write (NTPBuffer, NTP_PACKET_SIZE); UDP.endPacket(); } inline int getSeconds(uint32_t UNIXTime) { retourneer 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 het

Gebruik het!
Gebruik het!
Gebruik het!
Gebruik het!

Leid uw draden naar de binnenkant van de komhouder en sluit uw kattenvoerbak aan op een stopcontact met behulp van een USB-wisselstroomadapter. De manier waarop de eenvoudige code is geschreven, is bedoeld om te worden opgestart in de "open" staat en zal alleen de positie van het deksel veranderen op de tijddrempels die zijn gespecificeerd in de Arduino-schets.

Bedankt voor het volgen! Als je je eigen versie maakt, zou ik die graag zien in de I Made It-sectie hieronder!

Als je dit project leuk vindt, ben je misschien geïnteresseerd in enkele van mijn andere:

  • Prismahouder voor regenboogportretten
  • Multiplex opslagmuur met kattentoren
  • LED Mason Jar Lantaarns (3D geprint deksel)
  • 3D-printer Filament Droge Doos
  • Nood-USB-stroombron (3D afgedrukt)
  • Gloeiende LED Gummy Candy
  • 3D-geprinte geometrische plantenbak met drainage
  • Gloeiende 3D-geprinte bloemen
  • Hoe LED's onder een scooter te installeren (met Bluetooth)

Volg mij op YouTube, Instagram, Twitter en Pinterest om op de hoogte te blijven van waar ik mee bezig ben.

Aanbevolen: