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

相关文章

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.

如何选择SDR无线图传方案

在开源软件定义无线电(SDR)领域,有几个项目提供了无线图传的解决方案。以下是一些开源SDR无线图传方案: 1. **OpenHD**:这是一个远程高清数字图像传输的开源解决方案,它使用SDR技术来实现高清视频的无线传输。OpenHD项目提供了一个完整的工具链,包括发射器和接收器的硬件设计以及相应的软件。 2. **USRP(Universal Software Radio Periphera

MyBatis 切换不同的类型数据库方案

下属案例例当前结合SpringBoot 配置进行讲解。 背景: 实现一个工程里面在部署阶段支持切换不同类型数据库支持。 方案一 数据源配置 关键代码(是什么数据库,该怎么配就怎么配) spring:datasource:name: test# 使用druid数据源type: com.alibaba.druid.pool.DruidDataSource# @需要修改 数据库连接及驱动u

控制反转 的种类

之前对控制反转的定义和解释都不是很清晰。最近翻书发现在《Pro Spring 5》(免费电子版在文章最后)有一段非常不错的解释。记录一下,有道翻译贴出来方便查看。如有请直接跳过中文,看后面的原文。 控制反转的类型 控制反转的类型您可能想知道为什么有两种类型的IoC,以及为什么这些类型被进一步划分为不同的实现。这个问题似乎没有明确的答案;当然,不同的类型提供了一定程度的灵活性,但

一种改进的red5集群方案的应用、基于Red5服务器集群负载均衡调度算法研究

转自: 一种改进的red5集群方案的应用: http://wenku.baidu.com/link?url=jYQ1wNwHVBqJ-5XCYq0PRligp6Y5q6BYXyISUsF56My8DP8dc9CZ4pZvpPz1abxJn8fojMrL0IyfmMHStpvkotqC1RWlRMGnzVL1X4IPOa_  基于Red5服务器集群负载均衡调度算法研究 http://ww

深入解析秒杀业务中的核心问题 —— 从并发控制到事务管理

深入解析秒杀业务中的核心问题 —— 从并发控制到事务管理 秒杀系统是应对高并发、高压力下的典型业务场景,涉及到并发控制、库存管理、事务管理等多个关键技术点。本文将深入剖析秒杀商品业务中常见的几个核心问题,包括 AOP 事务管理、同步锁机制、乐观锁、CAS 操作,以及用户限购策略。通过这些技术的结合,确保秒杀系统在高并发场景下的稳定性和一致性。 1. AOP 代理对象与事务管理 在秒杀商品