在传统药盒的基础上,本文根据老年人在服药过程中经常出现漏服和忘服的问题,提出以ATMEGA328系列微控制器芯片为核心设计一个智能药盒。智能药盒主要由OLED显示屏、时钟模块、MP3播放器组成,同时采用ESP8266作为网络控制核心,该系统可以实现吃药时间提醒功能以及药物存储功能。以传统药盒相比,本系统提供了药物存储功能,DHT11温湿度模块进行药物存储环境的温湿度检测,并通过阿里云物联网平台在线控制。

本系统经过测试,可以在设定好的时间内,通过语音播报和灯光常亮进行吃药时间提醒。温湿度模块实时监测药物存储的温湿度上传阿里云平台,在线控制风扇的开关,调节温湿度,保证药品存储在适宜的环境下。为智能医疗产品设计的发展提供了新的参考和借鉴。

目录

一、功能:

二、材料清单:

Arduino UNO 一块,扩展板一块、5号电池盒四节一个、LED灯三个,按钮四个,OLED显示屏一块,DS3231时钟模块一个,MINIMP3模块转换板、MINIMP3、TF卡、若干杜邦线。

三、硬件连接:

四、软件系统详细设计

4.1 Arduino与Esp8266环境搭建

4.2 字模提取软件

4.3 阿里云平台开发

4.3.1 药物存储环境

4.3.2 开发流程图设计

4.4 语音提醒设计

五、系统功能测试

5.1 Arduino程序上传

5.2ESP8266程序上传

5.3闹钟时间测试

5.4声光测试结果

5.5温湿度监控


一、功能:

一天三次吃药的时间(早上、中午和晚上)到了之后会有语音提示,并且会有相对应的LED灯被点亮,可以通过按钮设置(早上、中午和晚上)吃药的时间。

二、材料清单:

Arduino UNO 一块,扩展板一块、5号电池盒四节一个、LED灯三个,按钮四个,OLED显示屏一块,DS3231时钟模块一个,MINIMP3模块转换板、MINIMP3、TF卡、若干杜邦线。

三、硬件连接

Arduino  UNO    <------>     黄色按钮

GND        <------>      G

5V          <------>     V

4         <------>      D

Arduino  UNO    <------>     红色按钮

GND        <------>      G

5V          <------>     V

5         <------>      D

Arduino  UNO   <------>      绿色按钮

GND        <------>      G

5V          <------>     V

6        <------>      D

Arduino  UNO   <------>     白色按钮

GND        <------>      G

5V          <------>     V

7        <------>      D

Arduino  UNO  <------>    DS1307时钟模块

GND        <------>      G

5V          <------>     V

10         <------>      SDA

11         <------>      SCL

Arduino  UNO   <------>    黄色LED灯

GND        <------>      G

5V          <------>     V

A3         <------>       D

Arduino  UNO  <------>      红色LED灯

GND        <------>      G

5V          <------>     V

A2         <------>       D

Arduino  UNO   <------>     绿色LED灯

GND        <------>      G

5V          <------>     V

A1         <------>       D

Arduino  UNO   <------>    OLED显示屏

GND        <------>       G

5V          <------>      V

SDA        <------>       SDA

SCL        <------>       SCL

Arduino  UNO   <------>     MINI MP3模块

GND        <------>       G

5V          <------>      V

9          <------>       TX

8          <------>       RX

Arduino  UNO    <------>      5号电池盒(4节)

VIN       <------>      正极(红色线)

GND      <------>    负极(黑色线)

四、软件系统详细设计

4.1 Arduino与Esp8266环境搭建

(1)登录Arduino官网,下载软件。

(2)打开文件à首选项,再将该连接复制到à“附加开发板管理器网址”。

网址为:https://arduino.esp8266.com/stable/package_esp8266_index.json

添加附加开发板管理器网址如图所示:

  1. 重启Arduino软件,依次点击:工具-开发板-开发板管理器,然后搜索ESP8266并下载。如图17所示为搜索结果:

(4)下载完成后,依次点击工具à开发板,可以观察到ESP8266相关的开发板,如下图所示,至此Arduino 和 ESP8266 开发环境就搭建好了。

4.2 字模提取软件

对于智能药盒设计对显示汉字的需求,选择PCtoLCD2002字体取模软件。软件的配置界面如下图所示。

其中,阴码和阳码是指:字模点阵中有笔迹像素位的状态是“1”还是“0”,即对应的薄膜晶体管是“亮”还是“灭”。

自定义格式中只有两种格式“C51”和“A51”,在这里要选择常用的“C51”格式。取模方式选择逐行式,一行一行的以最低位开始,向最高位进行扫描。进行相应的设定后,在输入框输入想要显示的汉字点击生成字模即可。比如我们输入汉字“智能药盒”,如下图所示。

4.3 阿里云平台开发

4.3.1 药物存储环境

药物的处方成分比较复杂,应按照其特性,剂型选择合适的储存条件。如果是常温贮存的,温度一般保持在10~30℃左右即可,如果是需要阴凉贮存的,一般温度控制在10~20℃左右为宜,若温度过高,中成药的某些成分可能会氧化、分解加速、变量变质,例如含芳香挥发性成分的药物可因加速挥发而损失,含脂肪油成分的药物易“泛油”或酸败,胶囊剂易黏软变型,片剂易裂片变色等等;但是温度也不宜过低,温度过低容易导致糖浆剂、露剂、含乙醇制剂等产生沉淀、结晶,甚至变性失效。一般中成药的储存相对湿度以35%~75%为宜。如果环境湿度过高,例如梅雨季节,容易导致中成药发生潮解、变形、生虫甚至霉变,如果环境湿度过低,则可能会导致中成药风化或干燥等等。对此,进行药盒内部温湿度的检测上传阿里云平台进行实时监控,保证药物的存储环境达标。同时接入一个风扇,通过开关对温湿度进行调节。

4.3.2 开发流程图设计

药物存储也是整个药盒系统设计过程中最重要的环节,流程图如下图20所示。

首先,登录阿里云官网进行实名注册登录,点击控制台搜索物联网平台开通公共实例。选择产品,进行产品创建,所属类品选择温湿度采集,连网方式选择WIFI,创建产品成功后进行创建设备,自定义功能,进行温湿度以及风扇开关的属性设置,温湿度为单精度浮点型,开关为布尔型。设置完相应功能后进行发布上线,属性设置如下图所示。

下一步是DHT11温湿度传感器接入ESP8266,连接阿里云物联网平台,从设备信息查看三元组信息并且更改代码的三元组以及WIFI信息,更改信息如下图所示。

最后上传代码连接到WIFI就可以激活设备,此时就能在阿里云平台观察到设备在线,就表示已经连接到阿里云平台。此时就可以查看实时的温湿度信息,进行药物存储环境的监控。外接的继电器用于控制风扇,用于调节温湿度情况,显示结果如下图所示:

4.4 语音提醒设计

在智能药盒系统设计中,选择MP3 PLAY模块作为语音提醒模块。在文本转语音平台可以自定义文本,设置相应的语言、身份、情况等的设置,更加注重情感化的设计。MP3模块是使用串口通信,本系统采用的是虚拟串口。主要实现代码如下:

#include "SoftwareSerial.h"//软串口库

#include "DFRobotDFPlayerMini.h"

SoftwareSerial mySerial(8, 9);

DFRobotDFPlayerMini myPlayer;

void setup()

{

mySoftwareSerial.begin(9600);

myPlayer.begin(mySoftwareSerial);

myPlayer.volume(100);   //音量设定为100

myPlayer.playFolder(1, 1);    //播放TF卡中 01文件夹下001.mp3 文件

}

void loop(){}

工作流程图如下图所示。

本系统采用微软Al语音,输入你需要转换的文本即可得到你想要的语音内容。

在合成相应的语言和可以选择完整播放,和试听选择,设置合理之后点击下载,生成的语言要放在01开头的文件夹,同时文件夹里的早中晚提醒语音文件名必须设定为001.mp3、002.mp3和003.mp3.mp3。myPlayer.playFolder(1,2)表示播放的是01文件夹的001播放源。

五、系统功能测试

5.1 Arduino程序上传

Arduino程序上传调试我们采用的是Arduino IDE,打开软件新建项目文件,在工具栏中选择我们所需要的开发板型号,开发板型号选择Arduino/Genuino Uno,进行程序编写,对我们本系统所需要的库文件逐一进行添加。然后在IDE软件中进行程序的编译,编译成功后选择对应端口点击程序上传,一段时间后就可以看见下方显示上传成功,至此,Arduino调试成功。上传成功界面如下图26所示。

5.2ESP8266程序上传

ESP8266端的程序上传同样采用的是Arduino IDE,打开软件新建项目文件,在工具栏中选择我们所需要的开发板型号,开发板型号选择ESP8266 NoedMcu 1.0,进行程序的编写,编写完成后选择对应端口进行程序下载。在IDE软件中显示上传成功后表示程序已上传,打开串口监视器,显示相应的温湿度信息。温湿度显示信息如下图27所示。

根据上图的串口显示结果,可以看到看到连接成功,显示数字1。同时可以观察到实时的温度和湿度,当连接不成功的时候则显示-1。

5.3闹钟时间测试

本系统满足人们对日常药盒的基本需求,分别可以设置早中晚三个服药时间, 早上时间设置定义一个zss变量,用if语句进行实现,当按键按下时早上时间加一,考虑时间是24小时制,预先设置一个阈值,当大于24时重头开始计数,中午和晚上设置时间同早上一致,if (digitalRead(5) == HIGH) {

delay(300);  //早上小时的时间设置

zss = zss + 1;当按下D5按键时,小时时间加一

if (zss >= 24) {

zss = 0;

}

EEPROM.put(1, zss);//将早上小时的时间设置写入EEPROM地址1

}

if (digitalRead(6) == HIGH) {

delay(300);  //早上分钟的时间设置

zsf = zsf + 1;当按下按键D6时,分钟时间加一

if (zsf >= 60) {

zsf = 0;}

EEPROM.put(11, zsf);  //将早上分钟的设置写入EEPROM地址1}

if (digitalRead(7) == HIGH) {

delay(300);  //如果7号按钮被按下则退出程序返回界面

A = 0; break;}当按下按键D7时,退出,测试结果如图28所示。

在闹钟设定显示界面图中,第一行显示的是当前的年月日,第二行显示的是当前的时间,包括时、分和秒,在第三行中显示的是用户设定好的早上吃药的闹钟、中午吃药时间的闹钟以及晚上吃药的时间。一共显示5个数据,时间显示区采用24小时制。

5.4声光测试结果

本系统设置多种提醒方式,声音提醒和LED灯常亮。获取时间代码如下:

if (Rtc.GetDateTime().Hour() == zss && (Rtc.GetDateTime().Minute()

== zsf && Rtc.GetDateTime().Second() == 0))

{

pinMode(A3,OUTPUT);

digitalWrite(A3,HIGH);

myPlayer.playFolder(1,1);

}

声光提醒图如图29所示。

在声光提醒显示界面中,设定好早上吃药时间的闹钟是22:12,if (Rtc.GetDateTime().Hour() == zss && (Rtc.GetDateTime().Minute() == zsf是获取时间,当到达闹钟设定的22:12的时候, pinMode(A3, OUTPUT);digitalWrite(A3,HIGH);可以看到早上药物所存储的格子绿灯亮起,同时 myPlayer.playFolder(1, 1),语音进行播报。

5.5温湿度监控

本系统连接阿里云上传温湿度信息,实时监测,在存储环境不佳时通过开关打开和关闭风扇,调节存储药物所需环境。

void loop(){

AliyunIoTSDK::loop();

AliyunIoTSDK::send("temperature",t);

AliyunIoTSDK::send("Humidity",h);

AliyunIoTSDK::send("LEDPIN", digitalRead(LED_BUILTIN));

h = dht.readHumidity();

t = dht.readTemperature();

Serial.print("Temperature:");

Serial.println(t); delay(1000);

Serial.print("Humidity:");

Serial.print(h);

Serial.println("%");

delay(1000);}温湿度实时监测数据图如下图30所示。

AliyunIoTSDK::send("temperature",t);AliyunIoTSDK::send("Humidity",h);表示把温度和湿度信息发送到IOT云平台。通过温湿度监控页面可以实时看到通过串口打印Serial.print("Temperature:");Serial.print("Humidity:")的实时温度为18.7℃,湿度为42.0%。在温湿度不在预期范围内,可以在云端进行风扇开关的调节。在ESP8266上外接一个继电器用于风扇的开关,风扇接在继电器上。当给继电器一个高电平时,打开了继电器的开关,风扇就会进行转动。在温湿度达到预期的药物存储环境时,相反的给继电器一个低电平,从而使风扇关闭,停止工作。

  • 程序设计

一天三次吃药的时间(早上、中午和晚上)到了之后会有语音提示,并且会有相对应的LED灯被点亮。

#include <U8g2lib.h>   //显示屏和时钟模块的库文件U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
SoftwareWire myWire(10,11);
RtcDS3231<SoftwareWire> Rtc(myWire);
SoftwareSerial mySerial(8,9);
DFRobotDFPlayerMini myPlayer;
volatile int zss;  //定义7个变量
volatile int zsf;
volatile int zws;
volatile int zwf;
volatile int wss;
volatile int wsf;
volatile int A;
// 显示文字:早上
static const unsigned char PROGMEM bitmap1[96] = {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xC0,0x00,0x00,0x00,0x00,0xFC,0x40,0x00,0x00,0x00,0x00,0x84,0x40,0x00,0x00,0x00,0x00,0xFC,0xC0,0x07,0x00,0x00,0x00,0x34,0x40,0x00,0x00,0x00,0x00,0xFF,0x43,0x00,0x00,0x00,0x00,0x30,0x40,0x00,0x00,0x00,0x00,0x30,0xFC,0x0F,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//显示文字:中午
static const unsigned char PROGMEM bitmap2[96] = {0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0xFE,0xF1,0x07,0x00,0x00,0x00,0x32,0xD9,0x00,0x00,0x00,0x00,0x32,0xC9,0x00,0x00,0x00,0x00,0xFE,0xFD,0x0F,0x00,0x00,0x00,0x32,0xC1,0x00,0x00,0x00,0x00,0x30,0xC0,0x00,0x00,0x00,0x00,0x30,0xC0,0x00,0x00,0x00,0x00,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//显示文字:晚上
static const unsigned char PROGMEM bitmap3[96] = {0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x00,0x00,0x00,0x00,0xFF,0x41,0x00,0x00,0x00,0x00,0xFF,0x41,0x00,0x00,0x00,0x00,0x5F,0xC1,0x07,0x00,0x00,0x00,0xFF,0x41,0x00,0x00,0x00,0x00,0xFF,0x40,0x00,0x00,0x00,0x00,0x6F,0x40,0x00,0x00,0x00,0x00,0x7F,0xFD,0x0F,0x00,0x00,0x00,0xDC,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//显示文字:闹钟设置时间
static const unsigned char PROGMEM bitmap4[128] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF4,0x19,0x63,0x8F,0x7F,0x80,0xF0,0x07,0x1E,0x79,0x41,0x8B,0x7F,0x8F,0x38,0x04,0xFE,0xF9,0x7F,0xBB,0x7F,0xFB,0xEB,0x05,0x32,0xDD,0xC5,0x1F,0x3F,0x8F,0xA8,0x05,0xFA,0xFD,0xC7,0x0B,0x21,0xBB,0xE8,0x05,0xFE,0x51,0xC5,0x0F,0x3F,0xAB,0xA8,0x05,0xFE,0x71,0xC1,0x06,0x3F,0x8F,0xE8,0x05,0x7E,0x31,0x41,0x0E,0x3F,0x8B,0xA8,0x05,0xF2,0x01,0xC3,0xF9,0xFF,0xE0,0x08,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};void page1() {u8g2.setFont(u8g2_font_timR10_tf); //显示年,月,日,时,分,秒,早上、中午和晚上时间u8g2.setFontPosTop();u8g2.setCursor(35,0);u8g2.print(String(Rtc.GetDateTime().Year()) + String(String("-") + String(String(Rtc.GetDateTime().Month()) + String(String("-") + String(Rtc.GetDateTime().Day())))));u8g2.setFont(u8g2_font_timR18_tf);u8g2.setFontPosTop();u8g2.setCursor(30,15);u8g2.print(Rtc.GetDateTime().Hour());u8g2.setCursor(60,15);u8g2.print(":");u8g2.setCursor(70,15);u8g2.print(Rtc.GetDateTime().Minute());u8g2.setFont(u8g2_font_timR10_tf);u8g2.setFontPosTop();u8g2.setCursor(95,25);u8g2.print(Rtc.GetDateTime().Second());u8g2.drawXBMP(0, 50, 48, 16, bitmap1);u8g2.drawXBMP(43, 50, 48, 16, bitmap2);u8g2.drawXBMP(87, 50, 48, 16, bitmap3);u8g2.drawXBMP(33, 35, 60, 16, bitmap4);u8g2.setFont(u8g2_font_timR08_tf);u8g2.setFontPosTop();u8g2.setCursor(20,50);u8g2.print(String(zss) + String(String(":") + String(zsf)));u8g2.setCursor(63,50);u8g2.print(String(zws) + String(String(":") + String(zwf)));u8g2.setCursor(106,50);u8g2.print(String(wss) + String(String(":") + String(wsf)));
}
void my_1() {u8g2.setFont(u8g2_font_timR10_tf);u8g2.setFontPosTop();u8g2.drawXBMP(0, 50, 48, 16, bitmap1);u8g2.setFont(u8g2_font_timR08_tf);u8g2.setFontPosTop();u8g2.setCursor(20,50);u8g2.print(String(zss) + String(String(":") + String(zsf)));
}
void my_2() {u8g2.setFont(u8g2_font_timR10_tf);u8g2.setFontPosTop();u8g2.drawXBMP(43, 50, 48, 16, bitmap2);u8g2.setFont(u8g2_font_timR08_tf);u8g2.setFontPosTop();u8g2.setCursor(63,50);u8g2.print(String(zws) + String(String(":") + String(zwf)));
}
void my_3() {u8g2.setFont(u8g2_font_timR10_tf);u8g2.setFontPosTop();u8g2.drawXBMP(87, 50, 48, 16, bitmap3);u8g2.setFont(u8g2_font_timR08_tf);u8g2.setFontPosTop();u8g2.setCursor(106,50);u8g2.print(String(wss) + String(String(":") + String(wsf)));
}
void setup(){u8g2.setI2CAddress(0x3C*2);u8g2.begin();Rtc.Begin();Rtc.SetIsRunning(true);mySerial.begin(9600);myPlayer.begin(mySerial);//Rtc.SetDateTime(RtcDateTime(__DATE__, __TIME__));//第二次上传时注释此行代码,新模块上电需要设置一次当前时间,否则每次上电都会初始化时间数据myPlayer.setTimeOut(500);myPlayer.volume(100);myPlayer.EQ(DFPLAYER_EQ_NORMAL);myPlayer.outputDevice(DFPLAYER_DEVICE_SD);pinMode(A1, OUTPUT);  //定义A1,A2和A3为输出管脚digitalWrite(A1,LOW);pinMode(A2, OUTPUT);digitalWrite(A2,LOW);pinMode(A3, OUTPUT);digitalWrite(A3,LOW);u8g2.enableUTF8Print();pinMode(4, INPUT);   //定义4,5,6,和7为输入管脚pinMode(5, INPUT);pinMode(6, INPUT);pinMode(7, INPUT);
}
void loop(){EEPROM.get(1, zss);   //读取EEPROM地址1的变量值EEPROM.get(11, zsf); //读取EEPROM地址11的变量值EEPROM.get(21, zws); //读取EEPROM地址21的变量值EEPROM.get(31, zwf); //读取EEPROM地址31的变量值EEPROM.get(41, wss); //读取EEPROM地址41的变量值EEPROM.get(51, wsf); //读取EEPROM地址51的变量值u8g2.firstPage();do{page1();}while(u8g2.nextPage());  //如果到达早上设置时间则对应的LED灯点亮,语音播放if (Rtc.GetDateTime().Hour() == zss && (Rtc.GetDateTime().Minute() == zsf && Rtc.GetDateTime().Second() == 0)) {pinMode(A3, OUTPUT);digitalWrite(A3,HIGH);pinMode(A1, OUTPUT);digitalWrite(A1,LOW);pinMode(A2, OUTPUT);digitalWrite(A2,LOW);myPlayer.playFolder(1, 1);}if (Rtc.GetDateTime().Hour() == zws && (Rtc.GetDateTime().Minute() == zwf && Rtc.GetDateTime().Second() == 0)) {pinMode(A2, OUTPUT);   //如果到达中午设置时间则对应的LED灯点亮,语音播放digitalWrite(A2,HIGH);pinMode(A1, OUTPUT);digitalWrite(A1,LOW);pinMode(A3, OUTPUT);digitalWrite(A3,LOW);myPlayer.playFolder(1, 2);}if (Rtc.GetDateTime().Hour() == wss && (Rtc.GetDateTime().Minute() == wsf && Rtc.GetDateTime().Second() == 0)) {pinMode(A1, OUTPUT);   //如果到达晚上设置时间则对应的LED灯点亮,语音播放主人,晚上吃药的时间到了digitalWrite(A1,HIGH);pinMode(A2, OUTPUT);digitalWrite(A2,LOW);pinMode(A3, OUTPUT);digitalWrite(A3,LOW);  myPlayer.playFolder(1, 3);}if (digitalRead(4) == HIGH) {delay(300);  //如果4号按钮被按下,那么进行闹钟时间的设置u8g2.firstPage();do{my_1();}while(u8g2.nextPage());delay(1000);  A = A + 10;while (A == 10) {u8g2.firstPage();do{my_1();}while(u8g2.nextPage());if (digitalRead(5) == HIGH) {delay(300);  //早上小时的时间设置zss = zss + 1;if (zss >= 24) {zss = 0;}EEPROM.put(1, zss);//将早上小时的时间设置写入EEPROM地址1}if (digitalRead(6) == HIGH) {delay(300);  //早上分钟的时间设置zsf = zsf + 1;if (zsf >= 60) {zsf = 0;}EEPROM.put(11, zsf);  //将早上分钟的时间设置写入EEPROM地址11}if (digitalRead(7) == HIGH) {delay(300);  //如果7号按钮被按下则退出程序返回界面A = 0; break;}if (digitalRead(4) == HIGH) {  //如果4号按钮被按下切换到中午时间的设置delay(300);A = A + 10; break;}}u8g2.firstPage();do{my_2();}while(u8g2.nextPage());delay(1000);while (A == 20) {u8g2.firstPage();do{my_2();}while(u8g2.nextPage());if (digitalRead(5) == HIGH) {delay(300);  //中午小时的时间设置zws = zws + 1;if (zws >= 24) {zws = 0;}EEPROM.put(21, zws);//将中午小时的时间设置写入EEPROM地址21}if (digitalRead(6) == HIGH) {delay(300);zwf = zwf + 1;   //中午分钟的时间设置if (zwf >= 60) {zwf = 0;}EEPROM.put(31, zwf);//将中午分钟的时间设置写入EEPROM地址31}if (digitalRead(7) == HIGH) {delay(300);   //如果7号按钮被按下则退出程序返回界面A = 0; break;}if (digitalRead(4) == HIGH) {A = A + 10; //如果4号按钮被按下切换到晚上时间的设置delay(300);  break;}}u8g2.firstPage();do{my_3();}while(u8g2.nextPage());delay(1000);while (A == 30) {u8g2.firstPage();do{my_3();}while(u8g2.nextPage());if (digitalRead(5) == HIGH) {delay(300);wss = wss + 1;  //晚上小时的时间设置if (wss >= 24) {wss = 0;}EEPROM.put(41, wss);//将晚上小时的时间设置写入EEPROM地址41}if (digitalRead(6) == HIGH) {delay(300);wsf = wsf + 1; //晚上分钟的时间设置if (wsf >= 60) {wsf = 0;}EEPROM.put(51, wsf);//将晚上分钟的时间设置写入EEPROM地址51}if (digitalRead(7) == HIGH) {delay(300);   //如果7号按钮被按下则退出程序返回界面A = 0; break;}if (digitalRead(4) == HIGH) {  //如果4号按钮被按下则退出程序返回界面delay(300);A = 0; break;} } }if (digitalRead(7) == HIGH) {  //如果7号管脚被按下则3盏灯全部熄灭pinMode(A1, OUTPUT);digitalWrite(A1,LOW);pinMode(A2, OUTPUT);digitalWrite(A2,LOW);pinMode(A3, OUTPUT);digitalWrite(A3,LOW);} }

智能药盒的设计与实现相关推荐

  1. 特别提醒蓝牙语音智能药盒的设计思路(二)TTS技术应用篇,附手机小程序界面

    全文3000字,阅读时间约8分钟,建议收藏后慢慢看 目录 引言 蓝牙TTS智能药盒方案系统图 智能药盒是什么 智能药盒为什么需要语音提醒 语音提醒功能为什么要用TTS技术 TTS语音提醒的应用场景 1 ...

  2. 【Verilog智能药盒的设计与实现】

    该可编程器件实验板是以 Altera 公司的 MAX II 系列可编程器件 EPM1270T144C5 为核心芯片,是一款具有多种外部接口和显示器件的通用数字电路实验平台.选用1kHz. 一. 设计课 ...

  3. 嵌入式单片机智能药盒设计(含代码)

    目录 前言 设计的内容 (1)显示 (2)定时时间与用药量的设定 (3)实时时间调节 (4)报警功能 时钟模块 蓝牙模块 系统软件设计 系统主程序 按键函数 中断服务函数 作品展示 测试药定时提醒功能 ...

  4. 基于stm32的智能药盒

    提示:记录毕设 文章目录 前言 一.任务书 1.1设计(研究)目标: 1.2设计(研究)内容: 二.框架思路 三.硬件及代码 四.相关功能介绍 五.交流联系 六.喜欢请点赞哦! 前言 基于STM32的 ...

  5. 智能手环功能模块设计_智能手环的设计的方案.doc

    智能手环的设计的方案 智能手环的设计的方案 摘 要 本手环设计本身添加了市面上智能手环的相关功能,能够实现显示时间.测量步数.热量.闹钟等功能.因此本设计也适用于普通的使用者,在能够拥有智能手环的便捷 ...

  6. 天津大学计算机课程设计挂,《天津大学_智能装置课程设计报告》.doc

    智能装置课程设计报告 一.设计题目 空调控制系统 二.设计目的 1. 深入了解PIC16F877单片机的工作原理,熟练掌握汇编语言程序设计方法,熟练使用MPLAB-ICD仿真器及MPLAB-IDE仿真 ...

  7. 《智能家居产品 从设计到运营》——第2章 技术搭台——与智能家居相关的技术...

    本节书摘来异步社区<智能家居产品 从设计到运营>一书中的第2章,作者:邢袖迪,更多章节内容可以访问云栖社区"异步社区"公众号查看 第2章 技术搭台--与智能家居相关的技 ...

  8. python做商品推荐系统_一种商品智能推荐系统的设计的制作方法

    一种商品智能推荐系统的设计,其技术领域涉及web技术.Java语言的开发和数据库的建立. 背景技术: 近年来,互联网信息的增长十分迅速,基于电子商务模式的商品销售已经变得十分普及,如何为如此庞大的商品 ...

  9. Android 腾讯入门教程( 智能手表UI设计 和 MVC模式 )

    *****注意到mvc 在android 中是如何进行分层分域执行各自的功能.**** 官方推荐的按钮尺寸是48像素 前端之Android入门(1):环境配置 前端之Android入门(2):程序目录 ...

  10. 智能家居数据库设计_设计更智能的数据表

    智能家居数据库设计 重点 (Top highlight) Data tables are hard. There are many different ways to think about them ...

最新文章

  1. Js实现回车登录,监听回车事件
  2. 管理集群中的 crs 管理员
  3. 牛客 - 共鸣问题(贪心+思维)
  4. java中什么是释放已经持有的锁_java多线程什么时候释放锁
  5. 电脑小白用Linux,linux小白说说用linux的感受
  6. 蔚来:ET7首批预生产车正式下线
  7. C语言实现巴特沃斯IIR滤波器
  8. 至强服务器性能排行,至强CPU性能排行榜,至强系列cpu天梯图2020.06
  9. littleVGL开发(10):事件(EVENT)
  10. 2017网易校招:Fibonacci数列
  11. 工程项目常见风险及其22种最佳管理实践
  12. Zabbix Database error
  13. 360一键root su浅析
  14. TrueLaunchBar 4.2
  15. andriod studio 开发
  16. 科学数学工程工具MATLAB软件2023a中文版下载安装,MATLAB特色
  17. LTE PDCP层协议概述
  18. 模型预测控制(MPC)+逻辑控制(相平面分区控制)--matlab例程介绍
  19. IDEA 支持vue
  20. Error response from daemon: conflict: unable to delete image has dependent child images

热门文章

  1. unix网络编程中的fd是什么
  2. Excel文件加密后忘记密码破解方法
  3. 《循序渐进Oracle:数据库管理、优化与备份恢复》一一1.5 案例与实践分析 ...
  4. winedit使用教程_latex与winedit入门指导教程.pdf
  5. 内网ip如何传输文件
  6. 红外小目标检测中ROC曲线的绘制
  7. Field not found; typically this occurs with arrays which are not mapped as single value
  8. npm与yarn常用命令
  9. python爬虫beta版之抓取知乎单页面回答(low 逼版)
  10. 计算机社团收获作文,写智慧校园的优秀作文