Мазмуну:

Cat Food Access Control (ESP8266 + Servo Motor + 3D Басып чыгаруу): 5 кадам (Сүрөттөр менен)
Cat Food Access Control (ESP8266 + Servo Motor + 3D Басып чыгаруу): 5 кадам (Сүрөттөр менен)

Video: Cat Food Access Control (ESP8266 + Servo Motor + 3D Басып чыгаруу): 5 кадам (Сүрөттөр менен)

Video: Cat Food Access Control (ESP8266 + Servo Motor + 3D Басып чыгаруу): 5 кадам (Сүрөттөр менен)
Video: Cat Food Bowl Access Control with ESP8266 // Becky Stern 2024, Ноябрь
Anonim
Image
Image
Cat Food Access Control (ESP8266 + Servo Motor + 3D Басып чыгаруу)
Cat Food Access Control (ESP8266 + Servo Motor + 3D Басып чыгаруу)

Бул долбоор мен карыя диабетик мышык Чаз үчүн автоматташтырылган мышык тамак табагын жасоо процессин камтыйт. Караңыз, ал инсулинди ала электе эртең мененки тамакты ичиши керек, бирок мен көбүнчө жатар алдында анын тамагын алууну унутам, бул анын табитин бузат жана инсулин графигин бузат. Бул тамак серво моторун колдонуп, түн ортосу менен таңкы 7.30 аралыгында тамактын капкагын жабат. NodeMCU ESP8266 микроконтроллеринин Arduino эскизи графикти көзөмөлдөө үчүн Network Time Protocol (NTP) колдонот.

Бул долбоор жаш, активдүү мышыктарга ылайык келбеши мүмкүн. Чаз ушунчалык эски жана алсыз, ал идишти ачууга аракет кылбайт, бирок мүмкүн.

Эгерде сиз Arduino же ESP8266 үчүн жаңы болсоңуз, анда сиз төмөнкү шарттарды колдоно аласыз:

  • Instructables Arduino Class
  • Instructables Интернет нерселер классы

Жабдуулар

  • 3D принтери (мен Creality CR-10s Pro колдоном)
  • 3D принтер жипчеси (мен алтын PLA колдонуп жатам)
  • NodeMCU ESP8266 wifi микроконтроллери
  • USB кабели (Адан микробго чейин)
  • USB кубат адаптери
  • Микро -servo мотор
  • Чакан бурагыч жана бурамалар
  • Кошуу зымы
  • Башкы төөнөгүчтөр
  • Perma-proto тактасы

Мен иштеп жаткан нерсеге жетүү үчүн YouTube, Instagram, Twitter, Pinterestте мени ээрчиңиз жана менин маалымат баракчама жазылыңыз. Amazon Associate катары мен менин өнөктөштүк шилтемелеримди колдонуп, квалификациялуу сатып алуулардан киреше табам.

1 -кадам: 3D Басылган бөлүктөрү

3D басылган бөлүктөрү
3D басылган бөлүктөрү
3D басылган бөлүктөрү
3D басылган бөлүктөрү

Мышыктар үчүн тамак идиш кармагыч Арди Лайдын Thingiverse дизайнына негизделген. Мен мышыгымдын чөйчөгүн жайгаштырууну чоңойттум, жана аны кыскартып койдум, анткени аны масштабдаштыруу өтө бийик кылып койгон. Мен микросерво кыймылдаткычынын кармагычын жана кабелдердин ичине багыттоочу тешиктерин коштум.

Мен микросервонун мүйүзүнө бекитүү үчүн иштелип чыккан Tinkercad менен жөнөкөй капкакты моделдедим. Сиз менин дизайнымды Tinkercadтан түз алып, жана/же бул кадамга тиркелген STLлерди жүктөп алсаңыз болот.

Мен тетиктерди алтын PLA жип менен Creality CR-10s Pro принтеримде басып чыгардым.

Ачыктоо: бул жазуу учурунда мен Tinkercad кылган Autodeskтин кызматкеримин.

2 -кадам: Капкакты Servo Motorго тиркеңиз

Капкакты Servo Motorго бекитүү
Капкакты Servo Motorго бекитүү
Капкакты Servo Motorго бекитүү
Капкакты Servo Motorго бекитүү

Мен servo мүйүзүндөгү тешиктердин көлөмүн көбөйтүү үчүн кичинекей бургулоочу тетикти колдондум, андан кийин 3D басып чыгарылган капкакка сервону бекитүү үчүн бурамаларды колдондум.

3 -кадам: NodeMCU ESP8266 схемасын куруңуз

NodeMCU ESP8266 схемасын куруу
NodeMCU ESP8266 схемасын куруу
NodeMCU ESP8266 схемасын куруу
NodeMCU ESP8266 схемасын куруу
NodeMCU ESP8266 схемасын куруу
NodeMCU ESP8266 схемасын куруу
NodeMCU ESP8266 схемасын куруу
NodeMCU ESP8266 схемасын куруу

Район NodeMCU ESP8266 wifi микроконтроллери тарабынан башкарылат. Мен микросерво кыймылдаткычын оңой ажыратуу үчүн перма-прото тактасындагы баш пиндерди колдонгом.

Сары серво зымы: NodeMCU D1

Кызыл серво зымы: NodeMCU күчү (3V3 же VIN)

Кара серво зымы: NodeMCU жери (GND)

4 -кадам: Arduino кодун жүктөө жана тест

Arduino кодун жана тестин жүктөө
Arduino кодун жана тестин жүктөө

Кыймылдаткычтын 3D капкагынын мотор түрүндөгү оюкчасына мотор/капкакты орнотуңуз. Мотордун башын микроконтроллер тактасынын төөнөгүчтөрүнө сайыңыз жана схеманы компьютериңизге USB кабели менен туташтырыңыз.

Arduino эскизи учурдагы убакытты алуу үчүн Network Time Protocol колдонот, андан кийин катуу коддолгон график боюнча капкакты ачат же жабат. Төмөнкү кодду көчүрүп алыңыз, wifi грамоталарын жана UTC убактысын жаңыртыңыз жана Arduino IDE аркылуу NodeMCU тактаңызга жүктөңүз.

#кошуу

#кошуу #кошуу #кошуу ESP8266WiFiMulti wifiMulti; // 'wifiMulti' WiFiUDP UDP деп аталган ESP8266WiFiMulti классынын экземплярын түзүү; // IPAddress timeServerIPти жөнөтүү жана алуу үчүн WiFiUDP классынын экземплярын түзүңүз; // time.nist.gov NTP серверинин дареги const char* NTPServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // NTP убакыт штампы NTPBuffer [NTP_PACKET_SIZE] билдирүү байтынын биринчи 48 байтында; // кирүүчү жана чыккан пакеттерди кармоо үчүн буфер Servo myservo; // сервону көзөмөлдөө үчүн servo объектини түзүү // он эки servo объектти көпчүлүк такталарда түзүүгө болот int pos = 0; // servo кызматын сактоо үчүн өзгөрмө void setup () {myservo.attach (5); // servo объектисине 5 ака D1 боюнча сервону тиркейт // капкакты демейки боюнча ачуу Serial.println ("капкакты ачуу"); үчүн (pos = 95; pos> = 0; pos -= 1) {// 95 градустан 0 градуска чейин барат myservo.write (pos); // servoга "pos" кечигүү абалына өтүүсүн айт (15); // servo позициясына жетүү үчүн 15ms күтөт} Serial.begin (115200); // Компьютердин кечигүүсүнө билдирүүлөрдү жөнөтүү үчүн Сериялык байланышты баштаңыз (10); Serial.println ("\ r / n"); startWiFi (); // Кээ бир берилген кирүү чекиттерине туташууга аракет кылыңыз. Андан кийин туташуунун башталышын күтөбүзUDP (); if (! WiFi.hostByName (NTPServerName, timeServerIP)) {// Serial.println NTP серверинин IP дарегин алыңыз ("DNS издөө ишке ашкан жок. Кайра жүктөө."); Serial.flush (); ESP.reset (); } Serial.print ("Убакыт сервер IP: / t"); Serial.println (timeServerIP); Serial.println ("\ r / nNTP сурамы жөнөтүлүүдө…"); sendNTPpacket (timeServerIP); } кол коюлбаган узак интервал NNT = 60000; // NTP убактысын ар бир мүнөттө кол коюусуз узак prevNTP = 0; unsigned long lastNTPResponse = millis (); uint32_t timeUNIX = 0; unsigned long prevActualTime = 0; void loop () {unsigned long currentMillis = millis (); if (currentMillis - prevNTP> intervalNTP) {// Акыркы NTP сурамынан бери бир мүнөт өткөн болсо prevNTP = currentMillis; Serial.println ("\ r / nNTP сурамы жөнөтүлүүдө…"); sendNTPpacket (timeServerIP); // NTP сурамын жөнөтүү} uint32_t time = getTime (); // NTP жооп келгенин текшериңиз жана (UNIX) убактысын алыңыз, эгерде (убакыт) {// Эгерде жаңы убакыт белгиси кабыл алынган болсо, timeUNIX = убакыт; Serial.print ("NTP жообу: / t"); Serial.println (timeUNIX); lastNTPResponse = currentMillis; } else if ((currentMillis - lastNTPResponse)> 3600000) {Serial.println ("Акыркы NTP жооптон бери 1 сааттан ашык. Кайра жүктөө."); Serial.flush (); ESP.reset (); } uint32_t actualTime = timeUNIX + (currentMillis - lastNTPRESponse)/1000; uint32_t EasternTime = timeUNIX - 18000 + (currentMillis - lastNTPRESponse)/1000; if (actualTime! = prevActualTime && timeUNIX! = 0) {// Акыркы басуудан бери бир секунда өткөн болсо prevActualTime = actualTime; Serial.printf ("\ rUTC убактысы: / 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 am if (getHours (EasternTime) == 7 && GetMinutes (EasternTime) == 30 && GetSeconds (EasternTime) == 0) {// капкагын ачуу Serial.println ("капкакты ачуу"); үчүн (pos = 95; pos> = 0; pos -= 1) {// 95 градустан 0 градуска чейин барат myservo.write (pos); // servoга "pos" кечигүү абалына өтүүсүн айт (15); // servo позицияга жетүү үчүн 15ms күтөт}} // түн ортосунда if (getHours (eastTime) == 0 && getMinutes (EasternTime) == 0 && getSeconds (EasternTime) == 0) {// Serial капкагын жабуу. println ("капкагын жабуу"); үчүн (pos = 0; pos <= 95; pos += 1) {// 0 градустан 95 градуска чейин барат // 1 даражадагы кадамдар менен myservo.write (pos); // servoга "pos" кечигүү абалына өтүүсүн айт (15); // servo позициясына жетүү үчүн 15ms күтөт}} /* // test if (getHours (EasternTime) == 12 && GetMinutes (EasternTime) == 45 && GetSeconds (EasternTime) == 0) {// капкагын жабуу Serial.println ("капкагын жабуу"); үчүн (pos = 0; pos = 0; pos -= 1) {// 95 градустан 0 градуска чейин барат myservo.write (pos); // servoга "pos" кечигүү абалына өтүүсүн айт (15); // servo позициясына жетүү үчүн 15ms күтөт}} */} void startWiFi () {// Кээ бир кирүү чекиттерине туташууга аракет кылыңыз. Андан кийин wifiMulti.addAP ("ssid_from_AP_1", "your_password_for_AP_1") туташуусун күтө туруңуз; // туташкыңыз келген Wi-Fi тармактарын кошуу //wifiMulti.addAP("ssid_from_AP_2 "," your_password_for_AP_2 "); //wifiMulti.addAP("ssid_from_AP_3 "," your_password_for_AP_3 "); Serial.println ("Туташуу"); while (wifiMulti.run ()! = WL_CONNECTED) {// Wi-Fi кечигүү (250) туташуусун күтө туруңуз; Serial.print ('.'); } Serial.println ("\ r / n"); Serial.print ("Туташты"); Serial.println (WiFi. SSID ()); // Serial.print ("IP дареги: / t") менен кайсы тармакка туташканыбызды айт. Serial.print (WiFi.localIP ()); // ESP8266 IP дарегин компьютер Serial.println ("\ r / n") жөнөтүү; } void startUDP () {Serial.println ("UDP башталууда"); UDP.begin (123); // 123 Serial.print портунда UDP билдирүүлөрүн уга баштаңыз ("Жергиликтүү порт: / t"); Serial.println (UDP.localPort ()); Serial.println (); } uint32_t getTime () {if (UDP.parsePacket () == 0) {// Эгерде жооп болбосо (азырынча) 0 кайтарылат; } UDP.read (NTPBuffer, NTP_PACKET_SIZE); // буферге пакетти окуу // 4 убакыт белгиси байтын бир 32 биттик санга бириктирүү uint32_t NTPTime = (NTPBuffer [40] << 24) | (NTPBuffer [41] << 16) | (NTPBuffer [42] << 8) | NTPBuffer [43]; // NTP убактысын UNIX убактысына айландыруу: // Unix убактысы 1970 -жылдын 1 -январында башталат. Бул NTP убактысында 2208988800 секунд: const uint32_t жетимиш жыл = 2208988800UL; // жетимиш жылды алып салуу: uint32_t UNIXTime = NTPTime - жетимиш жыл; UNIXTime кайтаруу; } void sendNTPpacket (IPAddress & address) {memset (NTPBuffer, 0, NTP_PACKET_SIZE); // буфердеги бардык байттарды 0 кылып коюңуз // NTP суроо -талабын түзүү үчүн керектүү болгон баалуулуктарды баштоо NTPBuffer [0] = 0b11100011; // LI, версия, режим // убакыт белгисин талап кылган пакетти жөнөтүү: UDP.beginPacket (дарек, 123); // NTP сурамдары 123 UDP.write портуна (NTPBuffer, NTP_PACKET_SIZE); UDP.endPacket (); } inline int getSeconds (uint32_t UNIXTime) {return UNIXTime % 60; } inline int getMinutes (uint32_t UNIXTime) {UNIXTime кайтаруу / 60 % 60; } inline int getHours (uint32_t UNIXTime) {return UNIXTime / 3600 % 24; }

5 -кадам: Аны колдон

Аны колдон!
Аны колдон!
Аны колдон!
Аны колдон!

Зымдарыңызды чөйчөк кармагычтын ичине багыттаңыз жана мышык багуучуңузду USB AC адаптерин колдонуп розеткага сайыңыз. Жөнөкөй коддун жазылышы, ал "ачык" абалда жүктөлүшү керек жана Arduino эскизинде көрсөтүлгөн убакыт чектеринде гана капкактын абалын өзгөртөт.

Барганыңыз үчүн рахмат! Эгерде сиз өзүңүздүн версияңызды түзсөңүз, мен аны төмөнкү I Made It бөлүмүндө көргүм келет!

Эгерде сиз бул долбоорду жактырсаңыз, анда менин кээ бирөөлөрүмө кызыкдар болушуңуз мүмкүн:

  • Радуга портреттери үчүн призма кармагыч
  • Мышык мунарасы бар фанера сактоочу дубал
  • LED Mason Jar чырактары (3D басылган капкак)
  • 3D принтер филаментинин кургак кутусу
  • Өзгөчө USB Power Source (3D Басылган)
  • Жаркыраган LED Gummy Candy
  • Дренаж менен 3D басылган геометриялык плантер
  • Жаркыраган 3D Басылган Гүлдөр
  • LEDдерди скутердин астына кантип орнотуу керек (Bluetooth менен)

Мен иштеп жаткан нерсеге жетүү үчүн YouTube, Instagram, Twitter жана Pinterestте мени ээрчиңиз.

Сунушталууда: