找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2346|回復(fù): 1
收起左側(cè)

基于STM32單片機(jī)的智能藥盒(老人吃藥提醒器)程序原理圖PCB文件

[復(fù)制鏈接]
ID:1072951 發(fā)表于 2023-4-20 13:52 | 顯示全部樓層 |閱讀模式
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png 51hei.png 51hei.png
    1、修復(fù)ST V2.1底板時溫濕度不規(guī)則報0的問題[bug:45027];
    1、支持GoKit2.2硬件(增加RGB燈使能引腳A0)

    1、采用uVision V4.70.0.0軟件
    2、修改了軟件結(jié)構(gòu),封裝了串口協(xié)議部分,進(jìn)一步提升擴(kuò)展性;
    3、解決了app上顯示溫度不準(zhǔn)確的問題;
    4、修改了入網(wǎng)配置方法;
        長按key1恢復(fù)默認(rèn)配置,短按key2進(jìn)入Soft AP模式,RGB燈紅色,長按key2進(jìn)入AirLink模式,RGB燈綠色;
    5、關(guān)掉了進(jìn)入配置模式時電機(jī)轉(zhuǎn)動操作;
    6、解決了APP中自定義燈顏色切換不準(zhǔn)確的問題;
    7、完善了協(xié)議指令01、03、04、05指令;
    8、解決了上電時RGB高亮一段時間的問題;
    9、需配合最新版GAgent固件

單片機(jī)源程序如下:
  1. #include "gokit.h"

  2. int a=0;
  3. int b=0;
  4. u8 wtadd=0;
  5. int h;
  6. int q;
  7. int g;

  8. /*Global Variable*/
  9. uint32_t ReportTimeCount = 0;
  10. uint8_t gaterSensorFlag = 0;
  11. uint8_t Set_LedStatus = 0;
  12. uint8_t NetConfigureFlag = 0;
  13. uint8_t curTem = 0, curHum = 0;
  14. uint8_t lastTem = 0,lastHum = 0;

  15. extern RingBuffer u_ring_buff;
  16. uint8_t p0Flag = 0;

  17. WirteTypeDef_t        WirteTypeDef;
  18. ReadTypeDef_t        ReadTypeDef;

  19. extern uint8_t benday;  //???
  20. extern uint8_t benDhour;//?
  21. extern uint8_t benminute;//?
  22. extern uint8_t bensecond;//?

  23. extern uint8_t getTime[9];
  24. extern uint8_t XIEDate;
  25. extern uint8_t XIEHour;
  26. extern uint8_t XIEMin;
  27. extern uint8_t XIEsecond;
  28. extern unsigned char time[7],Tmp[20],temp,Flag8563_2402;


  29. extern uint8_t Month;   
  30. extern uint8_t Date;
  31. extern uint8_t Hour;
  32. extern uint8_t Min;
  33. extern uint8_t second;


  34. uint8_t  CENCHU_A;
  35. uint8_t  CENCHU_B;
  36. uint8_t  CENCHU_C;
  37. uint8_t  CENCHU_D;


  38. uint8_t  ZAOSHI;
  39. uint8_t  ZAOFEN;
  40. uint8_t  ZHONGSHI;
  41. uint8_t  ZHONGFEN;
  42. uint8_t  WANSHI;
  43. uint8_t  WANFEN;

  44. uint16_t cx=0, cxx=0,cxxx=0;


  45. /**
  46.   * @brief  Main program.
  47.   * @param  None
  48.   * @retval None
  49.   */
  50. int main(void)
  51. {
  52.         uint8_t p0_control_buf[MAX_P0_LEN],frist;
  53.         uint16_t cxx=0,cxxx=0;
  54. // uint8_t frist[2] ;
  55.         SystemInit();        
  56.         HW_Init();
  57.         Printf_SystemRccClocks();
  58.         SW_Init();
  59.         
  60. //         Time_Disposal ();
  61. //PCF8563_set(0x10,0x07,XIEDate,XIEHour,XIEMin,XIEsecond,0x05);//,年、月、日、時、分、秒、星期。BCD碼表示
  62.   Flag8563_2402=0;


  63.         
  64.         IIC_ReadBuf(0,Tmp,16);
  65.                
  66.          Flag8563_2402=111;
  67.         IIC_ReadBuf(2,&frist,1);// 判斷是否第一次啟動8563
  68.         if((frist&0x20)!=0)
  69.      {
  70.                  PCF8563_set(0x16,0x07,0x14,XIEHour,XIEMin,XIEsecond,0x05);
  71.                  }
  72.         
  73.         while(1)
  74.         {
  75.                 if(++cxxx==60000)
  76.                         {
  77.                                 if(++cx>>3)
  78.                                 {
  79.                                 Pro_UART_SendBuf(getTime,9,1);
  80.         Flag8563_2402=WR8563;                                
  81.                                 PCF8563_read(time);
  82.                           Ben_AckHandle();
  83.                                 printf("\r\nEEPROM: %d %d %d %d %d %d %d %d %d %d %d %d %d   \r\n",Tmp[0],Tmp[1],Tmp[2],Tmp[3],Tmp[4],Tmp[5],Tmp[6],Tmp[7],Tmp[8],Tmp[9],Tmp[10],Tmp[11],Tmp[12]);               
  84.                                 printf("\r\nTime: %s %d  %d :%d:%d\r\n","下位機(jī)--時間",benday,benDhour,benminute,bensecond);                        
  85.                                 printf("\r\nTime: %s %d-%d %d:%d:%d \r\n","云端----時間",Month,Date,Hour,Min,second);

  86.                         }
  87.                                 
  88.     if(wtadd==0)
  89.                 {
  90.          if((GPIO_ReadInputDataBit(GPIO_WT588BY_PORT,GPIO_Pin_1)))
  91.        {
  92.         Send_oneline( 0 );
  93.                                  ++wtadd;
  94.           }
  95.            }                        


  96.                         
  97.                         
  98.                         
  99.                         

  100.                         
  101.                 if((Tmp[5] == benDhour && Tmp[6] == benminute&&(bensecond<5))  || (Tmp[7] == benDhour && Tmp[8] == benminute&&(bensecond<5)) || (Tmp[9] == benDhour && Tmp[10] == benminute&&(bensecond<5)))
  102.             {
  103.                                 if(benDhour==0)////bug        
  104.                                 {
  105.                                         if(benminute==0)
  106.                                         {}
  107.                                                 else
  108.                         luoyao(Tmp[1],Tmp[2],Tmp[3],Tmp[4]);
  109.             }
  110.                                 
  111.                                 if(benDhour!=0)
  112.                                 {        
  113.                                                 if(benminute!=0)
  114.                                         luoyao(Tmp[1],Tmp[2],Tmp[3],Tmp[4]);
  115.                                        
  116.                 }
  117.         }
  118. }
  119.                
  120.                
  121.                 if(cxx==1)
  122.                 {
  123.                         cxx=0;
  124.                         printf("開始寫入數(shù)據(jù)");
  125.                         Flag8563_2402=WR2402;
  126.                         Tmp[1]= CENCHU_A;Tmp[2]=CENCHU_B;Tmp[3]=CENCHU_C;Tmp[4]=CENCHU_D;
  127.                   Tmp[5]= ZAOSHI;Tmp[6]=ZAOFEN;Tmp[7]=ZHONGSHI;Tmp[8]=ZHONGFEN;
  128.                   Tmp[9]= WANSHI;Tmp[10]=WANFEN;Tmp[11]=CENCHU_C;Tmp[12]=CENCHU_D;
  129.                   IIC_WriteBuf(0,Tmp,16);
  130.                   IIC_ReadBuf(0,Tmp,16);
  131.         printf("\r\nEEPROM: %d %d %d %d %d %d %d %d %d %d %d %d %d \r\n",Tmp[0],Tmp[1],Tmp[2],Tmp[3],Tmp[4],Tmp[5],Tmp[6],Tmp[7],Tmp[8],Tmp[9],Tmp[10],Tmp[11],Tmp[12]);               
  132.                 Flag8563_2402=WR8563;
  133.                 }
  134.                
  135.                 KEY_Handle();               
  136.                 GizWits_MessageHandle(p0_control_buf, sizeof(WirteTypeDef_t));
  137.                 if(p0Flag == 1)
  138.                 {
  139.                         memcpy((uint8_t *)&WirteTypeDef, p0_control_buf, sizeof(WirteTypeDef_t));
  140.                         GizWits_ControlDeviceHandle();
  141.                         GizWits_DevStatusUpgrade((uint8_t *)&ReadTypeDef, 10*60*1000, 1);
  142.                         p0Flag =0;
  143.                 }
  144.         if(gaterSensorFlag != 0)
  145.         {
  146.             GizWits_GatherSensorData();
  147.             gaterSensorFlag = 0;
  148.         }
  149.         GizWits_DevStatusUpgrade((uint8_t *)&ReadTypeDef, 10*60*1000, 0);
  150.         }
  151. }
  152. /** @addtogroup GizWits_HW_Init
  153.   * @{
  154.   */
  155. void HW_Init(void)
  156. {
  157.         Delay_Init(72);        
  158.         UARTx_Init();
  159. //   RGB_KEY_GPIO_Init();
  160.         RGB_LED_Init();        
  161.         LED_GPIO_Init();        
  162.         KEY_GPIO_Init();
  163.         TIM3_Int_Init(7199,9);   //ms interrupt        
  164. //        Motor_Init();        
  165.         DHT11_Init();        
  166.         IR_Init();
  167.         EXTIX_Init();
  168. }
  169. /** @addtogroup GizWits_SW_Init
  170.   * @{
  171.   */
  172. void SW_Init()
  173. {
  174.         ReadTypeDef.Alert = 0;
  175.         ReadTypeDef.LED_Cmd = 0;
  176.         ReadTypeDef.Infrared = 0;
  177.         
  178.         ReadTypeDef.SetA_YAO=0;
  179.   ReadTypeDef.SetB_YAO=0;  
  180.   ReadTypeDef.SetC_YAO=0 ;
  181.   ReadTypeDef.SetD_YAO=0;
  182.         
  183.         ReadTypeDef.ZAO_SHI=0;
  184.   ReadTypeDef.ZAO_FEN=0;  
  185.   ReadTypeDef.SetZHONG_SHI=0 ;
  186.   ReadTypeDef.SetZHONG_FEN=0;
  187.   ReadTypeDef.SetWAN_SHI=0;  
  188.   ReadTypeDef.SetWAN_FEN=0;
  189.         
  190.         ReadTypeDef.Temperature = 0;
  191.         ReadTypeDef.Humidity = 0;
  192.         ReadTypeDef.Alert = 0;
  193.         ReadTypeDef.Fault = 0;
  194.         GizWits_init(sizeof(ReadTypeDef_t));
  195.         printf("Gokit Init Ok ...\r\n");
  196. }
  197. /** @addtogroup Printf_SystemRccClocks
  198.   * @{
  199.   */
  200. void Printf_SystemRccClocks(void)
  201. {
  202.         uint8_t SYSCLKSource;

  203.         RCC_ClocksTypeDef  SystemRCC_Clocks;
  204.         printf("System start...\r\n");
  205.         SYSCLKSource = RCC_GetSYSCLKSource();
  206.         if(SYSCLKSource==0x04)
  207.                 printf("SYSCLKSource is HSE\r\n");
  208.         else if(SYSCLKSource==0x00)
  209.                 printf("SYSCLKSource is HSI\r\n");
  210.         else if(SYSCLKSource==0x08)
  211.                 printf("SYSCLKSource is PL!\r\n");
  212.         
  213.         RCC_GetClocksFreq(&SystemRCC_Clocks);
  214.         printf("SYS clock =%dMHz \r\n",(uint32_t)SystemRCC_Clocks.SYSCLK_Frequency/1000000);
  215.         printf("HCLK clock =%dMHz \r\n",(uint32_t)SystemRCC_Clocks.HCLK_Frequency/1000000);
  216.         printf("PCLK1 clock =%dMHz \r\n",(uint32_t)SystemRCC_Clocks.PCLK1_Frequency/1000000);
  217.         printf("PCLK2_clock =%dMHz \r\n",(uint32_t)SystemRCC_Clocks.PCLK2_Frequency/1000000);        
  218.         printf("SADCCLK_Frequencyclock =%dMHz \r\n",(uint32_t)SystemRCC_Clocks.ADCCLK_Frequency/1000000);

  219. }

  220. /*******************************************************************************
  221. * Function Name  : GizWits_ControlDeviceHandle
  222. * Description    : Analy P0 Package
  223. * Input          : None
  224. * Output         : None
  225. * Return         : Bit , Attr_Flags
  226. * Attention                 :
  227. *******************************************************************************/
  228. void GizWits_ControlDeviceHandle()
  229. {
  230.         if( ((WirteTypeDef.Attr_Flags>>8) & 1) == 1)
  231.          {
  232.                 if(Set_LedStatus != 1)
  233.                 {
  234.                         if(WirteTypeDef.LED_Cmd == LED_OnOff)
  235.                         {
  236.                                 printf("\r\nEEPROM: %d %d %d %d %d %d %d %d %d %d %d %d %d \r\n",Tmp[0],Tmp[1],Tmp[2],Tmp[3],Tmp[4],Tmp[5],Tmp[6],Tmp[7],Tmp[8],Tmp[9],Tmp[10],Tmp[11],Tmp[12]);               
  237.                                 printf("\r\nTime: %s %d  %d :%d:%d\r\n","下位機(jī)--時間",benday,benDhour,benminute,bensecond);                        
  238.                                 printf("\r\nTime: %s %d-%d %d:%d:%d \r\n","云端----時間",Month,Date,Hour,Min,second);
  239.                                 
  240.                                 LED_RGB_Control(0,0,0);
  241.                                 ReadTypeDef.LED_Cmd = LED_OnOff;
  242.                                 printf("SetLED_Off \r\n");
  243.                         }
  244.                         if(WirteTypeDef.LED_Cmd == LED_OnOn)
  245.                         {
  246.                                 ReadTypeDef.LED_Cmd = LED_OnOn;
  247.                                 
  248.                                 Flag8563_2402=WR8563;
  249.                                  cxx=1;
  250.                                 Time_Disposal();
  251.                           PCF8563_set(0x10,0x07,XIEDate,XIEHour,XIEMin,XIEsecond,0x05);//設(shè)置時間,年、月、日、時、分、秒、星期。BCD碼表示
  252.                                 PCF8563_read(time);
  253.                                 Ben_AckHandle();
  254.                                         if(cxx==1)
  255.                           {
  256.                                    cxx=0;
  257.                                   printf("開始寫入數(shù)據(jù)");
  258.                                   Flag8563_2402=0;
  259.                                  Tmp[1]= CENCHU_A;Tmp[2]=CENCHU_B;Tmp[3]=CENCHU_C;Tmp[4]=CENCHU_D;
  260.                             Tmp[5]= ZAOSHI;Tmp[6]=ZAOFEN;Tmp[7]=ZHONGSHI;Tmp[8]=ZHONGFEN;
  261.                              Tmp[9]= WANSHI;Tmp[10]=WANFEN;Tmp[11]=CENCHU_C;Tmp[12]=CENCHU_D;
  262.                                IIC_WriteBuf(0,Tmp,16);
  263.                                 IIC_ReadBuf(0,Tmp,16);
  264.               printf("\r\nEEPROM: %d %d %d %d %d %d %d %d %d %d %d %d %d  \r\n",Tmp[0],Tmp[1],Tmp[2],Tmp[3],Tmp[4],Tmp[5],Tmp[6],Tmp[7],Tmp[8],Tmp[9],Tmp[10],Tmp[11],Tmp[12]);               
  265.                 }
  266.                
  267.                                 printf("\r\nTime: %s %d  %d :%d:%d\r\n","下位機(jī)--時間",benday,benDhour,benminute,bensecond);                        
  268.                                 printf("\r\nTime: %s %d-%d %d:%d:%d \r\n","云端----時間",Month,Date,Hour,Min,second);                                             
  269.                                 
  270.                                 ReadTypeDef.LED_Cmd = LED_OnOn;
  271.                                 LED_RGB_Control(254,0,0);
  272.                                 printf("SetLED_On \r\n");
  273.                  if((GPIO_ReadInputDataBit(GPIO_WT588BY_PORT,GPIO_Pin_1)))
  274.        {
  275.         Send_oneline(1);
  276.           }
  277.                         }
  278.                 }        
  279.         }
  280.         if( ((WirteTypeDef.Attr_Flags>>9) & 1) == 1)
  281.                 {     printf("開始輸入A藥數(shù)據(jù)");
  282.                                                 ReadTypeDef.SetA_YAO= WirteTypeDef.SetA_YAO;
  283.                             CENCHU_A= WirteTypeDef.SetA_YAO;        
  284.                         printf("輸入的a藥數(shù)據(jù)為%d  不要忘記寫入哦",CENCHU_A);

  285.         }
  286.                
  287.         
  288.         
  289.         
  290.         if( ((WirteTypeDef.Attr_Flags>>10) & 1) == 1)
  291.                 {    printf("開始輸入B藥數(shù)據(jù)");
  292.                                                 ReadTypeDef.SetB_YAO= WirteTypeDef.SetB_YAO;
  293.                              CENCHU_B= WirteTypeDef.SetB_YAO;
  294.                
  295.                         printf("輸入的B要數(shù)據(jù)%d  不要忘記寫入哦",CENCHU_B);
  296.                
  297.         }
  298.                 if( ((WirteTypeDef.Attr_Flags>>11) & 1) == 1)
  299.                         {   printf("開始輸入C藥數(shù)據(jù)");
  300.                                                         ReadTypeDef.SetC_YAO= WirteTypeDef.SetC_YAO;
  301.                             CENCHU_C = WirteTypeDef.SetC_YAO;
  302.                
  303.                         printf("輸入的C要數(shù)據(jù)%d  不要忘記寫入哦",CENCHU_C);
  304.                
  305.         }
  306.         if( ((WirteTypeDef.Attr_Flags>>12) & 1) == 1)
  307.         {
  308.                
  309.                
  310.                         ReadTypeDef.ZAO_SHI= WirteTypeDef.ZAO_SHI;
  311.                              ZAOSHI= WirteTypeDef.ZAO_SHI;
  312.                
  313.                         printf("輸入早晨小時為%d  不要忘記寫入哦",ZAOSHI);
  314.                
  315.                
  316.         }
  317.                 if( ((WirteTypeDef.Attr_Flags>>13) & 1) == 1)
  318.         {
  319.                
  320.                
  321.                         ReadTypeDef.ZAO_FEN= WirteTypeDef.ZAO_FEN;
  322.                              ZAOFEN= WirteTypeDef.ZAO_FEN;
  323.                
  324.                         printf("輸入早晨分鐘%d  不要忘記寫入哦",ZAOFEN);
  325.                
  326.                
  327.         }
  328.         if( ((WirteTypeDef.Attr_Flags>>14) & 1) == 1)
  329.         {
  330.                
  331.                
  332.                         ReadTypeDef.SetZHONG_SHI= WirteTypeDef.SetZHONG_SHI;
  333.                                                                         ZHONGSHI= WirteTypeDef.SetZHONG_SHI;
  334.                
  335.                         printf("輸入SHANGWU時為%d  不要忘記寫入哦",ZHONGSHI);
  336.                
  337.                
  338.         }
  339.                 if( ((WirteTypeDef.Attr_Flags>>15) & 1) == 1)
  340.         {
  341.                
  342.                
  343.                         ReadTypeDef.SetZHONG_FEN= WirteTypeDef.SetZHONG_FEN;
  344.                              ZHONGFEN= WirteTypeDef.SetZHONG_FEN;
  345.                
  346.                         printf("輸入SHANGWU分鐘%d  不要忘記寫入哦",ZHONGFEN);        
  347.         }
  348.                         if( ((WirteTypeDef.Attr_Flags>>0) & 1) == 1)
  349.         {
  350.                
  351.                
  352.                         ReadTypeDef.SetWAN_SHI= WirteTypeDef.SetWAN_SHI;
  353.                              WANSHI= WirteTypeDef.SetWAN_SHI;
  354.                
  355.                         printf("晚上的小時%d  不要忘記寫入哦",WANSHI);
  356.                
  357.                
  358.         }
  359.         if( ((WirteTypeDef.Attr_Flags>>1) & 1) == 1)
  360.         {
  361.                
  362.                
  363.                         ReadTypeDef.SetWAN_FEN= WirteTypeDef.SetWAN_FEN;
  364.                                                                 WANFEN= WirteTypeDef.SetWAN_FEN;
  365.                
  366.                         printf("晚上的分鐘%d  不要忘記寫入哦",WANFEN);
  367.                
  368.                
  369.         }
  370.                 if( ((WirteTypeDef.Attr_Flags>>2) & 1) == 1)
  371.         {
  372.                
  373.                
  374.                         ReadTypeDef.SetD_YAO= WirteTypeDef.SetD_YAO;
  375.                                                                 CENCHU_D= WirteTypeDef.SetD_YAO;
  376.                
  377.                         printf("輸入D藥數(shù)據(jù)時為%d  不要忘記寫入哦",CENCHU_D);
  378.                
  379.                
  380.         }
  381. }

復(fù)制代碼
本資料為網(wǎng)絡(luò)收集分享給大家,目測還不完善,大家繼續(xù)改進(jìn)一起完善吧,僅供參考,切勿照搬:
程序PCB原理圖.7z (5.87 MB, 下載次數(shù): 50)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:291668 發(fā)表于 2023-4-21 09:08 | 顯示全部樓層
好啊,以前一直有人說要做這個,沒想到有人先做到了。感謝分享。學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表