DFSH_Cranberry 发表于 2021-1-25 15:40:18

基于esp32的智能药盒

本帖最后由 DFSH_Cranberry 于 2021-1-25 16:14 编辑

中老年人智能药盒目录一、背景介绍
二、市场调研
三、产品功能
四、硬件代码
五、产品外观
六、市场定位
一、背景介绍本着生命第一,健康第一的原则,本款产品解决部分中老年人在用药上做了充分市场调研,以及较全面功能应用分析,旨在能够提高中老年人生活质量。目标:为提醒需要定时吃药的健忘中老年人常见用户痛点:
[*]中老年人容易忘记吃药时间。
[*]中老年人容易忘记把药放在什么位置。

二、市场调研我们调查发现:(常见中老年人疾病以及用药时间)图一根据图一,我们不难发现,不同的患者他们有着不同的用药时间。高血压患者是每天都需要吃药,而且每天用药的时间也是不一样的;像高血脂患者,他们用药时间一般是十天到半个月,属于较长周期性疗程用药。
三、产品功能友商产品:时间显示,设置每天定时闹钟我们的产品:
[*]一键记录当前时间(特色,中老年人智能记录时间模式)
[*]功能齐全(时间设置,定时闹钟,指定日期闹钟)
特色:对于每天需要吃药的中老年人,为了简化设置闹钟时间,我们采用一键式记录当前时间,避免因为操作困难给中老年人带来困扰,用户只需要在头次吃药的时候准时按键记录,后面每天都可以在同一时间进行智能提醒。产品功能详细介绍见图二:
四、硬件代码硬件
[*]FireBeetle 萤火虫 ESP32微控制器X 1
(https://www.dfrobot.com.cn/goods-1394.html)
[*]I2C LCD1602 液晶显示屏X 1
(https://www.dfrobot.com.cn/goods-1696.html)
[*]小喇叭X 1
(https://www.dfrobot.com.cn/goods-611.html)
[*]数字大按钮模块X 3
(https://www.dfrobot.com.cn/goods-78.html)
[*]I2C SD2405 RTC 实时时钟模块X 1
(https://www.dfrobot.com.cn/goods-1405.html)
[*]3.7V电池X 1
(https://www.dfrobot.com.cn/goods-534.html)
[*]锂电池充电板MicroUSBX 1
(https://www.dfrobot.com.cn/goods-2831.html)
[*]导线若干,电源按钮开关,以及常用工具
接线图:代码:#include "GravityRtc.h"
#include <Wire.h>
#include "DFRobot_LCD.h"
GravityRtc rtc;
DFRobot_LCD lcd(16,2);//16 characters and 2 lines of show
int button_13 = D7;
int button_12 = D3;
int button_11 = D2;
int a={{0,0,0},{0,0,0},{0,0,0},{0,0,0}};//remenber the time currently
int b={{0,0,0},{0,0,0},{0,0,0},{0,0,0}};//remenber the time by habit
int c={{2020,9,7,0,0,0},{2020,9,7,0,0,0},{2020,9,7,0,0,0},{2020,9,7,0,0,0}};//set the time of periodicity
#define NOTE_D0 -1
#define NOTE_D1 294
#define NOTE_D2 330
#define NOTE_D3 350
#define NOTE_D4 393
#define NOTE_D5 441
#define NOTE_D6 495
#define NOTE_D7 556

#define NOTE_DL1 147
#define NOTE_DL2 165
#define NOTE_DL3 175
#define NOTE_DL4 196
#define NOTE_DL5 221
#define NOTE_DL6 248
#define NOTE_DL7 278

#define NOTE_DH1 589
#define NOTE_DH2 661
#define NOTE_DH3 700
#define NOTE_DH4 786
#define NOTE_DH5 882
#define NOTE_DH6 990
#define NOTE_DH7 112
//以上部分是定义是把每个音符和频率值对应起来,其实不用打这么多,但是都打上了,后面可以随意编写D调的各种歌,我这里用NOTE_D+数字表示音符,NOTE_DH+数字表示上面有点的那种音符,NOTE_DL+数字表示下面有点的那种音符。这样后面写起来比较好识别。
#define WHOLE 1
#define HALF 0.5
#define QUARTER 0.25
#define EIGHTH 0.25
#define SIXTEENTH 0.625
//这部分是用英文对应了拍子,这样后面也比较好看
int tune[] =
{
NOTE_DH1,NOTE_D6,NOTE_D5,NOTE_D6,NOTE_D0,
NOTE_DH1,NOTE_D6,NOTE_D5,NOTE_DH1,NOTE_D6,NOTE_D0,NOTE_D6,
NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D6,NOTE_D0,NOTE_D6,
NOTE_DH1,NOTE_D6,NOTE_D5,NOTE_DH1,NOTE_D6,NOTE_D0,
   
NOTE_D1,NOTE_D1,NOTE_D3,
NOTE_D1,NOTE_D1,NOTE_D3,NOTE_D0,
NOTE_D6,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D6,
NOTE_D5,NOTE_D1,NOTE_D3,NOTE_D0,
NOTE_DH1,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D6,
NOTE_D5,NOTE_D1,NOTE_D2,NOTE_D0,
NOTE_D7,NOTE_D7,NOTE_D5,NOTE_D3,
NOTE_D5,
NOTE_DH1,NOTE_D0,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D5,NOTE_D6,NOTE_D6,
NOTE_D0,NOTE_D5,NOTE_D1,NOTE_D3,NOTE_D0,
NOTE_DH1,NOTE_D0,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D5,NOTE_D6,NOTE_D6,
NOTE_D0,NOTE_D5,NOTE_D1,NOTE_D2,NOTE_D0,
NOTE_D3,NOTE_D3,NOTE_D1,NOTE_DL6,
NOTE_D1,
NOTE_D3,NOTE_D5,NOTE_D6,NOTE_D6,
NOTE_D3,NOTE_D5,NOTE_D6,NOTE_D6,
NOTE_DH1,NOTE_D0,NOTE_D7,NOTE_D5,
NOTE_D6,
};//这部分就是整首曲子的音符部分,用了一个序列定义为tune,整数

float duration[]=
{
1,1,0.5,0.5,1,
0.5,0.5,0.5,0.5,1,0.5,0.5,
0.5,1,0.5,1,0.5,0.5,
0.5,0.5,0.5,0.5,1,1,
   
1,1,1+1,
0.5,1,1+0.5,1,
1,1,0.5,0.5,1,
0.5,1,1+0.5,1,
0.5,0.5,0.5,0.5,1+1,
0.5,1,1+0.5,1,
1+1,0.5,0.5,1,
1+1+1+1,
0.5,0.5,0.5+0.25,0.25,0.5+0.25,0.25,0.5+0.25,0.25,
0.5,1,0.5,1,1,
0.5,0.5,0.5+0.25,0.25,0.5+0.25,0.25,0.5+0.25,0.25,
0.5,1,0.5,1,1,
1+1,0.5,0.5,1,
1+1+1+1,
0.5,1,0.5,1+1,
0.5,1,0.5,1+1,
1+1,0.5,0.5,1,
1+1+1+1
};//这部分是整首曲子的接拍部分,也定义个序列duration,浮点(数组的个数和前面音符的个数是一样的,一一对应么)
int freq = 2000;
int channel = 0;
int resolution = 8;
void setup() {
    pinMode(button_11,INPUT);
    pinMode(button_12,INPUT);
    pinMode(button_13,INPUT);
    ledcSetup(channel, freq, resolution);
    ledcAttachPin(D6, channel);
    Serial.begin(9600);
    rtc.setup();
    //自动设置RTC时钟:通过获取电脑时间校准RTC模块,首先需要保证电脑时间正确
    rtc.adjustRtc(F(__DATE__), F(__TIME__));
    // initialize
    lcd.init();
    // Print a message to the LCD.
   
   
}

void loop() {
    time_appearence();
    if(digitalRead(button_13)==HIGH){
      delay(200);
      int flag_TandA=0;
      while(1){    //选择时间调节模式还是闹钟调节模式
            if(digitalRead(button_12)==HIGH){
                flag_TandA=1+flag_TandA;
                delay(200);
            }
            if(flag_TandA%4==0){
                lcd.setCursor(0, 0);
                lcd.print("time adjust   ");
                lcd.setCursor(0, 1);
                lcd.print("                ");
            }else if(flag_TandA%4==1){
                lcd.setCursor(0, 0);
                lcd.print("alarm adjust    ");
                lcd.setCursor(0, 1);
                lcd.print("                ");
            }else if(flag_TandA%4==2){
                lcd.setCursor(0, 0);
                lcd.print("set a date      ");
                lcd.setCursor(0, 1);
                lcd.print("                ");
            }else{
                lcd.setCursor(0, 0);
                lcd.print("close all alarms");
                lcd.setCursor(0, 1);
                lcd.print("                ");
            }
            if(digitalRead(button_13)==HIGH){ //make a sure
                delay(200);
                if(flag_TandA%4==0){
                  RTC_adjust();// time adjust
                  break;
                }else if(flag_TandA%4==1){
                  AC_adjust();//set a currently AC time
                  break;
                }else if(flag_TandA%4==2){
                  fix_a_date();//set a periodicity time
                  break;
                }else{
                  DAC_FAD();//del all the alarm clock
                  break;
                }
            }
            if(digitalRead(button_11)==HIGH){//return
                delay(200);
                break;
            }
      }
    }
    delay(200);
    if(digitalRead(button_12)==HIGH){
      delay(200);
      IRA();//remenber a time automaticly
    }
    if(digitalRead(button_11)==HIGH){
      delay(200);
      DIRA();//del all the automaticly time
    }
    AC_judge();//jugle the time in order to make a alarm or not
}

//DEL all the alarm clock
void DAC_FAD(){
    lcd.setCursor(0, 1);
    lcd.print("valid or not   ");
    lcd.setCursor(12, 1);
    lcd.print(" ");
    int DAC_FAD_value;
    DAC_FAD_value=0;
    while(1){
      if(DAC_FAD_value==0){
            lcd.setCursor(13, 1);
            lcd.print("F");
      }else{
            lcd.setCursor(13, 1);
            lcd.print("T");
      }
      delay(200);
      if(digitalRead(button_13)==HIGH){
            if(DAC_FAD_value==1){
                for(int i=0;i<4;i++){
                  a=0;
                }
                for(int i=0;i<4;i++){
                  c=0;
                }
                delay(100);
                break;
            }else{
                delay(100);
                break;
            }
      }
      if(digitalRead(button_12)==HIGH){
            DAC_FAD_value=1-DAC_FAD_value;
            delay(100);
      }
      if(digitalRead(button_11)==HIGH){
            DAC_FAD_value=1-DAC_FAD_value;
            delay(100);
      }
    }
}

//set a periodicity time
void fix_a_date(){
    int flag_fix=0;
    int F_value=0;
    while(1){
      if(digitalRead(button_12)==HIGH){
            delay(100);
            flag_fix=1+flag_fix;
      }
      if(flag_fix%4==0){
            lcd.setCursor(0, 0);
            lcd.print("set one date   ");
            lcd.setCursor(0, 1);
            lcd.print("                ");
      }else if(flag_fix%4==1){
            lcd.setCursor(0, 0);
            lcd.print("set two date   ");
            lcd.setCursor(0, 1);
            lcd.print("                ");
      }else if(flag_fix%4==2){
            lcd.setCursor(0, 0);
            lcd.print("set three date   ");
            lcd.setCursor(0, 1);
            lcd.print("                ");
      }else{
            lcd.setCursor(0, 0);
            lcd.print("set four date   ");
            lcd.setCursor(0, 1);
            lcd.print("                ");
      }
      if(digitalRead(button_13)==HIGH){
            delay(200);
            if(flag_fix%4==0){
                F_value=flag_fix%4;
                Fix_adjust(F_value);
            }else if(flag_fix%4==1){
                F_value=flag_fix%4;
                Fix_adjust(F_value);
            }else if(flag_fix%4==2){
                F_value=flag_fix%4;
                Fix_adjust(F_value);
            }else{
                F_value=flag_fix%4;
                Fix_adjust(F_value);
            }
      }
      if(digitalRead(button_11)==HIGH){
            delay(100);
            break;
      }
    }
}

void Fix_adjust(int F_value){
    int value;
    value=F_value;
    while(1){
      lcd.setCursor(0, 1);
      lcd.print("year");
      lcd.setCursor(5, 1);
      lcd.print(c);
      if(digitalRead(button_12)==HIGH){
            delay(200);
            c=1+c;
      }if(digitalRead(button_11)==HIGH){
            delay(200);
            c=c-1;
      }
      if(digitalRead(button_13)==HIGH){
            delay(200);
            break;
      }
    }
    while(1){
      lcd.setCursor(0, 1);
      lcd.print("month");
      lcd.setCursor(5, 1);
      lcd.print(" ");
      if(c<10){
            lcd.setCursor(6, 1);
            lcd.print(c);
            lcd.setCursor(7, 1);
            lcd.print("            ");
      }else{
            lcd.setCursor(6, 1);
            lcd.print(c);
      }
      if(digitalRead(button_12)==HIGH){
            delay(200);
            c=1+c;
            if(c==13){
                c=1;
            }
      }if(digitalRead(button_11)==HIGH){
            delay(200);
            c=c-1;
            if(c==0){
                c=12;
            }
      }
      if(digitalRead(button_13)==HIGH){
            delay(200);
            break;
      }
    }
    while(1){
      lcd.setCursor(0, 1);
      lcd.print("day");
      lcd.setCursor(3, 1);
      lcd.print(" ");
      if(c<10){
            lcd.setCursor(4, 1);
            lcd.print(c);
            lcd.setCursor(5, 1);
            lcd.print("            ");
      }else{
            lcd.setCursor(4, 1);
            lcd.print(c);
      }
      if(digitalRead(button_12)==HIGH){
            delay(200);
            c=1+c;
            if(c==32){
                c=1;
            }
      }if(digitalRead(button_11)==HIGH){
            delay(200);
            c=c-1;
            if(c==0){
                c=31;
            }
      }
      if(digitalRead(button_13)==HIGH){
            delay(200);
            break;
      }
    }
    while(1){
      lcd.setCursor(0, 1);
      lcd.print("hour");
      lcd.setCursor(4, 1);
      lcd.print(" ");
      if(c<10){
            lcd.setCursor(5, 1);
            lcd.print(c);
            lcd.setCursor(6, 1);
            lcd.print("            ");
      }else{
            lcd.setCursor(5, 1);
            lcd.print(c);
      }
      if(digitalRead(button_12)==HIGH){
            delay(200);
            c=1+c;
            if(c==24){
                c=0;
            }
      }if(digitalRead(button_11)==HIGH){
            delay(200);
            c=c-1;
            if(c==-1){
                c=23;
            }
      }
      if(digitalRead(button_13)==HIGH){
            delay(200);
            break;
      }
    }
    while(1){
      lcd.setCursor(0, 1);
      lcd.print("minute");
      lcd.setCursor(6, 1);
      lcd.print(" ");
      if(c<10){
            lcd.setCursor(7, 1);
            lcd.print(c);
            lcd.setCursor(8, 1);
            lcd.print("            ");
      }else{
            lcd.setCursor(7, 1);
            lcd.print(c);
      }
      if(digitalRead(button_12)==HIGH){
            delay(200);
            c=1+c;
            if(c==60){
                c=0;
            }
      }if(digitalRead(button_11)==HIGH){
            delay(200);
            c=c-1;
            if(c==-1){
                c=59;
            }
      }
      if(digitalRead(button_13)==HIGH){
            delay(200);
            break;
      }
    }
    while(1){
      lcd.setCursor(0, 1);
      lcd.print("vaild or not");
      lcd.setCursor(12, 1);
      lcd.print(" ");
      if(c==0){
            lcd.setCursor(13, 1);
            lcd.print("F");
      }else{
            lcd.setCursor(13, 1);
            lcd.print("T");
      }
      if(digitalRead(button_12)==HIGH){
            c=1-c;
            delay(100);
      }
      if(digitalRead(button_11)==HIGH){
            c=1-c;
            delay(100);
      }
      if(digitalRead(button_13)==HIGH){
            delay(100);
            break;
      }
    }
}

//remenber a time automaticly
void IRA(){
    int IRA_flag=0;
    for(int i=0;i<4;i++){
      if(b==0){
            b=rtc.hour;
            b=rtc.minute;
            lcd.setCursor(0, 0);
            lcd.print("remenber time    ");
            lcd.setCursor(0, 1);
            lcd.print("valid or not   ");
            while(1){
                if(digitalRead(button_13)==HIGH){
                  delay(100);
                  b=1;
                  IRA_flag=1;
                  break;
                }else if(digitalRead(button_11)==HIGH){
                  delay(100);
                  break;
                }
            }
            break;
      }
    }
    if(IRA_flag==0){
      lcd.setCursor(0, 0);
      lcd.print("space full      ");
      lcd.setCursor(0, 1);
      lcd.print("Please empty it    ");
      delay(3000);
    }
}

//del all the automaticly time
void DIRA(){
    lcd.setCursor(0, 0);
    lcd.print("space empty      ");
    lcd.setCursor(0, 1);
    lcd.print("valid or not    ");
    while(1){
      if(digitalRead(button_13)==HIGH){
            delay(200);
            for(int i=0;i<4;i++){
                b=0;
            }
            break;
      }
      if(digitalRead(button_11)==HIGH){
            delay(200);
            break;
      }
    }
}

//显示当前时间
void time_appearence(){
    rtc.read();
    lcd.setCursor(0, 0);
    lcd.print(rtc.year);
    lcd.setCursor(4, 0);
    lcd.print("/");
    if(rtc.month<10){
      lcd.setCursor(5, 0);
      lcd.print("0");
      lcd.setCursor(6, 0);
      lcd.print(rtc.month);
    }else{
      lcd.setCursor(5, 0);
      lcd.print(rtc.month);
    }
    lcd.setCursor(7, 0);
    lcd.print("/");
    if(rtc.day<10){
      lcd.setCursor(8, 0);
      lcd.print("0");
      lcd.setCursor(9, 0);
      lcd.print(rtc.day);
    }else{
      lcd.setCursor(8, 0);
      lcd.print(rtc.day);
    }
    if(rtc.hour<10){
      lcd.setCursor(0, 1);
      lcd.print("0");
      lcd.setCursor(1, 1);
      lcd.print(rtc.hour);
    }else{
      lcd.setCursor(0, 1);
      lcd.print(rtc.hour);
    }
    lcd.setCursor(2, 1);
    lcd.print("-");
    if(rtc.minute<10){
      lcd.setCursor(3, 1);
      lcd.print("0");
      lcd.setCursor(4, 1);
      lcd.print(rtc.minute);
    }else{
      lcd.setCursor(3, 1);
      lcd.print(rtc.minute);
    }
    lcd.setCursor(5, 1);
    lcd.print("-");
    if(rtc.second<10){
      lcd.setCursor(6, 1);
      lcd.print("0");
      lcd.setCursor(7, 1);
      lcd.print(rtc.second);
    }else{
      lcd.setCursor(6, 1);
      lcd.print(rtc.second);
    }
    lcd.setCursor(9, 1);
    lcd.print("week-");
    lcd.setCursor(14, 1);
    lcd.print(rtc.week);
    lcd.setCursor(10, 0);
    lcd.print("      ");
    lcd.setCursor(8, 1);
    lcd.print(" ");
    lcd.setCursor(15, 1);
    lcd.print(" ");
    delay(200);
}

//手动设置RTC时钟
void RTC_adjust(){
    int flag_RTC=0;
    int i_year=rtc.year;
    int i_month=rtc.month;
    int i_day=rtc.day;
    int i_hour=rtc.hour;
    int i_minute=rtc.minute;
    int i_second=rtc.second;
    int i_week=rtc.week;
    while(1){
      if(digitalRead(button_12)==HIGH){
            delay(100);
            flag_RTC=1+flag_RTC;
      }
      if((flag_RTC%7)==0){
            lcd.setCursor(0, 0);
            lcd.print("year adjust   ");
            lcd.setCursor(0, 1);
            lcd.print("                ");
      }else if((flag_RTC%7)==1){
            lcd.setCursor(0, 0);
            lcd.print("month adjust   ");
            lcd.setCursor(0, 1);
            lcd.print("                ");
      }else if((flag_RTC%7)==2){
            lcd.setCursor(0, 0);
            lcd.print("day adjust   ");
            lcd.setCursor(0, 1);
            lcd.print("                ");
      }else if((flag_RTC%7)==3){
            lcd.setCursor(0, 0);
            lcd.print("hour adjust   ");
            lcd.setCursor(0, 1);
            lcd.print("                ");
      }else if((flag_RTC%7)==4){
            lcd.setCursor(0, 0);
            lcd.print("minute adjust   ");
            lcd.setCursor(0, 1);
            lcd.print("                ");
      }else if((flag_RTC%7)==5){
            lcd.setCursor(0, 0);
            lcd.print("second adjust   ");
            lcd.setCursor(0, 1);
            lcd.print("                ");
      }else{
            lcd.setCursor(0, 0);
            lcd.print("week adjust   ");
            lcd.setCursor(0, 1);
            lcd.print("                ");
      }
      if(digitalRead(button_13)==HIGH){
            delay(200);
            while((flag_RTC%7)==0){
                lcd.setCursor(0, 0);
                lcd.print("year adjust   ");
                lcd.setCursor(0, 1);
                lcd.print(i_year);
                if(digitalRead(button_12)==HIGH){
                  i_year=1+i_year;
                }
                if(digitalRead(button_11)==HIGH){
                  i_year=i_year-1;
                }
                if(digitalRead(button_13)==HIGH){
                  break;
                }
                delay(100);
            }
            while((flag_RTC%7)==1){
                lcd.setCursor(0, 0);
                lcd.print("month adjust   ");
                if(i_month<10){
                  lcd.setCursor(0, 1);
                  lcd.print(i_month);
                  lcd.setCursor(1, 1);
                  lcd.print("               ");
                }else{
                  lcd.setCursor(0, 1);
                  lcd.print(i_month);
                }
               
                if(digitalRead(button_12)==HIGH){
                  i_month=1+i_month;
                  if(i_month==13){
                        i_month=1;
                  }
                  
                }
                if(digitalRead(button_11)==HIGH){
                  i_month=i_month-1;
                  if(i_month==0){
                        i_month=12;
                  }
                }
                if(digitalRead(button_13)==HIGH){
                  break;
                }
                delay(100);
            }
            while((flag_RTC%7)==2){
                lcd.setCursor(0, 0);
                lcd.print("day adjust   ");
                if(i_day<10){
                  lcd.setCursor(0, 1);
                  lcd.print(i_day);
                  lcd.setCursor(1, 1);
                  lcd.print("               ");
                }else{
                  lcd.setCursor(0, 1);
                  lcd.print(i_day);
                }
                if(digitalRead(button_12)==HIGH){
                  i_day=1+i_day;
                  if(i_day==32){
                        i_day=1;
                  }
                }
                if(digitalRead(button_11)==HIGH){
                  i_day=i_day-1;
                  if(i_day==0){
                        i_day=31;
                  }
                }
                if(digitalRead(button_13)==HIGH){
                  break;
                }
                delay(100);
            }
            while((flag_RTC%7)==3){
                lcd.setCursor(0, 0);
                lcd.print("hour adjust   ");
                if(i_hour<10){
                  lcd.setCursor(0, 1);
                  lcd.print(i_hour);
                  lcd.setCursor(1, 1);
                  lcd.print("               ");
                }else{
                  lcd.setCursor(0, 1);
                  lcd.print(i_hour);
                }
                if(digitalRead(button_12)==HIGH){
                  i_hour=1+i_hour;
                  if(i_hour==24){
                        i_hour=0;
                  }
                }
                if(digitalRead(button_11)==HIGH){
                  i_hour=i_hour-1;
                  if(i_hour==-1){
                        i_hour=23;
                  }
                }
                if(digitalRead(button_13)==HIGH){
                  break;
                }
                delay(100);
            }
            while((flag_RTC%7)==4){
                lcd.setCursor(0, 0);
                lcd.print("minute adjust   ");
                if(i_minute<10){
                  lcd.setCursor(0, 1);
                  lcd.print(i_minute);
                  lcd.setCursor(1, 1);
                  lcd.print("               ");
                }else{
                  lcd.setCursor(0, 1);
                  lcd.print(i_minute);
                }
                if(digitalRead(button_12)==HIGH){
                  i_minute=1+i_minute;
                  if(i_minute==60){
                        i_minute=0;
                  }
                  
                }
                if(digitalRead(button_11)==HIGH){
                  i_minute=i_minute-1;
                  if(i_minute==-1){
                        i_minute=59;
                  }
                }
                if(digitalRead(button_13)==HIGH){
                  break;
                }
                delay(100);
            }
            while((flag_RTC%7)==5){
                lcd.setCursor(0, 0);
                lcd.print("second adjust   ");
                if(i_second<10){
                  lcd.setCursor(0, 1);
                  lcd.print(i_second);
                  lcd.setCursor(1, 1);
                  lcd.print("               ");
                }else{
                  lcd.setCursor(0, 1);
                  lcd.print(i_second);
                }
                if(digitalRead(button_12)==HIGH){
                  i_second=1+i_second;
                  if(i_second==60){
                        i_second=0;
                  }
                  
                }
                if(digitalRead(button_11)==HIGH){
                  i_second=i_second-1;
                  if(i_second==-1){
                        i_second=59;
                  }
                }
                if(digitalRead(button_13)==HIGH){
                  break;
                }
                delay(100);
            }
            while((flag_RTC%7)==6){
                lcd.setCursor(0, 0);
                lcd.print("week adjust   ");
                lcd.setCursor(0, 1);
                lcd.print(i_week);
                if(digitalRead(button_12)==HIGH){
                  i_week=1+i_week;
                  if(i_week==8){
                        i_week=1;
                  }
                  
                }
                if(digitalRead(button_11)==HIGH){
                  i_week=i_week-1;
                  if(i_week==0){
                        i_week=7;
                  }
                }
                if(digitalRead(button_13)==HIGH){
                  break;
                }
                delay(100);
            }
      }
      if(digitalRead(button_11)==HIGH){
            rtc.adjustRtc(i_year,i_month,i_day,i_week,i_hour,i_minute,i_second);
            break;
      }
    }
}

//闹钟调节模式
void AC_adjust(){
    delay(200);
    int flag_AC=0;
    int S_value=0;
    while(1){
      if(digitalRead(button_12)==HIGH){
            delay(100);
            flag_AC=1+flag_AC;
      }
      if(flag_AC%4==0){
            lcd.setCursor(0, 0);
            lcd.print("AC 1 adjust   ");
            lcd.setCursor(0, 1);
            lcd.print("                ");
      }else if(flag_AC%4==1){
            lcd.setCursor(0, 0);
            lcd.print("AC 2 adjust   ");
            lcd.setCursor(0, 1);
            lcd.print("                ");
      }else if(flag_AC%4==2){
            lcd.setCursor(0, 0);
            lcd.print("AC 3 adjust   ");
            lcd.setCursor(0, 1);
            lcd.print("                ");
      }else{
            lcd.setCursor(0, 0);
            lcd.print("AC 4 adjust   ");
            lcd.setCursor(0, 1);
            lcd.print("                ");
      }
      if(digitalRead(button_13)==HIGH){
            delay(200);
            if(flag_AC%4==0){
                S_value=flag_AC%4;
                AC_adjust_value(S_value);
            }else if(flag_AC%4==1){
                S_value=flag_AC%4;
                AC_adjust_value(S_value);
            }else if(flag_AC%4==2){
                S_value=flag_AC%4;
                AC_adjust_value(S_value);
            }else{
                S_value=flag_AC%4;
                AC_adjust_value(S_value);
            }
      }
      if(digitalRead(button_11)==HIGH){
            delay(500);
            break;
      }
      
    }
}

void AC_adjust_value(int S_value){
    int value;
    value=S_value;
    while(1){
      lcd.setCursor(0, 1);
      lcd.print("hour");
      lcd.setCursor(4, 1);
      lcd.print(" ");
      if(a<10){
            lcd.setCursor(5, 1);
            lcd.print(a);
            lcd.setCursor(6, 1);
            lcd.print("            ");
      }else{
            lcd.setCursor(5, 1);
            lcd.print(a);
      }
      if(digitalRead(button_12)==HIGH){
            delay(200);
            a=1+a;
            if(a==24){
                a=0;
            }
      }if(digitalRead(button_11)==HIGH){
            delay(200);
            a=a-1;
            if(a==-1){
                a=23;
            }
      }
      if(digitalRead(button_13)==HIGH){
            delay(200);
            break;
      }
    }
    while(1){
      lcd.setCursor(0, 1);
      lcd.print("minute");
      lcd.setCursor(6, 1);
      lcd.print(" ");
      if(a<10){
            lcd.setCursor(7, 1);
            lcd.print(a);
            lcd.setCursor(8, 1);
            lcd.print("            ");
      }else{
            lcd.setCursor(7, 1);
            lcd.print(a);
      }
      if(digitalRead(button_12)==HIGH){
            a=1+a;
            if(a==60){
                a=0;
            }
      }
      if(digitalRead(button_11)==HIGH){
            a=a-1;
            if(a==-1){
                a=59;
            }
      }
      if(digitalRead(button_13)==HIGH){
            delay(200);
            break;
      }
    }
    while(1){
      lcd.setCursor(0, 1);
      lcd.print("vaild or not");
      lcd.setCursor(12, 1);
      lcd.print(" ");
      if(a==0){
            lcd.setCursor(13, 1);
            lcd.print("F");
      }else{
            lcd.setCursor(13, 1);
            lcd.print("T");
      }
      if(digitalRead(button_12)==HIGH){
            a=1-a;
            delay(100);
      }
      if(digitalRead(button_11)==HIGH){
            a=1-a;
            delay(100);
      }
      if(digitalRead(button_13)==HIGH){
            delay(100);
            break;
      }
    }
}

void AC_judge(){
    int judge_value;
    for(judge_value =0;judge_value<4;judge_value++){
      if(a==1){
            if((a==rtc.hour)&&(a==rtc.minute)&&(rtc.second==0)){
                sing_song();
            }
      }
    }
    for(judge_value =0;judge_value<4;judge_value++){
      if(b==1){
            if((b==rtc.hour)&&(b==rtc.minute)&&(rtc.second==0)){
                sing_song();
            }
      }
    }
    for(judge_value =0;judge_value<4;judge_value++){
      if(c==1){
            if((c==rtc.year)&&(c==rtc.month)&&(c==rtc.day)&&(c==rtc.hour)&&(c==rtc.minute)&&(rtc.second==0)){
                sing_song();
            }
      }
    }
}

void sing_song(){
    int sing_song_value=1;
    while(sing_song_value){
      for(int x=0;x<sizeof(tune)/sizeof(int);x++){//循环音符的次数
            ledcWriteTone(channel, tune);
            delay(400*duration);
            if(digitalRead(button_13)==HIGH){
                delay(200);
                sing_song_value=0;
                x=98;
            }
      }
      delay(1000);//等待5秒后,循环重新开始
      ledcWriteTone(channel, 0);
    }
}

注意:上传代码前需要加载对应的库文件
五、产品外观友商产品:图三详细的打印文档见《药盒3D打印》通过图三与图四比较,可以发现我们的结构特色:
[*]易拆解替换存储的药盒
[*]长方体结构,便携带(简约型、省空间)
[*]可添加格栏,有效分类

六、市场定位场景:      需要定时吃药的健忘的中老年人(目标客户)谁会去买单:      中老年人的子女      养老院、医疗机构、药店

hnyzcj 发表于 2021-1-26 07:22:14

欧克

乐乐1 发表于 2021-5-6 09:22:34

优秀6666666

DFSH_Cranberry 发表于 2021-5-26 18:58:49

乐乐1 发表于 2021-5-6 09:22
优秀6666666

慢慢来,你也可以的
页: [1]
查看完整版本: 基于esp32的智能药盒