• 5.wifi开发【智能家居:上】,开发准备:智能开关灯,智能采集温湿,智能调彩灯


    一。wifi智能家居项目开发

    【智能开关】:继电器控制开发

    1.智能开关

    器件准备:wifi(esp8266,使用CP2102)继电器

    结果:

    2.继电器工作原理

    (1)继电器是一种自动电气开关

        (1) 输入输出电路隔离

        (2)信号转换(从断开到接通)

        (3)增加输出能力

    (2)继电器工作原理

    利用电磁铁控制工作电路通断的开关

    (3)继电器模块介绍

            高电平触发指的是信号触发端(IN)与电源负极之间有一个正向电压,.通常是用电源的正极与触发端连接的一种触发方式,当触发端有正极电压或达到触发的电压时,继电器则吸合。低电平触发指的是信号触发端与电源负极之间的电压为Ov时,或者说触发端的电压比电源正极的电压更低,低到可以触发的电压时,使继电器吸合,通常是将电源的负极与触发端连接的一种触发方式使继电器吸合。

            产品参数:

    电压版本:5v静态电流:4mAs工作电压:65mA蚀发电压:2-5V触发电流:2mA

    (4)继电器模块使用

    3.开发要求:

    1.ComBox模拟TCP客户端连接ESP8266

        (1)发送“relayon”打开继电器

        (2)发送“relayoff”关闭继电器

    4.硬件连接

    1.采用GPIO5直接驱动继电器

    2.继电器电源VCC连接到VIN  继电器GND连接到GND

    硬件连接:

    继电器            连接           esp8266

    VCC                                VIN

    GND                                VIN旁边的GND

    IN                                     D1(GPIO5)

    连接结果:

    5.开发流程

    1.在SDK目录下新建relay文件

    2.拷贝tcpserver下所有文件到relay下

    3.在relay/user目录下新建relay.c

    1. #include "esp_common.h"
    2. #include "gpio.h"
    3. /******************************************************************************
    4. * FunctionName : Relay_Control
    5. * Description : Relay_Control
    6. * Parameters : uint32 mask
    7. * Returns : none
    8. *******************************************************************************/
    9. void Relay_Control(uint32 mask)
    10. {
    11. GPIO_OUTPUT(GPIO_Pin_5,mask);
    12. }

    4.在relay/include目录下新建relay.h

    1. #ifndef __RELAY_H__
    2. #define __RELAY_H__
    3. #ifdef __cplusplus
    4. extern "C" {
    5. #endif
    6. #define RELAY_ON 1
    7. #define RELAY_OFF 0
    8. void Relay_Control(uint32 mask);
    9. #ifdef __cplusplus
    10. }
    11. #endif
    12. #endif

    5.在tcpserver下完成relayon/relayoff解析

    1. #include "esp_common.h"
    2. #include "freertos/FreeRTOS.h"
    3. #include "freertos/task.h"
    4. #include "lwip/sockets.h"
    5. #include "lwip/dns.h"
    6. #include "lwip/netdb.h"
    7. #include "tcpserver.h"
    8. #include "relay.h"
    9. #define SERVERADDR "192.168.31.158"
    10. #define SERVERPORT 8000
    11. /******************************************************************************
    12. * FunctionName : ATaskTcpServer
    13. * Description : ATaskTcpServer 任务
    14. * Parameters : none
    15. * Returns : none
    16. *******************************************************************************/
    17. void ATaskTcpServer( void *pvParameters )
    18. {
    19. int iVariableExample = 0;
    20. int fd = -1;
    21. int cfd = -1;
    22. int NetTimeOnt = 20000;
    23. int ret;
    24. struct sockaddr_in ServerAddr;
    25. struct sockaddr ClientAddr;
    26. socklen_t ClientAddrlen = sizeof(struct sockaddr);
    27. char Tcpmsg[48];
    28. STATION_STATUS StaStatus;
    29. do
    30. {
    31. StaStatus = wifi_station_get_connect_status();
    32. vTaskDelay(100);
    33. }while(StaStatus != STATION_GOT_IP);
    34. fd = socket(PF_INET,SOCK_STREAM,0);
    35. if(fd == -1)
    36. {
    37. printf("get socket fail!\n");
    38. vTaskDelete(NULL);
    39. return;
    40. }
    41. setsockopt(fd,SOL_SOCKET,SO_RCVTIMEO,&NetTimeOnt,sizeof(int));
    42. memset(&ServerAddr,0,sizeof(ServerAddr));
    43. ServerAddr.sin_family = AF_INET;
    44. ServerAddr.sin_addr.s_addr = INADDR_ANY;
    45. ServerAddr.sin_port = htons(SERVERPORT);
    46. ServerAddr.sin_len = sizeof(ServerAddr);
    47. if(bind(fd,(struct sockaddr*)&ServerAddr,ServerAddr.sin_len) != 0)
    48. {
    49. printf("bind socket fail!\n");
    50. vTaskDelete(NULL);
    51. return;
    52. }
    53. if(listen(fd,5) != 0)
    54. {
    55. printf("listen socket fail!\n");
    56. vTaskDelete(NULL);
    57. return;
    58. }
    59. for(;;)
    60. {
    61. cfd = accept(fd,&ClientAddr,&ClientAddrlen);
    62. if(cfd != -1)
    63. {
    64. ret = recv(cfd,Tcpmsg,48,0);
    65. if(ret > 0)
    66. {
    67. printf("TcpClient:%s\n",Tcpmsg);
    68. if(strncmp(Tcpmsg,"relayon",7) == 0)
    69. {
    70. Relay_Control(RELAY_ON);
    71. send(cfd,"relayon!",sizeof("relayon!"),0);
    72. }
    73. else if(strncmp(Tcpmsg,"relayoff",8) == 0)
    74. {
    75. Relay_Control(RELAY_OFF);
    76. send(cfd,"relayoff!",sizeof("relayoff!"),0);
    77. }
    78. else
    79. send(cfd,"cmd is error!",sizeof("cmd is error!"),0);
    80. }
    81. else
    82. {
    83. printf("TcpClient data is no!\n");
    84. }
    85. }
    86. close(cfd);
    87. }
    88. vTaskDelete( NULL );
    89. }
    90. /******************************************************************************
    91. * FunctionName : TcpServer_init
    92. * Description : TcpServer_init 初始化
    93. * Parameters : none
    94. * Returns : none
    95. *******************************************************************************/
    96. void TcpServer_init(void)
    97. {
    98. xTaskCreate(ATaskTcpServer, "TcpServer", 256, NULL, 4, NULL);
    99. }

    6.控制命令解析

    注意:user_main中修改适合的wifi名称与密码

    编译,运行结果:

    1.运行串口,esp8266地址为192.168.3.126

    2.窗口socket客户端窗口

    (1)关闭状态

    (2)打开状态

    【智能环境采集】:环境采集模块

    1.智能环境采集

    器件使用

    wifi模块+温湿度

    结果:温湿度采集模块

    2.空气温湿度传感器原理

    数字式空气温湿度传感器

            16Bit温度测量 16Bit湿度测量

    原理图:

    硬件连接:

            采用GPIO5直接驱动DHT11 DATA

            VCC连接到3.3V GND连接到GND

    3.驱动设计

    1.启动采集

    2.配置IO为输出模式

    3.拉低18ms后拉高

    4.配置IO为输入模式

    5.延时40us等待DHT11相应

    6.DHT11拉低

    7.等待拉低80us后拉高

    8.等待拉高80us后拉低

    4.获取数据流程(每次获取一位数据,连续获取8次)

    5.需求分析

    1.ComBox模拟TCP客户端连接ESP8266

    2.定时5秒采集一次温湿度数据

    3.客户端发送readdata,服务器当前温湿度数据

    6.功能开发

    (1)新建dht11工程目录

    1.在SDK目录下新建dht11目录

    2.拷贝tcpserver目录下所有文件到dht11目录下

    (2)新建dht11源码文件

    1.在user目录下新建tdht11.c

    2.在include目录下新建dht11.h

    (3)Sourceinsight配置

    1.在之前的工程中,移除relay文件夹

    2.添加dht11文件夹

    7.代码实现

    1.在dht11.c下

        (1)创建Dht11_init(),用于任务创建

        (2)创建void ATaskDht11( void *pvParameters ),用于任务实现

        (3)创建DHT11_TEST(void) ,用于温湿度数据采集

    实验结果:

    1.连接方式

    wifi-----》DHT11

    3V3-----》VCC

    GND----》GND

    D1-----》DATA

    【正式实现1】:wifi智能灯开发

    1.智能灯泡

    wifi+WS2812RGB

    结果:智能灯

    2.WS2812RGB介绍

    WS2812RGB原理:

            控制电路与RGB芯片集成在一个5050封装的元器件中, 构成一个完整的外控像素点。         每个像素点的三基色颜色可实现256级亮度显示,完成16777216种颜色的全真色彩显示, 扫描频率不低于400Hz/s。

            串行级联接口, 能通过一根信号线完成数据的接收与解码。 当刷新速率30帧/秒时, 低速模式级联数不小于512点, 高速模式不小于1024点。

            数据发送速度可达800

    WS2812RGB硬件连接:

    WS2812驱动时序图

    输入码型

    输入码型(高位先发,按照GRB的顺序发送数据)

    数据传输方法

    硬件连接

    1.采用GPIO5直接驱动WS2812 VIN

    2.VCC连接到3.3V GND连接到GND

    wifi------》RGB灯

    GND-----》GND

    D1-------》DIN

    3V3------》VCC

    3.驱动设计

    1.发送0码

    2.发送1码

    3.ns级延时

    4.发送复位码

    5.写入RGB数据

    4.代码实现

    1.进入临界段

    2.发送复位码

    3.循环写入7组RGB数据

    4.退出临界段

    【正式实现2】:wifi智能灯开发2

    1.功能需求

    1.ComBox模拟TCP客户端连接ESP8266

    2.客户端发送setcolour,服务器接收解析,改变一次灯泡颜色

    2.功能开发

    新建ws2812工程目录

    1.在SDK目录下新建ws2812目录

    2.拷贝tcpserver目录下所有文件到ws2812目录下

    新建ws2812源码文件

    1.在user目录下新建ws2812.c

    2.在include目录下新建ws2812.h

    Sourceinsight配置

    1.在之前的工程中,移除dht11文件夹

    2.添加ws2812文件夹

    代码实现

    1.在ws2812.c下

        (1)创建delay100Ns(),用于精准延时

        (2)创建SEND_WS_0(),用于写入0码

        (3)创建SEND_WS_1(),用于写入1码

        (4)创建Ws2812REST (),用于帧复位

        (5)创建Ws2812Write(colours colour),用于颜色写入

    运行结果:

    1.创建客户端,输入setcolour,变色

    2.

  • 相关阅读:
    ovs dpdk debug
    vmware esxi 7 直通GPU配置
    DevChat:VSCode中的AI黑马
    【Kafka】Kafka Producer 分区-05
    CSS学习(1)-选择器
    【scikit-learn基础】--『监督学习』之 决策树回归
    Web前端:2022年每个开发人员都必须遵循的React最佳实践
    如何利用Redis进行事务处理呢?
    反汇编ARM程序的技术靠谱吗?——揭秘ARM架构二进制程序的反汇编技术现状
    Spring MVC相关
  • 原文地址:https://blog.csdn.net/m0_61659911/article/details/133203320