| 用于药物提醒器的编程Arduino UNO 一旦你想到了提醒服用药片的方法,就很容易编写程序。程序中它将在显示屏提示,蜂鸣器鸣响以及用LED指示。它还可以选择三个时间段(每天一次/两次/三次),当时间到达时,开始通过蜂鸣器鸣响来提醒患者。然后整个系统将如下所示: 用户获取显示屏上的帮助说明>用户选择时间段(每天一次/两次/三次)>显示打印确认消息>保持开始时间>当时间与用户选择的插槽匹配时蜂鸣器和LED启动>用户停止按下停止按钮>结束 
 如果我们想要添加更多功能,我们可以更改程序和硬件。为了更简单地理解,我们将程序分解为小功能。这些功能易于理解和实施。完整的程序在本文末尾处给出。让我们从程序开始吧。 
 因为我们使用了一些外围设备,如16x2 LCD Display、RTC DS3231,所以我们首先必须包含库。所需的库文件如下: 复制代码<LiquidCrystal.h>  
<RTClib.h>   (https://github.com/adafruit/RTClib)
<EEPROM.h>
<Wire.h>
 如果Arduino未打开,EEPROM库用于保持用户选择输入的参数。当用户打开Arduino电源时,它会使用EEPROM库获得之前的按钮状态。由于RTC DS3231模块使用I2C进行通信,因此使用Wire.h库。 
 始终检查RTC是否正确接线或未损坏,因为RTC将在整个提醒系统的时间保持中发挥重要作用。 复制代码  if (! rtc.begin()) {                      // check if rtc is connected 
    Serial.println("Couldn't find RTC");
    while (1);
  }
if (rtc.lostPower()) {
    Serial.println("RTC lost power, lets set the time!");
  }
时间调整可以通过两种方式完成,可以自动使用系统编译时间,也可以手动输入。设置完时间后,请注释以下行,除非您想再次更改RTC时间。 复制代码rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));        
//rtc.adjust(DateTime(2019, 1, 10, 7, 59, 52));
以下switch语句用于读取先前保存的按钮状态并恢复状态以获得适当且准确的提醒时间。 复制代码val2 = EEPROM.read(addr);                         // read previosuly saved value of push button to start from where it was left previously
  switch (val2) {
    case 1:
      Serial.println("Set for 1/day");
      push1state = 1;
      push2state = 0;
      push3state = 0;
      pushVal = 01;
      break;
    case 2:
      Serial.println("Set for 2/day");
      push1state = 0;
      push2state = 1;
      push3state = 0;
      pushVal = 10;
      break;
   
    case 3:
      Serial.println("Set for 3/day");
      push1state = 0;
      push2state = 0;
      push3state = 1;
      pushVal = 11;
      break;
  } 
该代码用于使毫秒用于定时间隔和控制定义的间隔屏幕循环。 复制代码currentMillisLCD = millis(); // start millis for LCD screen switching at defined interval of time
开始读取连接到按钮的数字引脚。 复制代码push1state = digitalRead(push1pin);                  
push2state = digitalRead(push2pin);
push3state = digitalRead(push3pin);
stopinState = digitalRead(stopPin);  
 下面的函数用于读取按钮状态并将其写入EEPROM。 只要按下按钮,状态就会写入EEPROM。 它还在所选用户输入选项的LCD显示屏上打印消息。 类似地,使用函数push2()和push3()。 复制代码void push1() {                   // function to set reminder once/day 
  if (push1state == 1) {
    push1state = 0;
    push2state = 0;
    push3state = 0;
//    pushPressed = true;
    EEPROM.write(addr, 1);
    Serial.print("Push1 Written : "); Serial.println(EEPROM.read(addr));  // for debugging
    pushVal = 1;                                             //save the state of push button-1 
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Reminder set ");
    lcd.setCursor(0, 1);
    lcd.print("for Once/day !");
    delay(1200);
    lcd.clear();
  }
}
 下面的函数用于停止蜂鸣器和熄灭LED。 提出建议总是好的。 在显示屏上打印建议信息“Take medicine with warm water”。 复制代码void stopPins() {                   //function to stop buzzing when user pushes stop push button
  if (stopinState == 1) {
//    stopinState = 0;
//    pushPressed = true;
    pushpressed = 1;
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Take Medicine  ");
    lcd.setCursor(0, 1);
    lcd.print("with Warm Water");
    delay(1200);
    lcd.clear();
  }
}
 以下函数与时间保持无关,但总是在三个屏幕中循环,这有助于用户。 由于我们正在关注患者,因此我们可以打印一条问候语,因为我们知道情绪支持对于在更快的时间内治愈患者非常有帮助。 您可以选择自己的广告信息。 让我们打印一条消息“Stay healthy, Get well soon”。 第二个屏幕用于向患者发送“Press buttons for reminder..”。 第三个屏幕用于显示当前日期和时间。 复制代码void changeScreen() {                 //function for Screen Cycling
  // Start switching screen every defined intervalLCD
  if (currentMillisLCD - previousMillisLCD > intervalLCD)             // save the last time you changed the display
  {
    previousMillisLCD = currentMillisLCD;
    screens++;
    if (screens > maxScreen) {
      screens = 0;  // all screens over -> start from 1st
    }
    isScreenChanged = true;
  }
  // Start displaying current screen
  if (isScreenChanged)   // only update the screen if the screen is changed.
  {
    isScreenChanged = false; // reset for next iteration
    switch (screens)
    {
      case getWellsoon:
        gwsMessege();                // get well soon message
        break;
      case HELP_SCREEN:              
        helpScreen();               // instruction screen
        break;
      case TIME_SCREEN:
        timeScreen();                  // to print date and time
        break;
      default:
        //NOT SET.
        break;
    }
  }
}
 如果已达到所选时间,startBuzz()函数用于同时启动LED嗡嗡声和闪烁。 复制代码void startBuzz() {                    // function to start buzzing when time reaches to defined interval
//  if (pushPressed == false) {
 
if (pushpressed == 0) {
    Serial.println("pushpressed is false in blink");
    unsigned long currentMillis = millis();
    
if (currentMillis - previousMillis >= interval) {
      previousMillis = currentMillis;         // save the last time you blinked the LED
      Serial.println("Start Buzzing");
      
if (ledState == LOW) {                  // if the LED is off turn it on and vice-versa:
        ledState = HIGH;
      }  else {
        ledState = LOW;
      }
      digitalWrite(ledPin, ledState);
    }
  }
  
else if (pushpressed == 1) {
    Serial.println("pushpressed is true");
    ledState = LOW;
    digitalWrite(ledPin, ledState);
  }
}
 以下函数用于比较用户在上午8点选择的时隙,并开始蜂鸣器蜂鸣器并使LED闪烁,直到用户按下停止按钮。 类似地,函数void at2pm()和void at8pm()用于在下午2点和晚上8点启动蜂鸣器和LED。 复制代码void at8am() {                      // function to start buzzing at 8am
  DateTime now = rtc.now();
  if (int(now.hour()) >= buzz8amHH) {
    if (int(now.minute()) >= buzz8amMM) {
      if (int(now.second()) > buzz8amSS) {
        /////////////////////////////////////////////////////
        startBuzz();
        /////////////////////////////////////////////////////
      }
    }
  }
}
 以上就是你如何使用Arduino简单地制作自己的自动药物提醒器。 您还可以将ESP8266与Arduino一起使用,使其成为一个能够向用户发送电子邮件警报的物联网项目。 
 代码 完整的代码如下所示:
 main.rar
(2.87 KB, 下载次数: 93) |