當(dāng)談到我們所愛(ài)的人時(shí),我們總是希望他們保持健康和健康。但是如果他們生病了,忘記按時(shí)吃藥會(huì)怎么樣。我們會(huì)擔(dān)心的,對(duì)吧?在醫(yī)院,病人很多,很難提醒每一位病人按時(shí)吃藥。傳統(tǒng)方式需要人為提醒他們按時(shí)服藥。數(shù)字時(shí)代并沒(méi)有遵循這一點(diǎn),我們可以使用機(jī)器來(lái)做到這一點(diǎn)。Smart Medicine Reminder的應(yīng)用非常廣泛,可以在家中的患者、醫(yī)院的醫(yī)生以及許多其他地方使用。在提醒方面,可以有多種提醒方式:
在顯示器上顯示
通過(guò)電子郵件或電話發(fā)送通知
使用移動(dòng)應(yīng)用程序
蜂鳴器
接電話
在提醒當(dāng)前時(shí)間的同時(shí)提醒下次用藥時(shí)間
我們可以根據(jù)需要組合方式。為了簡(jiǎn)單起見(jiàn),我們使用 Arduino 制作了一個(gè)簡(jiǎn)單的藥物提醒,提醒我們每天服用 1 次或 2 次或 3 次藥物。可以使用按鈕選擇時(shí)隙。此外,它還顯示當(dāng)前日期和時(shí)間。我們將進(jìn)一步將其擴(kuò)展到 IoT 項(xiàng)目傳入的文章,其中將向用戶發(fā)送電子郵件或 SMS 通知。這種藥物提醒也可以與患者監(jiān)測(cè)系統(tǒng)集成。
使用 Arduino 進(jìn)行自動(dòng)醫(yī)學(xué)提醒所需的組件
Arduino Uno(我們也可以使用其他 Arduino 板,如 Pro mini、Nano)
RTC DS3231 模塊
16x2 液晶顯示器
蜂鳴器
LED(任何顏色)
面包板
按按鈕
10K電位器
10K,1K電阻
跳線
使用 Arduino 電路的 Arduino 醫(yī)學(xué)提醒
使用 Arduino 構(gòu)建智能藥盒的完整電路圖如下所示
以下是Arduino 與不同外設(shè)的引腳連接
在這個(gè)醫(yī)學(xué)提醒項(xiàng)目中,RTC DS3231 通過(guò) I2C 協(xié)議與 Arduino Uno 連接。您還可以使用 RTC IC DS1307 通過(guò) Arduino 讀取時(shí)間。RTC DS3231 還具有內(nèi)置的 32k 內(nèi)存,可用于存儲(chǔ)附加數(shù)據(jù)。RTC 模塊通過(guò) Arduino uno 的 3.3V 引腳供電。一個(gè)16x2 LCD 顯示器使用 SPI 接口。蜂鳴器r用于提醒和提醒該吃藥了。四個(gè)按鈕用于每個(gè)具有不同選擇功能的地方。第一個(gè)按鈕用于提醒每天吃一次藥。第二個(gè)按鈕用于每天提醒兩次,第三個(gè)按鈕用于每天提醒三次。當(dāng)用戶聽(tīng)到警報(bào)時(shí),第四個(gè)按鈕用于停止蜂鳴器。
自動(dòng)用藥提醒系統(tǒng)的工作
藥丸提醒警報(bào)器使用5V 電源供電。當(dāng)它第一次啟動(dòng)時(shí),它會(huì)顯示一個(gè)歡迎按摩“歡迎來(lái)到電路文摘”。LCD 屏幕設(shè)置為在三個(gè)屏幕中循環(huán)。第一個(gè)屏幕將按摩顯示為“保持健康,早日康復(fù)”。第二個(gè)屏幕是一個(gè)幫助屏幕,告訴按選擇按鈕選擇任何一個(gè)時(shí)間段進(jìn)行提醒(一天一次/兩次/三次)。時(shí)隙在程序中是可變的,可以進(jìn)行相應(yīng)的配置。現(xiàn)在我們已將其固定為三個(gè)持續(xù)時(shí)間,即上午 8 點(diǎn)、下午 2 點(diǎn)和晚上 8 點(diǎn)。
我們將時(shí)隙分為三種模式。當(dāng)用戶按下第一個(gè)按鈕時(shí),模式 1 選擇每天早上 8 點(diǎn)服藥一次。當(dāng)用戶按下第二個(gè)按鈕時(shí),模式 2 選擇每天早上 8 點(diǎn)和晚上 8 點(diǎn)服藥兩次。如果用戶按下第三個(gè)按鈕,模式 3 選擇每天早上 8 點(diǎn)、下午 2 點(diǎn)和晚上 8 點(diǎn)服藥三次。
我們還可以添加一個(gè)讓蜂鳴器暫停 10 分鐘的功能(不包括在這個(gè)項(xiàng)目中)。當(dāng)用戶通過(guò)按下按鈕選擇所需的時(shí)隙時(shí),用戶輸入被記錄并且時(shí)間從 RTC 中獲取。當(dāng)時(shí)間與所選時(shí)間段匹配時(shí),蜂鳴器開(kāi)始蜂鳴。用戶可以通過(guò)按 STOP 按鈕停止蜂鳴器。下一個(gè)槽提醒繼續(xù)相同的過(guò)程。完整的過(guò)程顯示在本文末尾給出的視頻中。
為醫(yī)學(xué)提醒編程 Arduino UNO
一旦想到了提醒服藥的方法,編寫程序就很容易了。在這里,它將在顯示屏上顯示提醒,蜂鳴器發(fā)出蜂鳴聲并使用 LED 指示。它還可以選擇三個(gè)時(shí)間段(每天一次/兩次/三次),當(dāng)時(shí)間到達(dá)時(shí),通過(guò)蜂鳴器蜂鳴器開(kāi)始提醒患者。然后整個(gè)系統(tǒng)將如下所示:
用戶在顯示屏上獲得幫助說(shuō)明 》 用戶選擇時(shí)間段(一次/天、兩次/天、三次/天) 》 在顯示屏上打印確認(rèn)消息 》 計(jì)時(shí)開(kāi)始 》 當(dāng)時(shí)間與用戶選擇的時(shí)間匹配時(shí)蜂鳴器和 LED 啟動(dòng) 》 用戶停止按下停止按鈕 》 結(jié)束
如果我們想添加更多功能,我們可以更改程序和硬件。為了以更簡(jiǎn)單的方式理解,我們將程序分解為小函數(shù)。這些功能易于理解和實(shí)現(xiàn)。完整的程序在本項(xiàng)目結(jié)束時(shí)給出。讓我們從程序開(kāi)始。
因?yàn)椋覀兪褂昧似渌鈬O(shè)備,如 16x2 LCD 顯示器、RTC DS3231,所以我們首先必須包含庫(kù)。所需庫(kù)如下:
?
(https://github.com/adafruit/RTClib)
?
如果 Arduino 未打開(kāi),EEPROM 庫(kù)用于跟蹤用戶選擇輸入。當(dāng)用戶打開(kāi) Arduino 電源時(shí),它會(huì)使用 EEPROM 庫(kù)獲取按鈕的先前狀態(tài)。使用 Wire.h 庫(kù)是因?yàn)?RTC DS3231 模塊使用 I2C 進(jìn)行通信。
經(jīng)常檢查 RTC 是否正確接線或沒(méi)有損壞,因?yàn)?RTC 將在整個(gè)提醒系統(tǒng)的計(jì)時(shí)中發(fā)揮重要作用。
?
if (!rtc.begin()) { // 檢查 rtc 是否連接 Serial.println("Couldn't find RTC"); 而(1); } if (rtc.lostPower()) { Serial.println("RTC 斷電,讓我們?cè)O(shè)置時(shí)間!"); }
?
時(shí)間調(diào)整可以通過(guò)兩種方式完成,或者使用系統(tǒng)編譯時(shí)間自動(dòng)進(jìn)行,或者手動(dòng)輸入。一旦我們?cè)O(shè)置了時(shí)間,請(qǐng)注釋以下行,除非您想再次更改 RTC 時(shí)間。
?
rtc.adjust(日期時(shí)間(F(__DATE__), F(__TIME__))); //rtc.adjust(DateTime(2019, 1, 10, 7, 59, 52));
?
此switch 語(yǔ)句用于讀取先前保存的按鈕狀態(tài)并恢復(fù)該狀態(tài)以獲得適當(dāng)且準(zhǔn)確的提醒時(shí)間。
?
val2 = EEPROM.read(addr); // 讀取之前保存的按鈕值,從之前離開(kāi)的位置開(kāi)始 switch (val2) { case 1: Serial.println("Set for 1/day"); 推1狀態(tài)= 1; push2state = 0; push3state = 0; pushVal = 01; 休息; 案例2: Serial.println("設(shè)置為2/天"); 推1狀態(tài)= 0; push2state = 1; push3state = 0; pushVal = 10; 休息; 案例 3: Serial.println("設(shè)置為 3/天"); 推1狀態(tài)= 0; push2state = 0; push3state = 1; pushVal = 11; 休息; }
?
此語(yǔ)句用于獲取毫秒以用于對(duì)定義的間隔屏幕循環(huán)進(jìn)行計(jì)時(shí)和控制。
?
currentMillisLCD = 毫秒();// 在定義的時(shí)間間隔啟動(dòng) LCD 屏幕切換毫秒
?
開(kāi)始讀取連接到按鈕的數(shù)字引腳。
?
push1state = digitalRead(push1pin); push2state = digitalRead(push2pin); push3state = digitalRead(push3pin); stopinState = digitalRead(stopPin);
?
以下函數(shù)用于讀取按鈕狀態(tài)并將其寫入 EEPROM。每當(dāng)按下按鈕時(shí),狀態(tài)都會(huì)寫入 EEPROM。它還在所選用戶輸入選項(xiàng)的 LCD 顯示屏上打印消息。類似地,使用了函數(shù)push2()和push3()。
?
void push1() { // 每天設(shè)置一次提醒的函數(shù) if (push1state == 1) { push1state = 0; push2state = 0; push3state = 0; // pushPressed = true; EEPROM.write(addr, 1); Serial.print("Push1 寫入:"); Serial.println(EEPROM.read(addr)); // 用于調(diào)試 pushVal = 1; //保存push button-1的狀態(tài) lcd.clear(); lcd.setCursor(0, 0); lcd.print("提醒設(shè)置"); lcd.setCursor(0, 1); lcd.print("一次/天!"); 延遲(1200); lcd.clear(); } }
?
以下功能用于停止蜂鳴器和 LED。提出建議總是好的。在“溫水服藥”顯示屏上打印一條建議信息。
?
void stopPins() { //當(dāng)用戶按下停止按鈕時(shí)停止蜂鳴的功能 if (stopinState == 1) { // stopinState = 0; // pushPressed = true; 按下= 1; lcd.clear(); lcd.setCursor(0, 0); lcd.print("吃藥"); lcd.setCursor(0, 1); lcd.print("用溫水"); 延遲(1200); lcd.clear(); } }
?
以下功能與計(jì)時(shí)無(wú)關(guān),但始終在三個(gè)屏幕中循環(huán),以幫助用戶。當(dāng)我們對(duì)患者保持關(guān)心時(shí),讓我們打印一條問(wèn)候信息,因?yàn)槲覀冎狼楦兄С謱?duì)于更快地治愈患者非常有幫助。您可以選擇自己的創(chuàng)意信息。讓我們打印一條消息“保持健康,早日康復(fù)”。
第二個(gè)屏幕用于向患者發(fā)出指示,如“按下按鈕提醒......”。??第三個(gè)屏幕用于簡(jiǎn)單地顯示當(dāng)前日期和時(shí)間。
?
void changeScreen() { //屏幕循環(huán)函數(shù) // 每隔定義的 intervalLCD 開(kāi)始切換屏幕 if (currentMillisLCD - previousMillisLCD > intervalLCD) // 保存上次更改顯示的時(shí)間 { previousMillisLCD = currentMillisLCD; 屏幕++; 如果(屏幕> maxScreen){ 屏幕= 0;// 所有屏幕結(jié)束 -> 從第一個(gè)開(kāi)始 } isScreenChanged = true; } // 開(kāi)始顯示當(dāng)前屏幕 if (isScreenChanged) // 僅當(dāng)屏幕改變時(shí)才更新屏幕。 { isScreenChanged = false; // 為下一次迭代重置 switch (screens) { case getWellsoon: gwsMessege(); // 快點(diǎn)好起來(lái)消息 中斷; 案例 HELP_SCREEN: helpScreen(); // 指令屏幕 中斷; case TIME_SCREEN: timeScreen (); // 打印日期和時(shí)間 間隔; 默認(rèn)值: //未設(shè)置。 休息; } } }
?
如果選擇的時(shí)間已到,此功能用于開(kāi)始同時(shí)發(fā)出蜂鳴聲和 LED 閃爍。
?
void startBuzz() { // 當(dāng)時(shí)間達(dá)到定義的時(shí)間間隔時(shí)開(kāi)始蜂鳴的函數(shù) // if (pushPressed == false) { if (pushpressed == 0) { Serial.println("pushpressed is false in blink"); 無(wú)符號(hào)長(zhǎng) currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; // 保存上次閃爍 LED 的時(shí)間 Serial.println("Start Buzzing"); if (ledState == LOW) { // 如果 LED 關(guān)閉,則將其打開(kāi),反之亦然: ledState = HIGH; } 其他 { ledState = 低; } digitalWrite(ledPin, ledState); } } else if (pushpressed == 1) { Serial.println("pushpressed 為真"); ledState = 低; 數(shù)字寫入(ledPin,ledState); } }
?
此功能用于比較用戶在上午 8 點(diǎn)選擇的時(shí)間段,并開(kāi)始蜂鳴器蜂鳴和 LED 閃爍,直到用戶按下停止按鈕。同樣,函數(shù)void at2pm()?和void at8pm用于啟動(dòng)蜂鳴器并在下午 2 點(diǎn)和 8 點(diǎn)引導(dǎo)。
?
void at8am() { // 函數(shù)在早上 8 點(diǎn)開(kāi)始嗡嗡聲 DateTime now = rtc.now(); if (int(now.hour()) >= buzz8amHH) { if (int(now.minute()) >= buzz8amMM) { if (int(now.second()) > buzz8amSS) { ////// ////////////////////////////////////// startBuzz() ; ///////////////////////////////////////// /// } } } }
?
這就是您可以使用 Arduino 輕松制作自己的自動(dòng)醫(yī)學(xué)提醒的方法。
//Medicine Reminder using Arduino Uno?
// 提醒在早上 8 點(diǎn)、下午 2 點(diǎn)、晚上 8 點(diǎn)吃藥?
/* 電路:
? ?LCD RS 引腳到數(shù)字引腳 12?
? ?LCD 使能引腳到數(shù)字引腳 11?
? ?LCD D4 引腳到數(shù)字引腳 5?
? ?LCD D5 引腳到數(shù)字pin 4?
? ?LCD D6 pin to digital pin 3?
? ?LCD D7 pin to digital pin 2?
? ?LCD R/W pin to ground?
? ?LCD VSS pin to ground?
? ?LCD VCC pin to 5V?
? ?10K 電阻:
? ?連接到+5V 和接地
? ?抽頭到 LCD VO pin (pin 3 )*/
#include
#include
#include
#include
int pushVal = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ?
整數(shù)值;
詮釋 val2;?
整數(shù)地址 = 0;
RTC_DS3231 實(shí)時(shí)時(shí)鐘;
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; // 液晶引腳
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
#define getWellsoon 0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
#define HELP_SCREEN 1?
#define TIME_SCREEN 2
//bool pushPressed; // 跟蹤按鈕狀態(tài)的標(biāo)志?
int pushpressed = 0;?
常量 int ledPin = LED_BUILTIN; // 蜂鳴器和 LED 引腳
int ledState = LOW;?
整數(shù)信號(hào) = 0;
國(guó)際嗡嗡聲= 13;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
int push1state,push2state,push3state,stopinState = 0;//??
int push1Flag, push2Flag, Push3Flag = false; // 按鈕標(biāo)志?
int push1pin = 9;?
int push2pin = 8;?
int push3pin = 7;?
int stopPin = A0;?
int屏幕= 0;// 屏幕顯示
int maxScreen = 2; // 屏幕計(jì)數(shù)
bool isScreenChanged = true;
很久以前Millis = 0;? ? ? ? ? ?
長(zhǎng)間隔 = 500;// 蜂鳴間隔
unsigned long currentMillis;
很久以前MillisLCD = 0; // 液晶屏更新
長(zhǎng)間隔LCD = 2000; // 屏幕循環(huán)間隔
unsigned long currentMillisLCD;
// 設(shè)置提醒更改時(shí)間
int buzz8amHH = 8; // HH - hours ##將這些設(shè)置為 24 小時(shí)的提醒時(shí)間 Format??
int buzz8amMM = 00; // MM - 分鐘
int buzz8amSS = 00; // SS - 秒
詮釋嗡嗡聲2pmHH = 14;// HH - 小時(shí)
int buzz2pmMM = 00; // MM - 分鐘
int buzz2pmSS = 00; // SS - 秒
詮釋嗡嗡聲8pmHH = 20;// HH - 小時(shí)
int buzz8pmMM = 00; // MM - 分鐘
int buzz8pmSS = 00; // SS - 秒
int nowHr, nowMin, nowSec; // 顯示當(dāng)前 mm,hh,ss
// 所有消息
void gwsMessege(){ // 打印快點(diǎn)恢復(fù) messege?
? ? lcd.clear();?
? ? lcd.setCursor(0, 0);?
? ? lcd.print("保持健康:)"); //
? ? 加油 lcd.setCursor(0, 1);?
? ? lcd.print("快點(diǎn)好起來(lái):)"); // 希望?
}
void helpScreen() { // 在 LCD 中顯示第一個(gè)屏幕的函數(shù)
? ? lcd.clear();?
? ? lcd.setCursor(0, 0);?
? ? lcd.print("按下按鈕");?
? ? lcd.setCursor(0, 1);?
? ? lcd.print("提醒...!");?
?}
void timeScreen() { // 在 LCD 屏幕上顯示日期和時(shí)間的函數(shù)
? DateTime now = rtc.now(); // 獲取 rtc 時(shí)間并在顯示中打印
? ? lcd.clear();?
? ? lcd.setCursor(0, 0);?
? ? lcd.print("時(shí)間:");?
? ? lcd.setCursor(6, 0);?
? ? lcd.print(nowHr = now.hour(), DEC);?
? ? lcd.print(":");?
? ? lcd.print(nowMin = now.minute(), DEC);?
? ? lcd.print(":");?
? ? lcd.print(nowSec = now.second(), DEC);?
? ? lcd.setCursor(0, 1);?
? ? lcd.print("日期:");?
? ? lcd.print(now.day(), DEC);?
? ? lcd.print("/");?
? ? lcd.print(now.month(), DEC);?
? ? lcd.print("/");?
? ? lcd.print(now.year(), 十二月);
}
無(wú)效設(shè)置(){
? 序列號(hào).開(kāi)始(9600);// 開(kāi)始串口調(diào)試
? if (!rtc.begin()) { // 檢查 rtc 是否連接?
? ? Serial.println("Couldn't find RTC");?
? ? 而(1);
? }?
? if (rtc.lostPower()) {?
? ? Serial.println("RTC 斷電,讓我們?cè)O(shè)置時(shí)間!");?
? }
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // 取消注釋以設(shè)置當(dāng)前時(shí)間,然后在您設(shè)置時(shí)間時(shí)在下次上傳時(shí)注釋
? rtc.adjust(DateTime(2019, 1, 10, 7, 59, 30)); // 手動(dòng)設(shè)置時(shí)間
? lcd.begin(16, 2);?
? lcd.clear();?
? lcd.setCursor(0, 0);?
? lcd.print("歡迎光臨"); // 在啟動(dòng)時(shí)打印一條消息
? lcd.setCursor(0, 1);?
? lcd.print("電路文摘");?
? 延遲(1000);
? pinMode(push1pin,輸入);// 定義按鈕引腳類型
? pinMode(push2pin, INPUT);?
? pinMode(push3pin,輸入);
? pinMode(stopPin,輸入);
? pinMode(ledPin,輸出);
? 延遲(200);
? Serial.println(EEPROM.read(addr));?
? val2 = EEPROM.read(addr); // 讀取之前保存的按鈕值,從之前離開(kāi)的位置開(kāi)始
? switch (val2) {
? ? 案例1:
? ? ? Serial.println("設(shè)置為1/天");?
? ? ? 推1狀態(tài)= 1;
? ? ? push2state = 0;?
? ? ? push3state = 0;?
? ? ? pushVal = 1;?
? ? ? 休息;?
? ? 案例2:
? ? ? Serial.println("設(shè)置為2/天");?
? ? ? 推1狀態(tài)= 0;
? ? ? push2state = 1;?
? ? ? push3state = 0;?
? ? ? pushVal = 2;
? ? ? 休息;?
? ? 案例 3:
? ? ? Serial.println("設(shè)置為 3/天");?
? ? ? 推1狀態(tài)= 0;
? ? ? push2state = 0;?
? ? ? push3state = 1;?
? ? ? pushVal = 3;
? ? ? 休息;?
? }
}
無(wú)效循環(huán)(){
? 推1();//調(diào)用設(shè)置一次/天?
? push2(); //調(diào)用設(shè)置兩次/天?
? push3(); //調(diào)用設(shè)置三次/天?
? ? if (pushVal == 1) { // 如果按下按鈕 1 則在上午 8 點(diǎn)提醒
? ? at8am(); // 早上 8 點(diǎn)開(kāi)始 uzzing 的函數(shù)?
? }?
? else if (pushVal == 2) { // 如果按下按鈕 2 則在上午 8 點(diǎn)和晚上 8 點(diǎn)提醒
? ? at8am();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? 晚上 8 點(diǎn)();//函數(shù)在 8mm 處開(kāi)始 uzzing?
? }
? else if (pushVal == 3) { // 如果按下按鈕 3,則在上午 8 點(diǎn)和晚上 8 點(diǎn)提醒
? ? at8am();?
? ? 下午 2 點(diǎn)();//函數(shù)在 8 毫米處開(kāi)始 uzzing?
? ? at8pm();?
? }?
? currentMillisLCD = millis(); // 以定義的時(shí)間間隔啟動(dòng) LCD 屏幕切換的
? 毫秒 push1state = digitalRead(push1pin); // 開(kāi)始讀取所有按鈕引腳
? push2state = digitalRead(push2pin);?
? push3state = digitalRead(push3pin);
? stopinState = digitalRead(stopPin);?
? 停止引腳();//調(diào)用停止嗡嗡聲
? 更改屏幕();// 屏幕循環(huán)函數(shù)
}
// 按鈕
void push1() { // 每天設(shè)置一次提醒的函數(shù)?
? if (push1state == 1) {?
? ? push1state = 0;?
? ? push2state = 0;?
? ? push3state = 0;?
// pushPressed = true;?
? ? EEPROM.write(addr, 1);?
? ? Serial.print("Push1 寫入:"); Serial.println(EEPROM.read(addr)); // 用于調(diào)試
? ? pushVal = 1; //保存push button-1的狀態(tài)?
? ? lcd.clear();?
? ? lcd.setCursor(0, 0);?
? ? lcd.print("提醒設(shè)置");?
? ? lcd.setCursor(0, 1);?
? ? lcd.print("一次/天!");?
? ? 延遲(1200);
? ? lcd.clear();?
? }?
}
void push2() { // 每天設(shè)置兩次提醒的函數(shù)
? if (push2state == 1) {?
? ? push2state = 0;?
? ? 推1狀態(tài)= 0;
? ? push3state = 0;?
// pushPressed = true;?
? ? EEPROM.write(addr, 2);?
? ? Serial.print("Push2 寫的:"); Serial.println(EEPROM.read(addr));?
? ? pushVal = 2;?
? ? lcd.clear();?
? ? lcd.setCursor(0, 0);?
? ? lcd.print("提醒設(shè)置");?
? ? lcd.setCursor(0, 1);?
? ? lcd.print("每天兩次!");?
? ? 延遲(1200);
? ? lcd.clear();?
? }?
}
void push3() { // 每天設(shè)置三次提醒的函數(shù)
? if (push3state == 1) {?
? ? push3state = 0;?
? ? 推1狀態(tài)= 0;
? ? push2state = 0;?
// pushPressed = true;?
? ? EEPROM.write(addr, 3);?
? ? Serial.print("Push3 寫的:"); Serial.println(EEPROM.read(addr));?
? ? pushVal = 3;?
? ? lcd.clear();?
? ? lcd.setCursor(0, 0);?
? ? lcd.print("提醒設(shè)置");?
? ? lcd.setCursor(0, 1);?
? ? lcd.print("每天三次!");?
? ? 延遲(1200);
? ? lcd.clear();?
? }?
}
void stopPins() { //當(dāng)用戶按下停止按鈕時(shí)停止嗡嗡聲
? if (stopinState == 1) {?
// stopinState = 0;?
// pushPressed = true;?
? ? 按下= 1;
? ? lcd.clear();?
? ? lcd.setCursor(0, 0);?
? ? lcd.print("吃藥");?
? ? lcd.setCursor(0, 1);?
? ? lcd.print("用溫水");?
? ? 延遲(1200);
? ? lcd.clear();?
? }?
}
void startBuzz() { // 當(dāng)時(shí)間到達(dá)定義的時(shí)間間隔時(shí)開(kāi)始蜂鳴的函數(shù)
// if (pushPressed == false) {?
?if (pushpressed == 0) {?
? ? Serial.println("pushpressed is false in blink");?
? ? 無(wú)符號(hào)長(zhǎng) currentMillis = millis();?
? ? if (currentMillis - previousMillis >= interval) {?
? ? ? previousMillis = currentMillis; // 保存上次閃爍 LED 的時(shí)間
? ? ? Serial.println("Start Buzzing");?
? ? ? if (ledState == LOW) { // 如果 LED 關(guān)閉,則將其打開(kāi),反之亦然:
? ? ? ? ledState = HIGH;?
? ? ? } 其他 {?
? ? ? ? ledState = 低;
? ? ? }?
? ? ? digitalWrite(ledPin, ledState);?
? ? }?
? }?
? else if (pushpressed == 1) {?
? ? Serial.println("pushpressed 為真");
? ? ledState = 低;
? ? 數(shù)字寫入(ledPin,ledState);
? }?
}
void at8am() { // 函數(shù)在早上 8 點(diǎn)開(kāi)始嗡嗡聲
? DateTime now = rtc.now();?
? if (int(now.hour()) >= buzz8amHH) {?
? ? if (int(now.minute()) >= buzz8amMM) {?
? ? ? if (int(now.second()) > buzz8amSS) {?
? ? ? ? ////// ///////////////////////////////////////
? ? ? ? 開(kāi)始嗡嗡聲();
? ? ? ? ///////////////////////////////////////// ///?
? ? ? }?
? ? }?
? }?
}
void at2pm() { // 函數(shù)在下午 2 點(diǎn)開(kāi)始嗡嗡聲
? DateTime now = rtc.now();?
? if (int(now.hour()) >= buzz2pmHH) {?
? ? if (int(now.minute()) >= buzz2pmMM) {?
? ? ? if (int(now.second()) > buzz2pmSS) {?
? ? ? ? ////// ////////////////////////////////////?
? ? ? ? startBuzz();?
? ? ? ? /////////////////////////////////////////?
? ? ? }?
? ? }?
? }?
}
void at8pm() { // 函數(shù)在晚上 8 點(diǎn)開(kāi)始嗡嗡聲
? DateTime now = rtc.now();?
? if (int(now.hour()) >= buzz8pmHH) {?
? ? if (int(now.minute()) >= buzz8pmMM) {?
? ? ? if (int(now.second()) > buzz8pmSS) {?
? ? ? ? ////// //////////////////////////////////////?
? ? ? ? startBuzz() ;?
? ? ? ? ///////////////////////////////////////// ///?
? ? ? }?
? ? }?
? }?
}
//屏幕循環(huán)
void changeScreen() { //屏幕循環(huán)函數(shù)
? // 每隔定義的intervalLCD開(kāi)始切換屏幕
? if (currentMillisLCD - previousMillisLCD > intervalLCD) // 保存上次更改顯示的時(shí)間
? {?
? ? previousMillisLCD = currentMillisLCD;?
? ? 屏幕++;
? ? 如果(屏幕> maxScreen){
? ? ? 屏幕= 0;// 所有屏幕結(jié)束 -> 從第一個(gè)開(kāi)始
? ? }?
? ? isScreenChanged = true;?
? }
? // 開(kāi)始顯示當(dāng)前屏幕
? if (isScreenChanged) // 僅當(dāng)屏幕改變時(shí)才更新屏幕。
? {?
? ? isScreenChanged = false; // 為下一次迭代重置
? ? switch (screens)?
? ? {?
? ? ? case getWellsoon:?
? ? ? ? gwsMessege(); // 快點(diǎn)好起來(lái)消息
? ? ? ? 中斷;
? ? ? 案例 HELP_SCREEN:? ? ? ? ? ? ? ?
? ? ? ? helpScreen(); // 指令屏幕
? ? ? ? 中斷;
? ? ? case TIME_SCREEN: timeScreen?
? ? ? ? (); // 打印日期和時(shí)間
? ? ? ? 間隔;
? ? ? 默認(rèn)值:
? ? ? ? //未設(shè)置。
? ? ? ? 休息;?
? ? }?
? }?
}
評(píng)論
查看更多