Агуулгын хүснэгт:

Cat Food Access Control (ESP8266 + Servo Motor + 3D хэвлэх): 5 алхам (зурагтай)
Cat Food Access Control (ESP8266 + Servo Motor + 3D хэвлэх): 5 алхам (зурагтай)

Видео: Cat Food Access Control (ESP8266 + Servo Motor + 3D хэвлэх): 5 алхам (зурагтай)

Видео: Cat Food Access Control (ESP8266 + Servo Motor + 3D хэвлэх): 5 алхам (зурагтай)
Видео: 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 хэвлэх)

Энэхүү төсөл нь миний хөгшин чихрийн шижинтэй муур Чазад зориулан автомат муурны хоол хийх аяга бүтээх үйл явцыг хамарна. Инсулин авахаасаа өмнө тэр өглөөний цайгаа уух ёстой байдаг, гэхдээ би унтахаасаа өмнө хоолны таваг авахаа мартдаг нь хоолны дуршил бууруулж, инсулины хуваарийг алдагдуулдаг. Энэхүү хоол нь servo мотор ашиглан шөнийн 00 цагаас өглөөний 7.30 цагийн хооронд хоолны тагийг хаадаг. NodeMCU ESP8266 микроконтроллерийн Arduino ноорог нь хуваарийг хянахын тулд Network Time Protocol (NTP) -ийг ашигладаг.

Энэ төсөл нь залуу, илүү идэвхтэй мууранд тохиромжгүй байж магадгүй юм. Чаз маш хөгшин, сул дорой тул аяга онгойлгох гэж оролддоггүй, гэхдээ боломжтой.

Хэрэв та Arduino эсвэл ESP8266 -д шинээр орсон бол дараах урьдчилсан гарын авлага танд таалагдах болно.

  • Ардуино ангиллын зааварчилгаа
  • Зааварлах боломжтой зүйлсийн интернет

Хангамж

  • 3D принтер (би Creality CR-10s Pro ашигладаг)
  • 3D принтерийн утас (би алтан PLA ашиглаж байна)
  • NodeMCU ESP8266 wifi микроконтроллер
  • USB кабель (A -аас microB хүртэл)
  • USB цахилгаан адаптер
  • Бичил servo мотор
  • Жижиг халив, эрэг
  • Холбох утас
  • Толгойн зүү
  • Perma-proto самбар

Миний хийж буй зүйлээс хоцрохгүйн тулд YouTube, Instagram, Twitter, Pinterest дээр намайг дагаж, мэдээллийн хуудсаа захиалаарай. Амазоны Associate -ийн хувьд та миний түншлэлийн холбоосыг ашиглан хийсэн худалдан авалтаас олдог.

Алхам 1: 3D хэвлэсэн хэсэг

3D хэвлэсэн эд анги
3D хэвлэсэн эд анги
3D хэвлэсэн эд анги
3D хэвлэсэн эд анги

Муурны хоолны аяга тавиур нь Thingiverse дээрх Ardy Lai -ийн загвар дээр үндэслэсэн болно. Би муурныхаа аягыг багтаахаар том болгож, том болгосны дараа богиносгосон. Би микро servo мотор эзэмшигч, кабелийг дотогш чиглүүлэх хэд хэдэн нүхийг нэмж оруулав.

Би Tinkercad ашиглан микро тагны эвэрт бэхлэх зориулалттай энгийн тагийг загварчилсан. Та миний загварыг Tinkercad -аас шууд авах боломжтой бөгөөд/эсвэл энэ алхамд хавсаргасан STL татаж авах боломжтой.

Би эд ангиудыг Creality CR-10s Pro принтер дээрээ PLA алтан судалтай хэвлэсэн.

Илчлэлт: Үүнийг бичиж байх үед би Tinkercad -ийг хийдэг Autodesk -ийн ажилтан юм.

Алхам 2: Тагийг Servo моторт холбоно уу

Тагийг Servo моторт холбоно уу
Тагийг Servo моторт холбоно уу
Тагийг Servo моторт холбоно уу
Тагийг Servo моторт холбоно уу

Би жижиг өрмийн тусламжтайгаар servo эвэр дээрх нүхний хэмжээг ихэсгэсэн бөгөөд дараа нь боолтыг ашиглан servo -ийг 3D хэвлэсэн таг дээр бэхлэв.

Алхам 3: NodeMCU ESP8266 хэлхээг бий болгох

NodeMCU ESP8266 хэлхээг бий болгох
NodeMCU ESP8266 хэлхээг бий болгох
NodeMCU ESP8266 хэлхээг бий болгох
NodeMCU ESP8266 хэлхээг бий болгох
NodeMCU ESP8266 хэлхээг бий болгох
NodeMCU ESP8266 хэлхээг бий болгох
NodeMCU ESP8266 хэлхээг бий болгох
NodeMCU ESP8266 хэлхээг бий болгох

Энэ хэлхээг NodeMCU ESP8266 wifi микроконтроллероор хянадаг. Би бичил servo моторыг хялбархан салгахын тулд толгойн зүү ашиглаж, servo толгойнуудыг NodeMCU-д дараах байдлаар холбосон.

Шар servo утас: NodeMCU D1

Улаан servo утас: 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 объект үүсгэнэ // ихэнх самбар дээр арван хоёр servo объект үүсгэж болно int pos = 0; // servo байрлалыг хадгалах хувьсагч void setup () {myservo.attach (5); // servo объекттой 5 буюу a1 D1 зүү дээрх servo -ийг хавсаргана // тагийг анхдагчаар нээнэ үү Serial.println ("тагийг нээх"); for (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); } гарын үсэг зураагүй урт интервалNTP = 60000; // NTP цагийг минут тутамд хүсээгүй гарын үсэг зураагүй урт prevNTP = 0; гарын үсэггүй урт lastNTPResponse = millis (); uint32_t timeUNIX = 0; гарын үсэг зураагүй урт 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; } if if ((currentMillis - lastNTPResponse)> 3600000) {Serial.println ("Сүүлийн NTP хариултаас хойш 1 цаг гаруй. Дахин ачаална."); Serial.flush (); ESP.reset (); } uint32_t actualTime = timeUNIX + (currentMillis - lastNTPRESponse)/1000; uint32_t eastTime = 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 тагийг нээнэ үү ("тагийг нээх"); for (pos = 95; pos> = 0; pos -= 1) {// 95 градусаас 0 градус хүртэл явдаг myservo.write (pos); // servo -д 'pos' гэсэн хоцрогдолтой байрлалд шилжихийг хэл (15); // servo байрлалд хүрэх хүртэл 15ms хүлээнэ}} // шөнө дунд хэрэв (getHours (eastTime) == 0 && getMinutes (eastTime) == 0 && getSeconds (EasternTime) == 0) {// Serial тагийг хаа. println ("тагийг хаах"); for (pos = 0; pos <= 95; pos += 1) {// 0 градусаас 95 градус хүртэл явна // 1 градусын алхамаар myservo.write (pos); // servo -д 'pos' гэсэн хоцрогдолтой байрлалд шилжихийг хэл (15); // servo байрлалд хүрэх хүртэл 15ms хүлээнэ үү}} /* // турших (хэрэв GetHours (eastTime) == 12 && getMinutes (eastTime) == 45 && getSeconds (EasternTime) == 0) {// тагийг хаадаг бол Serial.println ("тагийг хаах"); for (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 -р сарын 1 -ээс эхэлнэ. Энэ нь NTP хугацаанд 2208988800 секунд болно: const uint32_t даланYears = 2208988800UL; // далан жилийг хасах: uint32_t UNIXTime = NTPTime - далан жил; UNIXTime -ийг буцаах; } хүчингүй 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) {буцах UNIXTime % 60; } inline int getMinutes (uint32_t UNIXTime) {буцах UNIXTime / 60 % 60; } inline int getHours (uint32_t UNIXTime) {буцах UNIXTime / 3600 % 24; }

Алхам 5: Үүнийг ашиглаарай

Үүнийг хэрэглэ!
Үүнийг хэрэглэ!
Үүнийг хэрэглэ!
Үүнийг хэрэглэ!

Утаснуудаа аяга тавиурын дотор талд байрлуулж, муур тэжээгчийг USB AC адаптер ашиглан залгуурт залгаарай. Энгийн кодыг бичих арга нь "нээлттэй" төлөвт ачаалагдах ёстой бөгөөд зөвхөн Arduino -ийн ноорог дээр заасан хугацааны босгон дээр тагны байрлалыг өөрчлөх болно.

Дагаж байгаад баярлалаа! Хэрэв та өөрийн хувилбарыг гаргавал доорх I Made It хэсэгт үүнийг үзэхийг хүсч байна!

Хэрэв танд энэ төсөл таалагдсан бол та миний заримыг сонирхож магадгүй юм.

  • Солонгийн өнгийн хавтастай призм эзэмшигч
  • Муур цамхаг бүхий фанер хадгалах хана
  • LED Mason Jar дэнлүү (3D хэвлэсэн таг)
  • 3D принтерийн судалтай хуурай хайрцаг
  • Яаралтай USB тэжээлийн эх үүсвэр (3D хэвлэсэн)
  • Гялалзсан LED Gummy чихэр
  • Ус зайлуулах хоолой бүхий 3D хэвлэмэл геометрийн тариа
  • Гялалзсан 3D хэвлэсэн цэцэг
  • Скутер дор LED хэрхэн суулгах вэ (Bluetooth -тэй)

Миний хийж буй зүйлээс хоцрохгүйн тулд YouTube, Instagram, Twitter, Pinterest дээр намайг дагаарай.

Зөвлөмж болгож буй: