Коли Arduino дбає про ваше здоров'я краще за бабусю
Розумна пігулка — це не те, про що ви подумали! Це не таблетка з Голлівуду, яка робить вас генієм за одну ніч (шкода, правда?). Це пристрій, який подбає про те, щоб ви вчасно випили свою звичайну пігулку. Особливо корисно для тих, у кого життя залежить від ліків (діабет, щитовидна залоза тощо), або для тих, хто щоранку годину згадує: "А я вже випив таблетку чи ні?" 🤔
Пристрій вийшов настільки простим, що його може зібрати навіть ваш кіт (якщо навчите його паяти). Всі компоненти легко знайти на myproject.com.ua — вашому надійному постачальнику електронних чудес!
За статистикою, близько 50% людей забувають приймати ліки вчасно. Це означає, що кожен другий з нас потребує такого пристрою. Або хорошої пам'яті. Але пристрій надійніший! 😄
🛠️ Що нам знадобиться
⚡ Схема підключення
Схема настільки проста, що її зрозуміє навіть ваша бабуся (якщо вона інженер-електронщик):

Спочатку я збирав все на макетній платі (як справжній професіонал, який не довіряє собі з першого разу), протестував все, переконався, що нічого не димить, і тільки потім запхав у корпус.
ESP32 має більше обчислювальної потужності, ніж комп'ютер, який відправив людину на Місяць. І ми використовуємо його, щоб нагадати про таблетку. Прогрес! 🚀
🔨 Збираємо корпус
Робимо в кришці пару отворів під кріплення датчика та ще один під світлодіод. Дриль в руки — і вперед! Тільки не переплутайте з кришкою від каструлі.

З торця робимо вихід під зарядку акумуляторів та перемикач. Це як USB Type-C, тільки зроблений вами!

І всередині все за допомогою паяльника та клейового пістолета з'єднуємо. Так, клейовий пістолет — це професійний інструмент, не слухайте скептиків!

Важливо! Перед завантаженням коду обов'язково відключіть напругу акумуляторів від живлення ESP32! Інакше ваш комп'ютер може влаштувати вам сюрприз у вигляді синього екрану смерті.
💻 Програмування
Тепер найцікавіше — оживляємо нашого Франкенштейна! Спочатку вводимо свої логін та пароль від WiFi (так, пристрій буде знати ваш пароль, але обіцяє нікому не розказувати):
const char* ssid = "ваш_wifi"; const char* password = "ваш_супер_секретний_пароль";
Далі встановлюємо час, коли треба випити таблетку. У мене це 5:30 ранку (так, я мазохіст):
if (currentHour == 05 && currentMinute == 30 && !hasAlarmTriggeredToday) { // Час вставати і приймати ліки! }
Лайфхак: Якщо для вас критично випити таблетку точно вчасно — підключайте бузер до 19-го піна, а світлодіод до 17-го. Якщо ви більш розслаблена людина — можете підключити навпаки. Або взагалі не підключати (жартую, підключайте!).
Інфрачервоні датчики були винайдені для військових цілей, а тепер слідкують за вашими таблетками. От така демілітаризація! 🕊️
🎯 Як це працює
Кладете упаковку з пігулками на 2 ІК-світлодіоди датчика. Датчик думає: "О, щось є!" і спокійно чекає.
Кожен день о 5:30 починають блимати світлодіоди (бажано ультраяскраві, щоб розбудити не тільки вас, а й сусідів). Або пищить бузер — залежить від вашого рівня садизму.
Якщо ви взяли упаковку і вона була відсутня на датчику більше 5 секунд, система думає: "Молодець, випив!" Світлодіоди перестають блимати, бузер радісно пікає, підтверджуючи вашу дисциплінованість.
Після цього пристрій засинає до наступного дня, як кіт після обіду. І так кожен день — ваш персональний електронний нагадувач!
💡 Бонус: Код можна легко переробити, щоб пристрій спрацьовував 2-3 рази на день. Для тих, хто любить таблетки більше за цукерки!
📝 Повний код для Arduino IDE
#include <WiFi.h> #include <time.h> // --- НАЛАШТУВАННЯ WI-FI --- const char* ssid = "test"; const char* password = "12345678mimi"; // --- НАЛАШТУВАННЯ ЧАСУ (КИЇВ) --- const char* ntpServer = "ua.pool.ntp.org"; const long gmtOffset_sec = 7200; // UTC+2 const int daylightOffset_sec = 3600; // Літній час // --- НАЛАШТУВАННЯ ПІНІВ --- const int sensorPin = 16; // GPIO16 const int ledPin = 19; // GPIO19 const int ledPin2 = 17; // GPIO17 // --- ЗМІННІ СТАНУ --- bool isAlarmActive = false; // Чи активна "тривога" (блимання) bool hasAlarmTriggeredToday = false; // Чи спрацювала тривога сьогодні // --- Змінні для логіки --- int previousSensorState = 0; // Попередній стан датчика unsigned long lastSensorChangeTime = 0; // Час останньої зміни стану датчика // --- Змінні для блимання без delay() --- unsigned long previousBlinkMillis = 0; const long blinkInterval = 800; // Інтервал блимання в мс int ledState = LOW; void setup() { Serial.begin(115200); pinMode(sensorPin, INPUT); pinMode(ledPin, OUTPUT); pinMode(ledPin2, OUTPUT); digitalWrite(ledPin, LOW); // Переконуємося, що світлодіод вимкнений при старті digitalWrite(ledPin2, LOW); // --- ПІДКЛЮЧЕННЯ ДО WI-FI --- Serial.println("\nПідключення до Wi-Fi..."); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nWi-Fi підключено!"); // --- СИНХРОНІЗАЦІЯ ЧАСУ --- configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); Serial.print("Очікування синхронізації часу..."); while (time(nullptr) < 8 * 3600 * 2) { delay(500); Serial.print("."); } Serial.println("\nЧас синхронізовано!"); } void loop() { // --- ОТРИМАННЯ ПОТОЧНОГО ЧАСУ --- time_t now = time(nullptr); struct tm* timeinfo = localtime(&now); int currentHour = timeinfo->tm_hour; int currentMinute = timeinfo->tm_min; // --- СКИДАННЯ ТРИВОГИ ОПІВНОЧІ --- if (currentHour == 0 && currentMinute == 0 && hasAlarmTriggeredToday) { hasAlarmTriggeredToday = false; isAlarmActive = false; // На всяк випадок Serial.println("Систему скинуто для нового дня."); } // --- ЧИТАННЯ ДАНИХ З ДАТЧИКА --- // Датчик видає LOW при перешкоді, тому інвертуємо для нашої логіки (1 = перешкода) int currentSensorState = (digitalRead(sensorPin) == LOW) ? 1 : 0; // --- ПЕРЕВІРКА УМОВИ ДЛЯ ЗАПУСКУ ТРИВОГИ --- // Якщо 05:30, тривога сьогодні ще не спрацьовувала І є перешкода if (currentHour == 05 && currentMinute == 30 && !hasAlarmTriggeredToday && currentSensorState == 1) { isAlarmActive = true; hasAlarmTriggeredToday = true; // Відмічаємо, що сьогодні тривога вже була previousSensorState = currentSensorState; // Запам'ятовуємо початковий стан Serial.printf("ЧАС ТРИВОГИ! Датчик: %d. Починаю блимати...\n", currentSensorState); } // --- ЛОГІКА АКТИВНОЇ ТРИВОГИ --- if (isAlarmActive) { // 1. Перевіряємо, чи змінився стан датчика if (currentSensorState != previousSensorState) { Serial.printf("Стан датчика змінився на: %d\n", currentSensorState); lastSensorChangeTime = millis(); // Засікаємо час зміни previousSensorState = currentSensorState; } // 2. Якщо датчик показує 0 (немає перешкоди) довше 5 секунд if (currentSensorState == 0 && (millis() - lastSensorChangeTime > 5000)) { Serial.println("Перешкоду прибрано > 5 сек. Виконую підтвердження."); isAlarmActive = false; // Вимикаємо режим блимання // Веселе підтвердження світлодіодами digitalWrite(ledPin, HIGH); digitalWrite(ledPin2, HIGH); delay(100); digitalWrite(ledPin2, LOW); delay(200); digitalWrite(ledPin2, HIGH); delay(100); digitalWrite(ledPin2, LOW); delay(200); digitalWrite(ledPin2, HIGH); delay(200); digitalWrite(ledPin2, LOW); delay(1000); digitalWrite(ledPin, LOW); Serial.println("Тривогу на сьогодні завершено."); } // 3. Якщо умова вище не виконана, просто блимаємо else { unsigned long currentMillis = millis(); if (currentMillis - previousBlinkMillis >= blinkInterval) { previousBlinkMillis = currentMillis; ledState = (ledState == LOW) ? HIGH : LOW; digitalWrite(ledPin, ledState); } } } }
Перша "розумна таблетка" з'явилася в 2012 році — це була пігулка з вбудованим чіпом, який передавав дані про прийом ліків. Наш пристрій простіший, але не менш ефективний! І головне — таблетки залишаються звичайними. 💊
🎨 Можливості для апгрейду
Якщо вам замало базового функціоналу (ви ж перфекціоніст, правда?), ось кілька ідей для покращення:
Застереження: Цей пристрій не замінює консультацію лікаря! Він лише нагадує випити ліки, а не лікує. Хоча з такою кількістю електроніки виглядає досить переконливо! 😊
❓ Часті питання та відповіді
Що робити, якщо я прокидаюся пізніше 5:30?
Змініть час у коді! Або станьте жайворонком — це корисно для здоров'я (кажуть ті, хто встає о 5:30).
Чи можна використовувати для нагадування про інші речі?
Звісно! Можете класти на датчик ключі, гаманець, або навіть кота (якщо він досить терплячий).
Що робити, якщо сусіди скаржаться на бузер?
Подаруйте їм такий самий пристрій. Хай теж не забувають про таблетки!
Чи працює пристрій без інтернету?
Ні, йому потрібен WiFi для синхронізації часу. Але після синхронізації може працювати автономно (поки не вимкнете живлення).
Дослідження показують, що візуальні та звукові нагадування підвищують дотримання графіку прийому ліків на 30-40%. Тож наш пристрій — це не просто іграшка, а справжній помічник здоров'я! 📊
Написати коментар