Uploaded by 呂承翰

2021B04-技術報告

advertisement
資訊與通訊系 2021 年實務專題技術報告
看護輔助裝置
梁新潁教授/呂承翰/李宗翰/徐邦瑜/蘇鉦恆
朝陽科技大學資訊與通訊系
413 台中市霧峰區吉峰東路 168 號
Tel: (04) 23323000 ext. 5209
Fax: (04)23305539
E-mail:hyliang@cyut.edu.tw
近年來新聞媒體上時不時就會看到醫療看護
人員的短缺以及關於病人未被及時照顧或隔離控
管而導致病情加重跟死亡的案例,其中目前最為嚴
重的疫情就是新冠肺炎了,雖然到目前為止仍然還
沒辦法真正地確實避免確診,但這些都是可以預防
的[4]。
新型冠狀病毒(COVID-19)是導致本次疫情的
疾病嚴重特殊傳染性肺炎,由感染病原體至症狀浮
現之間的潛伏期平均為5至6天,一般情況下由1至
14天不等,有個別個案可達24天;即使沒有發燒,
沒有感染跡象或僅有輕微感染跡象的感染者也可
以將病毒傳染給他人,症狀篩查無法有效檢測;且
輕症患者症狀類似於同期流行的流行性感冒,因而
易導致患者、家屬及政府誤判[4]。
關鍵詞:Arduino、MIT App Inventor
Abstract
In recent years, news media have seen from time
to time the shortage of medical nurses and cases of
patients who are not cared for in time or isolated and
controlled, resulting in aggravation and death. Among
them, the most serious epidemic is the new crown
pneumonia, although so far There's still no way to
actually avoid a diagnosis, but it's preventable.
The new coronavirus pneumonia (COVID-19) is
a serious and special infectious pneumonia caused by
the disease. The incubation period from infection with
the pathogen to the emergence of symptoms is an
average of 5 to 6 days, generally ranging from 1 to 14
days, and there are individual cases. Cases can last up
to 24 days; infected people with no signs of infection
or only mild signs of infection can transmit the virus
to others even if they have no fever, and symptom
screening cannot be effectively detected; and mild
patients have symptoms similar to the flu that was
circulating at the same time Therefore, it is easy to
cause misjudgment by patients, family members and
the government.
Keywords:Arduino、MIT App Inventor
1. 前言
因為看見Arduino廣泛的應用,Arduino可以讓你的
計算機能夠擁有感應、控制真實世界的能力,而不
僅局限於鍵盤、滑鼠、屏幕、揚聲器等單一的標準
I/O設備。它同時也能作為獨立的核心,作為機器人、
智能車、雷射槍等電子設備的控制器,應用非常簡
單。Arduino可用於開發交互式對象,採取各種開關
或傳感器輸入,控制各種燈,電機和其他物理輸出。
於是本專題結合MIT App Inventor來操控電鎖裝置,
實現對Arduino的遠端操控。
2. 主要內容
2.1 主要電路的設計
Arduino Mega 2560 是一款基於
ATmega2560(datasheet)的微控制器板。 它有
54 個數位輸入/輸出引腳(其中 15 個可用作
PWM 輸出)
、16 個模擬輸入、4 個 UART(硬
體序列埠)
、1 個 16 MHz 晶體震盪器、1 個 USB
連接、1 個電源插座、1 個 ICSP 頭和 1 個重置
按鈕。
Arduino Mega 2560 開發板控制電路如圖 1、圖
2 所示。
AREF
13
12
IOREF
11
RESET
10
3.3V
9
5V
8
GND
7
GND
6
Vin
5
A0
4
A1
3
A2
2
A3
1
A4
0
A5
摘要
U2
ARDUINO
圖1
圖 2 Arduino Mega 2560 開發板腳位[1][3]
資訊與通訊系 2021 年實務專題技術報告
2.2 LCD 簡介
液晶顯示器,因為工作所需的電流非常低,因此被廣
泛使用於高級電器產品及儀表的顯示裝置上[1]。
在專題 LCD 顯示器模組電路中,為了節省 Arduino
Mega 2560 的 I/O 腳接腳,我們選用了 IIC LCD 模
組如圖 6 所示,不同的地方就是此模組多插了一塊
小 IC 晶片 PCF8574,他是 I2C 的 8bits 擴充 IC,利
用他就可以將 Arduino 的腳位擴充,只需要使用
Arduino 的 SDA SCL 腳位,大大節省了 Arduino 的
腳位[1]。
LCD 模組的結構如圖3所示。
圖3 LCD 模組結構
LCD 模組是由控制器,驅動器,顯示器三個部份
圖 4 LCD 顯示器(正面)
所組成, DDRAM 位址與可供顯示位置的對應圖,
如下表1所示。
表1
第一
0
1
2
3
80
81
82
83
C0
C1
C2
C3
行
第二
行
圖 5 LCD 顯示器(背面)
LCM
GND
VCC
SDA
SCL
16x2
+5V
1
2
3
4
我們選用的LCD顯示器可顯示2行每行16個字
元如圖4、圖5所示;至於它對外共有8根資料腳(D0
~D7)與3根控制腳(即致能腳 EN、讀寫控制腳
R/W 和暫存器選擇腳 RS),一般來說這類的LCD
顯示器可使用8或4位元(D4~D7)的資料匯流排;由
於Arduino開發工具已提供了許多跟LCD顯示器有
關的指令及副程式,而且有些可以只使用4根資料
匯流排(使用LCD顯示器資料匯流排的D4~D7腳),
此外如果不去作任何讀取LCD顯示器的動作的話,
還可以將LCD顯示器的讀寫控制腳(R/W)直接接到
低電位(即只作寫入動作)以省去額外的接腳。
P20
P21
圖 6 LCD 顯示器模組
資訊與通訊系 2021 年實務專題技術報告
2.3 藍芽模組
+12V
電J2磁 鎖
1
2
R1
+
-
Q1
IRF840
P3
300
圖7藍芽模組
藍芽模組
J1
圖9 電磁鎖
圖9所示為電磁鎖,IRF840為功率電晶體,可用來
驅動較大電流需求的電磁鎖,由Arduino之P3腳輸出
HIGH、LOW訊號至電晶體IRF840,當訊號為HIGH
時,電晶體導通讓電磁鎖通電,進行解鎖[1]。
4
3
2
1
RXD
TXD
GND
VCC
2.5 RC-522 RFID 讀卡模組
+5V
P0
P1
圖8藍芽模組
圖 7、圖 8 所示為藍芽模組,使用方法:首次和手
機連接時需配對,以後就隨連隨用。模組通電後模
組上的指示燈是快閃,也就是配對準備狀態,需在
30 秒內配對,如果 30 秒內沒配對,就變為慢閃進
入等待狀態。配對密碼:1234 如果 30 秒內沒配對,
再配對時需重開電源。藍牙模組和電腦連接後就是
那種非常快的閃了,如果有資料傳送,就是長亮。
連接成功後,使用 Arduino 的第 0 1 腳與手機端作
UART 傳輸,程式範例如下:
Serial.begin(9600);
//設定通訊鮑率
Serial.print("A");
//傳A至手機
2.4 電鎖電路
RC522 晶片簡介
MF RC522 是應用於 13.56MHz 非接觸式通信中
高集成度的讀寫卡晶片,是 NXP 公司針對“三表”
應用推出的一款低電壓、低成本、體積小的非接觸
式讀寫卡晶片,是智慧型儀器表和可擕式手持設備
研發的較好選擇[2]。MF RC522 利用了先進的調製
和解調概念,完全集成了在 13.56MHz 下所有類型
的被動非接觸式通信方式和協定。支援 14443A 相
容應答器信號。數位部分處理 ISO14443A 幀和錯誤
檢測。此外,還支援快速 CRYPTO1 加密演算法,
用語驗證 MIFARE 系列產品。MFRC522 支援
MIFARE 系列更高速的非接觸式通信,雙向資料傳
輸速率高達 424kbit/s。 作為 13.56MHz 高集成度讀
寫卡系列晶片家族的新成員,MF RC522 與 MF
RC500 和 MF RC530 有不少相似之處,同時也具備
許多特點和差異。它與主機間通信採用 SPI 模式,
有利於減少連線,縮小 PCB 板體積,降低成本[1]。
RFID 模組簡介
MF522-AN 模組採用 Philips MFRC522 原裝晶
片設計讀卡電路,使用方便,成本低廉,適用于設
備開發、讀卡器開發等高級應用的用戶、需要進行
射頻卡終端設計/生產的用戶。本模組可直接裝入各
種讀卡器模具。模組採用電壓為 3.3V,通過 SPI 介面
簡單的幾條線就可以直接與用戶任何 CPU 主板相
連接通信,可以保證模組穩定可靠的工作、讀卡距離
遠;
如圖 10:RFID 接腳名稱由下至上分別是, 3.3V、
RST、GND、IRQ、MISO、MOSI、SCK、SDA。
資訊與通訊系 2021 年實務專題技術報告
圖 10 RFID 模組
卡片自定義辨別方式:
1.
存 M 到卡片 變管理員主卡
2.
存 U 到卡片 變有註冊的副卡
3.
存 N 到卡片 變無註冊卡
4.
讀到卡片裡面有 M 時,可開鎖、新增和刪除
卡片
5.
讀到卡片裡面有 U 時,可開鎖
6.
讀到卡片裡面有 N 時,不動作,讀到 3 次以
上時,發警報
3. 程式及程式流程
圖11所示系統方塊圖,說明:使用arduino來偵測按
鍵,讓使用者自行設定目前時間及鬧鐘時間,使用
LCD顯示器顯示,當鬧鍵時間到時,蜂鳴器和手機
提醒使用者,並在早、中、晚以及睡前的藥盒上點
亮LED燈,當使用者吃藥開啟藥蓋後,提示燈熄滅,
並且傳送目前4組時間的吃藥情況至手機。
使用arduino來偵測RFID模組,是否有RFID卡
片,有卡片時讀取卡片號碼後,進行比對並解鎖。
3.2
程式流程圖
開始
顯示目
前時間
3.1 系統方塊圖
Android 手機
Wifi 網路
網路攝影機
是
RFID
卡號?
比對卡號,正
確時解鎖
否
arduino
LCD 顯示器
藍芽模組
hc05
吃藥提示燈
設定按鍵
按下
設定
鍵?
否
設定目前
時間、鬧
鐘 1、2、
3、4
是
蜂鳴器
藥盒開蓋感
測
電磁鎖
RFID 模組
RC-522
到達
鬧鐘
時
否
秤重傳感器
蜂鳴器停,關對
是
蜂鳴器響,開啟
對應藥盒 LED
是
應藥盒 LED
吃藥開
蓋?
否
圖11 系統方塊圖
圖12 程式流程圖
資訊與通訊系 2021 年實務專題技術報告
digitalWrite(SETD, HIGH);
//腳位設定
pinMode(DOR, OUTPUT);
// 設定成輸出腳
digitalWrite(DOR, LOW);
//輸出LOW
pinMode(ADDO, INPUT);
//設為輸入腳
pinMode(ADSK, OUTPUT);
//設為輸出
3.3 Arduino程式碼
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// 序列
式 LCD 介面程式庫
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3,
POSITIVE); // 設定 LCD I2C 位址
#include <SPI.h>
//引用程式庫
#include <MFRC522.h>
//引用程式庫
const byte RST_PIN = 13;
//讀卡機的重置腳位
const byte SS1 = 12;
//讀卡機選擇腳位
const byte ADDO = 24;
//腳位宣告
const byte ADSK = 22;
//腳位宣告
byte LED[] = {9, 8, 7, 6} ; //腳位宣告
byte MEN[] = {0, 0, 0, 0} ;
//暫存陣列
String MDT[] = {"n", "n", "n", "n"} ;//暫存陣列
const byte BZR = 5;
//腳位宣告
const byte SETT = 2;
//腳位宣告
const byte SETU = 3;
//腳位宣告
const byte SETD = 4;
//腳位宣告
const byte DOR = 10; //腳位宣告
int si = 1, sk = 0, it;
//變數宣告
int timer[] = {10, 0, 0, 9, 12, 18, 21};
//變數宣告
int sok = 0;
//變數宣告
int bbi = 0, ii;
int wtt, wgo = -1, dii = 0;
unsigned long Count, Count3, Count4, Countb;
float Count2;
unsigned long card;
//變數宣告
MFRC522 Rfid1(SS1, RST_PIN); // 建立
MFRC522物件
void setup(void) //初始化
{
pinMode(SS1, OUTPUT);
//腳位定義
輸出
digitalWrite(SS1, HIGH);
//腳位設定
for (ii = 0; ii < 4; ii++) //ii=0~3 共4次(早 中 晚
睡)
{
pinMode(LED[ii], OUTPUT);
//設定腳位
方向
digitalWrite(LED[ii], HIGH);
//腳位設為
HIGH
}
pinMode(BZR, OUTPUT);
//腳位設定
pinMode(SETT, INPUT);
//腳位設定
pinMode(SETU, INPUT);
//腳位設定
pinMode(SETD, INPUT);
//腳位設定
digitalWrite(BZR, HIGH);
//腳位設定
digitalWrite(SETT, HIGH);
//腳位設定
digitalWrite(SETU, HIGH);
//腳位設定
腳
digitalWrite(ADDO, HIGH);
//設定成高電位
digitalWrite(ADSK, HIGH);
//設定成高電位
delay(500);
Serial1.begin(9600);
//啟動串列傳輸 9600
lcd.begin(16, 2);
// 初始化 LCD
disint();
TCCR1A = 0x00;
// Normal
mode, just as a Timer
TCCR1B |= _BV(CS12);
//
prescaler = CPU clock/1024
TCCR1B &= ~_BV(CS11);
TCCR1B |= _BV(CS10);
TIMSK1 |= _BV(TOIE1);
// enable
timer overflow interrupt
TCNT1 = -15625;
// Ticks for
1 second @16 MHz,prescale=1024
BEE();
SPI.begin();
for (int i = 0; i < 3; i++) {
ReadCount();
//讀取重量AD值
Count3 = Count; //存到Count3
delay(100);
//延時200ms
}
BEE(); BEE();
Serial1.begin(9600);
// 啟動串列傳輸
9600
Rfid1.PCD_Init(); delay(100);
// 初始化
MFRC522讀卡機模組
/*
while (1)
{
ReadCount();
//讀取重量AD值
if (Count < Count3) //讀取到的ad值大於基準
值
{
Count2 = (float) (Count3 - Count) / 3.338;
//讀取到的ad值-基準值再/3.338得到重量值(單位為
1g)
Count4 = Count2;
}
else
{
Count4 = 0;
}
lcd.setCursor(13, 1); //lcd顯示在第2行第1字
lcd.print(Count4 / 100); lcd.print((Count4 %
100) / 10); //lcd顯示目前總重
lcd.print(Count4 % 10);
delay(100);
}
*/
資訊與通訊系 2021 年實務專題技術報告
}
void ReadCount()//讀出重量A/D值
{
unsigned char i;
digitalWrite(ADDO, HIGH);
//輸出高電位
digitalWrite(ADSK, LOW);
//輸出低電位
Count = 0;
while (digitalRead(ADDO) == HIGH);
for (i = 0; i < 24; i++) {
//24位計數器
digitalWrite(ADSK, HIGH); //輸出高電位
Count = Count << 1;
//Count左移一位
digitalWrite(ADSK, LOW);
//輸出低電位
if (digitalRead(ADDO) == HIGH)Count++;
}
digitalWrite(ADSK, HIGH); //輸出高電位
Count = Count ^ 0x800000;
digitalWrite(ADSK, LOW);
//輸出低電位
Count = Count / 100;
}
void BEE()
{
digitalWrite(BZR, LOW); delay(50); //蜂鳴器B
一聲
digitalWrite(BZR, HIGH); delay(50);
}
void disint()
//顯示主畫面
{
lcd.setCursor(0, 0);
//lcd顯示在第1行第1
字
lcd.print(" : :
A00 ");
lcd.setCursor(0, 1);
//lcd顯示在第2行第1
字
lcd.print("B00 C00 D00 ");
showt();
//顯示設定值在lcd上
}
void showid()
{
lcd.setCursor(0, 0);
//設定LCD顯示位置
(X,Y) X=0為第1字 Y=0為第1行
lcd.write("Thank You
");
lcd.setCursor(0, 1);
//設定LCD顯示位置
(X,Y) X=0為第1字 Y=0為第1行
lcd.print("ID:
");
lcd.setCursor(3, 1);
//設定LCD顯示位置
(X,Y) X=0為第1字 Y=0為第1行
lcd.write(card / 1000000000 + 0x30);
lcd.write((card % 1000000000) / 100000000 +
0x30);
lcd.write((card % 100000000) / 10000000 + 0x30);
lcd.write((card % 10000000) / 1000000 + 0x30);
lcd.write((card % 1000000) / 100000 + 0x30);
lcd.write((card % 100000) / 10000 + 0x30);
lcd.write((card % 10000) / 1000 + 0x30);
lcd.write((card % 1000) / 100 + 0x30);
lcd.write((card % 100) / 10 + 0x30);
lcd.write((card % 10) + 0x30);
BEE(); BEE(); //蜂鳴器bb
//disint();
}
void showt()
//顯示設定值
{
if (timer[0] > 23)timer[0] = 0; if (timer[1] >
59)timer[1] = 0; if (timer[2] > 59)timer[2] = 0;
if (timer[0] < 0)timer[0] = 23; if (timer[1] <
0)timer[1] = 59; if (timer[2] < 0)timer[2] = 59;
lcd.setCursor(0, 0);
//lcd顯示在第1行第1字
lcd.write(timer[0] / 10 + 0x30);
lcd.write((timer[0] % 10) + 0x30);
lcd.setCursor(3, 0);
//lcd顯示在第1行第4字
lcd.write(timer[1] / 10 + 0x30);
lcd.write((timer[1] % 10) + 0x30);
lcd.setCursor(6, 0);
//lcd顯示在第1行第7字
lcd.write(timer[2] / 10 + 0x30);
lcd.write((timer[2] % 10) + 0x30);
if (timer[3] > 23)timer[3] = 0; if (timer[4] >
23)timer[4] = 0;
if (timer[3] < 0)timer[3] = 23; if (timer[4] <
0)timer[4] = 23;
if (timer[5] > 23)timer[5] = 0; if (timer[6] >
23)timer[6] = 0;
if (timer[5] < 0)timer[5] = 23; if (timer[6] <
0)timer[6] = 23;
lcd.setCursor(11, 0);
//lcd顯示在第1行第12字
lcd.write(timer[3] / 10 + 0x30);
lcd.write((timer[3] % 10) + 0x30);
lcd.setCursor(1, 1);
//lcd顯示在第2行第2字
lcd.write(timer[4] / 10 + 0x30);
lcd.write((timer[4] % 10) + 0x30);
lcd.setCursor(6, 1);
//lcd顯示在第2行第7字
lcd.write(timer[5] / 10 + 0x30);
lcd.write((timer[5] % 10) + 0x30);
lcd.setCursor(11, 1);
//lcd顯示在第2行第12字
lcd.write(timer[6] / 10 + 0x30);
lcd.write((timer[6] % 10) + 0x30);
}
void sowcu()
//設定LCD游標位置
{
switch (it)
{
case 0:
// 若0 為第1行第1字
lcd.setCursor(0, 0);
break;
case 1:
// 若1 為第1行第4字
lcd.setCursor(3, 0);
break;
case 2:
// 若2 為第1行第7字
lcd.setCursor(6, 0);
break;
case 3:
// 若3 為第1行第12字
lcd.setCursor(11, 0);
break;
資訊與通訊系 2021 年實務專題技術報告
case 4:
// 若4 為第2行第2字
lcd.setCursor(1, 1);
break;
case 5:
// 若5 為第2行第7字
lcd.setCursor(6, 1);
break;
case 6:
// 若6 為第2行第12字
lcd.setCursor(11, 1);
break;
}
}
void settime(void)
//設定時間及定時功能
{
sok = 0;
it = 0; sowcu();
while (sok == 0)
{
if (digitalRead(SETU) == LOW) //按下設定+鍵
時
{ BEE();
timer[it] = timer[it] + 1; //設定值加1
showt();
//顯示設定值
while (digitalRead(SETU) == LOW); //等待放
開按鍵
sowcu();
//設定LCD游標位置
delay(100);
}
if (digitalRead(SETD) == LOW) //按下設定-鍵
時
{ BEE();
timer[it] = timer[it] - 1; //設定值減1
showt();
//顯示設定值
while (digitalRead(SETD) == LOW); //等待放
開按鍵
sowcu();
//設定LCD游標位置
delay(100);
}
if (digitalRead(SETT) == LOW) //按下設定鍵時
{ BEE();
while (digitalRead(SETT) ==
LOW)delay(100); //等待放開按鍵
it++;
//陣列位置加1
sowcu(); //設定LCD游標位置
delay(100);
if (it > 6)
{
sok = 1; //加到7時 設定完成
BEE(); BEE();
}
}
}
lcd.noBlink();
//不顯示游標
disint();
}
void loop(void)
{
if (digitalRead(SETT) == LOW) //按下設定鍵時
{ BEE(); BEE();
while (digitalRead(SETT) == LOW); //等待放開
按鍵
delay(100);
sk = 1;
lcd.setCursor(5, 0);
lcd.blink();
//顯示游標
settime();
//設定時間及定時功能
sk = 0;
}
delay(10);
dii++;
if (dii > 4)
{
dii = 0;
if (wgo != -1)
{
ReadCount();
//讀取重量
AD值
if (Count < Count3)
//讀取到的ad
值大於基準值
{
Count2 = (float) (Count3 - Count) / 1.3380;
//讀取到的ad值-基準值再/1.338得到重量值(單位為
1g)
Count4 = Count2;
}
else
{
Count4 = 0;
}
lcd.setCursor(14, 1);
//lcd顯示在第2行
第1字
if (Count4 > 99) Count4 = 99;
lcd.print((Count4 % 100) / 10); //lcd顯示目
前總重
lcd.print(Count4 % 10);
if ((Countb / 10) == (Count / 10))
{
wtt++;
if (wtt >= 20)
{
if (Count4 > 0)
{
lcd.setCursor(14, 1);
//lcd顯示
在第2行第1字
lcd.print(" "); //lcd顯示目前總重
digitalWrite(LED[wgo], HIGH);
MEN[wgo] = 0;
//提示燈變暗
BEE(); BEE(); BEE(); //蜂鳴器3聲
MDT[wgo] = "y"; //設y 表示已吃藥
wgo = -1;
}
資訊與通訊系 2021 年實務專題技術報告
wtt = 0;
}
}
else wtt = 0;
Countb = Count;
}
}
/*
for (ii = 0; ii < 4; ii++)
//ii=0~3 共4次(早
中 晚 睡)
{
if (digitalRead(SWW[ii]) == LOW) //按下吃藥
鍵時
{
digitalWrite(LED[ii], HIGH); MEN[ii] = 0;
//提示燈變暗
BEE(); BEE(); BEE(); //蜂鳴器3聲
MDT[ii] = "y"; //設y 表示已吃藥
}
}
*/
if (Rfid1.PICC_IsNewCardPresent() &&
Rfid1.PICC_ReadCardSerial()) { // 確認是否有新卡
片
byte *id = Rfid1.uid.uidByte;
// 取得卡片的
UID
byte idSize = Rfid1.uid.size; // 取得UID的長度
card = id[0] * 0x1000000 + id[1] * 0x10000 +
id[2] * 0x100 + id[3]; showid(); //取出卡號並顯示
BEE(); BEE();
if (card == 1252598181) //比對卡號 正確時
{
lcd.setCursor(0, 0);
//設定LCD顯示位
置(X,Y) X=0為第1字 Y=0為第1行
lcd.write("Door open
");
lcd.setCursor(0, 1);
//設定LCD顯示位
置(X,Y) X=0為第1字 Y=0為第1行
lcd.print("
");
digitalWrite(DOR, HIGH);
//輸出高電位
電磁鎖通電
delay(400);
digitalWrite(DOR, LOW);
//輸出低電位
delay(1000);
}
else
{
lcd.setCursor(0, 0);
//設定LCD顯示位
置(X,Y) X=0為第1字 Y=0為第1行
lcd.write("Wrong ID
");
lcd.setCursor(0, 1);
//設定LCD顯示位
置(X,Y) X=0為第1字 Y=0為第1行
lcd.print("
");
delay(2000);
}
Rfid1.PICC_HaltA(); // 讓卡片進入停止模式
delay(200); disint();
}
if (si == 1)
//1秒時間到,顯示時鐘
{
lcd.setCursor(0, 0);
lcd.write(timer[0] / 10 + 0x30); //lcd顯示 小時
lcd.write(timer[0] % 10 + 0x30);
lcd.setCursor(3, 0);
lcd.write(timer[1] / 10 + 0x30); //lcd顯示 分
lcd.write(timer[1] % 10 + 0x30);
lcd.setCursor(6, 0);
lcd.write(timer[2] / 10 + 0x30); //lcd顯示 秒
lcd.write(timer[2] % 10 + 0x30);
si = 0;
bbi = 0;
for (ii = 0; ii < 4; ii++)
//ii=0~3 共4次(早
中 晚 睡)
{
if (MEN[ii] > 0)
//若已到吃藥時間,
MEN[ii]會被設定成>0
{
digitalWrite(LED[ii], LOW); //提示燈亮起
MEN[ii]--;
//提醒時間減1
if (MEN[ii] == 0) //減到0 時
{
digitalWrite(LED[ii], HIGH); //提示燈
變暗
wgo = -1;
}
bbi = 1;
}
}
if (bbi == 1) //吃藥時間到時 bbi會為1
{
BEE();
for (ii = 0; ii < 4; ii++)
//ii=0~3 共4次
(早 中 晚 睡)
{
digitalWrite(LED[ii], HIGH); //提示燈變暗
(配合亮 變閃爍)
}
}
if (timer[0] == timer[3] && timer[1] == 0 &&
timer[2] == 0) //吃藥時段1 時間到
{
Serial1.print("
A"); //傳A至手機
通知吃藥時間到
MDT[0] = "n"; MEN[0] = 120; //提醒時間 設
120秒
資訊與通訊系 2021 年實務專題技術報告
wgo = 0; wtt = 0;
ReadCount(); Count3 = Count; //讀取重量
AD值 存到Count3
}
else if (timer[0] == timer[4] && timer[1] == 0
&& timer[2] == 0) //吃藥時段2 時間到
{
Serial1.print("
A"); //傳A至手機
通知吃藥時間到
MDT[1] = "n"; MEN[1] = 120; //提醒時間 設
120秒
wgo = 1; wtt = 0;
ReadCount(); Count3 = Count; //讀取重量
AD值 存到Count3
}
else if (timer[0] == timer[5] && timer[1] == 0
&& timer[2] == 0) //吃藥時段3 時間到
{
Serial1.print("
A"); //傳A至手機
通知吃藥時間到
MDT[2] = "n"; MEN[2] = 120; //提醒時間 設
120秒
wgo = 2; wtt = 0;
ReadCount(); Count3 = Count; //讀取重量
AD值 存到Count3
}
else if (timer[0] == timer[6] && timer[1] == 0
&& timer[2] == 0) //吃藥時段4 時間到
{
Serial1.print("
A"); //傳A至手機
通知吃藥時間到
MDT[3] = "n"; MEN[3] = 120; //提醒時間 設
120秒
wgo = 3; wtt = 0;
ReadCount(); Count3 = Count;
//讀取重量
AD值 存到Count3
}
else
{
Serial1.print(MDT[0]); Serial1.print(" ");
Serial1.print(MDT[1]); Serial1.print(" ");
Serial1.print(MDT[2]); Serial1.print(" ");
Serial1.print(MDT[3]);
Serial1.print("S"); //傳目前吃藥狀態至手機
}
}
}
ISR (TIMER1_OVF_vect)
{
TCNT1 = -15625;
// Ticks for 1
second @16 MHz,prescale=1024
if (sk == 0)
{
si = 1;
timer[2] = timer[2] + 1;
//時鐘秒加1 超過
59秒要進位
if (timer[2] > 59)
{ timer[2] = 0;
timer[1] = timer[1] + 1;
過59分要進位
if (timer[1] > 59)
{ timer[1] = 0;
timer[0] = timer[0] + 1;
超過23時要進位
if (timer[0] > 23)
{
timer[0] = 0;
}
}
}
}
}
3.4 APP inventor2 程式
//時鐘分加1 超
//時鐘時加1
資訊與通訊系 2021 年實務專題技術報告
4. 參考資料
[1] 黃宏彥、余文俊、楊國輝編著,感測器原理與
應用電路實習,高立圖書有限公司,1999。
[2]蔡朝陽,電工實習(四),全華科技圖書股份有
限公司,中華民國八十三年五月。
[3] 超圖解 Arduino 互動設計入門,旗標出版股份
有限公司。
[4]新型冠狀病毒
https://zh.wikipedia.org/wiki/2019%E5%86%A0%E7
%8A%B6%E7%97%85%E6%AF%92%E7%97%85
%E7%96%AB%E6%83%85
Download