郭庆帅 发表于 2016-7-2 22:35:15

【STM 32】之智能药盒

本帖最后由 郭庆帅 于 2016-8-29 14:53 编辑

基于stm32+机智云平台的智能药盒


file:///C:\Users\GUOQIN~1.QIN\AppData\Local\Temp\ksohtml\wps28E1.tmp.png(宝盒镇楼o(∩_∩)o )============================华丽的分割线=============================创意来源:“哎呀,忘了”!随着生活节奏的加快,年龄的增长,人们的总容易忘记一些事情,比如忘记吃药。尤其是家中的老人,由于身体问题,可能需要长期服药治疗,但年岁大了总容易忘这忘那的。但在科技快速发展的今天,这些都不是问题,我们设计并开发了一款名为“健康卫士”的智能药盒,可以联网监测用户的服药情况,提示用户服药,并且根据用户设定自动提取所需药物。哎呀!!!!!!!忘记了我是来参赛的,说下这次大赛要求达成情况.原创申明:转载请注明出处:http://club.gizwits.com/thread-2685-1-1.html
作者:来自山东的小伙子~~~~萌萌哒
【开源硬件】机智云智能硬件创新大赛http://club.gizwits.com/thread-2646-1-1.html

比赛要求达成情况!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
各个分值项的详解!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

一,需求提炼数据点以及产品定义

二设别端实现配置入网文字描述。。。。。。。。
三 实现demoapp和设备的控制(其实我们自己开发了个app(后面介绍))视频演示。。。。。。。。
四实时时钟因为这个功能我们用了pcf8563芯片 这样就实现了实时时钟(而且断网后不影响)
五报警功能手机远程提醒(后面介绍)   语音提醒(后面介绍)
六 可产品化程度先说一下这次的成本,因为我们这次是做的模型 ,什么都在探索,步进电机就换了两次(每次都是力不够(力量和空间)),总体来说这次花费还是不很多500 元左右,如果投入市场成本也就是200元左右。另外我们设计的非常人性化,一次设定,很长时间不用管(它是自动筛选药品哦),即使是掉电也不用怕哦,有记忆功能断网更不要怕 自动重新连接   另外本地运行(语音还是照样提醒哦)
七硬件系统硬件系统主要是pcb 走线布局+stm32(C语言 功能实现)+wifi(esp8266)+机智云平台在下先放个功能图给大家尝尝鲜!!!!!!!!!!!!!!!!
八、软件系统软件部分主要是用机智云的sdk,集成了机智云的sdk,开发起来还是很好入门的,向我这种小白在学了两个星期后就基本入门了,加上自己的做做UI,就可以了。代码很简单 贴出来了在后面(开源了)(好戏在后面。。。。。。。。。。。。。。)

九 发挥项1 语音播报通过wt588d, 进行语音提醒 ,感情切(也可以自己录音哦)2 断电后数据不丢通过数据保存(一次设定,全程无忧)。(再也不用担心重复设定了)3 自动化分拣药品种类每天还在想那个药品吃多少吗(你就out 啦 ,全新智能药盒, 再也不用烦恼了 )4 断网后自动连接断网后重新设置不用(网络连接失败后(有网络后)会重新连接的)==================================================================                              我是分割线=============================================================================---------------------------上面主要讲了写大赛要求相关的东西。。。说了这么多我们还没有知道过程呢。。。好吧 马上来--------------------------------------------------------------------我们这个智能药盒是我们团队两个月多月的时间从无到有的一个搞机械 组装,一个搞app ,一个搞电路写程序,接下来就有我详细介绍我们的这个作品总体结构: 电气部分:通过重新设计板子设计基于机智云平台的设备,设计集成了若干模块,主要包括eeprom,时钟模块、运动驱动模块、语                  音提醒模块、传感器模块(温湿度、霍尔、光耦)、网络模块。 药盒模型:重点解决自动提取药物部分的模型(转盘式双层筛板)          云:使用机智云平台,独立搭建数据点。      APP:与机智云平台和MCU通讯,从而进行对智能药盒的管理控制;远程      监控;远程提醒,远程温湿度查看。
材料清单:
pcb板(定制)
步进电机;驱动
震动电机
Risym槽型光耦模块
温湿度模块
语音模块
汉高百得PL70
圆管
esp8266模块
电池

轴承
亚克力(定制)
同步轮
同步带
pcf8563模块
下面我就以时间轴方式介绍一下电气部分7月一号:开贴报名
7月1-5号:寻找小伙伴
7月5-10号:确定主题(开始建立数据点)7月11-20号:对机智云的协议分析(包括大段字节 ,数据的标志位的理解)
7月21-30号:对本地时钟和传输的数据进行写入
8月1-10号: 对机智云的硬件充分理解画出原理图和pcb板
8月11-17号:终于等到了pcb(对电路板的焊接 和调试 )
8月17-20号:对原理图和pcb 图进行修改 从而实现功能
注:(程序一直穿插其中)
下面以此介绍程序的实现,电路的实现,pcb注意的事再次之前先发下我的文件夹(每天都在记录 哦)



原理图::pcb图来个3d吧
大家会疑问,为什么要做成是这样的 答案是省钱,又做了个wifi 转接板   现实图这样的

裁剪之后是这样的;P(焊接的照片 传不上去正在联系机智云。。。稍后奉上)

贴的字数限制了。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。请查看3楼








郭庆帅 发表于 2016-8-31 21:46:43

评委资料大汇总

本帖最后由 郭庆帅 于 2016-9-8 19:01 编辑

视频:点这里单片机源程序:点这里
原理图和pcb图:点这里
app源文件和apk:点这里
(失效后联系我)

郭庆帅 发表于 2016-8-22 14:14:59

【STM 32】之智能药盒

本帖最后由 郭庆帅 于 2016-9-25 14:43 编辑

这是焊接后的照片上面有步进电机驱动模块和语音模块、一键下载模块 、显示模块主控模块 、传感器模块、 电源模块
这是焊接的背面后面有我wifi模块和一些按键和时钟模块和保存数据模块

下面是全部焊好的正面图

这是后面的最终图 (调试好的)因为算错了电流 还有就是有散热 最终是这样的
到此电路部分完成。。。。。。。。。。。。。。。。。。。。。
下面开始 单片机程序!!!!!!!!!!!!!!
1.首先获取时间
uint8_t getTime={0xFF,0xFF,0x00,0x05,0x17,0x78,0x00,0x00,0x94};
2 写入时间(给本地时钟写入时间)
PCF8563_set(0x10,0x07,XIEDate,XIEHour,XIEMin,XIEsecond,0x05);//
                              PCF8563_read(time);

3存储药品个数和吃药时间
Tmp= CENCHU_A;Tmp=CENCHU_B;Tmp=CENCHU_C;Tmp=CENCHU_D;
                            Tmp= ZAOSHI;Tmp=ZAOFEN;Tmp=ZHONGSHI;Tmp=ZHONGFEN;
                           Tmp= WANSHI;Tmp=WANFEN;Tmp=CENCHU_C;Tmp=CENCHU_D;
                               IIC_WriteBuf(0,Tmp,16);
                              IIC_ReadBuf(0,Tmp,16);
4 温湿度传感器
/**
******
*
* @file      Hal_temp_hum.c
* @author    Gizwtis
* @version   V2.3
* @date      2015-07-06
*
* @brief   »úÖÇÔÆ Ö»ÎªÖÇÄÜÓ²¼þ¶øÉú
*            Gizwits Smart Cloudfor Smart Products
*            Á´½Ó|ÔöÖµ|¿ª·Å|ÖÐÁ¢|°²È«|×ÔÓÐ|×ÔÓÉ|Éú̬
*            www.gizwits.com
*
******/
#include "Hal_temp_hum/Hal_temp_hum.h"

//Reset DHT11
void DHT11_Rst(void)
{
    DHT11_IO_OUT();                                                                                       //SET OUTPUT
    DHT11_DQ_OUT=0;                                                                                       //GPIOA.0=0
    Delay_ms(20);                                                                                          //Pull down Least 18ms
    DHT11_DQ_OUT=1;                                                                                       //GPIOA.0=1
    Delay_us(30);                                                                                     //Pull up 20~40us
}

u8 DHT11_Check(void)
{
    u8 retry=0;
    DHT11_IO_IN();                                                                                                //SET INPUT
    while (DHT11_DQ_IN&&retry<100)                              //DHT11 Pull down 40~80us
    {
      retry++;
      Delay_us(1);
    }

    if(retry>=100)
      return 1;
    else
      retry=0;

    while (!DHT11_DQ_IN&&retry<100)                              //DHT11 Pull up 40~80us
    {
      retry++;
      Delay_us(1);
    }

    if(retry>=100)
      return 1;                                                                                                                //chack error

    return 0;
}

u8 DHT11_Read_Bit(void)
{
    u8 retry=0;
    while(DHT11_DQ_IN&&retry<100)                                        //wait become Low level
    {
      retry++;
      Delay_us(1);
    }

    retry=0;
    while(!DHT11_DQ_IN&&retry<100)                              //wait become High level
    {
      retry++;
      Delay_us(1);
    }

    Delay_us(40);//wait 40us

    if(DHT11_DQ_IN)
      return 1;
    else
      return 0;
}

u8 DHT11_Read_Byte(void)
{
    u8 i,dat;
    dat=0;
    for (i=0; i<8; i++)
    {
      dat<<=1;
      dat|=DHT11_Read_Bit();
    }

    return dat;
}

u8 DHT11_Read_Data(u8 *temperature,u8 *humidity)
{
    u8 buf;
    u8 i;
    DHT11_Rst();
    if(DHT11_Check()==0)
    {
      for(i=0; i<5; i++)
      {
            buf=DHT11_Read_Byte();
      }
      if((buf+buf+buf+buf)==buf)
      {
            *humidity=buf;
            *temperature=buf;
      }
    }
    else
      return 1;

    return 0;
}

u8 DHT11_Init(void)
{
    GPIO_InitTypeDefGPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_SetBits(GPIOB,GPIO_Pin_3);

    DHT11_Rst();
    return DHT11_Check();
}
5语音程序
    if(wtadd==0)
                {
         if((GPIO_ReadInputDataBit(GPIO_WT588BY_PORT,GPIO_Pin_1)))
       {
      Send_oneline( 0 );
                                 ++wtadd;
          }
         }      6 光耦传感器(这个地方用的中断)
#include "Hal_GUANGOU.h"

#include "Hal_Step_otor.h"
#include "stdio.h"
#include "delay.h"
externint a ;

void Delay1(__IO u32 nCount)         //¼òµ¥µÄÑÓʱº¯Êý
{
      while(--nCount);
}

void STEP_GPIO_GInit(void)//¹âñî
      {
      GPIO_InitTypeDef GPIO_InitStructure;
            RCC_APB2PeriphClockCmd( GPIO_G1_CLK | GPIO_G2_CLK, ENABLE);//??LED
   
      GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU;//IPU                                        //???????????
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                                        //?????
      
      GPIO_InitStructure.GPIO_Pin = GPIO_G1_PIN;      //¹âñî                                                //??LED1
      GPIO_Init(GPIO_G1_PORT, &GPIO_InitStructure);                                                //???LED1

      GPIO_InitStructure.GPIO_Pin = GPIO_G2_PIN;      //¹âñî                                                //??LED2
      GPIO_Init(GPIO_G2_PORT, &GPIO_InitStructure);      
               
                  
                  
               
}
void STEP_GPIO_HUOER(void)//»ô¶û
      {
      GPIO_InitTypeDef GPIO_InitStructure;
            RCC_APB2PeriphClockCmd( GPIO_Y1_CLK | GPIO_Y2_CLK, ENABLE);//??LED
   
      GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPD;//IPU                                        //???????????
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                                        //?????
      
            GPIO_InitStructure.GPIO_Pin = GPIO_Y1_PIN;      //»ô¶û                                                //??LED1
      GPIO_Init(GPIO_Y1_PORT, &GPIO_InitStructure);                                                //???LED1

      GPIO_InitStructure.GPIO_Pin = GPIO_Y2_PIN;                //»ô¶û                                        //??LED2
      GPIO_Init(GPIO_Y2_PORT, &GPIO_InitStructure);
      
                  GPIO_InitStructure.GPIO_Pin = GPIO_BEIYONG3_PIN;      //±¸ÓÃÊäÈë
      GPIO_Init(GPIO_BEIYONG3_PORT, &GPIO_InitStructure);                                                //???LED1

      GPIO_InitStructure.GPIO_Pin = GPIO_BEIYONG4_PIN;                //±¸ÓÃÊäÈë
      GPIO_Init(GPIO_BEIYONG4_PORT, &GPIO_InitStructure);
}
void EXTIX_Init(void)
{

         EXTI_InitTypeDef EXTI_InitStructure;
         NVIC_InitTypeDef NVIC_InitStructure;
          void STEP_GPIO_GInit();//¹âñî

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);      //ʹÄܸ´Óù¦ÄÜʱÖÓ
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);      //ÉèÖÃNVICÖжϷÖ×é2:2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶
   
//    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1);
//      
//    EXTI_InitStructure.EXTI_Line=EXTI_Line1;
//          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //ÖжÏģʽ
//          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//ϽµÑØ
//          EXTI_InitStructure.EXTI_LineCmd=ENABLE;
//          EXTI_Init(&EXTI_InitStructure);                //¸ù¾ÝEXTI_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèEXTI¼Ä´æÆ÷
//      
//   
//      
//          NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;                        //ʹÄÜ°´¼ü ËùÔÚµÄÍⲿÖжÏͨµÀ
//          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;      //ÇÀÕ¼ÓÅÏȼ¶2£¬
//          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;                                        //×ÓÓÅÏȼ¶0×î¸ß¼¶
//          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //ʹÄÜÍⲿÖжÏͨµÀ
//          NVIC_Init(&NVIC_InitStructure);

      
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);      //ʹÄܸ´Óù¦ÄÜʱÖÓ
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);      //ÉèÖÃNVICÖжϷÖ×é2:2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶
    //GPIOA.0          ÖжÏÏßÒÔ¼°Öжϳõʼ»¯ÅäÖà ÉÏÉýÑØ´¥·¢ PA0WK_UP
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
    EXTI_InitStructure.EXTI_Line=EXTI_Line0;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //ÖжÏģʽ EXTI_Trigger_RisingÉÏÉý
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//ÉÏÉýÑØ
          EXTI_InitStructure.EXTI_LineCmd=ENABLE;
          EXTI_Init(&EXTI_InitStructure);                //¸ù¾ÝEXTI_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèEXTI¼Ä´æÆ÷

          NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;                        //ʹÄÜ°´¼ü ËùÔÚµÄÍⲿÖжÏͨµÀ
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;      //ÇÀÕ¼ÓÅÏȼ¶2£¬
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;                                        //×ÓÓÅÏȼ¶0×î¸ß¼¶
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //ʹÄÜÍⲿÖжÏͨµÀ
          NVIC_Init(&NVIC_InitStructure);         
      
      
}
void EXTI0_IRQHandler(void)//0,1,2,3,4,9_5,15_10
{
            printf("½øÈëÖжÏ");
                     a=a+1;
      printf(" %d",a);
            Delay1(300000);
               
      EXTI_ClearITPendingBit(EXTI_Line0); //Çå³ýLINE4ÉϵÄÖжϱê־λ
}
7 霍尔传感器(和语音提醒)
bool IR_Handle(void)
{
      printf("½øÈë»ô¶û¼ì²â");
    if(GPIO_ReadInputDataBit(Infrared_GPIO_PORT, Infrared_GPIO_PIN))
    {
                        if(b%2==0)
                              {
                                        if(q==1)
                                        {               
                                                if((GPIO_ReadInputDataBit(GPIO_WT588BY_PORT,GPIO_Pin_1)))
            {
                                                                printf("ÓïÒôÌáÐѹéλ");
      Send_oneline(4);
                                                                q=0;
                }
                                                      }
                                                
                                        printf("Ò©ºÐÔÚԭλÖÃ");
                           return 0;
                              }
                        else
                        {
                              
    printf("Ö´ÐÐÖÐÒ©ºÐÒÔÄóö");                              
                if((GPIO_ReadInputDataBit(GPIO_WT588BY_PORT,GPIO_Pin_1)))
       {
      Send_oneline(2);
       }
                  return 1;
                        }

    }
    else
    {
                        printf("yyyyyy%d",h);
                        if(h ==1 )
                        {
                              printf("hahahhahahhh");
                        
                              if((GPIO_ReadInputDataBit(GPIO_WT588BY_PORT,GPIO_Pin_1)))
       {
      Send_oneline(3);
                                 b=0;
                                       h=0;
                                 q=1;
                         }
                        
               }

      return 0;
               }
                        
    }
8 步进电机程序
#define GPIO_A1_CLK    RCC_APB2Periph_GPIOA//B¸Ä³ÉA
#define GPIO_A1_PORT   GPIOA
#define GPIO_A1_PIN    GPIO_Pin_12

#define GPIO_B1_CLK    RCC_APB2Periph_GPIOA
#define GPIO_B1_PORT   GPIOA
#define GPIO_B1_PIN    GPIO_Pin_11

#define GPIO_C1_CLK    RCC_APB2Periph_GPIOB
#define GPIO_C1_PORT   GPIOB
#define GPIO_C1_PIN    GPIO_Pin_15

#define GPIO_D1_CLK    RCC_APB2Periph_GPIOB
#define GPIO_D1_PORT   GPIOB
#define GPIO_D1_PIN    GPIO_Pin_14

#define GPIO_A2_CLK    RCC_APB2Periph_GPIOB
#define GPIO_A2_PORT   GPIOB
#define GPIO_A2_PIN    GPIO_Pin_10

#define GPIO_B2_CLK    RCC_APB2Periph_GPIOB
#define GPIO_B2_PORT   GPIOB
#define GPIO_B2_PIN    GPIO_Pin_11

#define GPIO_C2_CLK    RCC_APB2Periph_GPIOB
#define GPIO_C2_PORT   GPIOB
#define GPIO_C2_PIN    GPIO_Pin_12

#define GPIO_D2_CLK    RCC_APB2Periph_GPIOB
#define GPIO_D2_PORT   GPIOB
#define GPIO_D2_PIN    GPIO_Pin_13步进电机原理程序
#define Coil_A1 {GPIO_SetBits(GPIO_A1_PORT,GPIO_A1_PIN);\
                                                                GPIO_ResetBits(GPIO_B1_PORT,GPIO_B1_PIN);\
                                                                GPIO_ResetBits(GPIO_C1_PORT,GPIO_C1_PIN);\
                                                                GPIO_ResetBits(GPIO_D1_PORT,GPIO_D1_PIN);\
                                                      }//AÏàͨµç£¬ÆäËûÏà¶Ïµç
#define Coil_B1 {GPIO_ResetBits(GPIO_A1_PORT,GPIO_A1_PIN);\
                                                                GPIO_SetBits(GPIO_B1_PORT,GPIO_B1_PIN);\
                                                                GPIO_ResetBits(GPIO_C1_PORT,GPIO_C1_PIN);\
                                                                GPIO_ResetBits(GPIO_D1_PORT,GPIO_D1_PIN);\
                                                                }//BÏàͨµç£¬ÆäËûÏà¶Ïµç
#define Coil_C1 {GPIO_ResetBits(GPIO_A1_PORT,GPIO_A1_PIN);\
                                                                GPIO_ResetBits(GPIO_B1_PORT,GPIO_B1_PIN);\
                                                                GPIO_SetBits(GPIO_C1_PORT,GPIO_C1_PIN);\
                                                                GPIO_ResetBits(GPIO_D1_PORT,GPIO_D1_PIN);\
                                                                }//CÏàͨµç£¬ÆäËûÏà¶Ïµç
#define Coil_D1 {GPIO_ResetBits(GPIO_A1_PORT,GPIO_A1_PIN);\
                                                                GPIO_ResetBits(GPIO_B1_PORT,GPIO_B1_PIN);\
                                                                GPIO_ResetBits(GPIO_C1_PORT,GPIO_C1_PIN);\
                                                                GPIO_SetBits(GPIO_D1_PORT,GPIO_D1_PIN);\
                                                                }//DÏàͨµç£¬ÆäËûÏà¶Ïµç
#define Coil_AB1 {GPIO_SetBits(GPIO_A1_PORT,GPIO_A1_PIN);\
                                                                GPIO_SetBits(GPIO_B1_PORT,GPIO_B1_PIN);\
                                                                GPIO_ResetBits(GPIO_C1_PORT,GPIO_C1_PIN);\
                                                                GPIO_ResetBits(GPIO_D1_PORT,GPIO_D1_PIN);\
                                                                }//ABÏàͨµç£¬ÆäËûÏà¶Ïµç
#define Coil_BC1 {GPIO_ResetBits(GPIO_A1_PORT,GPIO_A1_PIN);\
                                                                GPIO_SetBits(GPIO_B1_PORT,GPIO_B1_PIN);\
                                                                GPIO_SetBits(GPIO_C1_PORT,GPIO_C1_PIN);\
                                                                GPIO_ResetBits(GPIO_D1_PORT,GPIO_D1_PIN);\
                                                                }//BCÏàͨµç£¬ÆäËûÏà¶Ïµç
                                                      
#define Coil_CD1 {GPIO_ResetBits(GPIO_A1_PORT,GPIO_A1_PIN);\
                                                                GPIO_ResetBits(GPIO_B1_PORT,GPIO_B1_PIN);\
                                                                GPIO_SetBits(GPIO_C1_PORT,GPIO_C1_PIN);\
                                                                GPIO_SetBits(GPIO_D1_PORT,GPIO_D1_PIN);\
                                                                }//CDÏàͨµç£¬ÆäËûÏà¶Ïµç
#define Coil_DA1 {GPIO_SetBits(GPIO_A1_PORT,GPIO_A1_PIN);\
                      GPIO_ResetBits(GPIO_B1_PORT,GPIO_B1_PIN);\
                                                                GPIO_ResetBits(GPIO_C1_PORT,GPIO_C1_PIN);\
                                                                GPIO_SetBits(GPIO_D1_PORT,GPIO_D1_PIN);\
}
                                                                //DÏàͨµç£¬ÆäËûÏà¶Ïµç
#define Coil_OFF {GPIO_ResetBits(GPIO_A1_PORT,GPIO_A1_PIN);\
                                                                        GPIO_ResetBits(GPIO_B1_PORT,GPIO_B1_PIN);\
                                                                        GPIO_ResetBits(GPIO_C1_PORT,GPIO_C1_PIN);\
                                                                         GPIO_ResetBits(GPIO_D1_PORT,GPIO_D1_PIN);\
                                                                        }//È«²¿¶Ïµç

#define Coil_A2 {GPIO_SetBits(GPIO_A2_PORT,GPIO_A2_PIN);\
                                                                GPIO_ResetBits(GPIO_B2_PORT,GPIO_B2_PIN);\
                                                                GPIO_ResetBits(GPIO_C2_PORT,GPIO_C2_PIN);\
                                                                GPIO_ResetBits(GPIO_D2_PORT,GPIO_D2_PIN);\
                                                      }//AÏàͨµç£¬ÆäËûÏà¶Ïµç
#define Coil_B2 {GPIO_ResetBits(GPIO_A2_PORT,GPIO_A2_PIN);\
                                                                GPIO_SetBits(GPIO_B2_PORT,GPIO_B2_PIN);\
                                                                GPIO_ResetBits(GPIO_C2_PORT,GPIO_C2_PIN);\
                                                                GPIO_ResetBits(GPIO_D2_PORT,GPIO_D2_PIN);\
                                                                }//BÏàͨµç£¬ÆäËûÏà¶Ïµç
#define Coil_C2 {GPIO_ResetBits(GPIO_A2_PORT,GPIO_A2_PIN);\
                                                                GPIO_ResetBits(GPIO_B2_PORT,GPIO_B2_PIN);\
                                                                GPIO_SetBits(GPIO_C2_PORT,GPIO_C2_PIN);\
                                                                GPIO_ResetBits(GPIO_D2_PORT,GPIO_D2_PIN);\
                                                                }//CÏàͨµç£¬ÆäËûÏà¶Ïµç
#define Coil_D2 {GPIO_ResetBits(GPIO_A2_PORT,GPIO_A2_PIN);\
                                                                GPIO_ResetBits(GPIO_B2_PORT,GPIO_B2_PIN);\
                                                                GPIO_ResetBits(GPIO_C2_PORT,GPIO_C2_PIN);\
                                                                GPIO_SetBits(GPIO_D2_PORT,GPIO_D2_PIN);\
                                                                }//DÏàͨµç£¬ÆäËûÏà¶Ïµç
#define Coil_AB2 {GPIO_SetBits(GPIO_A2_PORT,GPIO_A2_PIN);\
                                                                GPIO_SetBits(GPIO_B2_PORT,GPIO_B2_PIN);\
                                                                GPIO_ResetBits(GPIO_C2_PORT,GPIO_C2_PIN);\
                                                                GPIO_ResetBits(GPIO_D2_PORT,GPIO_D2_PIN);\
                                                                }//ABÏàͨµç£¬ÆäËûÏà¶Ïµç
#define Coil_BC2 {GPIO_ResetBits(GPIO_A2_PORT,GPIO_A2_PIN);\
                                                                GPIO_SetBits(GPIO_B2_PORT,GPIO_B2_PIN);\
                                                                GPIO_SetBits(GPIO_C2_PORT,GPIO_C2_PIN);\
                                                                GPIO_ResetBits(GPIO_D2_PORT,GPIO_D2_PIN);\
                                                                }//BCÏàͨµç£¬ÆäËûÏà¶Ïµç
                                                      
#define Coil_CD2 {GPIO_ResetBits(GPIO_A2_PORT,GPIO_A2_PIN);\
                                                                GPIO_ResetBits(GPIO_B2_PORT,GPIO_B2_PIN);\
                                                                GPIO_SetBits(GPIO_C2_PORT,GPIO_C2_PIN);\
                                                                GPIO_SetBits(GPIO_D2_PORT,GPIO_D2_PIN);\
                                                                }//CDÏàͨµç£¬ÆäËûÏà¶Ïµç
#define Coil_DA2 {GPIO_SetBits(GPIO_A2_PORT,GPIO_A2_PIN);\
                      GPIO_ResetBits(GPIO_B2_PORT,GPIO_B2_PIN);\
                                                                GPIO_ResetBits(GPIO_C2_PORT,GPIO_C2_PIN);\
                                                                GPIO_SetBits(GPIO_D2_PORT,GPIO_D2_PIN);\
}
                                                                //DÏàͨµç£¬ÆäËûÏà¶Ïµç
#define Coil_OFF2 {GPIO_ResetBits(GPIO_A2_PORT,GPIO_A2_PIN);\
                                                                        GPIO_ResetBits(GPIO_B2_PORT,GPIO_B2_PIN);\
                                                                        GPIO_ResetBits(GPIO_C2_PORT,GPIO_C2_PIN);\
                                                                         GPIO_ResetBits(GPIO_D2_PORT,GPIO_D2_PIN);\
                                                                        }//È«²¿¶Ïµç到此stm32程序完毕 (代码比较多 ,仔细看哦)


下面是机械部分这是智能药盒侧视图(整体图 震贴)

下面从零到一组装


下面的可是上了铣床铣出来的



把这两个组装起来


加上同步轮

下面是电机部分

下面是电机组装

图2

整体框架

外观美化

最终完成


           健康卫士APP一、控制页面
<font size="1">//控制页面
protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.gokit_control);
                tabHost = (TabHost) findViewById(android.R.id.tabhost);
                tabHost.setup();
                tabHost.addTab(tabHost.newTabSpec("one_drug").setIndicator("第一种药").setContent(R.id.one_drug));
                tabHost.addTab(tabHost.newTabSpec("two_drug").setIndicator("第二种药").setContent(R.id.two_drug));
                tabHost.addTab(tabHost.newTabSpec("three_drug").setIndicator("第三种药").setContent(R.id.three_drug));
                tabHost.addTab(tabHost.newTabSpec("four_drug").setIndicator("第四种药").setContent(R.id.four_drug));
               
                initViews();   //初始化控件
                initEvents();//初始化**
               
                deviceStatu = new HashMap<String, Object>();
                controlDevice = (ControlDevice) getIntent().getSerializableExtra("device");
                WApplication.mControlDevice=controlDevice;
                xpgWifiDevice = BaseActivity.findDeviceByMac(controlDevice.getMac(), controlDevice.getDid());
                if (xpgWifiDevice != null) {
                        xpgWifiDevice.setListener(deviceListener);
                }
                actionBar.setTitle(controlDevice.getName());
      }

      final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();

      public static String bytesToHex(byte[] bytes) {
                char[] hexChars = new char;
                for (int j = 0; j < bytes.length; j++) {
                        int v = bytes & 0xFF;
                        hexChars = hexArray;
                        hexChars = hexArray;
                        hexChars = ' ';
                }
                return new String(hexChars);
      }



      /**
         * 初始化控件.
         */
      private void initViews() {
                mybutton = (Button) findViewById(R.id.mybutton);
               
                editTextA = (EditText) findViewById(R.id.editTextA);
                editTextB = (EditText) findViewById(R.id.editTextB);
                editTextC = (EditText) findViewById(R.id.editTextC);
                editTextD = (EditText) findViewById(R.id.editTextD);
                editTextE = (EditText) findViewById(R.id.editTextE);
                editTextF = (EditText) findViewById(R.id.editTextF);
                editTextG = (EditText) findViewById(R.id.editTextG);
                editTextH = (EditText) findViewById(R.id.editTextH);
               
                vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
                swInfrared = (Switch) findViewById(R.id.sw_infrared1);
      
               
                Map<String, String> map = FileActivity.ShowData3();
                if(map != null)
                {
                        editTextA.setText(map.get("Aname"));
                        editTextB.setText(map.get("Age"));
                        editTextC.setText(map.get("Bname"));
                        editTextD.setText(map.get("Bge"));
                        editTextE.setText(map.get("Cname"));
                        editTextF.setText(map.get("Cge"));
                        editTextG.setText(map.get("Dname"));
                        editTextH.setText(map.get("Dge"));
                }

      }

      /**
         * 初始化**.
         */
      private void initEvents() {
                /**打开预约时间页面*/
                mybutton.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                              // TODO Auto-generated method stub
                              String unt1 = editTextB.getText().toString().trim();
                              String unt2 = editTextD.getText().toString().trim();
                              String unt3 = editTextF.getText().toString().trim();
                              String unt4 = editTextH.getText().toString().trim();
                              Intent intent = new Intent();
                              
                              //储存药品名字合个数
                              if(TextUtils.isEmpty(editTextC.getText().toString()) && TextUtils.isEmpty(editTextE.getText().toString()) && TextUtils.isEmpty(editTextG.getText().toString()))
                              {
                                        FileActivity.DataLog3(editTextA.getText().toString(),Integer.parseInt(editTextB.getText().toString()), "", 0, "",0,"",0);
                              }
                              else if(editTextE.getText().toString() == null && editTextG.getText().toString() == null)
                              {
                                        FileActivity.DataLog3(editTextA.getText().toString(),Integer.parseInt(editTextB.getText().toString()),editTextC.getText().toString(),Integer.parseInt(editTextD.getText().toString()) , "",0,"",0);
                              }
                              else if(editTextG.getText().toString() == null)
                              {
                                        FileActivity.DataLog3(editTextA.getText().toString(),Integer.parseInt(editTextB.getText().toString()),editTextC.getText().toString(),Integer.parseInt(editTextD.getText().toString()) , editTextE.getText().toString(),Integer.parseInt(editTextF.getText().toString()),"",0);
                              }
                              else
                              {
                                        FileActivity.DataLog3(editTextA.getText().toString(),Integer.parseInt(editTextB.getText().toString()), editTextC.getText().toString(),Integer.parseInt(editTextD.getText().toString()), editTextE.getText().toString(),Integer.parseInt(editTextF.getText().toString()), editTextG.getText().toString(),Integer.parseInt(editTextH.getText().toString()));
                              }
                              
                              if(TextUtils.isEmpty(unt1))
                              {
                                        intent.putExtra("one1","0");
                              }
                              else
                              {
                                        intent.putExtra("one1",unt1);
                              }
                              if(TextUtils.isEmpty(unt2))
                              {
                                        intent.putExtra("one2","0");
                              }
                              else
                              {
                                        intent.putExtra("one2",unt2);
                              }
                              if(TextUtils.isEmpty(unt3))
                              {
                                        intent.putExtra("one3","0");
                              }
                              else
                              {
                                        intent.putExtra("one3",unt3);
                              }
                              if(TextUtils.isEmpty(unt4))
                              {
                                        intent.putExtra("one4","0");
                              }
                              else
                              {
                                        intent.putExtra("one4",unt4);
                              }
                              intent.setClass(GokitControlActivity1.this, Time_Activity.class);
                              startActivity(intent);
                        }
                });
                swInfrared.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                        @Override
                        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                              try {
                                        if(isChecked == true)
                                        {
                                                vibrator.vibrate(new long[]{1000,3000,1000,3000},0);//手机震动提示
                                                
                                                new AlertDialog.Builder(GokitControlActivity1.this).setTitle("警告")//设置对话框标题
                                             .setMessage("为了您的健康!\n请按时吃药!")//设置显示的内容
                                          .setNegativeButton("确定",new DialogInterface.OnClickListener() {//添加返回按钮
                                                   
                                                 @Override
                                                 public void onClick(DialogInterface dialog, int which) {//响应事件
                                          
                                                   // TODO Auto-generated method stub
                                                      SimpleDateFormat formatter = new SimpleDateFormat ("yyyy-MM-dd HH:mm");
                                        Date curDate = new Date(System.currentTimeMillis());//获取当前时间
                                        String str = formatter.format(curDate);
                                        if(editTextA.getText().toString() != null)
                                        {
                                                               FileActivity.DataLog2(editTextA.getText().toString(),Integer.parseInt(editTextB.getText().toString()),str);

                                        }
                                        if(editTextC.getText().toString() != null)
                                        {
                                                FileActivity.DataLog2(editTextC.getText().toString(),Integer.parseInt(editTextD.getText().toString()),str);
                                        }
                                        if(editTextE.getText().toString() != null)
                                        {
                                                FileActivity.DataLog2(editTextE.getText().toString(),Integer.parseInt(editTextF.getText().toString()),str);
                                        }
                                        if(editTextG.getText().toString() != null)
                                        {
                                                FileActivity.DataLog2(editTextG.getText().toString(),Integer.parseInt(editTextH.getText().toString()),str);
                                        }
                                                         vibrator.cancel();
                                                   Log.i("123"," 请保存数据!");
                                          
                                                 }
                                          
                                             }).show();//在按键响应事件中显示此对话框
                                        }
                                        else
                                        {
                                                 vibrator.cancel();
                                        }
                                        Log.v("123", ""+isChecked);
                                       
                                        sendJson(KEY_INFRARED, isChecked);
                              } catch (JSONException e) {
                                        e.printStackTrace();
                              }
                        }
                });
      }

二、预约时间<blockquote>class Button12 implements OnClickListener





三、温湿度查看
/**
*温湿度查看
*/
case R.id.action_device_status:
                        new Ale.Builder(GokitControlActivity1.this).setTitle("温湿度查看")//设置对话框标题
                        
                     .setMessage("环境湿度   "+ s +"\n" + "环境温度" + w)//设置显示的内容
                  .setNegativeButton("确定",new DialogInterface.OnClickListener() {//添加返回按钮
                         @Override
                  
                         public void onClick(DialogInterface dialog, int which) {//响应事件
                  
                           // TODO Auto-generated method stub
                  
                           Log.i("alertdialog"," 请保存数据!");
                  
                         }
                  
                     }).show();//在按键响应事件中显示此对话框                        
                        break;                                             

四、储存数据与读取数据/**
五、服药日志记录/*<span style="font-size: 14px; line-height: 1.5;">*服药日志</span>





资料和视频在9楼!!!!!!!!!!!如果你觉的好可以打赏,我们还会出更好的作品!!!!!!!!




郭庆帅 发表于 2016-8-31 21:17:07

资料和视频 大汇总!!!!!!!!!!!!!!!!!

本帖最后由 郭庆帅 于 2016-8-31 22:04 编辑

下面是视频:游客点这里单片机 源码链接:游客点这里
app 源码链接:游客点这里
电路图链接游客点这里(失效后联系我i)

------------------------------------------------------------------------
评委看这里!!!!!
请移步10楼!!



Genius 发表于 2016-7-5 17:22:58

期待中!!!

Quiet 发表于 2016-8-22 15:49:24

看着挺好的,机械设计用软件也很专业的,功能也不错。 感谢机智云提供的平台!

JerryLiu 发表于 2016-8-23 08:53:13

您好 该设备是如何通过转盘筛选药品种类以及计算药片数量的?

郭庆帅 发表于 2016-8-23 20:27:20

JerryLiu 发表于 2016-8-23 08:53
您好 该设备是如何通过转盘筛选药品种类以及计算药片数量的?

你好   请继续关注,稍后奉上

风乘雪 发表于 2016-8-28 01:10:34

不错,很好啊

大钊小宁丶 发表于 2016-8-29 17:08:10

感谢机智云平台和版主大大的无私奉献,关爱人类健康,从智能吃药开始:lol:lol:lol

PERFECT 发表于 2016-9-1 22:01:51

不错,很好!

twowinter 发表于 2016-9-1 22:09:33

“大家会疑问,为什么要做成是这样的 答案是省钱,又做了个wifi 转接板   现实图这样的”

琢磨了下才明白,假装是同一块板哈哈哈

郭庆帅 发表于 2016-9-2 13:50:47

twowinter 发表于 2016-9-1 22:09
“大家会疑问,为什么要做成是这样的 答案是省钱,又做了个wifi 转接板   现实图这样的”

琢磨了下才明白 ...

对,因为10x10 一一下的都是一样的钱,而且 你要是拼版的话 还有拼版费

hihaigui 发表于 2016-9-2 16:51:12

设计真的很不错。转载了

李~ 发表于 2016-9-8 18:30:01

郭庆帅 发表于 2016-9-2 13:50
对,因为10x10 一一下的都是一样的钱,而且 你要是拼版的话 还有拼版费

在哪里做的啊?让你拼板?嘉立创好像不允许这么搞啊

郭庆帅 发表于 2016-9-8 19:04:39

李~ 发表于 2016-9-8 18:30
在哪里做的啊?让你拼板?嘉立创好像不允许这么搞啊

淘宝

橘子洲头 发表于 2016-9-8 19:12:25

学习一下 。很棒的设计。初学stm32到一个阶段 前来看看

涛哥依然骄傲 发表于 2016-9-10 20:18:05

看着挺不错的

淡忘瞬间 发表于 2016-10-1 19:05:01

郭庆帅 发表于 2016-8-22 14:14
这是焊接后的照片上面有步进电机驱动模块和语音模块、一键下载模块 、显示模块主控模块 、传感器模块、...

佩服 工艺品

ASSS 发表于 2016-10-30 16:34:27

:):):):):):):):):):):)
页: [1] 2
查看完整版本: 【STM 32】之智能药盒