风筝
发表于: 2019-2-23 20:37:05 | 显示全部楼层

对于我们的亲人,我们总是希望保持健康和健康。但如果他们生病并忘记按时吃药会怎么样。我们会担心,对吗?在医院,有许多患者,很难提醒每个患者按时服药。传统方式需要人们努力提醒按时服药。数字时代并没有遵循这一点,我们可以使用机器来做到这一点。智能医学提醒的应用非常广泛,可供家中的患者,医院的医生和许多其他地方使用。提醒时,有很多方法可以提醒它:

1.  在显示器上显示

2.  通过电子邮件或电话发送通知

3.  使用移动应用

4.  嗡嗡声报警

5.  使用蓝牙/ Wi-Fi

6.  接电话

7.  在提醒当前时间的同时提醒下一次上药时间


我们可以根据需要组合方式。为了简单起见,我们使用Arduino开发板做了一个简单的医学提醒器,提醒每天服用1次或2次或3次药物。可以使用按钮选择时隙。此外,它显示当前日期和时间。我们将在未来的文章中将其进一步扩展到物联网项目,其中将向用户发送电子邮件或SMS通知。该药物提醒器还可以与患者监测系统集成。


所需的组件

●    Arduino Uno开发板(我们也可以使用其他Arduino板,如Promini、Nano)

●    RTC DS3231模块

●    1602 LCD显示屏

●    蜂鸣器

●    Led(任意颜色)

●    面包板

●    跳线


Arduino药物提醒器电路图和连接

Circuit-Diagram-Medicine-Reminder-Using-Arduino.png

在这个药物提醒器项目中,RTC DS3231通过I2C协议与Arduino Uno连接。您也可以使用RTC IC DS1307读取Arduino的时间。 RTC DS3231还具有内置32k内存,可用于存储其他数据。 RTC模块通过Arduino uno的3.3V引脚供电。使用SPI连接1602 LCD显示屏。蜂鸣器用于提醒并提醒是时候吃药了。使用四个按钮,每个按钮具有不同的选择功能。第一个按钮用于提醒每天服药一次。第二个按钮用于每天提醒两次,第三个按钮用于每天提醒三次。第四个按钮用于在用户听到警报时停止蜂鸣器。

DS3231-RTC-Module.jpg


自动药物提醒器的工作过程

药物提醒器(Pill Reminder Alarm)使用5V电源供电。当它第一次启动时,会显示欢迎信息为“Welcome”。 LCD屏设置为在三个界面中循环。第一个屏幕显示信息为“Stay Healthy, Get Well Soon”。第二个屏幕是一个帮助屏幕,告诉按下选择按钮选择任何一个时隙提醒(一天一次/两次/三次)。时隙可在程序中更改,并可相应配置。现在我们将其固定为三个持续时间,即上午8点、下午2点和晚上8点。


我们将时隙分为三种模式。当用户按下第一按钮时,模式1选择在早上8点服药一次。当用户按下第二按钮时,模式2选择在早上8点和晚上8点服用两次/天。如果用户按下第3按钮,模式3选择在上午8点、下午2点和晚上8点服用药物三次/天。

Circuit-Hardware-Medicine-Reminder-Using-Arduino.jpg


我们还可以添加一个功能来将蜂鸣器暂停10分钟(不包含在此项目中)。当用户通过按下按钮选择所需的模式时,将记录用户输入并从RTC获取时间。当时间与所选时隙匹配时,蜂鸣器开始嗡嗡声。用户可以按STOP按钮停止蜂鸣器。下一次的药物提醒继续相同的过程。

跳转到指定楼层
风筝
发表于: 2019-2-23 20:59:56 | 显示全部楼层

用于药物提醒器的编程Arduino UNO

一旦你想到了提醒服用药片的方法,就很容易编写程序。程序中它将在显示屏提示,蜂鸣器鸣响以及用LED指示。它还可以选择三个时间段(每天一次/两次/三次),当时间到达时,开始通过蜂鸣器鸣响来提醒患者。然后整个系统将如下所示:

用户获取显示屏上的帮助说明>用户选择时间段(每天一次/两次/三次)>显示打印确认消息>保持开始时间>当时间与用户选择的插槽匹配时蜂鸣器和LED启动>用户停止按下停止按钮>结束


如果我们想要添加更多功能,我们可以更改程序和硬件。为了更简单地理解,我们将程序分解为小功能。这些功能易于理解和实施。完整的程序在本文末尾处给出。让我们从程序开始吧。


因为我们使用了一些外围设备,如16x2 LCD Display、RTC DS3231,所以我们首先必须包含库。所需的库文件如下:

  1. <LiquidCrystal.h>  
  2. <RTClib.h>   (https://github.com/adafruit/RTClib)
  3. <EEPROM.h>
  4. <Wire.h>
复制代码

如果Arduino未打开,EEPROM库用于保持用户选择输入的参数。当用户打开Arduino电源时,它会使用EEPROM库获得之前的按钮状态。由于RTC DS3231模块使用I2C进行通信,因此使用Wire.h库。


始终检查RTC是否正确接线或未损坏,因为RTC将在整个提醒系统的时间保持中发挥重要作用。

  1.   if (! rtc.begin()) {                      // check if rtc is connected
  2.     Serial.println("Couldn't find RTC");
  3.     while (1);
  4.   }
  5. if (rtc.lostPower()) {
  6.     Serial.println("RTC lost power, lets set the time!");
  7.   }
复制代码

时间调整可以通过两种方式完成,可以自动使用系统编译时间,也可以手动输入。设置完时间后,请注释以下行,除非您想再次更改RTC时间。

  1. rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));        
  2. //rtc.adjust(DateTime(2019, 1, 10, 7, 59, 52));
复制代码

以下switch语句用于读取先前保存的按钮状态并恢复状态以获得适当且准确的提醒时间。

  1. val2 = EEPROM.read(addr);                         // read previosuly saved value of push button to start from where it was left previously
  2.   switch (val2) {
  3.     case 1:
  4.       Serial.println("Set for 1/day");
  5.       push1state = 1;
  6.       push2state = 0;
  7.       push3state = 0;
  8.       pushVal = 01;
  9.       break;

  10.     case 2:
  11.       Serial.println("Set for 2/day");
  12.       push1state = 0;
  13.       push2state = 1;
  14.       push3state = 0;
  15.       pushVal = 10;
  16.       break;
  17.    
  18.     case 3:
  19.       Serial.println("Set for 3/day");
  20.       push1state = 0;
  21.       push2state = 0;
  22.       push3state = 1;
  23.       pushVal = 11;
  24.       break;
  25.   }
复制代码

该代码用于使毫秒用于定时间隔和控制定义的间隔屏幕循环。

  1. currentMillisLCD = millis(); // start millis for LCD screen switching at defined interval of time
复制代码

开始读取连接到按钮的数字引脚。

  1. push1state = digitalRead(push1pin);                  
  2. push2state = digitalRead(push2pin);
  3. push3state = digitalRead(push3pin);
  4. stopinState = digitalRead(stopPin);  
复制代码

下面的函数用于读取按钮状态并将其写入EEPROM。 只要按下按钮,状态就会写入EEPROM。 它还在所选用户输入选项的LCD显示屏上打印消息。 类似地,使用函数push2()push3()

  1. void push1() {                   // function to set reminder once/day
  2.   if (push1state == 1) {
  3.     push1state = 0;
  4.     push2state = 0;
  5.     push3state = 0;
  6. //    pushPressed = true;
  7.     EEPROM.write(addr, 1);
  8.     Serial.print("Push1 Written : "); Serial.println(EEPROM.read(addr));  // for debugging
  9.     pushVal = 1;                                             //save the state of push button-1
  10.     lcd.clear();
  11.     lcd.setCursor(0, 0);
  12.     lcd.print("Reminder set ");
  13.     lcd.setCursor(0, 1);
  14.     lcd.print("for Once/day !");
  15.     delay(1200);
  16.     lcd.clear();
  17.   }
  18. }
复制代码

下面的函数用于停止蜂鸣器和熄灭LED。 提出建议总是好的。 在显示屏上打印建议信息“Take medicine with warm water”。

  1. void stopPins() {                   //function to stop buzzing when user pushes stop push button

  2.   if (stopinState == 1) {
  3. //    stopinState = 0;
  4. //    pushPressed = true;
  5.     pushpressed = 1;
  6.     lcd.clear();
  7.     lcd.setCursor(0, 0);
  8.     lcd.print("Take Medicine  ");
  9.     lcd.setCursor(0, 1);
  10.     lcd.print("with Warm Water");
  11.     delay(1200);
  12.     lcd.clear();
  13.   }
  14. }
复制代码

以下函数与时间保持无关,但总是在三个屏幕中循环,这有助于用户。 由于我们正在关注患者,因此我们可以打印一条问候语,因为我们知道情绪支持对于在更快的时间内治愈患者非常有帮助。 您可以选择自己的广告信息。 让我们打印一条消息“Stay healthy, Get well soon”。

第二个屏幕用于向患者发送“Press buttons for reminder..”。 第三个屏幕用于显示当前日期和时间。

  1. void changeScreen() {                 //function for Screen Cycling

  2.   // Start switching screen every defined intervalLCD
  3.   if (currentMillisLCD - previousMillisLCD > intervalLCD)             // save the last time you changed the display
  4.   {
  5.     previousMillisLCD = currentMillisLCD;
  6.     screens++;
  7.     if (screens > maxScreen) {
  8.       screens = 0;  // all screens over -> start from 1st
  9.     }
  10.     isScreenChanged = true;
  11.   }

  12.   // Start displaying current screen
  13.   if (isScreenChanged)   // only update the screen if the screen is changed.
  14.   {
  15.     isScreenChanged = false; // reset for next iteration
  16.     switch (screens)
  17.     {
  18.       case getWellsoon:
  19.         gwsMessege();                // get well soon message
  20.         break;
  21.       case HELP_SCREEN:              
  22.         helpScreen();               // instruction screen
  23.         break;
  24.       case TIME_SCREEN:
  25.         timeScreen();                  // to print date and time
  26.         break;
  27.       default:
  28.         //NOT SET.
  29.         break;
  30.     }
  31.   }
  32. }
复制代码

如果已达到所选时间,startBuzz()函数用于同时启动LED嗡嗡声和闪烁。

  1. void startBuzz() {                    // function to start buzzing when time reaches to defined interval
  2. //  if (pushPressed == false) {

  3. if (pushpressed == 0) {
  4.     Serial.println("pushpressed is false in blink");
  5.     unsigned long currentMillis = millis();
  6.    
  7. if (currentMillis - previousMillis >= interval) {
  8.       previousMillis = currentMillis;         // save the last time you blinked the LED
  9.       Serial.println("Start Buzzing");
  10.       
  11. if (ledState == LOW) {                  // if the LED is off turn it on and vice-versa:
  12.         ledState = HIGH;
  13.       }  else {
  14.         ledState = LOW;
  15.       }
  16.       digitalWrite(ledPin, ledState);
  17.     }
  18.   }
  19.   
  20. else if (pushpressed == 1) {
  21.     Serial.println("pushpressed is true");
  22.     ledState = LOW;
  23.     digitalWrite(ledPin, ledState);
  24.   }
  25. }
复制代码

以下函数用于比较用户在上午8点选择的时隙,并开始蜂鸣器蜂鸣器并使LED闪烁,直到用户按下停止按钮。 类似地,函数void at2pm()void at8pm()用于在下午2点和晚上8点启动蜂鸣器和LED。

  1. void at8am() {                      // function to start buzzing at 8am
  2.   DateTime now = rtc.now();
  3.   if (int(now.hour()) >= buzz8amHH) {
  4.     if (int(now.minute()) >= buzz8amMM) {
  5.       if (int(now.second()) > buzz8amSS) {
  6.         /////////////////////////////////////////////////////
  7.         startBuzz();
  8.         /////////////////////////////////////////////////////
  9.       }
  10.     }
  11.   }
  12. }
复制代码

以上就是你如何使用Arduino简单地制作自己的自动药物提醒器。 您还可以将ESP8266与Arduino一起使用,使其成为一个能够向用户发送电子邮件警报的物联网项目。


代码

完整的代码如下所示: main.rar (2.87 KB, 下载次数: 89)

回复

使用道具 举报

呵呵呵呵
发表于: 2020-10-12 20:22:58 | 显示全部楼层

为啥我的lcd显示一排的方块啊
回复

使用道具 举报

旧梦12333
发表于: 2021-6-10 16:55:07 | 显示全部楼层

你好,能把接线图发全一点吗?有些看不清楚,推敲了好久那个显示屏还是没亮
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-19 14:30 , Processed in 0.237653 second(s), 13 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表