Съдържание:
- Консумативи
- Стъпка 1: 3D отпечатани части
- Стъпка 2: Прикрепете капака към серво мотора
- Стъпка 3: Изградете верига NodeMCU ESP8266
- Стъпка 4: Качете Arduino код и тест
- Стъпка 5: Използвайте го
Видео: Контрол на достъпа до храна за котки (ESP8266 + серво мотор + 3D печат): 5 стъпки (със снимки)
2024 Автор: John Day | [email protected]. Последно модифициран: 2024-01-30 07:50
Този проект обхваща процеса, който използвах за създаването на автоматизирана купа за котешка храна за моята възрастна котка с диабет Chaz. Вижте, той трябва да закуси, преди да си вземе инсулина, но често забравям да си взема ястието с храна, преди да си легна, което разваля апетита му и изхвърля графика му за инсулин. Това ястие използва серво мотор, за да затвори капака над храната между часовете на полунощ и 7:30 сутринта. Скицата Arduino на микроконтролера NodeMCU ESP8266 използва Network Time Protocol (NTP) за контрол на графика.
Този проект може да не е подходящ за по -млади, по -активни котки. Чаз е толкова стар и крехък, не е склонен да се опитва да отвори купата, но е възможно.
Ако сте нов в Arduino или ESP8266, може да се насладите на следните предварителни ръководства:
- Инструкции клас Arduino
- Инструкции Клас Интернет на нещата
Консумативи
- 3D принтер (използвам Creality CR-10s Pro)
- Нишка за 3D принтер (използвам златен PLA)
- NodeMCU ESP8266 wifi микроконтролер
- USB кабел (от A до microB)
- USB захранващ адаптер
- Микро серво мотор
- Малка отвертка и винтове
- Тел за свързване
- Игли за заглавки
- Перма-прото платка
За да сте в крак с това, върху което работя, следвайте ме в YouTube, Instagram, Twitter, Pinterest и се абонирайте за моя бюлетин. Като партньор на Amazon печеля от квалифицирани покупки, които правите с помощта на моите партньорски връзки.
Стъпка 1: 3D отпечатани части
Поставката за купа за котешки храни се основава на дизайна на Ardy Lai върху Thingiverse. Направих го по -голям, за да побере купата на моята котка, и също го направих по -къс, тъй като увеличаването му го беше направило твърде високо. Добавих държач за микро серво мотор и няколко дупки за кабели, които да се насочат към вътрешността.
Моделирах обикновен капак с помощта на Tinkercad, предназначен да се прикрепи към клаксона на микро серво. Можете да вземете моя дизайн директно от Tinkercad и/или да изтеглите STL, приложени към тази стъпка.
Отпечатах частите на моя принтер Creality CR-10s Pro със златна нишка PLA.
Разкриване: към момента на това писане съм служител на Autodesk, което прави Tinkercad.
Стъпка 2: Прикрепете капака към серво мотора
Използвах малка свредло, за да увелича размера на отворите на серво рога, след това използвах винтове, за да прикрепя серво към 3D отпечатания капак.
Стъпка 3: Изградете верига NodeMCU ESP8266
Схемата се управлява от микроконтролер NodeMCU ESP8266 wifi. Използвах щифтове за заглавки на платка perma-proto, за да направя микро серво мотора лесно разглобяем. Серво заглавките са свързани към NodeMCU, както следва:
Жълт серво проводник: NodeMCU D1
Червен серво проводник: NodeMCU захранване (3V3 или VIN)
Черен серво проводник: NodeMCU маса (GND)
Стъпка 4: Качете Arduino код и тест
Инсталирайте вашия двигател/капак в изреза във формата на мотор на държача за купа с 3D печатна част. Включете заглавката на двигателя в щифтовете на заглавната платка на микроконтролера и включете веригата във вашия компютър с USB кабел.
Скицата на Arduino използва Network Time Protocol за извличане на текущото време и след това отваря или затваря капака според твърдо кодиран график. Копирайте следния код, актуализирайте вашите идентификационни данни за wifi и отместване на UTC времето и го качете на вашата NodeMCU платка, използвайки Arduino IDE.
#включва
#include #include #include ESP8266WiFiMulti wifiMulti; // Създайте екземпляр от класа ESP8266WiFiMulti, наречен 'wifiMulti' WiFiUDP UDP; // Създаване на екземпляр от класа WiFiUDP за изпращане и получаване на IPAddress timeServerIP; // time.nist.gov Адрес на NTP сървър const char* NTPServerName = "time.nist.gov"; const int NTP_PACKET_SIZE = 48; // NTP печатът за време е в първите 48 байта на байта на съобщението NTPBuffer [NTP_PACKET_SIZE]; // буфер за задържане на входящи и изходящи пакети Servo myservo; // създаване на серво обект за управление на серво // дванадесет серво обекта могат да бъдат създадени на повечето платки int pos = 0; // променлива за съхраняване на позицията на серво void setup () {myservo.attach (5); // прикрепя серво на щифт 5, известен още като D1, към серво обекта // отваря капака по подразбиране Serial.println ("отваряне на капака"); for (pos = 95; pos> = 0; pos -= 1) {// отива от 95 градуса на 0 градуса myservo.write (pos); // кажете на серво да отиде на позиция в променлива 'pos' delay (15); // изчаква 15ms, докато сервоприемникът достигне позицията} Serial.begin (115200); // Стартирайте серийната комуникация за изпращане на съобщения до компютъра забавяне (10); Serial.println ("\ r / n"); startWiFi (); // Опитайте да се свържете с някои дадени точки за достъп. След това изчакайте връзката startUDP (); if (! WiFi.hostByName (NTPServerName, timeServerIP)) {// Вземете IP адреса на NTP сървъра Serial.println ("DNS търсенето не бе успешно. Рестартиране."); Serial.flush (); ESP.reset (); } Serial.print ("IP сървър на времето: / t"); Serial.println (timeServerIP); Serial.println ("\ r / nИзпращане на NTP заявка …"); sendNTPpacket (timeServerIP); } без подпис дълъг интервалNTP = 60000; // Искане на NTP време всяка минута без подпис дълго prevNTP = 0; unsigned long lastNTPResponse = millis (); uint32_t времеUNIX = 0; unsigned long prevActualTime = 0; void loop () {unsigned long currentMillis = millis (); if (currentMillis - prevNTP> intervalNTP) {// Ако е минала минута от последната NTP заявка prevNTP = currentMillis; Serial.println ("\ r / nИзпращане на NTP заявка …"); sendNTPpacket (timeServerIP); // Изпращане на NTP заявка} uint32_t time = getTime (); // Проверете дали е пристигнал NTP отговор и вземете (UNIX) времето if (time) {// Ако е получена нова времева отметка timeUNIX = time; Serial.print ("NTP отговор: / t"); Serial.println (timeUNIX); lastNTPResponse = currentMillis; } else if ((currentMillis - lastNTPResponse)> 3600000) {Serial.println ("Повече от 1 час от последния NTP отговор. Рестартиране."); 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 (действително време), getMinutes (действително време), getSeconds (действително време)); Serial.printf ("\ rEST (-5): / t%d:%d:%d", getHours (EasternTime), getMinutes (EasternTime), getSeconds (EasternTime)); Serial.println (); } // 7:30 сутринта if (getHours (EasternTime) == 7 && getMinutes (EasternTime) == 30 && getSeconds (EasternTime) == 0) {// отворете капака Serial.println ("отваряне на капака"); for (pos = 95; pos> = 0; pos -= 1) {// отива от 95 градуса на 0 градуса myservo.write (pos); // кажете на серво да отиде на позиция в променлива 'pos' delay (15); // изчаква 15 мс, докато сервоприемникът достигне позицията}} // полунощ if (getHours (EasternTime) == 0 && getMinutes (EasternTime) == 0 && getSeconds (EasternTime) == 0) {// затваряне на капака Serial. println ("затваряне на капака"); for (pos = 0; pos <= 95; pos += 1) {// преминава от 0 градуса до 95 градуса // на стъпки от 1 градус myservo.write (pos); // кажете на серво да отиде на позиция в променлива 'pos' delay (15); // изчаква 15 мс, докато сервоприемникът достигне позицията}} /* // тестване ако (getHours (EasternTime) == 12 && getMinutes (EasternTime) == 45 && getSeconds (EasternTime) == 0) {// затворете капака Serial.println ("затваряне на капака"); for (pos = 0; pos = 0; pos -= 1) {// отива от 95 градуса до 0 градуса myservo.write (pos); // кажете на серво да отиде на позиция в променлива 'pos' delay (15); // изчаква 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 ()); // Изпращаме IP адреса на ESP8266 на компютъра Serial.println ("\ r / n"); } void startUDP () {Serial.println ("Стартиране на UDP"); UDP.begin (123); // Започнете да слушате UDP съобщения на порт 123 Serial.print ("Локален порт: / 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 времето започва на 1 януари 1970 г. Това е 2208988800 секунди в NTP време: const uint32_t seventyYears = 2208988800UL; // изважда седемдесет години: uint32_t UNIXTime = NTPTime - седемдесет години; връщане UNIXTime; } невалиден sendNTPpacket (IP адрес и адрес) {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) {return UNIXTime / 60 % 60; } inline int getHours (uint32_t UNIXTime) {връщане UNIXTime / 3600 % 24; }
Стъпка 5: Използвайте го
Прокарайте проводниците към вътрешността на държача за купа и включете захранващото устройство за котки в контакт с помощта на USB AC адаптер. Начинът, по който е написан простият код, е предназначен да се стартира в "отворено" състояние и ще промени само позицията на капака си във времевите прагове, посочени в скицата на Arduino.
Благодаря, че ни последвахте! Ако направите своя собствена версия, ще се радвам да я видя в секцията I Made It по -долу!
Ако този проект ви харесва, може да се интересувате от някои от другите ми:
- Призма притежател за Rainbow портрети
- Шперплат стена за съхранение с котка кула
- LED Mason Jar Фенери (3D отпечатан капак)
- Суха кутия с нишки за 3D принтер
- Авариен USB източник на захранване (3D печат)
- Светещ LED Gummy Candy
- 3D печатна геометрична сеялка с дренаж
- Светещи 3D принтирани цветя
- Как да инсталирате светодиоди под скутер (с Bluetooth)
За да сте в крак с това, върху което работя, следвайте ме в YouTube, Instagram, Twitter и Pinterest.
Препоръчано:
Контрол на щорите с ESP8266, Google Home и Openhab интеграция и уеб контрол: 5 стъпки (със снимки)
Контрол на щори с ESP8266, интегриране и уебконтрол на Google Home и Openhab: В тази инструкция ще ви покажа как добавих автоматизация към моите щори. Исках да мога да добавя и премахвам автоматизацията, така че цялата инсталация е закрепена. Основните части са: Стъпков двигател Стъпков шофьор, управляван от bij ESP-01 Gear и монтаж
Контрол на яркостта ШИМ базиран LED контрол с помощта на бутони, Raspberry Pi и надраскване: 8 стъпки (със снимки)
Контрол на яркостта PWM управление на LED управление с помощта на бутони, Raspberry Pi и Scratch: Опитвах се да намеря начин да обясня как PWM работи на моите ученици, затова си поставих задачата да се опитам да контролирам яркостта на светодиода с помощта на 2 бутона - единият бутон увеличава яркостта на светодиода, а другият го затъмнява. Към програмата
RFID NFC ARDUINO СИСТЕМА ЗА КОНТРОЛ НА ДОСТЪПА: 3 стъпки
RFID NFC ARDUINO СИСТЕМА ЗА КОНТРОЛ НА ДОСТЪПА: Това, от което имах нужда, беше система за контрол на достъпа до офиса ми. Целият проект е доста лесен за изграждане. Имах резервен Aduino Mega и Ethernet щит у дома, така че с още няколко компонента имам успях да изградя система за контрол на достъпа за моето изключване
Изградете свой собствен контрол на достъпа с Please-open.it: 4 стъпки
Изградете свой собствен контрол на достъпа с Please-open.it: Please-open.it е базиран във Франция и ние ще работим на пълен работен ден по този проект. Искаме фирмите (хотели, къмпинги, гари, наеми …) да се възползват от по -гъвкави решения и, разбира се, на по -ниска цена. Свържете всички вътрешни данни (назначете
RFID контрол на достъпа с Arduino Yun и Raspberry Pi: 11 стъпки
RFID контрол на достъпа с Arduino Yun и Raspberry Pi: Добре дошли в моя Instructable! Търсили ли сте онлайн система за контрол на достъпа до RFID, която може да има множество потребители, без да използвате главен ключ за програмирането й? Система, която може да регистрира достъпа с името на лицата? Система, в която лесно можете да добавите o