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

相关文章

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

Python远程控制MySQL的完整指南

《Python远程控制MySQL的完整指南》MySQL是最流行的关系型数据库之一,Python通过多种方式可以与MySQL进行交互,下面小编就为大家详细介绍一下Python操作MySQL的常用方法和最... 目录1. 准备工作2. 连接mysql数据库使用mysql-connector使用PyMySQL3.

在Java中将XLS转换为XLSX的实现方案

《在Java中将XLS转换为XLSX的实现方案》在本文中,我们将探讨传统ExcelXLS格式与现代XLSX格式的结构差异,并为Java开发者提供转换方案,通过了解底层原理、性能优势及实用工具,您将掌握... 目录为什么升级XLS到XLSX值得投入?实际转换过程解析推荐技术方案对比Apache POI实现编程

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

Java实现本地缓存的常用方案介绍

《Java实现本地缓存的常用方案介绍》本地缓存的代表技术主要有HashMap,GuavaCache,Caffeine和Encahche,这篇文章主要来和大家聊聊java利用这些技术分别实现本地缓存的方... 目录本地缓存实现方式HashMapConcurrentHashMapGuava CacheCaffe

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

利用Python实现可回滚方案的示例代码

《利用Python实现可回滚方案的示例代码》很多项目翻车不是因为不会做,而是走错了方向却没法回头,技术选型失败的风险我们都清楚,但真正能提前规划“回滚方案”的人不多,本文从实际项目出发,教你如何用Py... 目录描述题解答案(核心思路)题解代码分析第一步:抽象缓存接口第二步:实现两个版本第三步:根据 Fea

SpringBoot实现接口数据加解密的三种实战方案

《SpringBoot实现接口数据加解密的三种实战方案》在金融支付、用户隐私信息传输等场景中,接口数据若以明文传输,极易被中间人攻击窃取,SpringBoot提供了多种优雅的加解密实现方案,本文将从原... 目录一、为什么需要接口数据加解密?二、核心加解密算法选择1. 对称加密(AES)2. 非对称加密(R