物联网智能实验室-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 12481|回复: 5

[项目] 物联网智能实验室

[复制链接]
发表于 2017-10-1 14:39 | 显示全部楼层 |阅读模式
本帖最后由 王顺 于 2017-11-18 14:16 编辑

参赛项目:物联网智能实验室

参赛组员:
4人  
王顺 - 一只程序猿,最近喜欢折腾电子,负责电子设计与arduino程序编写
万大圣 - 某物联网公司产品经理,负责物联网智能实验室改造
向芸花 - 程序媛一枚,本职工作是做物联网前端,现在做物联网智能实验室技术分析。
陈宁佳 - 程序媛一枚,产品设计包装,
外观包装分析,“打酱油”

项目简介:


关于智能实验室的一些管理装置,从我的了解中我觉得还欠缺不少,不够完善,不够智能。就比如在我们的学校中,没次去实验室都要借钥匙,用完了也要还钥匙,还要登记信息,偶尔管理员外出不能还钥匙,以及其他的种种缺陷,针对这一缺陷,我想能不能设计出一个较为完整的智能实验室系统。(现在只是简单的设计,后期将考虑,门禁系统,远程操作云端,智能安防系统,智能电力管理系统,以及远程视频监控系统和具体每个工作台的管理体系等),在本次的初次设计中,我只能完成其中的一部分智能系统,应为小e的资源有限,后期将逐步完善,达到预期的目的。(未经允许严禁抄袭)

接下来我介绍一下本期将实现的功能
1、微信端控制实验室的电力总闸(强电/弱电)
2、实验室语音广播(给实验室成员传达信息)
3、实验室门禁控制(不能算系统,只是简单的控制)
4、实验室环境监测

以上的只是其中的一部分,也是这次参赛的内容,接下来我将如期完成我的功能
团队成员主要由4个人,关于具体的参赛发帖介绍吧!


                           

终于做完了,附上相应教程和作品功能



参赛作品

       各位评委大家好!我们是物联网专业的发烧友们,在这里很荣幸能参加开发快平台举办的智能硬件开发大赛,非常感谢平台给我们一个展示的舞台,以及技术帮助和支持!希望有更多的创客朋友和发烧友,在一起交流切磋,通过一些科技技术的创新来解决身边遇到的实际困难。从平台举办这次的大赛以来的这段时间里,我们算的上是开发快的铁粉了,整合这次的开发快的《物联开发大赛》,我们做了一个物联网智能实验室系统,主要解决了实验室使用的一些常用的管理和监测等。
       关于智能实验室的一些管理装置,从我的了解中我觉得还欠缺不少,不够完善,不够智能。就比如在我们的学校中,每次去实验室都要借钥匙,用完了也要还钥匙,还要登记信息,偶尔管理员外出不能还钥匙,以及其他的种种缺陷,针对这一缺陷,我想能不能设计出一个较为完整的物联网智能实验室系统,正因为想法,所以我们行动了!
       接下来我具体为大家介绍我们作品的硬件demo原型,功能,软件开发,以及我们的团队。


      (一)硬件demo原型
       1、首先我介绍一下我们参赛作品的硬件demo原型,所需要的硬件如下图所示,
       所需要的硬件如下图所示

         

       IIClcd1602                                         RC522 RFID射频 IC卡               拨动开关
        电磁力锁                                          两路5V 12V输出电源                8路继电器
        lcd12864中文显示                            模拟空调风扇                            扬声器   
        自制功放                                          12V转5V 3.3V模块                   arduino nano *2
        12V灯泡                                           人体红外感应模块            小E开发板

        作品的全照。由于我们的控制电路做在模型的顶上,所以难免上面有看起来有点笨厚。


         


        本次作品从初始想法解决问题→比赛报名→设计软件→设计硬件→软硬件调试→成功完成,
        将花费我们半个月的时间,抛洒了我们的热情,但不后悔,最后完成了我们的硬件demo原型,
        感谢开发快平台硬件技术支持和我们的团队队员辛勤劳动的汗水!





         2、接下来我为大家标注了我们作品的硬件执行机构模块

         这是我们作品正面介绍图

         

          智能实验室侧面室内介绍图

         

         作品顶面硬件控制部分介绍图

         



(二)作品功能

       1、上面为大家展示了我们作品的硬件demo原型,那接下来我为大家介绍的是我们的作品到的有什么功能,将详细为大家讲解。
       本次作品设计采用了原有小e开发板的档位选择功能,在不改变原有的基础功能上来嵌入我们的实验室的功能。通过外接arduino开发板来处理小e开发板下发的指令,当然小e开发板我         们也做了相应的固件源码修          改,具体我将在后面软件部分详细介绍,每次换挡过后都要重新启动小e开发板,arduino开发板来获取ADC的值来进入不同的功能块,达到我们的功能        控制。

       本作品原用了小e开发板的4个档模式:原有的功能将通过oled显示,嵌入的功能将通过ldc1602、lcd12864显示。


       先说说门禁系统,主要是提示用户刷卡信息和开门状态

      

        门禁初始化LCD12864显示界面      

         


        刷卡成功信息提醒界面


        一档模式,当全部档位处于关的状态时,led1602显示如下所示



      

      首先我们要把档位开关搬到一档,然后重新启动小e开发板上电(最右边按钮),arduino开发板通过ADC判断进入一档模式,
      这时候lcd1602会显示如下,判断模式,提示教室是否有人;“0”代表没有人,“1”代表有人;


      


   

         


        同时oled的显示功能和原来的小e开发板一样,具有温湿度和人机交互显示功能;由于我们的实验室就是我们的教室,所以我们就刷的固件是智能教室。
                                       


     二档模式,进入二档模式其实和进入一档模式是一样的,先搬档位在给小e开发板上电,然后arduino开发板通过ADC判断进入一档模式,
    这时候lcd1602会如下显示,在二档我们做了一个温湿度显示,时刻监控实验室室内环境。

   

    同时手机微信端可以查看大气压数据

      


     三档模式,档位操作同上;这个档位比较特殊,也是我们作品设计的最复杂的部分,我们利用了原来的小e开发板的多彩灯光的GPIO的三个输出引脚的输出状态,
     通过arduino开发板来读取相应引脚电平的变化来作出相应的开关控制。(具体软件部分介绍)

      

      微信控制端用了小e的led多彩控制界面,我为大家标注了每一个颜色所代表的功能,其余预留区域可以更据代码自行开发,在后期将对微信端的多彩控制界面进行修改,
     达到预期的控制界面;同时lcd1602会显示三档工作的状态,其中数字可以显示0~7八中状态,对应上面的八种控制;比如显示“5”表示,
     工作于八中状态中的第5个状态对应的模拟空调打开;显示“0”,标示所有控制全部断开。

      


四档模式,第四档我们主要利用了小e开发板的语音留言功能,我们将语音留言通过我们自制的功放播放出来,主要面对使用实验室的同学进行广播通知,
省去了人为的传话或者打电话(万一不知道号码)等之内的繁琐的事。功能上我们采用了节约能源模式,当档位开关搬到4档时,自制功放电源打开,
收到语音进行广播(可调音量),不需要广播时(其他档位)断开功放电源,节约能源;同时lcd1602会提示功放电源的开关状态。


      


(三) 软件开发
       1、修改小e固件源码;想到软件,大家都觉得是一件头疼的事,但是只要大家看懂了就没有那么复杂了,软件也是硬件的灵魂,是很重要的部分。接下来我为大家解释一下我的软件编          写流程。
        首先我们去官网下载小e开发板的固件及开发环境,以及下载工具,至于源码怎么用编辑器打开就不用多说了,我用的是Source Insight 3.5,好像有中文版本的;


       Source Insight 3.5 工具



       首先我们在et_user_app.c中找到rgb驱动函数,它主要是控制多彩灯GPIO的,
      
      然后我们根据函数跳进去,在RGB_light.c中,把RGB_light_set_color屏蔽掉,然后再自己写一个函数


  • /******************************************************************************
  • * FunctionName : RGB_light_set_color
  • * Description  : set pwm period
  • * Parameters   : uint16 freq : 100hz typically
  • * Returns      : NONE
  • *******************************************************************************/
  • /*void ICACHE_FLASH_ATTR
  • RGB_light_set_color(et_uint8 r, et_uint8 g, et_uint8 b)
  • {
  •         et_uint32 period = RGB_light_get_period();
  •         et_uint32 max_duty = PWM_DUTY_MAX(period);
  • #ifdef USER_PRINT_DEBUG
  •         printf("set color: R(%02x) G(%02x) B(%02x)\r\n", r, g, b);
  • #endif
  •         // red
  •         if (0x41 == r)
  •                 r = 0x05;
  •         else if ((r - 0x0c) > 0)
  •                 r = r - 0x0c;
  •         else if (r == 0)
  •                 ;
  •         else
  •         {
  •                 if (0x03 == r)
  •                         r = 0;
  •                 else
  •                         r = 0xff - 0x0c + r;
  •         }
  •         // green
  •         if (0xc1 == g)
  •                 g = 0x81;
  •         else if (0x7f == g)
  •                 g = 0x3f;
  •         else if (0xc6 == g)
  •                 g = 0xc5;
  •         else if (0x28 == g)
  •                 g = 0;
  •         else if ((g - 0x0c) > 0)
  •                 g = g - 0x0c;
  •         else if (g == 0)
  •                 ;
  •         else
  •                 g = 0xff - 0x0c + g;
  •         // blue
  •         if (0xfa == b)
  •                 b = 0x9f;
  •         else if (0x69 == b)
  •                 b = 0xf4;
  •         else if (0xe2 == b)
  •                 b = 0x5d;
  •         else if ((b - 0x0c) > 0)
  •                 b = b - 0x0c;
  •         else if (b == 0)
  •                 ;
  •         else
  •         {
  •                 if (0x0a == b)
  •                         b = 0x0;
  •                 else if (0x0c == b)
  •                         ;
  •                 else
  •                         b = 0xff - 0x0c + b;
  •         }
  • #ifdef RGB_COMMON_GND
  •         RGB_light_set_duty(RGB_TO_DUTY(r, max_duty), LIGHT_RED);
  •         RGB_light_set_duty(RGB_TO_DUTY(g, max_duty), LIGHT_GREEN);
  •         RGB_light_set_duty(RGB_TO_DUTY(b, max_duty), LIGHT_BLUE);
  • #else
  •         RGB_light_set_duty(RGB_TO_DUTY((et_uint8)~r, max_duty), LIGHT_RED);
  •         RGB_light_set_duty(RGB_TO_DUTY((et_uint8)~g, max_duty), LIGHT_GREEN);
  •         RGB_light_set_duty(RGB_TO_DUTY((et_uint8)~b, max_duty), LIGHT_BLUE);
  • #endif
  •         RGB_light_start();
  • }
  • /******************************************************************************
  • * FunctionName : RGB_light_init
  • * Description  : light demo init, mainy init pwm
  • * Parameters   : none
  • * Returns      : none
  • *******************************************************************************/

[color=rgb(224, 51, 0) !important]复制代码



       整个函数里面的内容全部屏蔽掉,然后就在上面在写一个一样的函数;


  • #define GPIO_OUTPUT_SET(gpio_no, bit_value) \
  • gpio_output_conf(bit_value<<gpio_no, ((~bit_value)&0x01)<<gpio_no, 1<<gpio_no, 0)
  • 上面定义部分这个必须要加,才能配置GPIO引脚为输出模式。
  • RGB_light_set_color(et_uint8 r, et_uint8 g, et_uint8 b)
  • {
  •         int flag=0;
  •         //直接控制IO
  •         // red
  •         os_printf("mode error, r = %d\n", r);
  •         os_printf("mode error, g = %d\n", g);
  •         os_printf("mode error, b = %d\n", b);
  •         if (0xfd == r && 0x28 == g && 0x0a == b)//大红
  •         {
  •                 GPIO_OUTPUT_SET(PWM_0_OUT_IO_NUM, LOGIC_LL);//100
  •                 GPIO_OUTPUT_SET(PWM_1_OUT_IO_NUM, LOGIC_HL);
  •                 GPIO_OUTPUT_SET(PWM_3_OUT_IO_NUM, LOGIC_HL);
  •                 //os_printf("mode error, r = %d\n", r);
  •                 flag=1;
  •         }
  •         if (r ==0x00 && 0xd1 == g && b == 0x69)//绿色
  •         {
  •                 GPIO_OUTPUT_SET(PWM_0_OUT_IO_NUM, LOGIC_HL);//010
  •                 GPIO_OUTPUT_SET(PWM_1_OUT_IO_NUM, LOGIC_LL);
  •                 GPIO_OUTPUT_SET(PWM_3_OUT_IO_NUM, LOGIC_HL);
  •                 //os_printf("mode error, g = %d\n", g);
  •                 flag=1;
  •         }
  •         if (r == 0x41 && g ==0x00 && 0xfa == b)//蓝(靛青)
  •         {
  •                 GPIO_OUTPUT_SET(PWM_0_OUT_IO_NUM, LOGIC_HL);//001
  •                 GPIO_OUTPUT_SET(PWM_1_OUT_IO_NUM, LOGIC_HL);
  •                 GPIO_OUTPUT_SET(PWM_3_OUT_IO_NUM, LOGIC_LL);
  •                 //os_printf("mode error, b = %d\n", b);
  •                 flag=1;
  •         }
  •         if(0xe6 == r && g== 0x1c && b ==0xbe)//玖红
  •         {
  •                 GPIO_OUTPUT_SET(PWM_0_OUT_IO_NUM, LOGIC_LL);//111
  •                 GPIO_OUTPUT_SET(PWM_1_OUT_IO_NUM, LOGIC_LL);
  •                 GPIO_OUTPUT_SET(PWM_3_OUT_IO_NUM, LOGIC_LL);
  •                 //os_printf("mode error, b = %d\n", b);
  •                 flag=1;
  •         }
  •         if(0x96 == r && g== 0x00 && b ==0xff)//紫色
  •         {
  •                 GPIO_OUTPUT_SET(PWM_0_OUT_IO_NUM, LOGIC_HL);//011
  •                 GPIO_OUTPUT_SET(PWM_1_OUT_IO_NUM, LOGIC_LL);
  •                 GPIO_OUTPUT_SET(PWM_3_OUT_IO_NUM, LOGIC_LL);
  •                 //os_printf("mode error, b = %d\n", b);
  •                 flag=1;
  •         }
  •         if(0x06 == r && g== 0x76 && b ==0xf4)//钻蓝
  •         {
  •                 GPIO_OUTPUT_SET(PWM_0_OUT_IO_NUM, LOGIC_LL);//101
  •                 GPIO_OUTPUT_SET(PWM_1_OUT_IO_NUM, LOGIC_HL);
  •                 GPIO_OUTPUT_SET(PWM_3_OUT_IO_NUM, LOGIC_LL);
  •                 //os_printf("mode error, b = %d\n", b);
  •                 flag=1;
  •         }
  •         if(0x03 == r && g== 0xc6 && b ==0xe2)//湖蓝
  •                 {
  •                 GPIO_OUTPUT_SET(PWM_0_OUT_IO_NUM, LOGIC_LL);//110
  •                 GPIO_OUTPUT_SET(PWM_1_OUT_IO_NUM, LOGIC_LL);
  •                 GPIO_OUTPUT_SET(PWM_3_OUT_IO_NUM, LOGIC_HL);
  •                 //os_printf("mode error, b = %d\n", b);
  •                 flag=1;
  •                 }
  •         if(flag == 0)//关闭
  •         {
  •                 GPIO_OUTPUT_SET(PWM_0_OUT_IO_NUM, LOGIC_HL);//000
  •                 GPIO_OUTPUT_SET(PWM_1_OUT_IO_NUM, LOGIC_HL);
  •                 GPIO_OUTPUT_SET(PWM_3_OUT_IO_NUM, LOGIC_HL);
  •                 flag=1;
  •         }
  •         }


[color=rgb(224, 51, 0) !important]复制代码



大家看到这里,想必都已经看清楚我的思路了吧!这段程序是收到手机微信端发来的rgb的值进行的一个判断,然后再配置对应的GPIO口的一个高低电平状态,
        接下来我们要去Pwm.h中去定义一下我们要输出的GPIO口的引脚,


                  

定义好了,我们还要去把原来默认的GPIO口的PWM输出去屏蔽了,不然一上电,配置的GPIO就有PWM输出,我们要去掉他默认的输出功能,现在好了,固件就修改到这里,至于oled显示自定义显示文字,我就不说了,太简单了,论坛有教程,接下来就是arduino开发板要做的事情了。

2、写代码获取GPIO脚电平状态。首先我会想到要用arduino开发板来完成GPIO的状态读取,因为arduino开发简单,时间短,易上手,自己写的代码主要有两个个功能,第一读取GPIO状态,第二对GPIO的状态进行相应的控制,第三门禁系统控制;部分源码如下所示:

  • /**********************************************
  • 函数名:Pattern_Zero
  • 描  述:小E开发板工作模式的判断
  • 输  入:
  • 输  出:
  • 返  回:
  • 注  意:
  • ***********************************************/
  • void Pattern_Zero(void)
  • {
  •   if(val<=10)//不拨动档位0000
  •   {
  •         mode_4=1;
  •         AUDIO_state(1);
  •         RGB_state_Close();
  •         lcd.setCursor(0, 1);
  •         lcd.print("Choice Pattern  ");   //选择模式
  •   }
  •   else if(val<=60)//四档功放电源控制0001
  •   {
  •         mode_3=1;
  •         RGB_state_Close();
  •         AUDIO_state(0);
  •         lcd.setCursor(0, 1);
  •         lcd.print("frequency open  ");//功放电源开关打开
  •   }
  •   else if(val<=110)//三档RGB模式0010
  •   {
  •         mode_2=1;
  •         AUDIO_state(1);
  •         RGB_state();
  •   }
  •   else if(val<=160)//二档温湿度显示0100
  •   {
  •         mode_1=1;
  •         AUDIO_state(1);
  •         RGB_state_Close();
  •         DHT11_state();
  •   }
  •   else if(val<=215)//一档待定1000
  •   {
  •         AUDIO_state(1);
  •         mode_0=1;
  •         RGB_state_Close();
  •         people_judge();
  •   }
  • }


[color=rgb(224, 51, 0) !important]复制代码





最后,作品的全部质料我将全部上传百度云盘,视频质料等待比赛完毕一并上次!

(四)团队介绍
        我们都知道团队应该是Team,而不是Group,也就是说团队不仅仅是一群人的简单的组合,而一定是不同成员有分工、有协同,是一个有机的整体,这个就叫做协同合作、相互支持。团队成员根据工作需要,根据个人特长,合理分工,有效协同,一起把事情做好。团队成员之间协同合作、互相支持,就是要使1+1>2,并且不断改进提高,使效能(效率+效果)达到最大化,1+1能不能=3,能不能=4,甚至更大,就看我们在团队的工作中如何更有效的协作和互相支持,这需要不断的训练。
        我们的团队成员,王顺、万大圣、杨琴娟、邹栋才,他们都来自物联网工程,其所涉及的专业知识面很广泛。诸如:模拟电子技术、数字电子技术、通信原理、物联网概论、C语言、单片机应用与编程、PCB电路板绘制、多媒体技术、微信开发、CAD绘图等,通过我们的辛勤劳动,做事认真负责,思虑周详,良好的团队凝聚力和向心力。“相对分工,绝对合作”,取长补短,共同完成项目作品。
        以下是我们的作品制作过程的照片

                          
             
                          



169RP`6DPCNSHSYUV$`@ZBS.png

到此整个智能实验室系统的制作就完成啦,应该说整个过程并没有任何复杂的编程,经过封装的数据接口只需简单的几句函数就能完成读取。由这个项目的启发,我发现我们的产品还是很有市场前景的,恰好赶上物联网时代的到来,智能实验室系统美好的前景让我们拭目以待吧!

视频连接 http://v.youku.com/v_show/id_XMzExODc5Nzc2OA==.html?spm=a2h3j.8428770.3416059.1

质料百度盘  http://pan.baidu.com/s/1i563LHj

31FB86A69222581AA7B065F210F2BA6A.jpg





发表于 2017-10-2 08:30 | 显示全部楼层
谢谢分享学习一下
发表于 2017-10-19 23:01 | 显示全部楼层
1.感谢对社区比赛的支持,演示视频开头需要添加大赛宣传海报,请补充完整。具体要求请参考:
http://www.arduino.cn/thread-47517-1-1.html
2.开发者积分和贡献值已发放,请点击以下链接领取纪念衫并参与抽奖~
http://www.arduino.cn/thread-48132-1-1.html
3.比赛结果会在11.15号前公布,请耐心等待。
发表于 2020-7-7 14:07 | 显示全部楼层
有点难度啊,兄弟
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-9-20 22:47 , Processed in 0.079757 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表