熊总熊 发表于 2016-7-28 11:48:05

【Gokit】之智慧宿舍

本帖最后由 Genius 于 2016-8-25 15:56 编辑

智慧宿舍:集成了高校宿舍防火子系统,防盗子系统,大功率用电器实时监测子系统,三网结合信息查询与充值子系统(电费,水费,热水卡),门禁控制子系统,利用机智云提供的云服务器为基础,配合手机客户端APP。分级分组式24小时实时智能的为高校宿舍提供安全监察。原创**,转载请注明出处:http://club.gizwits.com/thread-2997-1-1.html作者:熊总熊~~~(可爱熊)本文已参加【开源硬件】机智云智能硬件创新大赛http://club.gizwits.com/thread-2646-1-1.htmlhttp://player.youku.com/player.php/sid/XMTY5ODI0OTY2OA==/v.swf播放密码 :zhushi演示视频链接请用力戳这里:http://v.youku.com/v_show/id_XMTY5ODI0OTY2OA==.html

先上一份目录,这个项目基本就是按照下面的顺序介绍的,最后有个彩蛋,话不多说,开贴........
目录介绍
第一章:智慧宿舍的总体介绍第二章:智慧宿舍的的硬件实现第三章:智慧宿舍的的固件实现第四章:智慧宿舍的的软件实现第五章:智慧宿舍的的系统集成第六章:智慧宿舍的功能演示和解说第七章:智慧宿舍的的可扩展性分析
、第一章:、智慧宿舍项目总体介绍
    2008年11月14日早晨6时10分左右,上海商学院徐汇校区一学生宿舍楼发生火灾,4名女生遇难,2008年5月5日中央民族大学28号楼6层S0601女生宿舍发生火灾,千人被紧急疏散,2000年吉林省万发乡中学火灾,4死11重伤,2001年5月16日,广州市的一所寄宿学校发生火灾,8死25人。   2016年3月,上海松江一高校女生宿舍半夜遭入室盗窃,2012年年底,河南5所高校连连失窃,多名学生的笔记本电脑被盗。2012年京28所高校1年失窃808起,大学成小偷的"黄金岛"。   2014-05-13,云南大学一男子持刀爬上女生宿舍杀人,2012年,25日凌晨,河南职业技术学院女生宿舍楼内发生命案,3死1伤。   高校安全一直是高校建设的重点,而作为学子们朝夕相处的宿舍安全更是高校管理里面最重要的一个环节,我们立足于高校宿舍建设的实际,针对高校宿舍管理中存在的问题,提出了一套智惠宿舍管理一站式系统。在目前高校宿舍的建设中,普遍会存在几个问题,   1、 宿舍失火造成人员财产甚至是人员伤亡。   2、 宿舍发生失窃给学生造成财产损失。   3、非高校工作人员进入学生宿舍进行非法犯罪活动。 4、无法对学生夜宿和日常生活情况进行管理。5、宿舍的水电管理繁琐,需要投入很多人力进行管理维护。6、高校宿舍信息无法统一管理和记录,加大了管理难度。
基于上述情况,我们提出了一套针对高校的宿舍管理一站式智能系统,简称“智慧宿舍”,这套管理系统是集成了高校宿舍防火子系统,防盗子系统,大功率用电器实时监测子系统,三网结合信息查询与充值子系统(电费,水费,热水卡),门禁控制子系统,利用机智云提供的云服务器为基础,配合手机客户端APP。分级分组式24小时实时智能的为高校宿舍提供安全监察。

这里贴上一张图进行说明


下面贴上每一个子系统的单独图示:


作为高校安全最最重要的一块,防火子系统流程图如下:




我们实用的防盗子系统:

还有比较常规的电费检/监测子系统:


下面是我们项目的明星功能来了,查询和充值子系统:

最后,在安全警报方面,我们肯定也是设计了一套子系统:
好了,通过上面的各种图示,想必大家对我们干的这件事有了一个大概的了解。这里傲娇的宣布一个消息,我们的关门断电检测方案已经拿到专利了,~~~~
和目前市面上已有的安防类产品相比,我们的产品着力于服务高校,充分考虑高校宿舍的大容量和多样性,独创的无损式关门检测传感器可以兼容目前高校宿舍的所有类型的门窗,安装时间短,性能稳定可靠。而独家推出的三网联合系统可以在高校宿舍管理中心和互联网和手机客户端建立实时网络,更为宿舍安全填上一把铁锁,而针对宿管人员推出了配套的管理软件,可以更加高效准确的对宿舍情况进行实时掌握,对于高校学生,我们也开发了很贴心的各类实用功能服务,采用我们的一站式系统,可以大大的减少高校宿舍人员费用,保证高校宿舍安全。     作为一个一站式解决系统,各子系统能独立工作,高校可以单独采样其中的子模块对高校宿舍进行管理,也可以采集一站式各个子模块集成管理,本系统具有良好的集成功能,各部分模块化组合,可以适用于任何高校宿舍环境。各功能模块高度自动化,对系统管理人员无较高的知识要求,并且系统建设快速,稳定性好。并且我们配备了对应的维护方案。
大体的方案介绍就先到这里,更多的信息我们在视频中进行讲解。

Genius 发表于 2016-7-28 13:10:49

加油   如需帮助,可在社区发帖或者是QQ群讨论

竹石科技APP坚 发表于 2016-8-26 12:30:39

创意很不错,,有APP有上位机,,如果优化好能够稳定运行生产出产品,,对于全国高校来说,,确实是很大的市场

熊总熊 发表于 2016-8-17 22:50:41

再来一个stm32的主控程序 int main(void)
{
        uint8_t p0_control_buf;
       
        SystemInit();       
        HW_Init();
//        Printf_SystemRccClocks();
        SW_Init();       
        while(1)
               
        {       
                KEY_Handle();       
                   
                GizWits_MessageHandle(p0_control_buf, sizeof(WirteTypeDef_t));
               
                if(p0Flag == 1)
                {
                        memcpy((uint8_t *)&WirteTypeDef, p0_control_buf, sizeof(WirteTypeDef_t));
                        GizWits_ControlDeviceHandle();

                        GizWits_DevStatusUpgrade((uint8_t *)&ReadTypeDef, 10*60*1000, 1);
                        p0Flag =0;
                }
      if(gaterSensorFlag != 0)   
      {
            GizWits_GatherSensorData();
            gaterSensorFlag = 0;
      }
       GizWits_DevStatusUpgrade((uint8_t *)&ReadTypeDef, 10*60*1000, 0);
        }
}
/** @addtogroup GizWits_HW_Init
* @{
*/
void HW_Init(void)
{
        Delay_Init(72);       
        UARTx_Init();
RGB_KEY_GPIO_Init();
        RGB_LED_Init();       
        LED_GPIO_Init();       
        KEY_GPIO_Init();
        TIM3_Int_Init(7199,9);   //ms interrupt       
        Motor_Init();       
        DHT11_Init();       
        IR_Init();       
}
/** @addtogroup GizWits_SW_Init
* @{
*/
void SW_Init()
{
        ReadTypeDef.Led=0;
        ReadTypeDef.Get_data=0;
        ReadTypeDef.Money=0;
        ReadTypeDef.Wise=0;
ReadTypeDef.Temperature=0;
        ReadTypeDef.Humidity= 0;          
        ReadTypeDef.Sum_elec=0;
        ReadTypeDef.Remaining=0;
        GizWits_init(sizeof(ReadTypeDef_t));
//        printf("Gokit Init Ok ...\r\n");
}
/** @addtogroup Printf_SystemRccClocks
* @{
*/
void Printf_SystemRccClocks(void)
{
        uint8_t SYSCLKSource;

        RCC_ClocksTypeDefSystemRCC_Clocks;
//        printf("System start...\r\n");
        ;
        SYSCLKSource = RCC_GetSYSCLKSource();
        if(SYSCLKSource==0x04)
                ;
        //        printf("SYSCLKSource is HSE\r\n");
        else if(SYSCLKSource==0x00)
                ;
//                printf("SYSCLKSource is HSI\r\n");
        else if(SYSCLKSource==0x08)
                ;
        //        printf("SYSCLKSource is PL!\r\n");
       
        RCC_GetClocksFreq(&SystemRCC_Clocks);
//        printf("SYS clock =%dMHz \r\n",(uint32_t)SystemRCC_Clocks.SYSCLK_Frequency/1000000);
//        printf("HCLK clock =%dMHz \r\n",(uint32_t)SystemRCC_Clocks.HCLK_Frequency/1000000);
//        printf("PCLK1 clock =%dMHz \r\n",(uint32_t)SystemRCC_Clocks.PCLK1_Frequency/1000000);
//        printf("PCLK2_clock =%dMHz \r\n",(uint32_t)SystemRCC_Clocks.PCLK2_Frequency/1000000);       
//        printf("SADCCLK_Frequencyclock =%dMHz \r\n",(uint32_t)SystemRCC_Clocks.ADCCLK_Frequency/1000000);

}

/*****************************************************
* Function Name: GizWits_ControlDeviceHandle
* Description    : Analy P0 Package
* Input          : None
* Output         : None
* Return         : Bit , Attr_Flags
* Attention               :
*****************************************************/
void GizWits_ControlDeviceHandle()
{
        if( (WirteTypeDef.Attr_Flags & (1<<0)) == (1<<0))//控制灯
        {

                        if(WirteTypeDef.Led == LED_OnOff)   //灯是关的
                        {
                                //ReadTypeDef.Led = LED_OnOff;
                                  Rec_value=0x00;
                                  Value10=0x00;
                                        Delay_ms(500);
                                        UART1_Send_DATA(Rec_value);
                          Delay_ms(500);
                          UART1_Send_DATA(0x00);
                          Delay_ms(500);
                      UART1_Send_DATA(0x00);
                Delay_ms(500);
                        }
                        if(WirteTypeDef.Led == LED_OnOn)
                        {
                        //ReadTypeDef.Led = LED_OnOn;
                                Rec_value=0x01;
                                Value10=0x01;
                                Delay_ms(500);
                                UART1_Send_DATA(Rec_value);
                          Delay_ms(500);
                          UART1_Send_DATA(0x00);
                          Delay_ms(500);
                  UART1_Send_DATA(0x00);
              Delay_ms(500);
          }
        }
                        if( (WirteTypeDef.Attr_Flags & (1<<1)) == (1<<1))
        {
          ReadTypeDef.Get_data=WirteTypeDef.Get_data;
                        UART1_Send_DATA(Rec_value);
                        Delay_ms(500);
                        UART1_Send_DATA(0x00);
                        Delay_ms(500);
                  UART1_Send_DATA(0x00);
          Delay_ms(500);
                  
        }
                if( (WirteTypeDef.Attr_Flags & (1<<2)) == (1<<2))
        {
               
                //ReadTypeDef.Money = WirteTypeDef.Money;       
                Money_Value=WirteTypeDef.Money;
                Rec_value=Money_Value>>8;               
                Rec_value=(Money_Value&0x0ff);
               
                        UART1_Send_DATA(Rec_value);
                        Delay_ms(500);
                        UART1_Send_DATA(Rec_value);
                        Delay_ms(500);
                  UART1_Send_DATA(Rec_value);
          Delay_ms(500);
      Money_Value=0;
                        Rec_value=0;               
                  Rec_value=0;
               
}
                       
}
/*****************************************************
* Function Name: GizWits_GatherSensorData();
* Description    : Gather Sensor Data
* Input          : None
* Output         : None
* Return         : None
* Attention               : None
*****************************************************/
//只要在这里改变了数据的值,直接在这里搜集传感器的值
void GizWits_GatherSensorData(void)
       
{
          ReadTypeDef.Led=Value10;
       
          ReadTypeDef.Money=Money_Value;
          ReadTypeDef.Wise=Value11;

          ReadTypeDef.Temperature=Ten_Value+ 13;
          ReadTypeDef.Humidity=Hum_Value;
          ReadTypeDef.power = Loa_Value;
                ReadTypeDef.Sum_elec=Sum_Value;
                ReadTypeDef.Remaining=Rem_Value;       
}
/*****************************************************
* Function Name: KEY_Handle
* Description    : Key processing function
* Input          : None
* Output         : None
* Return         : None
* Attention                      : None
*****************************************************/
void KEY_Handle(void)
{
        uint8_t Key_return =0;       
        Key_return = ReadKeyValue();       
        if(Key_return & KEY_UP)
        {
                if(Key_return & PRESS_KEY1)
                {
//#ifdef PROTOCOL_DEBUG
//                                printf("KEY1 PRESS\r\n");
//#endif               
                }
                if(Key_return & PRESS_KEY2)
                {
//#ifdef PROTOCOL_DEBUG
//                        printf("KEY2 PRESS ,Soft AP mode\r\n");
//#endif       
                        //Soft AP mode, RGB red
                        LED_RGB_Control(255, 0, 0);
                        GizWits_D2WConfigCmd(SoftAp_Mode);
                        NetConfigureFlag = 1;
                }                               
        }

        if(Key_return & KEY_LONG)
        {
                if(Key_return & PRESS_KEY1)
                {
//#ifdef PROTOCOL_DEBUG
//                                printf("KEY1 PRESS LONG ,Wifi Reset\r\n");
//#endif                       
                        GizWits_D2WResetCmd();
                }
                if(Key_return & PRESS_KEY2)
                {
                        //AirLink mode, RGB Green
//#ifdef PROTOCOL_DEBUG
//                                printf("KEY2 PRESS LONG ,AirLink mode\r\n");
//#endif       
                        LED_RGB_Control(0, 128, 0);
                        GizWits_D2WConfigCmd(AirLink_Mode);
                        NetConfigureFlag = 1;
                }
        }
}
/*****************************************************
* Function Name: GizWits_WiFiStatueHandle
* Description    :funcCallbacktion , Judge Wifi statue
* Input          : None
* Output         : None
* Return         : Bit , Attr_Flags
* Attention               :
*****************************************************/
void GizWits_WiFiStatueHandle(uint16_t wifiStatue)
{       
        if(((wifiStatue & Wifi_ConnClouds) == Wifi_ConnClouds) && (NetConfigureFlag == 1))
        {
//                printf("W2M->Wifi_ConnClouds\r\n");
                NetConfigureFlag = 0;
                LED_RGB_Control(0,0,0);
        }
}
/************* (C) COPYRIGHT 2011 STMicroelectronics ****END OF FILE***/

熊总熊 发表于 2016-8-13 12:46:04

本帖最后由 熊总熊 于 2016-8-17 22:17 编辑

先自己给自己顶顶贴,顶顶顶,顶顶顶~~~~~

熊总熊 发表于 2016-8-13 12:46:50

本帖最后由 熊总熊 于 2016-8-17 22:08 编辑

第二章:智慧宿舍的的硬件实现


首先贴上我们的BOM小单单一份(电阻等等小东东就不贴了):

BOM单
       机智云gokit2开发版                X1
       STC的51单片机开发板                X1
       离子式烟雾传感器 HQ-2             X1
       热释电传感器 HC-SR501            X1
       温湿度传感器DHT11                  X1
       电量检测模块                            X1
       关门检测模块                           X1
      指纹模块                                  X1
      摄像头模块                               X1
      声光报警器                               X1            485通信模块                                       X1
      直流电源 12v/5v/3.3V                         X1

   ........还有一些小东东,就不啰啰嗦嗦一一介绍了。


我们用了机智云的开发板,主控用的是一个STM32和机智云的板子做通信,这里先回答一下网友提出的一个问题,为什么还要用一块51的板子干毛?原因就是增加系统的可扩展性,和降低系统的成本,51的板子只负责采集各种传感器的数据,然后通过串口发送给STM32主控,主控接着也是通过串口利用wifi发送给机智云,那为什么不直接用51单片机发送给机智云,这就是所谓的可扩展性,你把51的板子换了其他的板子,只要是串口的数据过来,stm32就能正常接收,系统可兼容其他各种串口的配备。这里的51单片机相当于一个个串口节点。

下面先上几张局部硬件图



如图是温湿度传感器和热释电模块集成在一个节点盒子里,经过PVC线槽直接通过485对外输出信号

接下来是我们的防火检测模块


                                                          细心的网友肯定发现了,里面有两个烟雾传感器模块,一个是离子式,一个是光电的,这两种烟雾传感器一种对浓烟敏感,一种对气体敏感,互补大小火源和浓烟的情景,对烟雾更加的精准,这里分享一个小干货知识,不要直接用烟雾传感器的数字输出,要对传感器的输出模拟量进行检测,然后设置一个阀门值,可以大大的提高烟烟雾传感器的精度和灵敏度 。Get ??哈哈哈
接下来是电表模块。见下图

进入宿舍的用电会经过这个电表的盒子,里面会自动检测实时用电功率,当用电功率大于800W
会自动切断电源,在5分钟后会自动恢复供电,如果半小时内超过3次用电大于800w,那告诉你一个不幸的
消息,下去找宿管阿姨卖萌给你恢复供电吧,这个电表模块也是通过485直接输出,也同时可以通过APP发送的缴费信息
进行电费充值

下面是各种传感器采集之后把各种数据进行汇集到一个51的主控的数据卡 ,见下图



各种传感器的数据汇集到一个汇集卡,然后汇集卡通过串口把数据发送给机智云开发板,然后上次机智云提供的云服务器。
同时数据汇集卡还可以可以连接电脑的USB端,直接在本地的上位机进行数据的显示和控制。




熊总熊 发表于 2016-8-13 12:47:42

本帖最后由 熊总熊 于 2016-8-17 22:38 编辑

                                                第三章:智慧宿舍的的固件实现

接下来,这章主要对固件进行大体的讲解,这个51的程序就不BB了,就是简单的串口收发数据,加上几个简单的外设驱动,比如温湿度,热释电,烟雾传感器的,主要讲讲 51数据卡和机制云开发板和云服务器的通信机制。


然后,肯定是建立数据点,如图所示。我们运用的数据点有下面这些.贴一张图在下面。








这里,肯定要制定一个通信协议,严格按照规定的字节顺序。不然,嘿嘿嘿.....这里提个问题,你知道PC的大端模式和小端模式的区别吗?在机制云的DEMO 中就有用到 . 不说了,直接贴上代码 .


附件怎么传输限制了1000k,求教怎么上传代码???






熊总熊 发表于 2016-8-13 12:49:01

本帖最后由 熊总熊 于 2016-8-17 22:43 编辑

好吧,我还是没能把代码上次上去,直接把重点的几段贴上来 。这是中断函数,接受的串口数据在这里处理
void USART1_IRQHandler(void)   //接收到的数据在这里处理
{
       
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{        
   
   
    USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除标志位
//                if(p0Flag == 1)
//                {
//                        i++;
//                  switch (i)
//                        {
//                        case 1:Rec_AnMeter=USART_ReceiveData(USART1);    //led状态值
//                                               Value12=Rec_AnMeter;
//                                               break;
//                        case 2:Rec_AnMeter=USART_ReceiveData(USART1);    //led状态值
//                                               Value12=Rec_AnMeter;
//                                               break;
//                        case 3:Rec_AnMeter=USART_ReceiveData(USART1);    //led状态值
//                                               Value12=Rec_AnMeter;
//                             break;
//                        case 4:Rec_AnMeter=USART_ReceiveData(USART1);    //led状态值
//                                               Value12=Rec_AnMeter;
//                             break;
//                        case 5:Rec_AnMeter=USART_ReceiveData(USART1);    //充钱值
//                        Rec_AnMeter=Rec_AnMeter<<8;
//                                     break;
//                        case 6:Rec_AnMeter=USART_ReceiveData(USART1);
//                             Money_Value=(Rec_AnMeter&0XFF00)|(Rec_AnMeter&0X00FF);   
//                         break;
//                        case 7:Rec_AnMeter=USART_ReceiveData(USART1);      //热释电/烟雾/关门断电状态值
//                             Value11=Rec_AnMeter;
//                                     break;
//                        case 8:Rec_AnMeter=USART_ReceiveData(USART1);      //温度值
//                             Ten_Value=Rec_AnMeter;
//                         break;
//                        case 9:Rec_AnMeter=USART_ReceiveData(USART1);       //湿度值
//                             Hum_Value=Rec_AnMeter;
//                         break;
//                        case 10:Rec_AnMeter=USART_ReceiveData(USART1);      //电表度数值
//                        Rec_AnMeter=Rec_AnMeter<<8;
//                                      break;
//                        case 11:Rec_AnMeter=USART_ReceiveData(USART1);
//                             Sum_Value=(Rec_AnMeter&0XFF00)|(Rec_AnMeter&0X00FF);
//                         break;
//                        case 12:Rec_AnMeter=USART_ReceiveData(USART1);      //剩余度数值
//                        Rec_AnMeter=Rec_AnMeter<<8;
//                                      break;
//                        case 13:Rec_AnMeter=USART_ReceiveData(USART1);
//                                Rem_Value=(Rec_AnMeter&0XFF00)|(Rec_AnMeter&0X00FF);
//                         break;
//                        case 14:Rec_AnMeter=USART_ReceiveData(USART1);      //负载值
//                       Rec_AnMeter=Rec_AnMeter<<8;
//                                      break;
//                        case 15:Rec_AnMeter=USART_ReceiveData(USART1);
//                                Loa_Value=(Rec_AnMeter&0XFF00)|(Rec_AnMeter&0X00FF);
//                        break;
//                        }
//                        if (i==12)
//                        i=0;
//                }
//                else
//                {
               i++;
                switch (i)
                {       
                        case 1:Rec_AnMeter=USART_ReceiveData(USART1);    //led状态值
                                               Value10=Rec_AnMeter;
                             break;
                        case 2:Rec_AnMeter=USART_ReceiveData(USART1);    //充钱值
                        Rec_AnMeter=Rec_AnMeter<<8;
                                     break;
                        case 3:Rec_AnMeter=USART_ReceiveData(USART1);
                             Money_Value=(Rec_AnMeter&0XFF00)|(Rec_AnMeter&0X00FF);   
                         break;
                        case 4:Rec_AnMeter=USART_ReceiveData(USART1);      //热释电/烟雾/关门断电状态值
                             Value11=Rec_AnMeter;
                                     break;
                        case 5:Rec_AnMeter=USART_ReceiveData(USART1);      //温度值
                             Ten_Value=Rec_AnMeter;
                         break;
                        case 6:Rec_AnMeter=USART_ReceiveData(USART1);       //湿度值
                             Hum_Value=Rec_AnMeter;
                         break;
                        case 7:Rec_AnMeter=USART_ReceiveData(USART1);      //电表度数值
                        Rec_AnMeter=Rec_AnMeter<<8;
                                      break;
                        case 8:Rec_AnMeter=USART_ReceiveData(USART1);
                             Sum_Value=(Rec_AnMeter&0XFF00)|(Rec_AnMeter&0X00FF);
                         break;
                        case 9:Rec_AnMeter=USART_ReceiveData(USART1);      //剩余度数值
                        Rec_AnMeter=Rec_AnMeter<<8;
                                      break;
                        case 10:Rec_AnMeter=USART_ReceiveData(USART1);
                                Rem_Value=(Rec_AnMeter&0XFF00)|(Rec_AnMeter&0X00FF);
                         break;
                        case 11:Rec_AnMeter=USART_ReceiveData(USART1);      //负载值
                       Rec_AnMeter=Rec_AnMeter<<8;
                                      break;
                        case 12:Rec_AnMeter=USART_ReceiveData(USART1);
                                Loa_Value=(Rec_AnMeter&0XFF00)|(Rec_AnMeter&0X00FF);
                        break;
                       
//}
               
        }
                if (i==12)
                        i=0;       
               
   // USART_SendData(USART1,USART_ReceiveData(USART1));
                //Loop until the end of transmission
        //        while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
       
        }
}

/**
* USART2_IRQHandler
*/
void USART2_IRQHandler(void)
{
        uint8_t value = 0;
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//查询标志位
        {
                USART_ClearITPendingBit(USART2,USART_IT_RXNE);//置0
                value = USART_ReceiveData(USART2);
                if(rb_can_write(&u_ring_buff) > 0)
                {
                        rb_write(&u_ring_buff, &value, 1);
                }
        }
}

void USART3_IRQHandler(void)
{
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{

                USART_ClearITPendingBit(USART3,USART_IT_RXNE);
                USART_SendData(USART3,USART_ReceiveData(USART3));
                //Loop until the end of transmission
                while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);               
        }
}







郭庆帅 发表于 2016-8-13 17:34:54

你不是用的32吗为什么用的51单片机

熊总熊 发表于 2016-8-17 22:44:50

郭庆帅 发表于 2016-8-13 17:34
你不是用的32吗为什么用的51单片机

51是数据汇集卡的主控,主要是为了把各种传感器的数据先汇集到51的板子,然后通过51的串口把数据发送给32的主控版,这样增强32的集成功能和扩展性

熊总熊 发表于 2016-8-17 22:52:27

51的汇集卡代码也来一段 /******************************************************
* 【编写时间】: 2016年6月30日
* 【作    者】: 竹石科技:01
* 【版    本】: 1.0
* 【网    站】: http://www.zhushikeji.com/
* 【外部晶振】: 11.0592mhz       
* 【主控芯片】: STC89C52RC
* 【编译环境】: Keil μVisio5       
* 【程序功能】: 智慧宿舍传感器采集集成                                                                                 
* 【使用说明】: 比特率9600,校验位:无 停止位:1
*******************************************************/

/*预处理命令*/
#include <reg52.h>                   //包含单片机寄存器的头文件
#include <stdio.h>
#include "Time.h"
#include "Usart.h"
#include "24C02.h"
#include "LCD1602.h"
#include "Exit.h"                   //包含单片机寄存器的头文件
#include "Tem_Hum.h"                   //包含单片机寄存器的头文件
#define uchar unsigned char
#define uint unsigned int
       
unsigned long Time;         //时间计数       
unsigned long Total;      //当前总度数
unsigned long Last_value; //上次总度数
unsigned long Remain_value; //当前剩余度数
unsigned long        Add_value;    //充值度数
unsigned long Total_value;//暂存值
uint Saraly;
uint Money;//充值的钱
sbit Initial=P3^5;
uint Power;                //功率
uint basket;
uint numble;
uchar Rec;
uchar Send;
uchar Send1;

uint i;
uchar Pulse;               //脉冲计数

uchar Flag;
uint w,v,z,b,c,d,f=0;
sbit OUT=P0^0;
sbit LED_Test =P3^7;
sbit LED_SunShine =P3^3;
sbit beep=P1^5;           //报警
sbit close=P1^2;   //断电
sbit gsign=P1^3;           //检测到干簧管信号
sbit ysign=P1^4;           //检测到烟雾传感器信号
sbit hongwai=P1^0;
uchar dis_code;        // 写入lcd1602缓存区
/*
******************************************************
** 函数名称 : main(void)
** 函数功能 : 主函数
******************************************************
*/



void Charing()
{
        Remain_value=Remain_value+(Money/0.65)*10; ;//新的剩余度数
       
        Last_value=Total_value;      //上次总度数
       
        Total_value=Total*10;
               
        Remain_value=Remain_value-(Total_value-Last_value);//剩余的度数扩大10倍
       
   if(Remain_value<50)
   {
       if(Remain_value>0)
           beep=1;               //报警
       if(Remain_value<=0)
   {
               
                OUT=1;                  //断电          
       }                                
       }
       
}
void main()
{
          EA=0;
          Set_TIM_1 (); //设置定时器
          Set_Exit_0 ();//设置外部中断
          Set_Speed (); //设置波特率 9600
          lcd_init();
           Power=0;
                Total=0;
                Time=0;
       
        close=1;   //断电
        beep=1;           //报警
    gsign=0;           //检测到干簧管信号
    ysign=1;           //检测到烟雾传感器信号
   hongwai=1;    //检测到热释电信号
        Last_value=0;
        Total_value=2550;
        Remain_value=1000;
        Power = read_random(0); //读取24Cxx内容,并输出数据
        delayms(250);
        Total=read_random(1);
        delayms(250);
        receive();   //温度接收
        EA=1;
        LED_Test=0;
        Pulse=0;
        while(1)
        {
          display();
                if(basket==1)
                {
                        LED_Test =~LED_Test;
                       basket=0;
                        Charing();
                  Send1=Remain_value/256;
                        Send1=Remain_value%256;
                        Send1=Total/256;
                        Send1=Total%256;
                  Send_to_STM32();
                }
        if(        Initial==0)
                {       
                        Send1=Remain_value/256;
                        Send1=Remain_value%256;
                        Send1=Total/256;
                        Send1=Total%256;
          Send_to_STM32();
                }


               Alert_a();   //警报        
                Alert_b();   // 红外       
                outage();    //干簧管
               
        }       

}
void into() interrupt 0
{
       
        Pulse++;
        Send1=Pulse;
        if(Time>1000)
        {Power=1125000/Time;}//对应3200imp/kWh电能表
       
        Time=0;
        SDA = 1;
        SCL = 1;
        write_byte(0, Power);

        if(Send1==320)      //对应3200imp/kWh电能表,满32个脉冲为0.01度电
        {
                Pulse=0;
          Total++;
       write_byte(1, Total);
        }
}
void time0() interrupt 1
{
       
        TH0=(65536-1000)/256;                //定时1ms
        TL0=(65536-1000)%256;
       
Time++;
        //Saraly++;

if(Time>112500)//小于10w就不显示
       
       
{
Power=0; //功率为零
Time--;
       
       
}

if(Power>800)

    {
                        OUT=1;//大于800w就断掉
                }
else
          {
          OUT=0;
          }
}

void ser() interrupt 4
{

        RI=0;
        Rec=SBUF;                        //接收数据SBUF,即将计算机的数据接收。       
Send=Rec;
//        Responed();////每收一次数据,做一次应答
        i++;
        if (i==3)
        {
        i=0;
        basket=1;
        Money=(int)(Rec*256)+(int)Rec;
if (Rec==0x01)       
        {LED_SunShine=0;}
        else
        {LED_SunShine=1;}       
       
       }
}

熊总熊 发表于 2016-8-17 22:54:54

本帖最后由 熊总熊 于 2016-8-17 23:14 编辑

                                                                               第四章: 智慧宿舍的的软件实现首先贴几张我们APP的界面图片


智慧宿舍爱屁屁
注册登录界面

这个电话是我们爱屁屁开发的一个帅哥,给马一下嘿嘿黑.


可以通过爱屁屁在线充值电费,水费,热水卡,调用的支付宝的API函数,安全性能刚刚的...


                                                                         戳一下最上面那个灯图案,就可以直接把宿舍的灯给关了。妈妈再也不担心我冬天要起床关灯了....

熊总熊 发表于 2016-8-17 23:15:58

本帖最后由 熊总熊 于 2016-8-17 23:25 编辑

下面对我们针对宿管阿姨推出的客户端的上位机上一波图片

宿管上位机 登录界面


客户端登录界面


数据滚动显示界面



熊总熊 发表于 2016-8-17 23:29:01

本帖最后由 熊总熊 于 2016-8-17 23:34 编辑

   第七章:智慧宿舍的的可扩展性分析




作为一个可扩展性很强的项目,智慧宿舍也采用了数据汇集卡的方式,可以接受其他检测传感器的数据,然后通过串口方式接受和通信,只需要对机智云的数据点进行添加,在主控的固件中添加传感器的信息,就可以稳定,高效,快速的进行传感器的接入,从而对系统进行升级。

-------------------------------------最后面是演示视频链接 。






熊总熊 发表于 2016-8-17 23:35:09

本帖最后由 熊总熊 于 2016-8-24 21:34 编辑

演示视频链接请用力戳这里:http://v.youku.com/v_show/id_XMTY5ODI0OTY2OA==.html播放密码 :zhushi




熊总熊 发表于 2016-8-25 00:22:29

发一波智慧宿舍stm32的代码

C19940506 发表于 2016-8-26 12:43:17

这个项目做好来,还是很有市场的。创意也很不错。

迷之源 发表于 2016-8-26 12:44:34

顶下:lol

萌小姐 发表于 2016-8-26 13:57:06

有创意,有想法。适用于高校

飞翔中的语言 发表于 2016-8-29 14:11:28

挺不错的一个ideal,赞
页: [1] 2
查看完整版本: 【Gokit】之智慧宿舍