收藏官网首页
查看: 23572|回复: 3

GoKit案例:机智云宠物屋改空气质量检测仪

140

主题

418

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
12646
跳转到指定楼层
楼主
发表于 2019-11-22 09:42:18 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
汉枫LPB120模块
全功能机智云宠物屋加MQ135空气质量检测
硬件:
机智云宠物屋gokit3功能板(ESP12F),电路图参考http://club.gizwits.com/thread-2889-1-1.html
       MQ135空气质量检测传感器(对氨气、硫化物、苯系蒸汽的灵敏度高)
本次教程实现全功能宠物屋(包含红外遮挡,温湿度,全彩灯,电机),实现空气质量检测(包含有害气体浓度和空气质量)
MQ135扩展外接电路,USB供电5V,经过二极管之后实际电压就是4.93V左右,根据电阻分压将传感器电压分压到0-1V(10位ADC对应0-1024)。根据MQ135传感器手册,我们对分压后的电压的参数对应空气质量划分如下:
优:0-200
良:201-400
中:401-600
差:601-1024
                              
在云端创建一个新的产品:
创建产品过后点击左侧数据点,依次点击管理,选择产品数据点模板
选择Gokit demo,然后点击添加
导入了demo数据点之后我们需要再创建如下两个数据点
到此我们数据点就创建好了,创建好记得点击最上面的应用,才会生效,接下来我们点击左侧基本信息,复制里面的Product Secret内容,然后在

点击左侧MCU开发,按照1234生成SOC代码。生成号代码之后下载到电脑之后解压。

然后我们下载开发环境,由于网上开发环境很多,很多新手难找,在此处我将开发环境打包放在QQ群文件,可以到QQ群438373554里面去下载,QQ群文件比较多,按照截图找。
下载好软件之后一定要注意,先解压,将解压过后软件复制到非中文路径下,不能包含中文,如果有中文需要修改成纯英文。否则软件不可用。
解压来打开桌面上的快捷方式。
接下来我们导入下载好的代码,在左侧项目栏右键,然后点击导入
选择Makefile项目,下一步

选择项目所在路径,这儿一定不要选错了,选错不能编译,看清除2哪儿,一定不要选错了,然后确定选中
最顶上的项目名称可以修改一下,然后选择Cygwin GCC编译器之后,点Finish即可导入项目

然后展开项目,选择根目录下面的Makefile,修改编译相关的信息。修改成下面的,自己动手打,别在这儿复制代码,到时候编码不一样会报错就只能重新解压再导入项目才能解决。以后所介绍到的所有代码都只能手动打,不能复制。修改完之后保存。
BOOT?=new
APP?=1
SPI_SPEED?=40
SPI_MODE?=QIO
SPI_SIZE_MAP?=6
接下来我们解压下载好的固件(GoKit_SoC_esp8266_V03000003测试固件及开发资源2017072815.zip),需要进行驱动移植,解压后将驱动库代码目录下的“.c”驱动文件全部拷贝到我们的项目 SOC_esp8266_source\app\driver 目录下(复制了粘贴过去就行)
将驱动库代码目录下的“.h”驱动文件拷贝到SOC_ESP8266_source\app\include\driver目录下
然后回到我们的IDE软件,项目上右键,刷新


接下来就是代码修改了,接下来我们要进行代码的修改:在代码中添加相应的函数调用。
首先在在SOC_ESP8266_source\app\user\user_main.c文件中添加各驱动库的头文件。
//新增的头文件
#include"driver/hal_infrared.h"
#include"driver/hal_motor.h"
#include"driver/hal_rgb_led.h"
#include "driver/hal_temp_hum.h"
接下来我们往下拉,找到LOCALvoid ICACHE_FLASH_ATTRkeyInit(void)函数,在里面添加各sensor的初始化。
    //新增的各sensor的初始化
   ///< 新添加代码: RGBLED初始化
   rgbGpioInit();
   rgbLedInit();
   ///< 新添加代码: 电机初始化
   motorInit();
   motorControl(0);
   ///< 新添加代码: 温湿度初始化
   dh11Init();
   ///< 新添加代码: 红外初始化
   irInit();
找到key2ShortPress()函数与key2LongPress( )函数中添加长/短按key2时的LED点亮代码
rgbControl(250, 0, 0); ///< 新添加代码: Soft AP mode, RGB red
rgbControl(0, 250, 0); ///< 新添加代码: AirLink mode, RGB Green

在SoC_ESP8266_32M_source\app\Gizwits\gizwits_product.c文件开头添加
#defineUSER_TIME_MS 100 ///< 新添加代码: 更改定时器间隔为100ms
#defineTH_TIMEOUT (1000 / USER_TIME_MS)///< 新添加代码: 温湿度采集间隔为1S(1000ms)
#defineINF_TIMEOUT (500 / USER_TIME_MS)///< 新添加代码: 红外采集间隔为500ms

继续该文件程序往下找到voidICACHE_FLASH_ATTR userHandle(void),在代码里面添加如下代码
       uint8_t ret = 0;
       uint8_t curTemperature = 0;
       uint8_t curHumidity = 0;
       uint8_t curIr = 0;
       static uint8_t thCtime = 0;
       static uint8_t irCtime = 0;
       LOCAL uint32_t MQ125_v=0;
       thCtime++;
       irCtime++;
       ///< 新添加代码: 红外传感器数据获取
       if(INF_TIMEOUT < irCtime)
       {
              irCtime = 0;
              curIr = irUpdateStatus();
              currentDataPoint.valueInfrared =curIr;
       }
       ///< 新添加代码: 温湿度传感器数据获取
       if(TH_TIMEOUT < thCtime)
       {
              MQ125_v=system_adc_read();
              thCtime = 0;
              ret = dh11Read(&curTemperature,&curHumidity);
              if(0 == ret)
              {
                     currentDataPoint.valueTemperature=curTemperature;
                     currentDataPoint.valueHumidity=curHumidity;
              }
              else GIZWITS_LOG ("@@@@dh11Read error !\n");
              currentDataPoint.valueMQ135 =MQ125_v;
              if(MQ125_v <= 200)currentDataPoint.valueair_quality = 0;
              else if(MQ125_v >200&&MQ125_v <= 400) currentDataPoint.valueair_quality = 1;
              else if(MQ125_v >400&&MQ125_v <= 600) currentDataPoint.valueair_quality = 2;
              elsecurrentDataPoint.valueair_quality = 3;
       }

代码往上面找到gizwitsEventProcess,在if(0x01 == currentDataPoint.valueLED_OnOff)后面代码修改成如下
            GIZWITS_LOG("Evt:EVENT_LED_OnOff %d \n", currentDataPoint.valueLED_OnOff);
            if(0x01 ==currentDataPoint.valueLED_OnOff)
            {
                   rgbControl(254,0,0); ///< 新添加代码: 对应开启红灯
            }
            else
            {
                   rgbControl(0,0,0); ///< 新添加代码: 对应关闭红灯
            }
            break;
        case EVENT_LED_Color:
            currentDataPoint.valueLED_Color =dataPointPtr->valueLED_Color;
            GIZWITS_LOG("Evt:EVENT_LED_Color %d\n", currentDataPoint.valueLED_Color);
           switch(currentDataPoint.valueLED_Color)
            {
            case LED_Color_VALUE0:
                   rgbControl(currentDataPoint.valueLED_R,currentDataPoint.valueLED_G,currentDataPoint.valueLED_B);///<新添加代码: 对应设置LED组合色
                break;
            case LED_Color_VALUE1:
                   rgbControl(254,254,0); ///< 新添加代码: 对应LED组合颜色‐黄色
                break;
            case LED_Color_VALUE2:
                   rgbControl(254,0,70); ///< 新添加代码: 对应LED组合颜色‐紫色
                break;
            case LED_Color_VALUE3:
                   rgbControl(238,30,30); ///< 新添加代码: 对应LED组合颜色‐粉色
                break;
            default:
                break;
            }
            break;
        case EVENT_LED_R:
            currentDataPoint.valueLED_R=dataPointPtr->valueLED_R;
            GIZWITS_LOG("Evt:EVENT_LED_R%d\n",currentDataPoint.valueLED_R);
            rgbControl(currentDataPoint.valueLED_R,currentDataPoint.valueLED_G,currentDataPoint.valueLED_B);///<新添加代码: 对应设置LED组合色
            break;
        case EVENT_LED_G:
            currentDataPoint.valueLED_G=dataPointPtr->valueLED_G;
            GIZWITS_LOG("Evt:EVENT_LED_G%d\n",currentDataPoint.valueLED_G);
           rgbControl(currentDataPoint.valueLED_R,currentDataPoint.valueLED_G,currentDataPoint.valueLED_B);///<新添加代码: 对应设置LED组合色
            break;
        case EVENT_LED_B:
            currentDataPoint.valueLED_B=dataPointPtr->valueLED_B;
            GIZWITS_LOG("Evt:EVENT_LED_B%d\n",currentDataPoint.valueLED_B);
           rgbControl(currentDataPoint.valueLED_R,currentDataPoint.valueLED_G,currentDataPoint.valueLED_B);///<新添加代码: 对应设置LED组合色
            break;
        case EVENT_Motor_Speed:
            currentDataPoint.valueMotor_Speed=dataPointPtr->valueMotor_Speed;
           GIZWITS_LOG("Evt:EVENT_Motor_Speed%d\n",currentDataPoint.valueMotor_Speed);
            motorControl(currentDataPoint.valueMotor_Speed);///<新添加代码: 对应设定电机转速
            break;

继续往下找到WIFI_CON_ROUTER设置连接路由器关闭RGB
rgbControl(0,0, 0); ///< 新添加代码: 连接路由后关闭LED灯

到此代码修改完成,保存所有文件之后再项目上点击右键,编译,等待便已完成生成对应固件。如果没成成,恭喜你成功干出了BUG。

接下来我们需要把程序下载到8266里面。首先GOKIT3把key拔到GND,接好旁边的串口线先接到USB转TTL(TX-RX RX-TXGND-GND),然后把USB接手机充电器。打开下载软件(下载地址https://www.espressif.com/sites/default/files/tools/flash_download_tools_v3.6.7.zip,下载过后解压)
将软件参数设置如下,选择编译好的固件(对应的地址别填写错了)
点击START开始下载,如果一直卡在等待说明你key1没有拔到GND那一边,拔过去复位按键(reset)按一下,下载成功如图所示。

接下来,把GND拔回来到key。然后按复位,程序就开始运行了。
打开机智云APP(下载页面https://download.gizwits.com/zh-cn/p/98/99),短按一下开发板上面的中间一个按键(红灯亮),点击手机APP右上角加号,选择热点配置,在跳出页面选择你家里面路由器wifi,输入wifi密码之后下一步,选择乐鑫,再点击我已完成上述步骤,点一下发现设备里面的设备,即可开始配网,如果没有设备,检查开发板红灯是否点亮。没问题的话过一会儿就是绑定成功点进去就可以开始是用你的新设备了

2

主题

16

帖子

430

积分

中级会员

Rank: 3Rank: 3

积分
430
板凳
发表于 2020-4-6 01:35:17 | 只看该作者
你好,可以发源代码么,感觉有好多问题没有理解。希望可以深入的了解一下,最近想掌握ADC的用法。而且esp8266只有一个ADC引脚是不是意味着只能用一个ADC的模块了。可不可以用其他的引脚连接呢!

4

主题

10

帖子

517

积分

高级会员

Rank: 4

积分
517
地板
发表于 2020-5-4 17:47:25 | 只看该作者
你好,可以给一份源码吗,还有,气体检测模块需要驱动文件,我找了好久都没找的,希望博主帮个忙
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

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