نظام تذكير بمواعيد الدواء باستخدام الأردوينو وDS3231

رسم هندسي توضيحي: نظام تذكير بمواعيد الدواء باستخدام الأردوينو وDS3231

يمكن استخدام لوحة أردوينو مع ساعة حقيقية وشاشة ومنبّه لبناء وسيلة تذكير منزلية بسيطة بمواعيد الدواء. الفكرة تعليمية ومناسبة لتعلّم قراءة الوقت، وحفظ الإعدادات، والتعامل مع الأزرار والمخرجات، لكنها ليست جهازًا طبيًا ولا بديلًا عن تعليمات الطبيب أو متابعة مقدم الرعاية.

تنبيه مهم: لا تعتمد على هذا المشروع وحده في الأدوية الحرجة أو الحالات التي قد يسبب فيها تأخير الجرعة خطرًا. استخدمه كتذكير إضافي إلى جانب خطة موثوقة ومراجعة بشرية.

كيف يعمل النظام؟

توفر وحدة DS3231 RTC الوقت حتى عند فصل التغذية بفضل بطاريتها الاحتياطية. يقارن البرنامج الساعة الحالية بثلاثة مواعيد قابلة للتعديل. عند التطابق، يعمل المنبّه الصوتي وتظهر رسالة على شاشة LCD 16×2. يؤدي الضغط على زر التأكيد إلى إيقاف التنبيه وتسجيل استجابة المستخدم لذلك الموعد حتى لا يتكرر الإنذار خلال الدقيقة نفسها.

المكونات المطلوبة

  • لوحة Arduino Uno أو لوحة متوافقة تعمل بجهد 5V.
  • وحدة ساعة حقيقية DS3231 مع بطارية احتياطية سليمة.
  • شاشة LCD 16×2 بواجهة I²C؛ العنوان الشائع 0x27 وقد يختلف حسب الوحدة.
  • منبّه صوتي فعال 5V، وزر ضغط، وبريدبورد وأسلاك توصيل.
  • مصدر 5V منظم ومناسب للوحة والمكونات.

التوصيل المقترح

المكوّنالطرفArduino Uno
DS3231VCC / GND5V / GND
DS3231SDA / SCLA4 / A5
شاشة I²CVCC / GND5V / GND
شاشة I²CSDA / SCLA4 / A5
المنبّهالإشارةD8
زر التأكيدبين D7 وGNDD7 مع INPUT_PULLUP

تشارك الشاشة ووحدة الساعة خطّي I²C بصورة طبيعية لأن لكل واحدة عنوانًا مختلفًا. افحص عنوان الشاشة بأداة I²C Scanner إذا لم يظهر النص.

الكود البرمجي

ثبّت مكتبتي RTClib وLiquidCrystal_I2C من مدير المكتبات. غيّر مصفوفتَي الساعات والدقائق بما يناسب الخطة التي يحددها الطبيب.

#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>

RTC_DS3231 rtc;
LiquidCrystal_I2C lcd(0x27, 16, 2);

const byte BUZZER_PIN = 8;
const byte ACK_PIN = 7;
const byte ALARM_COUNT = 3;
const byte alarmHour[ALARM_COUNT] = {8, 14, 20};
const byte alarmMinute[ALARM_COUNT] = {0, 0, 0};

bool acknowledged[ALARM_COUNT] = {false, false, false};
int lastDay = -1;

void setup() {
  pinMode(BUZZER_PIN, OUTPUT);
  pinMode(ACK_PIN, INPUT_PULLUP);
  Wire.begin();
  lcd.init();
  lcd.backlight();

  if (!rtc.begin()) {
    lcd.print("RTC not found");
    while (true) { }
  }

  // اضبط الساعة مرة واحدة فقط عند فقد التغذية ثم أعد تعليق السطر.
  if (rtc.lostPower()) {
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }
}

void loop() {
  DateTime now = rtc.now();

  if (now.day() != lastDay) {
    lastDay = now.day();
    for (byte i = 0; i < ALARM_COUNT; i++) {
      acknowledged[i] = false;
    }
  }

  lcd.setCursor(0, 0);
  if (now.hour() < 10) lcd.print('0');
  lcd.print(now.hour());
  lcd.print(':');
  if (now.minute() < 10) lcd.print('0');
  lcd.print(now.minute());
  lcd.print("          ");

  int activeAlarm = -1;
  for (byte i = 0; i < ALARM_COUNT; i++) {
    if (!acknowledged[i] &&
        now.hour() == alarmHour[i] &&
        now.minute() == alarmMinute[i]) {
      activeAlarm = i;
      break;
    }
  }

  lcd.setCursor(0, 1);
  if (activeAlarm >= 0) {
    lcd.print("Medicine time!  ");
    tone(BUZZER_PIN, 2200);
    if (digitalRead(ACK_PIN) == LOW) {
      acknowledged[activeAlarm] = true;
      noTone(BUZZER_PIN);
      delay(250); // إزالة اهتزاز الزر
    }
  } else {
    noTone(BUZZER_PIN);
    lcd.print("Reminder ready  ");
  }

  delay(150);
}

خطوات الاختبار قبل الاستخدام

  1. جرّب مواعيد تبعد دقائق قليلة عن الوقت الحالي وتأكد من عمل الصوت والزر.
  2. افصل التغذية وأعد تشغيلها وتأكد من احتفاظ DS3231 بالوقت الصحيح.
  3. اختبر كل موعد على حدة، وتحقق من أن الضغط لا يلغي بقية مواعيد اليوم.
  4. استخدم علبة مناسبة وثبّت الأسلاك، ولا تضع المشروع في مكان قد يتعرض للسوائل.

يمكن تطوير الفكرة بإضافة شاشة أكبر، أو سجل للجرعات، أو إشعار للهاتف عبر Wi‑Fi. وعند إضافة اتصال سحابي يجب حماية بيانات المستخدم وعدم إرسال معلومات صحية دون موافقة صريحة.

اترك تعليقا

*
*
يمكن للأعضاء المسجلين فقط ترك تعليقات.