• 6.wifi开发【智能家居:下】,正式开发:智能开关灯,智能采集温湿度,智能调彩灯


    一。WEB Server开发

    1.需求分析

    用户通过页面操作插座+彩灯+温湿度

    【开发前端1】:智能插座网页设计

    智能插座网页设计需求

    1.通过浏览器访问ESP8266 webserver

    2.显示“自学项目-WiFi-智能家居”

    3.显示“智能插座”

    4.显示当前插座工作状态

    5.按键触发插座动作

    2.智能插座Web设计

    智能插座网页设计

    这里为自己设置的前端页面

    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    2. <html xmlns="http://www.w3.org/1999/xhtml">
    3. <head>
    4. <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    5. <title>智能插座</title>
    6. <script defer="defer">
    7. function ledSwitch() {
    8. var xmlhttp;
    9. if (window.XMLHttpRequest) {
    10. xmlhttp = new XMLHttpRequest();
    11. } else {
    12. xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    13. }
    14. xmlhttp.onreadystatechange = function () {
    15. if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
    16. document.getElementById("txtState").innerHTML = xmlhttp.responseText;
    17. }
    18. },
    19. xmlhttp.open("GET", "Switch", true);
    20. xmlhttp.send();
    21. }
    22. </script>
    23. </head>
    24. <body style="background-color: #2F4F4F">
    25. <font size="12" color="yellow">
    26. <b>
    27. <div class="text" style=" text-align:center;"><big>创客学院-WiFi-智能家居</big></div>
    28. </b>
    29. </font>
    30. <font size="12" color="yellow">
    31. <b>
    32. <div class="text" style=" text-align:center;"><big>智能插座</big></div>
    33. </b>
    34. </font>
    35. <br> </br>
    36. <font size="20" color="white">
    37. <div align="center" id="txtState">插座状态未知</div>
    38. </font>
    39. <br> </br>
    40. <div style=" text-align:center;">
    41. <input type="button" value="开关" style="width:80px;height:40px;" onclick="ledSwitch()">
    42. </div>
    43. </body>
    44. </html>

    3.智能插座嵌入式程序设计

    1.继电器 驱动程序

            继电器就是一个上电的自动开关,所以只需要控制output为高电平或者低电平即可。

    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. }

    2.HTTP协议 解析程序

            通过代码,可以看到html的页面是运行在esp8266中的,下方DefaultPage这个字符指针就存储了这个页面的数据,页面中使用javaScript来对用户按键进行相应,esp8266去GET到指令数据后,对数据进行处理,进而实现网页交互的功能。

    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 "httpserver.h"
    8. #include "relay.c"
    9. #define SERVERADDR "192.168.31.158"
    10. #define SERVERPORT 80
    11. const char *DefaultPage=
    12. "html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"
    13. ""
    14. ""
    15. ""
    16. "智能插座"
    17. ""
    18. ""
    19. ""
    20. ""
    21. ""
    22. "
      创客学院-WiFi-智能家居
      "
    23. ""
    24. ""
    25. ""
    26. ""
    27. "
      智能插座
      "
    28. ""
    29. ""
    30. "

      "
    31. ""
    32. "
      插座状态未知
      "
    33. ""
    34. "

      "
    35. "
      "
    36. ""
    37. "
      "
  • ""
  • "";
  • /*
  • ""
  • "Default"
  • "I am Http server!"
  • ""
  • ;
  • */
  • // 发送200 ok报头
  • int file_ok(int cfd, long flen)
  • {
  • char *send_buf = zalloc(sizeof(char)*100);
  • sprintf(send_buf, "HTTP/1.1 200 OK\r\n");
  • send(cfd, send_buf, strlen(send_buf), 0);
  • sprintf(send_buf, "Connection: keep-alive\r\n");
  • send(cfd, send_buf, strlen(send_buf), 0);
  • sprintf(send_buf, "Content-Length: %ld\r\n", flen);
  • send(cfd, send_buf, strlen(send_buf), 0);
  • sprintf(send_buf, "Content-Type: text/html\r\n");
  • send(cfd, send_buf, strlen(send_buf), 0);
  • sprintf(send_buf, "\r\n");
  • send(cfd, send_buf, strlen(send_buf), 0);
  • free(send_buf);
  • return 0;
  • }
  • bool isLedTurnOpen = false; // 记录LED状态
  • /******************************************************************************
  • * FunctionName : ATaskHttpServer
  • * Description : ATaskHttpServer 任务
  • * Parameters : none
  • * Returns : none
  • *******************************************************************************/
  • void ATaskHttpServer( void *pvParameters )
  • {
  • int iVariableExample = 0;
  • int fd = -1;
  • int cfd = -1;
  • int NetTimeOnt = 2000;
  • int ret;
  • struct sockaddr_in ServerAddr;
  • struct sockaddr ClientAddr;
  • socklen_t ClientAddrlen = sizeof(struct sockaddr);
  • char *Httpmsg;
  • char *Sendmsg;
  • STATION_STATUS StaStatus;
  • do
  • {
  • StaStatus = wifi_station_get_connect_status();
  • vTaskDelay(100);
  • }while(StaStatus != STATION_GOT_IP);
  • fd = socket(PF_INET,SOCK_STREAM,0);
  • if(fd == -1)
  • {
  • printf("get socket fail!\n");
  • vTaskDelete(NULL);
  • return;
  • }
  • setsockopt(fd,SOL_SOCKET,SO_RCVTIMEO,&NetTimeOnt,sizeof(int));
  • memset(&ServerAddr,0,sizeof(ServerAddr));
  • ServerAddr.sin_family = AF_INET;
  • ServerAddr.sin_addr.s_addr = INADDR_ANY;
  • ServerAddr.sin_port = htons(SERVERPORT);
  • ServerAddr.sin_len = sizeof(ServerAddr);
  • if(bind(fd,(struct sockaddr*)&ServerAddr,ServerAddr.sin_len) != 0)
  • {
  • printf("bind socket fail!\n");
  • vTaskDelete(NULL);
  • return;
  • }
  • if(listen(fd,5) != 0)
  • {
  • printf("listen socket fail!\n");
  • vTaskDelete(NULL);
  • return;
  • }
  • Httpmsg = (char*)zalloc(sizeof(char)*1000);
  • for(;;)
  • {
  • cfd = accept(fd,&ClientAddr,&ClientAddrlen);
  • if(cfd != -1)
  • {
  • printf("HttpClient accept\n");
  • ret = recv(cfd,Httpmsg,1000,0);
  • if(ret > 0)
  • {
  • printf("HttpClient recv\n");
  • printf("%s\n",Httpmsg);
  • if(strstr(Httpmsg,"GET / HTTP/1.1") != NULL)
  • {
  • file_ok(cfd,strlen(DefaultPage));
  • send(cfd,DefaultPage,strlen(DefaultPage),0);
  • }
  • else if(strstr(Httpmsg,"GET /Switch") != NULL)
  • {
  • if(isLedTurnOpen)
  • {
  • Relay_Control(0);
  • send(cfd,"插座已经关闭",strlen("插座已经关闭"),0);
  • isLedTurnOpen = false;
  • }
  • else
  • {
  • Relay_Control(1);
  • send(cfd,"插座已经打开",strlen("插座已经关闭"),0);
  • isLedTurnOpen = true;
  • }
  • }
  • }
  • else
  • {
  • printf("HttpClient data is no!\n");
  • }
  • }
  • close(cfd);
  • }
  • free(Httpmsg);
  • vTaskDelete( NULL );
  • }
  • /******************************************************************************
  • * FunctionName : HttpServer_init
  • * Description : HttpServer_init 初始化
  • * Parameters : none
  • * Returns : none
  • *******************************************************************************/
  • void HttpServer_init(void)
  • {
  • xTaskCreate(ATaskHttpServer, "HttpServer", 256, NULL, 4, NULL);
  • }
  • 补充:user_main.c

    1.user_main.c中提供的user_init函数就是SDK工程(提供的模版工程),这就是工程为我们提供的main入口,我们在这里创建Freertos操作系统的任务,这样就可以运行各类自写的线程函数。(以下几个实验,换汤不换药,原理只能说是一模一样)

    运行结果:

     1.页面设计

    2.打开之后,绿灯亮

    【开发前端2】:智能环境采集页面设计

     1.需求分析

    智能环境采集网页设计需求

    1.通过浏览器访问ESP8266 webserver

    2.显示“自学项目-WiFi-智能家居”

    3.显示“智能环境采集”

    4.显示当前温湿度数据

    5.按键触发获取温湿度值

    2.智能环境采集Web设计

    这里是自己设置的环境采集页面

    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    2. <html xmlns="http://www.w3.org/1999/xhtml">
    3. <head>
    4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    5. <title>智能环境采集</title>
    6. <script defer="defer">
    7. function ledSwitch() {
    8. var xmlhttp;
    9. if (window.XMLHttpRequest) {
    10. xmlhttp = new XMLHttpRequest();
    11. } else {
    12. xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    13. }
    14. xmlhttp.onreadystatechange = function () {
    15. if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
    16. document.getElementById("txtState").innerHTML = xmlhttp.responseText;
    17. }
    18. },
    19. xmlhttp.open("GET", "Data", true);
    20. xmlhttp.send();
    21. }
    22. </script>
    23. </head>
    24. <body style="background-color: #2F4F4F">
    25. <font size="12" color="yellow">
    26. <b>
    27. <div class="text" style=" text-align:center;"><big>创客学院-WiFi-智能家居</big></div>
    28. </b>
    29. </font>
    30. <font size="12" color="yellow">
    31. <b>
    32. <div class="text" style=" text-align:center;"><big>智能环境采集</big></div>
    33. </b>
    34. </font>
    35. <br> </br>
    36. <font size="20" color="white">
    37. <div align="center" id="txtState">环境数据未知</div>
    38. </font>
    39. <br> </br>
    40. <div style=" text-align:center;">
    41. <input type="button" value="获取数据" style="width:80px;height:40px;" onclick="ledSwitch()">
    42. </div>
    43. </body>
    44. </html>

    3.智能环境采集嵌入式程序设计

    1.DHT11 驱动程序

    1. #include "esp_common.h"
    2. #include "freertos/FreeRTOS.h"
    3. #include "freertos/task.h"
    4. #include "gpio.h"
    5. #include "dht11.h"
    6. #define DHT11_PIN_NUM 5
    7. #define DHT11_PIN_BIT GPIO_Pin_5
    8. #define DHT11_SET 1
    9. #define DHT11_RESET 0
    10. //温湿度定义
    11. uint8 ucharT_data_H=0,ucharT_data_L=0,ucharRH_data_H=0,ucharRH_data_L=0,ucharcheckdata=0;
    12. static void DHT11_TEST(void) //温湿传感启动
    13. {
    14. uint8 ucharT_data_H_temp,ucharT_data_L_temp,ucharRH_data_H_humidity,ucharRH_data_L_humidity,ucharcheckdata_temp;
    15. uint8 ucharFLAG = 0,uchartemp=0;
    16. uint8 ucharcomdata;
    17. uint8 i;
    18. taskENTER_CRITICAL();
    19. {
    20. GPIO_OUTPUT_SET(DHT11_PIN_NUM,DHT11_RESET);
    21. os_delay_us(18*1000);
    22. GPIO_OUTPUT_SET(DHT11_PIN_NUM,DHT11_SET);
    23. GPIO_AS_INPUT(DHT11_PIN_BIT);
    24. os_delay_us(4*10);
    25. }
    26. if(!GPIO_INPUT_GET(DHT11_PIN_NUM))
    27. {
    28. ucharFLAG=2;
    29. while((!GPIO_INPUT_GET(DHT11_PIN_NUM))&&ucharFLAG++);
    30. ucharFLAG=2;
    31. while(GPIO_INPUT_GET(DHT11_PIN_NUM)&&ucharFLAG++);
    32. for(i=0;i<8;i++)
    33. {
    34. ucharFLAG=2;
    35. while((!GPIO_INPUT_GET(DHT11_PIN_NUM))&&ucharFLAG++);
    36. os_delay_us(3*10);
    37. uchartemp=0;
    38. if(GPIO_INPUT_GET(DHT11_PIN_NUM))uchartemp=1;
    39. ucharFLAG=2;
    40. while(GPIO_INPUT_GET(DHT11_PIN_NUM)&&ucharFLAG++);
    41. if(ucharFLAG==1)break;
    42. ucharcomdata<<=1;
    43. ucharcomdata|=uchartemp;
    44. }
    45. ucharRH_data_H_humidity = ucharcomdata;
    46. for(i=0;i<8;i++)
    47. {
    48. ucharFLAG=2;
    49. while((!GPIO_INPUT_GET(DHT11_PIN_NUM))&&ucharFLAG++);
    50. os_delay_us(3*10);
    51. uchartemp=0;
    52. if(GPIO_INPUT_GET(DHT11_PIN_NUM))uchartemp=1;
    53. ucharFLAG=2;
    54. while(GPIO_INPUT_GET(DHT11_PIN_NUM)&&ucharFLAG++);
    55. if(ucharFLAG==1)break;
    56. ucharcomdata<<=1;
    57. ucharcomdata|=uchartemp;
    58. }
    59. ucharRH_data_L_humidity = ucharcomdata;
    60. for(i=0;i<8;i++)
    61. {
    62. ucharFLAG=2;
    63. while((!GPIO_INPUT_GET(DHT11_PIN_NUM))&&ucharFLAG++);
    64. os_delay_us(3*10);
    65. uchartemp=0;
    66. if(GPIO_INPUT_GET(DHT11_PIN_NUM))uchartemp=1;
    67. ucharFLAG=2;
    68. while((GPIO_INPUT_GET(DHT11_PIN_NUM))&&ucharFLAG++);
    69. if(ucharFLAG==1)break;
    70. ucharcomdata<<=1;
    71. ucharcomdata|=uchartemp;
    72. }
    73. ucharT_data_H_temp = ucharcomdata;
    74. for(i=0;i<8;i++)
    75. {
    76. ucharFLAG=2;
    77. while((!GPIO_INPUT_GET(DHT11_PIN_NUM))&&ucharFLAG++);
    78. os_delay_us(3*10);
    79. uchartemp=0;
    80. if(GPIO_INPUT_GET(DHT11_PIN_NUM))uchartemp=1;
    81. ucharFLAG=2;
    82. while((GPIO_INPUT_GET(DHT11_PIN_NUM))&&ucharFLAG++);
    83. if(ucharFLAG==1)break;
    84. ucharcomdata<<=1;
    85. ucharcomdata|=uchartemp;
    86. }
    87. ucharT_data_L_temp = ucharcomdata;
    88. for(i=0;i<8;i++)
    89. {
    90. ucharFLAG=2;
    91. while((!GPIO_INPUT_GET(DHT11_PIN_NUM))&&ucharFLAG++);
    92. os_delay_us(3*10);
    93. uchartemp=0;
    94. if(GPIO_INPUT_GET(DHT11_PIN_NUM))uchartemp=1;
    95. ucharFLAG=2;
    96. while((GPIO_INPUT_GET(DHT11_PIN_NUM))&&ucharFLAG++);
    97. if(ucharFLAG==1)break;
    98. ucharcomdata<<=1;
    99. ucharcomdata|=uchartemp;
    100. }
    101. ucharcheckdata_temp = ucharcomdata;
    102. // humiture=1;
    103. uchartemp=(ucharT_data_H_temp+ucharT_data_L_temp+ucharRH_data_H_humidity+ucharRH_data_L_humidity);
    104. if(uchartemp==ucharcheckdata_temp)
    105. {
    106. ucharT_data_H = ucharT_data_H_temp;
    107. ucharT_data_L = ucharT_data_L_temp;
    108. ucharRH_data_H = ucharRH_data_H_humidity;
    109. ucharRH_data_L = ucharRH_data_L_humidity;
    110. ucharcheckdata = ucharcheckdata_temp;
    111. }
    112. }
    113. else //没用成功读取,返回0
    114. {
    115. ucharT_data_H = 0;
    116. ucharT_data_L = 0;
    117. ucharRH_data_H = 0;
    118. ucharRH_data_L = 0;
    119. }
    120. taskEXIT_CRITICAL();
    121. }
    122. /******************************************************************************
    123. * FunctionName : ATaskDht11
    124. * Description : ATaskDht11 任务
    125. * Parameters : none
    126. * Returns : none
    127. *******************************************************************************/
    128. void ATaskDht11( void *pvParameters )
    129. {
    130. for(;;)
    131. {
    132. vTaskDelay(500);
    133. DHT11_TEST();
    134. printf("ucharT_data_H = %d\n",ucharT_data_H);
    135. printf("ucharRH_data_H = %d\n",ucharRH_data_H);
    136. }
    137. vTaskDelete( NULL );
    138. }
    139. /******************************************************************************
    140. * FunctionName : Dht11_init
    141. * Description : Dht11_init 初始化
    142. * Parameters : none
    143. * Returns : none
    144. *******************************************************************************/
    145. void Dht11_init(void)
    146. {
    147. xTaskCreate(ATaskDht11, "ATaskDht11", 256, NULL, 4, NULL);
    148. }

    2.HTTP协议 解析程序

    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 "httpserver.h"
    8. #include "dht11.h"
    9. #define SERVERADDR "192.168.31.158"
    10. #define SERVERPORT 80
    11. const char *DefaultPage=
    12. "html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"
    13. ""
    14. ""
    15. ""
    16. "智能环境采集"
    17. ""
    18. ""
    19. ""
    20. ""
    21. ""
    22. "
      创客学院-WiFi-智能家居
      "
    23. ""
    24. ""
    25. ""
    26. ""
    27. "
      智能环境采集
      "
    28. ""
    29. ""
    30. "

      "
    31. ""
    32. "
      环境数据未知
      "
    33. ""
    34. "

      "
    35. "
      "
    36. ""
    37. "
      "
  • ""
  • "";
  • /*
  • ""
  • "Default"
  • "I am Http server!"
  • ""
  • ;
  • */
  • // 发送200 ok报头
  • int file_ok(int cfd, long flen)
  • {
  • char *send_buf = zalloc(sizeof(char)*100);
  • sprintf(send_buf, "HTTP/1.1 200 OK\r\n");
  • send(cfd, send_buf, strlen(send_buf), 0);
  • sprintf(send_buf, "Connection: keep-alive\r\n");
  • send(cfd, send_buf, strlen(send_buf), 0);
  • sprintf(send_buf, "Content-Length: %ld\r\n", flen);
  • send(cfd, send_buf, strlen(send_buf), 0);
  • sprintf(send_buf, "Content-Type: text/html\r\n");
  • send(cfd, send_buf, strlen(send_buf), 0);
  • sprintf(send_buf, "\r\n");
  • send(cfd, send_buf, strlen(send_buf), 0);
  • free(send_buf);
  • return 0;
  • }
  • bool isLedTurnOpen = false; // 记录LED状态
  • /******************************************************************************
  • * FunctionName : ATaskHttpServer
  • * Description : ATaskHttpServer 任务
  • * Parameters : none
  • * Returns : none
  • *******************************************************************************/
  • void ATaskHttpServer( void *pvParameters )
  • {
  • int iVariableExample = 0;
  • int fd = -1;
  • int cfd = -1;
  • int NetTimeOnt = 2000;
  • int ret;
  • struct sockaddr_in ServerAddr;
  • struct sockaddr ClientAddr;
  • socklen_t ClientAddrlen = sizeof(struct sockaddr);
  • char *Httpmsg;
  • char *Sendmsg;
  • char data[30];
  • STATION_STATUS StaStatus;
  • do
  • {
  • StaStatus = wifi_station_get_connect_status();
  • vTaskDelay(100);
  • }while(StaStatus != STATION_GOT_IP);
  • fd = socket(PF_INET,SOCK_STREAM,0);
  • if(fd == -1)
  • {
  • printf("get socket fail!\n");
  • vTaskDelete(NULL);
  • return;
  • }
  • setsockopt(fd,SOL_SOCKET,SO_RCVTIMEO,&NetTimeOnt,sizeof(int));
  • memset(&ServerAddr,0,sizeof(ServerAddr));
  • ServerAddr.sin_family = AF_INET;
  • ServerAddr.sin_addr.s_addr = INADDR_ANY;
  • ServerAddr.sin_port = htons(SERVERPORT);
  • ServerAddr.sin_len = sizeof(ServerAddr);
  • if(bind(fd,(struct sockaddr*)&ServerAddr,ServerAddr.sin_len) != 0)
  • {
  • printf("bind socket fail!\n");
  • vTaskDelete(NULL);
  • return;
  • }
  • if(listen(fd,5) != 0)
  • {
  • printf("listen socket fail!\n");
  • vTaskDelete(NULL);
  • return;
  • }
  • Httpmsg = (char*)zalloc(sizeof(char)*1000);
  • for(;;)
  • {
  • cfd = accept(fd,&ClientAddr,&ClientAddrlen);
  • if(cfd != -1)
  • {
  • printf("HttpClient accept\n");
  • ret = recv(cfd,Httpmsg,1000,0);
  • if(ret > 0)
  • {
  • printf("HttpClient recv\n");
  • printf("%s\n",Httpmsg);
  • if(strstr(Httpmsg,"GET / HTTP/1.1") != NULL)
  • {
  • file_ok(cfd,strlen(DefaultPage));
  • send(cfd,DefaultPage,strlen(DefaultPage),0);
  • }
  • else if(strstr(Httpmsg,"GET /Data") != NULL)
  • {
  • sprintf(data,"温度=%d\n湿度=%d",ucharT_data_H,ucharRH_data_H);
  • send(cfd,data,strlen(data),0);
  • }
  • }
  • else
  • {
  • printf("HttpClient data is no!\n");
  • }
  • }
  • close(cfd);
  • }
  • free(Httpmsg);
  • vTaskDelete( NULL );
  • }
  • /******************************************************************************
  • * FunctionName : HttpServer_init
  • * Description : HttpServer_init 初始化
  • * Parameters : none
  • * Returns : none
  • *******************************************************************************/
  • void HttpServer_init(void)
  • {
  • xTaskCreate(ATaskHttpServer, "HttpServer", 256, NULL, 4, NULL);
  • }
  • 运行结果:

    【开发前端3】:智能灯泡页面设计

    1.需求分析

    智能灯泡网页设计需求

    通过浏览器访问ESP8266 webserver

    显示“WiFi-智能家居”

    显示“智能灯泡”

    显示当前灯泡工作状态(内容字体颜色与灯泡状态一直)

    按键触发不同色彩控制(红、橙、黄、绿、青、蓝、紫)

    2.智能灯泡Web设计

    这里为自己的智能灯泡页面

    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    2. <html xmlns="http://www.w3.org/1999/xhtml">
    3. <head>
    4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    5. <title>智能灯泡</title>
    6. <script defer="defer">
    7. function ledSwitch(string) {
    8. var xmlhttp;
    9. if (window.XMLHttpRequest) {
    10. xmlhttp = new XMLHttpRequest();
    11. } else {
    12. xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    13. }
    14. xmlhttp.onreadystatechange = function () {
    15. if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
    16. document.getElementById("txtState").innerHTML = xmlhttp.responseText;
    17. document.getElementById("txtState").style.color = string;
    18. }
    19. },
    20. xmlhttp.open("GET", string, true);
    21. xmlhttp.send();
    22. }
    23. </script>
    24. </head>
    25. <body style="background-color: #2F4F4F">
    26. <font size="12" color="yellow">
    27. <b>
    28. <div class="text" style=" text-align:center;"><big>创客学院-WiFi-智能家居</big></div>
    29. </b>
    30. </font>
    31. <font size="12" color="yellow">
    32. <b>
    33. <div class="text" style=" text-align:center;"><big>智能灯泡</big></div>
    34. </b>
    35. </font>
    36. <br> </br>
    37. <font size="20" color="white">
    38. <div align="center" id="txtState">灯泡状态未知</div>
    39. </font>
    40. <br> </br>
    41. <div style=" text-align:center;">
    42. <input type="button" value="红色" style="width:80px;height:40px;background:red;" onclick="ledSwitch('red')" />
    43. <input type="button" value="橙色" style="width:80px;height:40px;background:orange;" onclick="ledSwitch('orange')">
    44. <input type="button" value="黄色" style="width:80px;height:40px;background:yellow;" onclick="ledSwitch('yellow')">
    45. <input type="button" value="绿色" style="width:80px;height:40px;background:green;" onclick="ledSwitch('green')">
    46. <input type="button" value="青色" style="width:80px;height:40px;background:cyan;" onclick="ledSwitch('cyan')">
    47. <input type="button" value="蓝色" style="width:80px;height:40px;background:blue;" onclick="ledSwitch('blue')">
    48. <input type="button" value="紫色" style="width:80px;height:40px;background:purple;" onclick="ledSwitch('purple')">
    49. </div>
    50. </body>
    51. </html>

    3.智能灯泡嵌入式程序设计

    1.WS2812 驱动程序

    1. #include "esp_common.h"
    2. #include "freertos/FreeRTOS.h"
    3. #include "freertos/task.h"
    4. #include "gpio.h"
    5. #include "ws2812.h"
    6. uint32 ColourArray[COLOUR_NUM] = {
    7. 0x00FF00,
    8. 0xA5FF00,
    9. 0xFFFF00,
    10. 0x800000,
    11. 0xFF00FF,
    12. 0x0000FF,
    13. 0x008080
    14. };
    15. static volatile uint8_t time;
    16. void delay100Ns(void)
    17. {
    18. time ++;
    19. }
    20. /******************************************************************************
    21. * FunctionName : SEND_WS_0
    22. * Description : 写0码
    23. * Parameters : none
    24. * Returns : none
    25. *******************************************************************************/
    26. static void SEND_WS_0(void)
    27. {
    28. GPIO_REG_WRITE(GPIO_OUT_W1TS_ADDRESS, GPIO_Pin_5);
    29. GPIO_REG_WRITE(GPIO_OUT_W1TC_ADDRESS, 0);
    30. GPIO_REG_WRITE(GPIO_OUT_W1TS_ADDRESS, 0);
    31. GPIO_REG_WRITE(GPIO_OUT_W1TC_ADDRESS, GPIO_Pin_5);
    32. delay100Ns();
    33. delay100Ns();
    34. delay100Ns();
    35. }
    36. /******************************************************************************
    37. * FunctionName : SEND_WS_1
    38. * Description : 写1码
    39. * Parameters : none
    40. * Returns : none
    41. *******************************************************************************/
    42. static void SEND_WS_1(void)
    43. {
    44. GPIO_REG_WRITE(GPIO_OUT_W1TS_ADDRESS, GPIO_Pin_5);
    45. GPIO_REG_WRITE(GPIO_OUT_W1TC_ADDRESS, 0);
    46. delay100Ns();
    47. delay100Ns();
    48. GPIO_REG_WRITE(GPIO_OUT_W1TS_ADDRESS, 0);
    49. GPIO_REG_WRITE(GPIO_OUT_W1TC_ADDRESS, GPIO_Pin_5);
    50. delay100Ns();
    51. }
    52. /******************************************************************************
    53. * FunctionName : Ws2812REST
    54. * Description : 帧切换
    55. * Parameters : none
    56. * Returns : none
    57. *******************************************************************************/
    58. static void Ws2812REST(void)
    59. {
    60. GPIO_OUTPUT(GPIO_Pin_5,0);
    61. os_delay_us(250);
    62. //GPIO_OUTPUT(GPIO_Pin_5,0);
    63. }
    64. /******************************************************************************
    65. * FunctionName : Ws2812Write
    66. * Description : 写入色彩数据
    67. * Parameters : 色彩编码
    68. * Returns : none
    69. *******************************************************************************/
    70. void Ws2812Write(colours colour)
    71. {
    72. uint32 mask;
    73. uint8 i;
    74. taskENTER_CRITICAL();
    75. Ws2812REST();
    76. for(i = 0;i < 7;i++)
    77. {
    78. mask = 0x800000;
    79. while(mask)
    80. {
    81. if(ColourArray[colour]&mask)
    82. SEND_WS_1();
    83. else
    84. SEND_WS_0();
    85. mask >>= 1;
    86. }
    87. }
    88. taskEXIT_CRITICAL();
    89. }
    90. /******************************************************************************
    91. * FunctionName : Ws2812_init
    92. * Description : Ws2812_init 初始化
    93. * Parameters : none
    94. * Returns : none
    95. *******************************************************************************/
    96. void Ws2812_init(void)
    97. {
    98. GPIO_AS_OUTPUT(GPIO_Pin_5);
    99. }

    2.HTTP协议 解析程序

    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 "httpserver.h"
    8. #include "WS2812.h"
    9. #define SERVERADDR "192.168.31.158"
    10. #define SERVERPORT 80
    11. const char *DefaultPage=
    12. "html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"
    13. ""
    14. ""
    15. ""
    16. "智能灯泡"
    17. ""
    18. ""
    19. ""
    20. ""
    21. ""
    22. "
      创客学院-WiFi-智能家居
      "
    23. ""
    24. ""
    25. ""
    26. ""
    27. "
      智能灯泡
      "
    28. ""
    29. ""
    30. "

      "
    31. ""
    32. "
      灯泡状态未知
      "
    33. ""
    34. "

      "
    35. "
      "
    36. ""
    37. ""
    38. ""
    39. ""
    40. ""
    41. ""
    42. ""
    43. "
      "
  • ""
  • "";
  • /*
  • ""
  • "Default"
  • "I am Http server!"
  • ""
  • ;
  • */
  • // 发送200 ok报头
  • int file_ok(int cfd, long flen)
  • {
  • char *send_buf = zalloc(sizeof(char)*100);
  • sprintf(send_buf, "HTTP/1.1 200 OK\r\n");
  • send(cfd, send_buf, strlen(send_buf), 0);
  • sprintf(send_buf, "Connection: keep-alive\r\n");
  • send(cfd, send_buf, strlen(send_buf), 0);
  • sprintf(send_buf, "Content-Length: %ld\r\n", flen);
  • send(cfd, send_buf, strlen(send_buf), 0);
  • sprintf(send_buf, "Content-Type: text/html\r\n");
  • send(cfd, send_buf, strlen(send_buf), 0);
  • sprintf(send_buf, "\r\n");
  • send(cfd, send_buf, strlen(send_buf), 0);
  • free(send_buf);
  • return 0;
  • }
  • bool isLedTurnOpen = false; // 记录LED状态
  • /******************************************************************************
  • * FunctionName : ATaskHttpServer
  • * Description : ATaskHttpServer 任务
  • * Parameters : none
  • * Returns : none
  • *******************************************************************************/
  • void ATaskHttpServer( void *pvParameters )
  • {
  • int iVariableExample = 0;
  • int fd = -1;
  • int cfd = -1;
  • int NetTimeOnt = 2000;
  • int ret;
  • struct sockaddr_in ServerAddr;
  • struct sockaddr ClientAddr;
  • socklen_t ClientAddrlen = sizeof(struct sockaddr);
  • char *Httpmsg;
  • char *Sendmsg;
  • STATION_STATUS StaStatus;
  • do
  • {
  • StaStatus = wifi_station_get_connect_status();
  • vTaskDelay(100);
  • }while(StaStatus != STATION_GOT_IP);
  • fd = socket(PF_INET,SOCK_STREAM,0);
  • if(fd == -1)
  • {
  • printf("get socket fail!\n");
  • vTaskDelete(NULL);
  • return;
  • }
  • setsockopt(fd,SOL_SOCKET,SO_RCVTIMEO,&NetTimeOnt,sizeof(int));
  • memset(&ServerAddr,0,sizeof(ServerAddr));
  • ServerAddr.sin_family = AF_INET;
  • ServerAddr.sin_addr.s_addr = INADDR_ANY;
  • ServerAddr.sin_port = htons(SERVERPORT);
  • ServerAddr.sin_len = sizeof(ServerAddr);
  • if(bind(fd,(struct sockaddr*)&ServerAddr,ServerAddr.sin_len) != 0)
  • {
  • printf("bind socket fail!\n");
  • vTaskDelete(NULL);
  • return;
  • }
  • if(listen(fd,5) != 0)
  • {
  • printf("listen socket fail!\n");
  • vTaskDelete(NULL);
  • return;
  • }
  • Httpmsg = (char*)zalloc(sizeof(char)*1000);
  • for(;;)
  • {
  • cfd = accept(fd,&ClientAddr,&ClientAddrlen);
  • if(cfd != -1)
  • {
  • printf("HttpClient accept\n");
  • ret = recv(cfd,Httpmsg,1000,0);
  • if(ret > 0)
  • {
  • printf("HttpClient recv\n");
  • printf("%s\n",Httpmsg);
  • if(strstr(Httpmsg,"GET / HTTP/1.1") != NULL)
  • {
  • file_ok(cfd,strlen(DefaultPage));
  • send(cfd,DefaultPage,strlen(DefaultPage),0);
  • }
  • else if(strstr(Httpmsg,"red") != NULL)
  • {
  • Ws2812Write(red);
  • send(cfd,"灯泡状态为红色",strlen("灯泡状态为红色"),0);
  • }
  • else if(strstr(Httpmsg,"orange") != NULL)
  • {
  • Ws2812Write(orange);
  • send(cfd,"灯泡状态为橙色",strlen("灯泡状态为橙色"),0);
  • }
  • else if(strstr(Httpmsg,"yellow") != NULL)
  • {
  • Ws2812Write(yellow);
  • send(cfd,"灯泡状态为黄色",strlen("灯泡状态为黄色"),0);
  • }
  • else if(strstr(Httpmsg,"green") != NULL)
  • {
  • Ws2812Write(green);
  • send(cfd,"灯泡状态为绿色",strlen("灯泡状态为绿色"),0);
  • }
  • else if(strstr(Httpmsg,"cyan") != NULL)
  • {
  • Ws2812Write(cyan);
  • send(cfd,"灯泡状态为青色",strlen("灯泡状态为青色"),0);
  • }
  • else if(strstr(Httpmsg,"blue") != NULL)
  • {
  • Ws2812Write(blue);
  • send(cfd,"灯泡状态为蓝色",strlen("灯泡状态为蓝色"),0);
  • }
  • else if(strstr(Httpmsg,"purple") != NULL)
  • {
  • Ws2812Write(purple);
  • send(cfd,"灯泡状态为紫色",strlen("灯泡状态为紫色"),0);
  • }
  • }
  • else
  • {
  • printf("HttpClient data is no!\n");
  • }
  • }
  • close(cfd);
  • }
  • free(Httpmsg);
  • vTaskDelete( NULL );
  • }
  • /******************************************************************************
  • * FunctionName : HttpServer_init
  • * Description : HttpServer_init 初始化
  • * Parameters : none
  • * Returns : none
  • *******************************************************************************/
  • void HttpServer_init(void)
  • {
  • xTaskCreate(ATaskHttpServer, "HttpServer", 256, NULL, 4, NULL);
  • }
  • 运行结果:

  • 相关阅读:
    设计素材网站,我推荐这6个
    Java 替换PDF中的字体
    需要什么PCB封装,照着弄就好了
    linux集群上的SCHRODINGER 分子对接工作流程
    golang操作zookeeper
    项目文件上传到行云codeup teambition
    链表(2)——带头双向循环链表
    Linux socket编程(5):三次握手和四次挥手分析和SIGPIPE信号的处理
    CAD进阶练习(四)
    【机器学习】基于卷积神经网络 CNN 的猫狗分类问题
  • 原文地址:https://blog.csdn.net/m0_61659911/article/details/133206536