5009浏览
查看: 5009|回复: 3

[项目] 基于esp32的智能药盒

[复制链接]
本帖最后由 DFSH_Cranberry 于 2021-1-25 16:14 编辑

中老年人智能药盒
目录
一、背景介绍

二、市场调研

三、产品功能

四、硬件代码

五、产品外观

六、市场定位

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

二、市场调研
我们调查发现:(常见中老年人疾病以及用药时间)
基于esp32的智能药盒图2
图一
根据图一,我们不难发现,不同的患者他们有着不同的用药时间。高血压患者是每天都需要吃药,而且每天用药的时间也是不一样的;像高血脂患者,他们用药时间一般是十天到半个月,属于较长周期性疗程用药。

三、产品功能
友商产品:时间显示,设置每天定时闹钟
我们的产品:
  • 一键记录当前时间(特色,中老年人智能记录时间模式)
  • 功能齐全(时间设置,定时闹钟,指定日期闹钟)
特色:对于每天需要吃药的中老年人,为了简化设置闹钟时间,我们采用一键式记录当前时间,避免因为操作困难给中老年人带来困扰,用户只需要在头次吃药的时候准时按键记录,后面每天都可以在同一时间进行智能提醒。
产品功能详细介绍见图二:
基于esp32的智能药盒图3

四、硬件代码
硬件
  • 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)
  • 锂电池充电板MicroUSB  X 1
https://www.dfrobot.com.cn/goods-2831.html)
  • 导线若干,电源按钮开关,以及常用工具
接线图:
基于esp32的智能药盒图4
代码:
  1. #include "GravityRtc.h"
  2. #include <Wire.h>
  3. #include "DFRobot_LCD.h"
  4. GravityRtc rtc;
  5. DFRobot_LCD lcd(16,2);  //16 characters and 2 lines of show
  6. int button_13 = D7;
  7. int button_12 = D3;
  8. int button_11 = D2;
  9. int a[4][3]={{0,0,0},{0,0,0},{0,0,0},{0,0,0}};  //remenber the time currently
  10. int b[4][3]={{0,0,0},{0,0,0},{0,0,0},{0,0,0}};  //remenber the time by habit
  11. int c[4][6]={{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
  12. #define NOTE_D0 -1
  13. #define NOTE_D1 294
  14. #define NOTE_D2 330
  15. #define NOTE_D3 350
  16. #define NOTE_D4 393
  17. #define NOTE_D5 441
  18. #define NOTE_D6 495
  19. #define NOTE_D7 556
  20. #define NOTE_DL1 147
  21. #define NOTE_DL2 165
  22. #define NOTE_DL3 175
  23. #define NOTE_DL4 196
  24. #define NOTE_DL5 221
  25. #define NOTE_DL6 248
  26. #define NOTE_DL7 278
  27. #define NOTE_DH1 589
  28. #define NOTE_DH2 661
  29. #define NOTE_DH3 700
  30. #define NOTE_DH4 786
  31. #define NOTE_DH5 882
  32. #define NOTE_DH6 990
  33. #define NOTE_DH7 112
  34. //以上部分是定义是把每个音符和频率值对应起来,其实不用打这么多,但是都打上了,后面可以随意编写D调的各种歌,我这里用NOTE_D+数字表示音符,NOTE_DH+数字表示上面有点的那种音符,NOTE_DL+数字表示下面有点的那种音符。这样后面写起来比较好识别。
  35. #define WHOLE 1
  36. #define HALF 0.5
  37. #define QUARTER 0.25
  38. #define EIGHTH 0.25
  39. #define SIXTEENTH 0.625
  40. //这部分是用英文对应了拍子,这样后面也比较好看
  41. int tune[] =
  42. {
  43.   NOTE_DH1,NOTE_D6,NOTE_D5,NOTE_D6,NOTE_D0,
  44.   NOTE_DH1,NOTE_D6,NOTE_D5,NOTE_DH1,NOTE_D6,NOTE_D0,NOTE_D6,
  45.   NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D6,NOTE_D0,NOTE_D6,
  46.   NOTE_DH1,NOTE_D6,NOTE_D5,NOTE_DH1,NOTE_D6,NOTE_D0,
  47.    
  48.   NOTE_D1,NOTE_D1,NOTE_D3,
  49.   NOTE_D1,NOTE_D1,NOTE_D3,NOTE_D0,
  50.   NOTE_D6,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D6,
  51.   NOTE_D5,NOTE_D1,NOTE_D3,NOTE_D0,
  52.   NOTE_DH1,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D6,
  53.   NOTE_D5,NOTE_D1,NOTE_D2,NOTE_D0,
  54.   NOTE_D7,NOTE_D7,NOTE_D5,NOTE_D3,
  55.   NOTE_D5,
  56.   NOTE_DH1,NOTE_D0,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D5,NOTE_D6,NOTE_D6,
  57.   NOTE_D0,NOTE_D5,NOTE_D1,NOTE_D3,NOTE_D0,
  58.   NOTE_DH1,NOTE_D0,NOTE_D6,NOTE_D6,NOTE_D5,NOTE_D5,NOTE_D6,NOTE_D6,
  59.   NOTE_D0,NOTE_D5,NOTE_D1,NOTE_D2,NOTE_D0,
  60.   NOTE_D3,NOTE_D3,NOTE_D1,NOTE_DL6,
  61.   NOTE_D1,
  62.   NOTE_D3,NOTE_D5,NOTE_D6,NOTE_D6,
  63.   NOTE_D3,NOTE_D5,NOTE_D6,NOTE_D6,
  64.   NOTE_DH1,NOTE_D0,NOTE_D7,NOTE_D5,
  65.   NOTE_D6,
  66. };//这部分就是整首曲子的音符部分,用了一个序列定义为tune,整数
  67. float duration[]=
  68. {
  69.   1,1,0.5,0.5,1,
  70.   0.5,0.5,0.5,0.5,1,0.5,0.5,
  71.   0.5,1,0.5,1,0.5,0.5,
  72.   0.5,0.5,0.5,0.5,1,1,
  73.    
  74.   1,1,1+1,
  75.   0.5,1,1+0.5,1,
  76.   1,1,0.5,0.5,1,
  77.   0.5,1,1+0.5,1,
  78.   0.5,0.5,0.5,0.5,1+1,
  79.   0.5,1,1+0.5,1,
  80.   1+1,0.5,0.5,1,
  81.   1+1+1+1,
  82.   0.5,0.5,0.5+0.25,0.25,0.5+0.25,0.25,0.5+0.25,0.25,
  83.   0.5,1,0.5,1,1,
  84.   0.5,0.5,0.5+0.25,0.25,0.5+0.25,0.25,0.5+0.25,0.25,
  85.   0.5,1,0.5,1,1,
  86.   1+1,0.5,0.5,1,
  87.   1+1+1+1,
  88.   0.5,1,0.5,1+1,
  89.   0.5,1,0.5,1+1,
  90.   1+1,0.5,0.5,1,
  91.   1+1+1+1
  92. };//这部分是整首曲子的接拍部分,也定义个序列duration,浮点(数组的个数和前面音符的个数是一样的,一一对应么)
  93. int freq = 2000;
  94. int channel = 0;
  95. int resolution = 8;
  96. void setup() {
  97.     pinMode(button_11,INPUT);
  98.     pinMode(button_12,INPUT);
  99.     pinMode(button_13,INPUT);
  100.     ledcSetup(channel, freq, resolution);
  101.     ledcAttachPin(D6, channel);
  102.     Serial.begin(9600);
  103.     rtc.setup();
  104.     //自动设置RTC时钟:通过获取电脑时间校准RTC模块,首先需要保证电脑时间正确
  105.     rtc.adjustRtc(F(__DATE__), F(__TIME__));
  106.     // initialize
  107.     lcd.init();
  108.     // Print a message to the LCD.
  109.    
  110.    
  111. }
  112. void loop() {
  113.     time_appearence();
  114.     if(digitalRead(button_13)==HIGH){
  115.         delay(200);
  116.         int flag_TandA=0;
  117.         while(1){    //选择时间调节模式还是闹钟调节模式
  118.             if(digitalRead(button_12)==HIGH){
  119.                 flag_TandA=1+flag_TandA;
  120.                 delay(200);
  121.             }
  122.             if(flag_TandA%4==0){
  123.                 lcd.setCursor(0, 0);
  124.                 lcd.print("time adjust     ");
  125.                 lcd.setCursor(0, 1);
  126.                 lcd.print("                ");
  127.             }else if(flag_TandA%4==1){
  128.                 lcd.setCursor(0, 0);
  129.                 lcd.print("alarm adjust    ");
  130.                 lcd.setCursor(0, 1);
  131.                 lcd.print("                ");
  132.             }else if(flag_TandA%4==2){
  133.                 lcd.setCursor(0, 0);
  134.                 lcd.print("set a date      ");  
  135.                 lcd.setCursor(0, 1);
  136.                 lcd.print("                ");
  137.             }else{
  138.                 lcd.setCursor(0, 0);
  139.                 lcd.print("close all alarms");
  140.                 lcd.setCursor(0, 1);
  141.                 lcd.print("                ");
  142.             }
  143.             if(digitalRead(button_13)==HIGH){ //make a sure
  144.                 delay(200);
  145.                 if(flag_TandA%4==0){
  146.                     RTC_adjust();  // time adjust
  147.                     break;
  148.                 }else if(flag_TandA%4==1){
  149.                     AC_adjust();  //set a currently AC time
  150.                     break;
  151.                 }else if(flag_TandA%4==2){
  152.                     fix_a_date();  //set a periodicity time
  153.                     break;
  154.                 }else{
  155.                     DAC_FAD();  //del all the alarm clock
  156.                     break;
  157.                 }
  158.             }
  159.             if(digitalRead(button_11)==HIGH){  //return
  160.                 delay(200);
  161.                 break;
  162.             }
  163.         }
  164.     }
  165.     delay(200);
  166.     if(digitalRead(button_12)==HIGH){
  167.         delay(200);
  168.         IRA();  //remenber a time automaticly
  169.     }
  170.     if(digitalRead(button_11)==HIGH){
  171.         delay(200);
  172.         DIRA();  //del all the automaticly time
  173.     }
  174.     AC_judge();  //jugle the time in order to make a alarm or not
  175. }
  176. //DEL all the alarm clock
  177. void DAC_FAD(){
  178.     lcd.setCursor(0, 1);
  179.     lcd.print("valid or not   ");
  180.     lcd.setCursor(12, 1);
  181.     lcd.print(" ");
  182.     int DAC_FAD_value;
  183.     DAC_FAD_value=0;
  184.     while(1){
  185.         if(DAC_FAD_value==0){
  186.             lcd.setCursor(13, 1);
  187.             lcd.print("F");
  188.         }else{
  189.             lcd.setCursor(13, 1);
  190.             lcd.print("T");
  191.         }
  192.         delay(200);
  193.         if(digitalRead(button_13)==HIGH){
  194.             if(DAC_FAD_value==1){
  195.                 for(int i=0;i<4;i++){
  196.                     a[i][2]=0;
  197.                 }
  198.                 for(int i=0;i<4;i++){
  199.                     c[i][5]=0;
  200.                 }
  201.                 delay(100);
  202.                 break;
  203.             }else{
  204.                 delay(100);
  205.                 break;
  206.             }
  207.         }
  208.         if(digitalRead(button_12)==HIGH){
  209.             DAC_FAD_value=1-DAC_FAD_value;
  210.             delay(100);
  211.         }
  212.         if(digitalRead(button_11)==HIGH){
  213.             DAC_FAD_value=1-DAC_FAD_value;
  214.             delay(100);
  215.         }
  216.     }
  217. }
  218. //set a periodicity time
  219. void fix_a_date(){
  220.     int flag_fix=0;
  221.     int F_value=0;
  222.     while(1){
  223.         if(digitalRead(button_12)==HIGH){
  224.             delay(100);
  225.             flag_fix=1+flag_fix;
  226.         }
  227.         if(flag_fix%4==0){
  228.             lcd.setCursor(0, 0);
  229.             lcd.print("set one date   ");
  230.             lcd.setCursor(0, 1);
  231.             lcd.print("                ");
  232.         }else if(flag_fix%4==1){
  233.             lcd.setCursor(0, 0);
  234.             lcd.print("set two date   ");
  235.             lcd.setCursor(0, 1);
  236.             lcd.print("                ");
  237.         }else if(flag_fix%4==2){
  238.             lcd.setCursor(0, 0);
  239.             lcd.print("set three date   ");
  240.             lcd.setCursor(0, 1);
  241.             lcd.print("                ");
  242.         }else{
  243.             lcd.setCursor(0, 0);
  244.             lcd.print("set four date   ");
  245.             lcd.setCursor(0, 1);
  246.             lcd.print("                ");
  247.         }
  248.         if(digitalRead(button_13)==HIGH){
  249.             delay(200);
  250.             if(flag_fix%4==0){
  251.                 F_value=flag_fix%4;
  252.                 Fix_adjust(F_value);
  253.             }else if(flag_fix%4==1){
  254.                 F_value=flag_fix%4;
  255.                 Fix_adjust(F_value);
  256.             }else if(flag_fix%4==2){
  257.                 F_value=flag_fix%4;
  258.                 Fix_adjust(F_value);
  259.             }else{
  260.                 F_value=flag_fix%4;
  261.                 Fix_adjust(F_value);
  262.             }
  263.         }
  264.         if(digitalRead(button_11)==HIGH){
  265.             delay(100);
  266.             break;
  267.         }
  268.     }
  269. }
  270. void Fix_adjust(int F_value){
  271.     int value;
  272.     value=F_value;
  273.     while(1){
  274.         lcd.setCursor(0, 1);
  275.         lcd.print("year");
  276.         lcd.setCursor(5, 1);
  277.         lcd.print(c[value][0]);
  278.         if(digitalRead(button_12)==HIGH){
  279.             delay(200);
  280.             c[value][0]=1+c[value][0];
  281.         }if(digitalRead(button_11)==HIGH){
  282.             delay(200);
  283.             c[value][0]=c[value][0]-1;
  284.         }
  285.         if(digitalRead(button_13)==HIGH){
  286.             delay(200);
  287.             break;
  288.         }
  289.     }
  290.     while(1){
  291.         lcd.setCursor(0, 1);
  292.         lcd.print("month");
  293.         lcd.setCursor(5, 1);
  294.         lcd.print(" ");
  295.         if(c[value][1]<10){
  296.             lcd.setCursor(6, 1);
  297.             lcd.print(c[value][1]);
  298.             lcd.setCursor(7, 1);
  299.             lcd.print("            ");
  300.         }else{
  301.             lcd.setCursor(6, 1);
  302.             lcd.print(c[value][1]);
  303.         }
  304.         if(digitalRead(button_12)==HIGH){
  305.             delay(200);
  306.             c[value][0]=1+c[value][0];
  307.             if(c[value][1]==13){
  308.                 c[value][1]=1;
  309.             }
  310.         }if(digitalRead(button_11)==HIGH){
  311.             delay(200);
  312.             c[value][1]=c[value][1]-1;
  313.             if(c[value][1]==0){
  314.                 c[value][0]=12;
  315.             }
  316.         }
  317.         if(digitalRead(button_13)==HIGH){
  318.             delay(200);
  319.             break;
  320.         }
  321.     }
  322.     while(1){
  323.         lcd.setCursor(0, 1);
  324.         lcd.print("day");
  325.         lcd.setCursor(3, 1);
  326.         lcd.print(" ");
  327.         if(c[value][2]<10){
  328.             lcd.setCursor(4, 1);
  329.             lcd.print(c[value][2]);
  330.             lcd.setCursor(5, 1);
  331.             lcd.print("            ");
  332.         }else{
  333.             lcd.setCursor(4, 1);
  334.             lcd.print(c[value][2]);
  335.         }
  336.         if(digitalRead(button_12)==HIGH){
  337.             delay(200);
  338.             c[value][2]=1+c[value][2];
  339.             if(c[value][2]==32){
  340.                 c[value][2]=1;
  341.             }
  342.         }if(digitalRead(button_11)==HIGH){
  343.             delay(200);
  344.             c[value][2]=c[value][2]-1;
  345.             if(c[value][2]==0){
  346.                 c[value][2]=31;
  347.             }
  348.         }
  349.         if(digitalRead(button_13)==HIGH){
  350.             delay(200);
  351.             break;
  352.         }
  353.     }
  354.     while(1){
  355.         lcd.setCursor(0, 1);
  356.         lcd.print("hour");
  357.         lcd.setCursor(4, 1);
  358.         lcd.print(" ");
  359.         if(c[value][3]<10){
  360.             lcd.setCursor(5, 1);
  361.             lcd.print(c[value][3]);
  362.             lcd.setCursor(6, 1);
  363.             lcd.print("            ");
  364.         }else{
  365.             lcd.setCursor(5, 1);
  366.             lcd.print(c[value][3]);
  367.         }
  368.         if(digitalRead(button_12)==HIGH){
  369.             delay(200);
  370.             c[value][3]=1+c[value][3];
  371.             if(c[value][3]==24){
  372.                 c[value][3]=0;
  373.             }
  374.         }if(digitalRead(button_11)==HIGH){
  375.             delay(200);
  376.             c[value][3]=c[value][3]-1;
  377.             if(c[value][3]==-1){
  378.                 c[value][3]=23;
  379.             }
  380.         }
  381.         if(digitalRead(button_13)==HIGH){
  382.             delay(200);
  383.             break;
  384.         }
  385.     }
  386.     while(1){
  387.         lcd.setCursor(0, 1);
  388.         lcd.print("minute");
  389.         lcd.setCursor(6, 1);
  390.         lcd.print(" ");
  391.         if(c[value][4]<10){
  392.             lcd.setCursor(7, 1);
  393.             lcd.print(c[value][4]);
  394.             lcd.setCursor(8, 1);
  395.             lcd.print("            ");
  396.         }else{
  397.             lcd.setCursor(7, 1);
  398.             lcd.print(c[value][4]);
  399.         }
  400.         if(digitalRead(button_12)==HIGH){
  401.             delay(200);
  402.             c[value][4]=1+c[value][4];
  403.             if(c[value][4]==60){
  404.                 c[value][4]=0;
  405.             }
  406.         }if(digitalRead(button_11)==HIGH){
  407.             delay(200);
  408.             c[value][4]=c[value][4]-1;
  409.             if(c[value][4]==-1){
  410.                 c[value][4]=59;
  411.             }
  412.         }
  413.         if(digitalRead(button_13)==HIGH){
  414.             delay(200);
  415.             break;
  416.         }
  417.     }
  418.     while(1){
  419.         lcd.setCursor(0, 1);
  420.         lcd.print("vaild or not");
  421.         lcd.setCursor(12, 1);
  422.         lcd.print(" ");
  423.         if(c[value][5]==0){
  424.             lcd.setCursor(13, 1);
  425.             lcd.print("F");
  426.         }else{
  427.             lcd.setCursor(13, 1);
  428.             lcd.print("T");
  429.         }
  430.         if(digitalRead(button_12)==HIGH){
  431.             c[value][5]=1-c[value][5];
  432.             delay(100);
  433.         }
  434.         if(digitalRead(button_11)==HIGH){
  435.             c[value][5]=1-c[value][5];
  436.             delay(100);
  437.         }
  438.         if(digitalRead(button_13)==HIGH){
  439.             delay(100);
  440.             break;
  441.         }
  442.     }
  443. }
  444. //remenber a time automaticly
  445. void IRA(){
  446.     int IRA_flag=0;
  447.     for(int i=0;i<4;i++){
  448.         if(b[i][2]==0){
  449.             b[i][0]=rtc.hour;
  450.             b[i][1]=rtc.minute;
  451.             lcd.setCursor(0, 0);
  452.             lcd.print("remenber time    ");
  453.             lcd.setCursor(0, 1);
  454.             lcd.print("valid or not     ");
  455.             while(1){
  456.                 if(digitalRead(button_13)==HIGH){
  457.                     delay(100);
  458.                     b[i][2]=1;
  459.                     IRA_flag=1;
  460.                     break;
  461.                 }else if(digitalRead(button_11)==HIGH){
  462.                     delay(100);
  463.                     break;
  464.                 }
  465.             }
  466.             break;
  467.         }
  468.     }
  469.     if(IRA_flag==0){
  470.         lcd.setCursor(0, 0);
  471.         lcd.print("space full        ");
  472.         lcd.setCursor(0, 1);
  473.         lcd.print("Please empty it    ");
  474.         delay(3000);
  475.     }
  476. }
  477. //del all the automaticly time
  478. void DIRA(){
  479.     lcd.setCursor(0, 0);
  480.     lcd.print("space empty      ");
  481.     lcd.setCursor(0, 1);
  482.     lcd.print("valid or not    ");
  483.     while(1){
  484.         if(digitalRead(button_13)==HIGH){
  485.             delay(200);
  486.             for(int i=0;i<4;i++){
  487.                 b[i][2]=0;
  488.             }
  489.             break;
  490.         }
  491.         if(digitalRead(button_11)==HIGH){
  492.             delay(200);
  493.             break;
  494.         }
  495.     }
  496. }
  497. //显示当前时间
  498. void time_appearence(){
  499.     rtc.read();
  500.     lcd.setCursor(0, 0);
  501.     lcd.print(rtc.year);
  502.     lcd.setCursor(4, 0);
  503.     lcd.print("/");
  504.     if(rtc.month<10){
  505.         lcd.setCursor(5, 0);
  506.         lcd.print("0");
  507.         lcd.setCursor(6, 0);
  508.         lcd.print(rtc.month);
  509.     }else{
  510.         lcd.setCursor(5, 0);
  511.         lcd.print(rtc.month);
  512.     }
  513.     lcd.setCursor(7, 0);
  514.     lcd.print("/");
  515.     if(rtc.day<10){
  516.         lcd.setCursor(8, 0);
  517.         lcd.print("0");
  518.         lcd.setCursor(9, 0);
  519.         lcd.print(rtc.day);
  520.     }else{
  521.         lcd.setCursor(8, 0);
  522.         lcd.print(rtc.day);
  523.     }
  524.     if(rtc.hour<10){
  525.         lcd.setCursor(0, 1);
  526.         lcd.print("0");
  527.         lcd.setCursor(1, 1);
  528.         lcd.print(rtc.hour);
  529.     }else{
  530.         lcd.setCursor(0, 1);
  531.         lcd.print(rtc.hour);
  532.     }
  533.     lcd.setCursor(2, 1);
  534.     lcd.print("-");
  535.     if(rtc.minute<10){
  536.         lcd.setCursor(3, 1);
  537.         lcd.print("0");
  538.         lcd.setCursor(4, 1);
  539.         lcd.print(rtc.minute);
  540.     }else{
  541.         lcd.setCursor(3, 1);
  542.         lcd.print(rtc.minute);
  543.     }
  544.     lcd.setCursor(5, 1);
  545.     lcd.print("-");
  546.     if(rtc.second<10){
  547.         lcd.setCursor(6, 1);
  548.         lcd.print("0");
  549.         lcd.setCursor(7, 1);
  550.         lcd.print(rtc.second);
  551.     }else{
  552.         lcd.setCursor(6, 1);
  553.         lcd.print(rtc.second);
  554.     }
  555.     lcd.setCursor(9, 1);
  556.     lcd.print("week-");
  557.     lcd.setCursor(14, 1);
  558.     lcd.print(rtc.week);
  559.     lcd.setCursor(10, 0);
  560.     lcd.print("      ");
  561.     lcd.setCursor(8, 1);
  562.     lcd.print(" ");
  563.     lcd.setCursor(15, 1);
  564.     lcd.print(" ");
  565.     delay(200);
  566. }
  567. //手动设置RTC时钟
  568. void RTC_adjust(){
  569.     int flag_RTC=0;
  570.     int i_year=rtc.year;
  571.     int i_month=rtc.month;
  572.     int i_day=rtc.day;
  573.     int i_hour=rtc.hour;
  574.     int i_minute=rtc.minute;
  575.     int i_second=rtc.second;
  576.     int i_week=rtc.week;
  577.     while(1){
  578.         if(digitalRead(button_12)==HIGH){
  579.             delay(100);
  580.             flag_RTC=1+flag_RTC;
  581.         }
  582.         if((flag_RTC%7)==0){
  583.             lcd.setCursor(0, 0);
  584.             lcd.print("year adjust     ");
  585.             lcd.setCursor(0, 1);
  586.             lcd.print("                ");
  587.         }else if((flag_RTC%7)==1){
  588.             lcd.setCursor(0, 0);
  589.             lcd.print("month adjust     ");
  590.             lcd.setCursor(0, 1);
  591.             lcd.print("                ");
  592.         }else if((flag_RTC%7)==2){
  593.             lcd.setCursor(0, 0);
  594.             lcd.print("day adjust     ");
  595.             lcd.setCursor(0, 1);
  596.             lcd.print("                ");
  597.         }else if((flag_RTC%7)==3){
  598.             lcd.setCursor(0, 0);
  599.             lcd.print("hour adjust     ");
  600.             lcd.setCursor(0, 1);
  601.             lcd.print("                ");
  602.         }else if((flag_RTC%7)==4){
  603.             lcd.setCursor(0, 0);
  604.             lcd.print("minute adjust     ");
  605.             lcd.setCursor(0, 1);
  606.             lcd.print("                ");
  607.         }else if((flag_RTC%7)==5){
  608.             lcd.setCursor(0, 0);
  609.             lcd.print("second adjust     ");
  610.             lcd.setCursor(0, 1);
  611.             lcd.print("                ");
  612.         }else{
  613.             lcd.setCursor(0, 0);
  614.             lcd.print("week adjust     ");
  615.             lcd.setCursor(0, 1);
  616.             lcd.print("                ");
  617.         }
  618.         if(digitalRead(button_13)==HIGH){
  619.             delay(200);
  620.             while((flag_RTC%7)==0){
  621.                 lcd.setCursor(0, 0);
  622.                 lcd.print("year adjust     ");
  623.                 lcd.setCursor(0, 1);
  624.                 lcd.print(i_year);
  625.                 if(digitalRead(button_12)==HIGH){
  626.                     i_year=1+i_year;
  627.                 }
  628.                 if(digitalRead(button_11)==HIGH){
  629.                     i_year=i_year-1;
  630.                 }
  631.                 if(digitalRead(button_13)==HIGH){
  632.                     break;
  633.                 }
  634.                 delay(100);
  635.             }
  636.             while((flag_RTC%7)==1){
  637.                 lcd.setCursor(0, 0);
  638.                 lcd.print("month adjust     ");
  639.                 if(i_month<10){
  640.                     lcd.setCursor(0, 1);
  641.                     lcd.print(i_month);
  642.                     lcd.setCursor(1, 1);
  643.                     lcd.print("               ");
  644.                 }else{
  645.                     lcd.setCursor(0, 1);
  646.                     lcd.print(i_month);
  647.                 }
  648.                
  649.                 if(digitalRead(button_12)==HIGH){
  650.                     i_month=1+i_month;
  651.                     if(i_month==13){
  652.                         i_month=1;
  653.                     }
  654.                     
  655.                 }
  656.                 if(digitalRead(button_11)==HIGH){
  657.                     i_month=i_month-1;
  658.                     if(i_month==0){
  659.                         i_month=12;
  660.                     }
  661.                 }
  662.                 if(digitalRead(button_13)==HIGH){
  663.                     break;
  664.                 }
  665.                 delay(100);
  666.             }
  667.             while((flag_RTC%7)==2){
  668.                 lcd.setCursor(0, 0);
  669.                 lcd.print("day adjust     ");
  670.                 if(i_day<10){
  671.                     lcd.setCursor(0, 1);
  672.                     lcd.print(i_day);
  673.                     lcd.setCursor(1, 1);
  674.                     lcd.print("               ");
  675.                 }else{
  676.                     lcd.setCursor(0, 1);
  677.                     lcd.print(i_day);
  678.                 }
  679.                 if(digitalRead(button_12)==HIGH){
  680.                     i_day=1+i_day;
  681.                     if(i_day==32){
  682.                         i_day=1;
  683.                     }
  684.                 }
  685.                 if(digitalRead(button_11)==HIGH){
  686.                     i_day=i_day-1;
  687.                     if(i_day==0){
  688.                         i_day=31;
  689.                     }
  690.                 }
  691.                 if(digitalRead(button_13)==HIGH){
  692.                     break;
  693.                 }
  694.                 delay(100);
  695.             }
  696.             while((flag_RTC%7)==3){
  697.                 lcd.setCursor(0, 0);
  698.                 lcd.print("hour adjust     ");
  699.                 if(i_hour<10){
  700.                     lcd.setCursor(0, 1);
  701.                     lcd.print(i_hour);
  702.                     lcd.setCursor(1, 1);
  703.                     lcd.print("               ");
  704.                 }else{
  705.                     lcd.setCursor(0, 1);
  706.                     lcd.print(i_hour);
  707.                 }
  708.                 if(digitalRead(button_12)==HIGH){
  709.                     i_hour=1+i_hour;
  710.                     if(i_hour==24){
  711.                         i_hour=0;
  712.                     }
  713.                 }
  714.                 if(digitalRead(button_11)==HIGH){
  715.                     i_hour=i_hour-1;
  716.                     if(i_hour==-1){
  717.                         i_hour=23;
  718.                     }
  719.                 }
  720.                 if(digitalRead(button_13)==HIGH){
  721.                     break;
  722.                 }
  723.                 delay(100);
  724.             }
  725.             while((flag_RTC%7)==4){
  726.                 lcd.setCursor(0, 0);
  727.                 lcd.print("minute adjust     ");
  728.                 if(i_minute<10){
  729.                     lcd.setCursor(0, 1);
  730.                     lcd.print(i_minute);
  731.                     lcd.setCursor(1, 1);
  732.                     lcd.print("               ");
  733.                 }else{
  734.                     lcd.setCursor(0, 1);
  735.                     lcd.print(i_minute);
  736.                 }
  737.                 if(digitalRead(button_12)==HIGH){
  738.                     i_minute=1+i_minute;
  739.                     if(i_minute==60){
  740.                         i_minute=0;
  741.                     }
  742.                     
  743.                 }
  744.                 if(digitalRead(button_11)==HIGH){
  745.                     i_minute=i_minute-1;
  746.                     if(i_minute==-1){
  747.                         i_minute=59;
  748.                     }
  749.                 }
  750.                 if(digitalRead(button_13)==HIGH){
  751.                     break;
  752.                 }
  753.                 delay(100);
  754.             }
  755.             while((flag_RTC%7)==5){
  756.                 lcd.setCursor(0, 0);
  757.                 lcd.print("second adjust     ");
  758.                 if(i_second<10){
  759.                     lcd.setCursor(0, 1);
  760.                     lcd.print(i_second);
  761.                     lcd.setCursor(1, 1);
  762.                     lcd.print("               ");
  763.                 }else{
  764.                     lcd.setCursor(0, 1);
  765.                     lcd.print(i_second);
  766.                 }
  767.                 if(digitalRead(button_12)==HIGH){
  768.                     i_second=1+i_second;
  769.                     if(i_second==60){
  770.                         i_second=0;
  771.                     }
  772.                     
  773.                 }
  774.                 if(digitalRead(button_11)==HIGH){
  775.                     i_second=i_second-1;
  776.                     if(i_second==-1){
  777.                         i_second=59;
  778.                     }
  779.                 }
  780.                 if(digitalRead(button_13)==HIGH){
  781.                     break;
  782.                 }
  783.                 delay(100);
  784.             }
  785.             while((flag_RTC%7)==6){
  786.                 lcd.setCursor(0, 0);
  787.                 lcd.print("week adjust     ");
  788.                 lcd.setCursor(0, 1);
  789.                 lcd.print(i_week);
  790.                 if(digitalRead(button_12)==HIGH){
  791.                     i_week=1+i_week;
  792.                     if(i_week==8){
  793.                         i_week=1;
  794.                     }
  795.                     
  796.                 }
  797.                 if(digitalRead(button_11)==HIGH){
  798.                     i_week=i_week-1;
  799.                     if(i_week==0){
  800.                         i_week=7;
  801.                     }
  802.                 }
  803.                 if(digitalRead(button_13)==HIGH){
  804.                     break;
  805.                 }
  806.                 delay(100);
  807.             }
  808.         }
  809.         if(digitalRead(button_11)==HIGH){
  810.             rtc.adjustRtc(i_year,i_month,i_day,i_week,i_hour,i_minute,i_second);
  811.             break;
  812.         }
  813.     }
  814. }
  815. //闹钟调节模式
  816. void AC_adjust(){
  817.     delay(200);
  818.     int flag_AC=0;
  819.     int S_value=0;
  820.     while(1){
  821.         if(digitalRead(button_12)==HIGH){
  822.             delay(100);
  823.             flag_AC=1+flag_AC;
  824.         }
  825.         if(flag_AC%4==0){
  826.             lcd.setCursor(0, 0);
  827.             lcd.print("AC 1 adjust     ");
  828.             lcd.setCursor(0, 1);
  829.             lcd.print("                ");
  830.         }else if(flag_AC%4==1){
  831.             lcd.setCursor(0, 0);
  832.             lcd.print("AC 2 adjust     ");
  833.             lcd.setCursor(0, 1);
  834.             lcd.print("                ");
  835.         }else if(flag_AC%4==2){
  836.             lcd.setCursor(0, 0);
  837.             lcd.print("AC 3 adjust     ");
  838.             lcd.setCursor(0, 1);
  839.             lcd.print("                ");
  840.         }else{
  841.             lcd.setCursor(0, 0);
  842.             lcd.print("AC 4 adjust     ");
  843.             lcd.setCursor(0, 1);
  844.             lcd.print("                ");
  845.         }
  846.         if(digitalRead(button_13)==HIGH){
  847.             delay(200);
  848.             if(flag_AC%4==0){
  849.                 S_value=flag_AC%4;
  850.                 AC_adjust_value(S_value);
  851.             }else if(flag_AC%4==1){
  852.                 S_value=flag_AC%4;
  853.                 AC_adjust_value(S_value);
  854.             }else if(flag_AC%4==2){
  855.                 S_value=flag_AC%4;
  856.                 AC_adjust_value(S_value);
  857.             }else{
  858.                 S_value=flag_AC%4;
  859.                 AC_adjust_value(S_value);
  860.             }
  861.         }
  862.         if(digitalRead(button_11)==HIGH){
  863.             delay(500);
  864.             break;
  865.         }
  866.         
  867.     }
  868. }
  869. void AC_adjust_value(int S_value){
  870.     int value;
  871.     value=S_value;
  872.     while(1){
  873.         lcd.setCursor(0, 1);
  874.         lcd.print("hour");
  875.         lcd.setCursor(4, 1);
  876.         lcd.print(" ");
  877.         if(a[value][0]<10){
  878.             lcd.setCursor(5, 1);
  879.             lcd.print(a[value][0]);
  880.             lcd.setCursor(6, 1);
  881.             lcd.print("            ");
  882.         }else{
  883.             lcd.setCursor(5, 1);
  884.             lcd.print(a[value][0]);
  885.         }
  886.         if(digitalRead(button_12)==HIGH){
  887.             delay(200);
  888.             a[value][0]=1+a[value][0];
  889.             if(a[value][0]==24){
  890.                 a[value][0]=0;
  891.             }
  892.         }if(digitalRead(button_11)==HIGH){
  893.             delay(200);
  894.             a[value][0]=a[value][0]-1;
  895.             if(a[value][0]==-1){
  896.                 a[value][0]=23;
  897.             }
  898.         }
  899.         if(digitalRead(button_13)==HIGH){
  900.             delay(200);
  901.             break;
  902.         }
  903.     }
  904.     while(1){
  905.         lcd.setCursor(0, 1);
  906.         lcd.print("minute");
  907.         lcd.setCursor(6, 1);
  908.         lcd.print(" ");
  909.         if(a[value][1]<10){
  910.             lcd.setCursor(7, 1);
  911.             lcd.print(a[value][1]);
  912.             lcd.setCursor(8, 1);
  913.             lcd.print("            ");
  914.         }else{
  915.             lcd.setCursor(7, 1);
  916.             lcd.print(a[value][1]);
  917.         }
  918.         if(digitalRead(button_12)==HIGH){
  919.             a[value][1]=1+a[value][1];
  920.             if(a[value][1]==60){
  921.                 a[value][1]=0;
  922.             }
  923.         }
  924.         if(digitalRead(button_11)==HIGH){
  925.             a[value][1]=a[value][1]-1;
  926.             if(a[value][1]==-1){
  927.                 a[value][1]=59;
  928.             }
  929.         }
  930.         if(digitalRead(button_13)==HIGH){
  931.             delay(200);
  932.             break;
  933.         }
  934.     }
  935.     while(1){
  936.         lcd.setCursor(0, 1);
  937.         lcd.print("vaild or not");
  938.         lcd.setCursor(12, 1);
  939.         lcd.print(" ");
  940.         if(a[value][2]==0){
  941.             lcd.setCursor(13, 1);
  942.             lcd.print("F");
  943.         }else{
  944.             lcd.setCursor(13, 1);
  945.             lcd.print("T");
  946.         }
  947.         if(digitalRead(button_12)==HIGH){
  948.             a[value][2]=1-a[value][2];
  949.             delay(100);
  950.         }
  951.         if(digitalRead(button_11)==HIGH){
  952.             a[value][2]=1-a[value][2];
  953.             delay(100);
  954.         }
  955.         if(digitalRead(button_13)==HIGH){
  956.             delay(100);
  957.             break;
  958.         }
  959.     }
  960. }
  961. void AC_judge(){
  962.     int judge_value;
  963.     for(judge_value =0;judge_value<4;judge_value++){
  964.         if(a[judge_value][2]==1){
  965.             if((a[judge_value][0]==rtc.hour)&&(a[judge_value][1]==rtc.minute)&&(rtc.second==0)){
  966.                 sing_song();
  967.             }
  968.         }
  969.     }
  970.     for(judge_value =0;judge_value<4;judge_value++){
  971.         if(b[judge_value][2]==1){
  972.             if((b[judge_value][0]==rtc.hour)&&(b[judge_value][1]==rtc.minute)&&(rtc.second==0)){
  973.                 sing_song();
  974.             }
  975.         }
  976.     }
  977.     for(judge_value =0;judge_value<4;judge_value++){
  978.         if(c[judge_value][5]==1){
  979.             if((c[judge_value][0]==rtc.year)&&(c[judge_value][1]==rtc.month)&&(c[judge_value][2]==rtc.day)&&(c[judge_value][3]==rtc.hour)&&(c[judge_value][4]==rtc.minute)&&(rtc.second==0)){
  980.                 sing_song();
  981.             }
  982.         }
  983.     }
  984. }
  985. void sing_song(){
  986.     int sing_song_value=1;
  987.     while(sing_song_value){
  988.         for(int x=0;x<sizeof(tune)/sizeof(int);x++){  //循环音符的次数
  989.             ledcWriteTone(channel, tune[x]);
  990.             delay(400*duration[x]);
  991.             if(digitalRead(button_13)==HIGH){
  992.                 delay(200);
  993.                 sing_song_value=0;
  994.                 x=98;
  995.             }
  996.         }
  997.         delay(1000);//等待5秒后,循环重新开始
  998.         ledcWriteTone(channel, 0);
  999.     }
  1000. }
复制代码

注意:上传代码前需要加载对应的库文件

五、产品外观
友商产品:
基于esp32的智能药盒图5
图三
基于esp32的智能药盒图6基于esp32的智能药盒图7
详细的打印文档见《药盒3D打印
通过图三与图四比较,可以发现我们的结构特色:
  • 易拆解替换存储的药盒
  • 长方体结构,便携带(简约型、省空间)
  • 可添加格栏,有效分类

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

hnyzcj  版主

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

欧克
回复

使用道具 举报

乐乐1  见习技师

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

优秀6666666
回复

使用道具 举报

DFSH_Cranberry  中级技师
 楼主|

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


慢慢来,你也可以的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail