ESP8266 NodeMcu机智云SOC方案控制4路继电器+DHT11温湿度上报

本文主要是介绍ESP8266 NodeMcu机智云SOC方案控制4路继电器+DHT11温湿度上报,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、实现功能

该方案可以实现物理按键KEY和远程APP同步控制四路LED,其中KEY1长按进入SOFTAP模式,KEY1短按控制LED1,KEY2长按进入AIRLINK模式,KEY2短按控制LED2,KEY3短按控制LED3,KEY4短按控制LED4。GPIO5端口用于读取DHT11温湿度传感器的值(这里有个坑需要跟大家讲下)。(原计划通过长按KEY3控制LED全开,长按KEY4控制LED全关,尝试了很多办法会出错,如果找到比较稳定的好办法会给大家分享。LED本来是4路继电器,还没到所以就凑合下,反正原理都一样,哈哈)

二、电路图

1、电路原理图

在这里插入图片描述

2.实物连接图

在这里插入图片描述

三、数据点及代码修改

1.数据点

LED_1		LED_2		LED_3		LED_4
数据点1 LED_1
数据点2 LED_2
数据点3 LED_3
数据点4 LED_4
数据点5 temperature
数据点6 humidity
下面是大家喜闻乐见的干货部分,哈哈。

首先是把DHT11的驱动配置好
hal_temp_hum.h放到/app/include/driver文件夹内
hal_temp_hum.c放到/app/driver文件夹内
没有这个驱动文件可以到机智云下载中心,找到GoKit MCU示例工程,在对应的文件夹内有相应的驱动文件。

2.代码修改

(1)gizwits_protocol.h

在这里插入图片描述
如果有朋友懒得改程序,想直接看到效果,最简单的办法就是数据点和我上面的设置的一样,然后直接改上面覆盖的两个地方,我的程序会给大家链接,可供参考。但是不建议这么做,这不利于理解程序的功能,运行机制。

(2)gizwits_protocol.h

下面红框中的值最好改成100或者50,不改的话控制延时有1s,我感觉延时太大挺别扭的。
在这里插入图片描述

(3)gizwits_product.h

定义一个数组用于储存4个LED的状态
extern bool statu[4];
在这里插入图片描述

(4)gizwits_product.c

首先加入DHT11的头文件(userhand()需要调用),然后是定义的数组statu[4]初始化
#include “driver/hal_temp_hum.h”
bool statu[4] = {0};
LED状态扫描、DHT11数值读取 定义扫描、读取时间间隔
#define USER_TIME_MS 100
#define LED_TIMEOUT (100/USER_TIME_MS 100) // LED状态扫描,100ms扫描一次
#define DHT_TIMEOUT (1000/USER_TIME_MS 100) // DHT11数值读取,1s扫描一次
(扫描、读取其实是一个意思,可能用词不准,见谅)
在这里插入图片描述
改gizwitsEventProcess()程序
先说下数组statu[ ]和LED数据点的对应关系
statu[0]=LED_1
statu[1]=LED_2
statu[2]=LED_3
statu[3]=LED_4
也就是说statu[0]=1是LED_1就开
以下面gizwitsEventProcess()里的程序为例
case EVENT_LED_1 : //LED_1为数据点
currentDataPoint.valueLED_1 = dataPointPtr->valueLED_1;
GIZWITS_LOG(“Evt: EVENT_LED_1 %d \n”, currentDataPoint.valueLED_1);
if(0x01 == currentDataPoint.valueLED_1)
{
statu[0]=1;// 开灯
}
else
{
statu[0]=0;//关灯
}
break;
以此类推

数据点LED_1
在这里插入图片描述
数据点LED_4
在这里插入图片描述
由于程序太长,数据点LED_2、LED_3就不截图了。

最后改userHandle()程序
首先添加以下代码,这里的代码是将软件世界和硬件世界连接的桥梁,将ESP8266的引脚和数组statu[ ]关联,数组statu[ ]就是这个桥。个人理解,不喜勿喷,哈哈。
GPIO_OUTPUT_SET(GPIO_ID_PIN(14),!statu[0]);
GPIO_OUTPUT_SET(GPIO_ID_PIN(12),!statu[1]);
GPIO_OUTPUT_SET(GPIO_ID_PIN(13),!statu[2]);
GPIO_OUTPUT_SET(GPIO_ID_PIN(15),!statu[3]);
在这里插入图片描述

实现定时LED状态扫描、DHT11数值读取
下面的是C语言基础,应该比较容易看懂
uint8_t ret=0;
uint8_t curTemperature=0;
uint8_t curHumidity=0;
static uint8_t dhttime=0;
static uint8_t ledtime=0;
dhttime++;
ledtime++;
if(DHT_TIMEOUT<dhttime)
{
dhttime=0;
ret=dh11Read(&curTemperature,&curHumidity);
if(0==ret)
{
currentDataPoint.valuetemperature=curTemperature;
currentDataPoint.valuehumidity=curHumidity;
}
else
{
os_printf("@@@ dh11Read error! \n");
}
}
if(LED_TIMEOUT<ledtime)
{
ledtime=0;
currentDataPoint.valueLED_1=statu[0];
currentDataPoint.valueLED_2=statu[1];
currentDataPoint.valueLED_3=statu[2];
currentDataPoint.valueLED_4=statu[3];
}
在这里插入图片描述
在这里插入图片描述
最后就是数据点的初始化程序userInit()
这个会自动生成,把注释去掉,把值都改为0
currentDataPoint.valueLED_1 = 0;
currentDataPoint.valueLED_2 = 0;
currentDataPoint.valueLED_3 = 0;
currentDataPoint.valueLED_4 = 0;
currentDataPoint.valuetemperature = 0;
currentDataPoint.valuehumidity = 0;
在这里插入图片描述

(5)user_main.c

首先填DHT11的头文件
#include “driver/hal_temp_hum.h”

接下来是4个按键的定义
#define GPIO_KEY_NUM 4 ///< Defines the total number of key members

#define KEY_0_IO_MUX PERIPHS_IO_MUX_GPIO0_U ///< ESP8266 GPIO function
#define KEY_0_IO_NUM 0 ///< ESP8266 GPIO number
#define KEY_0_IO_FUNC FUNC_GPIO0 ///< ESP8266 GPIO name

#define KEY_1_IO_MUX PERIPHS_IO_MUX_GPIO2_U ///< ESP8266 GPIO function
#define KEY_1_IO_NUM 2 ///< ESP8266 GPIO number
#define KEY_1_IO_FUNC FUNC_GPIO2 ///< ESP8266 GPIO name

#define KEY_2_IO_MUX PERIPHS_IO_MUX_U0RXD_U ///< ESP8266 GPIO function
#define KEY_2_IO_NUM 3 ///< ESP8266 GPIO number
#define KEY_2_IO_FUNC FUNC_GPIO3 ///< ESP8266 GPIO name

#define KEY_3_IO_MUX PERIPHS_IO_MUX_U0TXD_U ///< ESP8266 GPIO function
#define KEY_3_IO_NUM 1 ///< ESP8266 GPIO number
#define KEY_3_IO_FUNC FUNC_GPIO1 ///< ESP8266 GPIO name
在这里插入图片描述
定义按键的功能(长按、短按)
/**

  • Key1 key short press processing
  • @param none
  • @return none
    */

LOCAL void ICACHE_FLASH_ATTR key1ShortPress(void)
{
if(statu[0]=!statu[0])
GIZWITS_LOG("#### KEY1 short press ,LED_1 ON/OFF \n");

}

/**

  • Key1 key presses a long press

  • @param none

  • @return none
    */
    LOCAL void ICACHE_FLASH_ATTR key1LongPress(void)
    {

    GIZWITS_LOG("#### key1 long press, SOFTAP MODE\n");

    gizwitsSetMode(WIFI_SOFTAP_MODE);
    }

/**

  • Key2 key to short press processing
  • @param none
  • @return none
    */
    LOCAL void ICACHE_FLASH_ATTR key2ShortPress(void)
    {
    if(statu[1]=!statu[1])
    GIZWITS_LOG("#### key2 short press, LED_2 ON/OFF \n");

}

/**

  • Key2 button long press

  • @param none

  • @return none
    */
    LOCAL void ICACHE_FLASH_ATTR key2LongPress(void)
    {
    GIZWITS_LOG("#### key2 long press, AIRLINK MODE\n");

    gizwitsSetMode(WIFI_AIRLINK_MODE);
    }

/**

  • Key3 key to short press processing
  • @param none
  • @return none
    */

LOCAL void ICACHE_FLASH_ATTR key3ShortPress(void)
{
if(statu[2]=!statu[2])
GIZWITS_LOG("#### key3 short press, LED_3 ON/OFF \n");

}

/**

  • Key3 button long press
  • @param none
  • @return none
    */
    LOCAL void ICACHE_FLASH_ATTR key3LongPress(void)
    {
    GIZWITS_LOG("#### key3 long press, ALL_LED ON \n");

}

/**

  • Key4 key to short press processing
  • @param none
  • @return none
    */

LOCAL void ICACHE_FLASH_ATTR key4ShortPress(void)
{
if(statu[3]=!statu[3])
GIZWITS_LOG("#### key4 short press, LED_4 ON/OFF \n");

}

/**

  • Key4 button long press
  • @param none
  • @return none
    */
    LOCAL void ICACHE_FLASH_ATTR key4LongPress(void)
    {
    GIZWITS_LOG("#### key4 long press, ALL_LED OFF \n");

}
由于程序太长,且全部代码都给出,就只做一个截图
在这里插入图片描述
再就是按键初始化keyInit(void)

LOCAL void ICACHE_FLASH_ATTR keyInit(void)
{
singleKey[0] = keyInitOne(KEY_0_IO_NUM, KEY_0_IO_MUX, KEY_0_IO_FUNC,
key1LongPress, key1ShortPress);

singleKey[1] = keyInitOne(KEY_1_IO_NUM, KEY_1_IO_MUX, KEY_1_IO_FUNC,
key2LongPress, key2ShortPress);

singleKey[2] = keyInitOne(KEY_2_IO_NUM, KEY_2_IO_MUX, KEY_2_IO_FUNC,
key3LongPress, key3ShortPress);

singleKey[3] = keyInitOne(KEY_3_IO_NUM, KEY_3_IO_MUX, KEY_3_IO_FUNC,
key4LongPress, key4ShortPress);

keys.singleKey = singleKey;

keyParaInit(&keys);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U,FUNC_GPIO14);// 配置lED_1引脚输出
GPIO_DIS_OUTPUT(GPIO_ID_PIN(14));

PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);// 配置LED_2引脚输出
GPIO_DIS_OUTPUT(GPIO_ID_PIN(12));

PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U,FUNC_GPIO13);// 配置lED_1引脚输出
GPIO_DIS_OUTPUT(GPIO_ID_PIN(13));

PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U,FUNC_GPIO15);// 配置lED_1引脚输出
GPIO_DIS_OUTPUT(GPIO_ID_PIN(15));
GPIO_OUTPUT_SET(GPIO_ID_PIN(14), 0);//输出高电平 LED_1 OFF
GPIO_OUTPUT_SET(GPIO_ID_PIN(12), 0);//输出高电平 LED_2 OFF
GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 0);//输出高电平 LED_3 OFF
GPIO_OUTPUT_SET(GPIO_ID_PIN(15), 0);//输出高电平 LED_4 OFF
}
完整的程序都给出,所以不做截图了
最后在user_init(void)里添加DHT11初始化程序
dh11Init( );
在这里插入图片描述
接下来的操作就不用说了吧!如果不会请看我的第一篇稿子,第一次总是潦草的,见谅。地址:esp8266 NodeMcu机智云SOC方案开发经验分享
大功告成!并没有完,哈哈。
那个DHT11的坑没有讲,现在补充下
右击dh11Init( );选择下图红框
在这里插入图片描述
发现了没有,当你要定义其他引脚作为DHT11的数据接口时,改头文件是不够的,红框里也要改
在这里插入图片描述
需要代码的话可以回复我

That’all .thans for your reading.

这篇关于ESP8266 NodeMcu机智云SOC方案控制4路继电器+DHT11温湿度上报的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/331299

相关文章

Java解析JSON的六种方案

《Java解析JSON的六种方案》这篇文章介绍了6种JSON解析方案,包括Jackson、Gson、FastJSON、JsonPath、、手动解析,分别阐述了它们的功能特点、代码示例、高级功能、优缺点... 目录前言1. 使用 Jackson:业界标配功能特点代码示例高级功能优缺点2. 使用 Gson:轻量

Redis KEYS查询大批量数据替代方案

《RedisKEYS查询大批量数据替代方案》在使用Redis时,KEYS命令虽然简单直接,但其全表扫描的特性在处理大规模数据时会导致性能问题,甚至可能阻塞Redis服务,本文将介绍SCAN命令、有序... 目录前言KEYS命令问题背景替代方案1.使用 SCAN 命令2. 使用有序集合(Sorted Set)

Python实现局域网远程控制电脑

《Python实现局域网远程控制电脑》这篇文章主要为大家详细介绍了如何利用Python编写一个工具,可以实现远程控制局域网电脑关机,重启,注销等功能,感兴趣的小伙伴可以参考一下... 目录1.简介2. 运行效果3. 1.0版本相关源码服务端server.py客户端client.py4. 2.0版本相关源码1

MyBatis延迟加载的处理方案

《MyBatis延迟加载的处理方案》MyBatis支持延迟加载(LazyLoading),允许在需要数据时才从数据库加载,而不是在查询结果第一次返回时就立即加载所有数据,延迟加载的核心思想是,将关联对... 目录MyBATis如何处理延迟加载?延迟加载的原理1. 开启延迟加载2. 延迟加载的配置2.1 使用

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.