基于STM32F1单片机、ESP8266WIFI模块、DHT11温湿度传感的WIFI网络温湿度传输系统

  • 功能说明
    • 温湿度采集端
    • 温湿度监控端
  • 硬件材料
    • 硬件连接
  • 主要代码
    • 温湿度采集端
    • 温湿度监控端
  • 测试

基于STM32F1单片机、ESP8266WIFI模块、DHT11温湿度传感的WIFI网络温湿度传输系统完整工程

功能说明

基于嵌入式的温湿度网络传输系统包含:温湿度采集端与温湿度监控端。
温湿度采集端可实时采集温度与湿度数据,通过WIFI透传技术,将温湿度数据传送到温度监控端。温度监控端实时接收温湿度采集端所发送的温湿度数据,显示在网站上。
注:目前只是在局域网下测试。

温湿度采集端

  1. 嵌入式STM32微控制器实时读取DHT11温湿度传感器采集的温湿度数据。
  2. 嵌入式STM32微控制器通过ESP8266WIFI模块连接WIFI。
  3. 通过TCP协议连接到电脑服务器,将温湿度数据传输到服务器。

温湿度监控端

  1. 通过建立Serversocket监听指定端口,获得温湿度采集端的温湿度数据。
  2. 将获取的数据通过WebSocket建立与客户端web页面的实时连接,将数据传送到web页面
  3. web页面可实时显示温湿度数据、查询温湿度数据、将数值图形化用动态柱形图的形式展现。

硬件材料

温湿度采集端STM32F1单片机、DHT11温湿度传感器、ESP8266WIFI模块

硬件连接

ESP8266与STM32F103连接图:

DHT11与STM32F103连接图:

温湿度监控端普通电脑需要JAVA环境

主要代码

温湿度采集端

/************************************************************************************/
@file    main.c
@function   初始化各模块
*************************************************************************************/
#include "stm32f10x.h"
#include "bsp_usart1.h"
#include "bsp_SysTick.h"
#include "bsp_esp8266.h"
#include "test.h"
#include "bsp_dht11.h"int main ( void )
{USARTx_Config ();
SysTick_Init ();
ESP8266_Init ();
DHT11_Init (); ESP8266_StaTcpClient_UnvarnishTest ();while ( 1 );
}
/****************************END OF FILE***************************//************************************************************************************/
@file    stm32f10x_conf.h
@function   调用库包含
*************************************************************************************/
#ifndef __STM32F10x_CONF_H
#define __STM32F10x_CONF_H
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_usart.h"
#include "misc.h"
#ifdef  USE_FULL_ASSERT
#else
#define assert_param(expr) ((void)0)
#endif
#endif
/****************************END OF FILE***************************//************************************************************************************/
@file    stm32f10x_it.h
@function   中断头文件
*************************************************************************************/
#ifndef __STM32F10x_IT_H
#define __STM32F10x_IT_H
#ifdef __cplusplusextern "C" {#endif void NMI_Handler(void);
void HardFault_Handler(void);
void MemManage_Handler(void);
void BusFault_Handler(void);
void UsageFault_Handler(void);
void SVC_Handler(void);
void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);
#ifdef __cplusplus
}
#endif
#endif
/****************************END OF FILE***************************//************************************************************************************/
@file    stm32f10x_it.c
@function   中断服务程序
*************************************************************************************/
#include "stm32f10x_it.h"
#include <stdio.h>
#include <string.h>
#include "bsp_SysTick.h"
#include "bsp_esp8266.h"
#include "test.h"void macESP8266_USART_INT_FUN ( void )
{   uint8_t ucCh;if ( USART_GetITStatus ( macESP8266_USARTx, USART_IT_RXNE ) != RESET ){ucCh  = USART_ReceiveData( macESP8266_USARTx );if(strEsp8266_Fram_Record.InfBit.FramLength<(RX_BUF_MAX_LEN-1))
strEsp8266_Fram_Record.Data_RX_BUF[strEsp8266_Fram_Record .InfBit .FramLength++]= ucCh;}if ( USART_GetITStatus( macESP8266_USARTx, USART_IT_IDLE ) == SET ){strEsp8266_Fram_Record .InfBit .FramFinishFlag = 1;ucCh = USART_ReceiveData( macESP8266_USARTx );"CLOSED\r\n" )}
}
/****************************END OF FILE***************************//************************************************************************************/
@file    bsp_usart1.h
@function   USART头文件
*************************************************************************************/
#ifndef __USART1_H
#define __USART1_H
#include "stm32f10x.h"
#include <stdio.h>
****/
#define             macUSART_BAUD_RATE                       115200
#define             macUSARTx                                USART1
#define             macUSART_APBxClock_FUN       RCC_APB2PeriphClockCmd
#define             macUSART_CLK                RCC_APB2Periph_USART1
#define             macUSART_GPIO_APBxClock_FUN  RCC_APB2PeriphClockCmd
#define             macUSART_GPIO_CLK          RCC_APB2Periph_GPIOA
#define             macUSART_TX_PORT                         GPIOA
#define             macUSART_TX_PIN             GPIO_Pin_9
#define             macUSART_RX_PORT                         GPIOA
#define             macUSART_RX_PIN                GPIO_Pin_10
#define             macUSART_IRQ                   USART1_IRQn
#define             macUSART_INT_FUN              USART1_IRQHandlervoid                USARTx_Config                           ( void );
#endif
/****************************END OF FILE***************************//************************************************************************************/
@file    bsp_usart1.c
@function   USART配置
*************************************************************************************/
#include "bsp_usart1.h"void USARTx_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;macUSART_APBxClock_FUN(macUSART_CLK, ENABLE);macUSART_GPIO_APBxClock_FUN(macUSART_GPIO_CLK, ENABLE);GPIO_InitStructure.GPIO_Pin =  macUSART_TX_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(macUSART_TX_PORT, &GPIO_InitStructure);    GPIO_InitStructure.GPIO_Pin = macUSART_RX_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(macUSART_RX_PORT, &GPIO_InitStructure);    USART_InitStructure.USART_BaudRate = macUSART_BAUD_RATE;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No ;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(macUSARTx, &USART_InitStructure);USART_Cmd(macUSARTx, ENABLE);}int fputc(int ch, FILE *f)
{USART_SendData(macUSARTx, (uint8_t) ch);while (USART_GetFlagStatus(macUSARTx, USART_FLAG_TXE) == RESET);return (ch);
}int fgetc(FILE *f)
{while(USART_GetFlagStatus(macUSARTx,USART_FLAG_RXNE)==RESET);return (int)USART_ReceiveData(macUSARTx);
}
/**********************************END OF FILE*********************/
/************************************************************************************/
@file    bsp_SysTick.h
@function   软件定时头文件
*************************************************************************************/
#ifndef __SYSTICK_H
#define __SYSTICK_H
#include "stm32f10x.h"#define Delay_ms(x) Delay_us(1000*x)     void SysTick_Init( void );
void TimingDelay_Decrement( void );
void Delay_us ( __IO u32 nTime );#endif
/**********************************END OF FILE*********************//************************************************************************************/
@file    bsp_SysTick.c
@function   软件定时
*************************************************************************************/
#include "bsp_SysTick.h"
static __IO u32 TimingDelay = 0;void SysTick_Init( void )
{if ( SysTick_Config(SystemCoreClock / 1000000) )   { while (1);} SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}void Delay_us( __IO u32 nTime )
{ TimingDelay = nTime;  SysTick->CTRL |=  SysTick_CTRL_ENABLE_Msk;while( TimingDelay != 0 );
}void TimingDelay_Decrement(void)
{if ( TimingDelay != 0x00 ){ TimingDelay --;}
}/**********************************END OF FILE*******************//************************************************************************************/
@file    bsp_esp8266.h
@function   WIFI模块头文件
*************************************************************************************/
#ifndef  __BSP_ESP8266_H
#define  __BSP_ESP8266_H
#include "stm32f10x.h"
#include "common.h"
#include <stdio.h>
#include <stdbool.h>#if defined ( __CC_ARM   )
#pragma anon_unions
#endiftypedef enum{STA,AP,STA_AP
} ENUM_Net_ModeTypeDef;typedef enum{enumTCP,enumUDP,
} ENUM_NetPro_TypeDef;typedef enum{Multiple_ID_0 = 0,Multiple_ID_1 = 1,Multiple_ID_2 = 2,Multiple_ID_3 = 3,Multiple_ID_4 = 4,Single_ID_0 = 5,
} ENUM_ID_NO_TypeDef;typedef enum{OPEN = 0,WEP = 1,WPA_PSK = 2,WPA2_PSK = 3,WPA_WPA2_PSK = 4,
} ENUM_AP_PsdMode_TypeDef;#define RX_BUF_MAX_LEN     1024                                extern struct  STRUCT_USARTx_Fram
{char  Data_RX_BUF [ RX_BUF_MAX_LEN ];union {__IO u16 InfAll;struct {__IO u16 FramLength       :15;       __IO u16 FramFinishFlag   :1;         } InfBit;}; } strEsp8266_Fram_Record;#define      macESP8266_CH_PD_APBxClock_FUN                   RCC_APB2PeriphClockCmd
#define      macESP8266_CH_PD_CLK                             RCC_APB2Periph_GPIOB
#define      macESP8266_CH_PD_PORT                            GPIOB
#define      macESP8266_CH_PD_PIN                             GPIO_Pin_8#define      macESP8266_RST_APBxClock_FUN                     RCC_APB2PeriphClockCmd
#define      macESP8266_RST_CLK                               RCC_APB2Periph_GPIOB
#define      macESP8266_RST_PORT                              GPIOB
#define      macESP8266_RST_PIN                               GPIO_Pin_9#define      macESP8266_USART_BAUD_RATE                       115200#define      macESP8266_USARTx                                USART3
#define      macESP8266_USART_APBxClock_FUN                   RCC_APB1PeriphClockCmd
#define      macESP8266_USART_CLK                             RCC_APB1Periph_USART3
#define      macESP8266_USART_GPIO_APBxClock_FUN              RCC_APB2PeriphClockCmd
#define      macESP8266_USART_GPIO_CLK                        RCC_APB2Periph_GPIOB
#define      macESP8266_USART_TX_PORT                         GPIOB
#define      macESP8266_USART_TX_PIN                          GPIO_Pin_10
#define      macESP8266_USART_RX_PORT                         GPIOB
#define      macESP8266_USART_RX_PIN                          GPIO_Pin_11
#define      macESP8266_USART_IRQ                             USART3_IRQn
#define      macESP8266_USART_INT_FUN                         USART3_IRQHandler#define     macESP8266_Usart( fmt, ... )           USART_printf ( macESP8266_USARTx, fmt, ##__VA_ARGS__ )
#define     macPC_Usart( fmt, ... )                printf ( fmt, ##__VA_ARGS__ )
//#define     macPC_Usart( fmt, ... )                #define     macESP8266_CH_ENABLE()                 GPIO_SetBits ( macESP8266_CH_PD_PORT, macESP8266_CH_PD_PIN )
#define     macESP8266_CH_DISABLE()                GPIO_ResetBits ( macESP8266_CH_PD_PORT, macESP8266_CH_PD_PIN )#define     macESP8266_RST_HIGH_LEVEL()            GPIO_SetBits ( macESP8266_RST_PORT, macESP8266_RST_PIN )
#define     macESP8266_RST_LOW_LEVEL()             GPIO_ResetBits ( macESP8266_RST_PORT, macESP8266_RST_PIN )void                     ESP8266_Init                        ( void );
void                     ESP8266_Rst                         ( void );
bool                     ESP8266_Cmd                         ( char * cmd, char * reply1, char * reply2, u32 waittime );
void                     ESP8266_AT_Test                     ( void );
bool                     ESP8266_Net_Mode_Choose             ( ENUM_Net_ModeTypeDef enumMode );
bool                     ESP8266_JoinAP                      ( char * pSSID, char * pPassWord );
bool                     ESP8266_BuildAP                     ( char * pSSID, char * pPassWord, ENUM_AP_PsdMode_TypeDef enunPsdMode );
bool                     ESP8266_Enable_MultipleId           ( FunctionalState enumEnUnvarnishTx );
bool                     ESP8266_Link_Server                 ( ENUM_NetPro_TypeDef enumE, char * ip, char * ComNum, ENUM_ID_NO_TypeDef id);
bool                     ESP8266_StartOrShutServer           ( FunctionalState enumMode, char * pPortNum, char * pTimeOver );
uint8_t                  ESP8266_Get_LinkStatus              ( void );
uint8_t                  ESP8266_Get_IdLinkStatus            ( void );
uint8_t                  ESP8266_Inquire_ApIp                ( char * pApIp, uint8_t ucArrayLength );
bool                     ESP8266_UnvarnishSend               ( void );
void                     ESP8266_ExitUnvarnishSend           ( void );
bool                     ESP8266_SendString                  ( FunctionalState enumEnUnvarnishTx, char * pStr, u32 ulStrLength, ENUM_ID_NO_TypeDef ucId );
char *                   ESP8266_ReceiveString               ( FunctionalState enumEnUnvarnishTx );#endif/**********************************END OF FILE*******************//************************************************************************************/
@file    bsp_esp8266.c
@function   WIFI模块功能文件
*************************************************************************************/
#include "bsp_esp8266.h"
#include "common.h"
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include "bsp_SysTick.h"static void             ESP8266_GPIO_Config                 ( void );
static void             ESP8266_USART_Config                ( void );
static void             ESP8266_USART_NVIC_Configuration    ( void );struct  STRUCT_USARTx_Fram strEsp8266_Fram_Record = { 0 };void ESP8266_Init ( void )
{ESP8266_GPIO_Config (); ESP8266_USART_Config (); macESP8266_RST_HIGH_LEVEL();macESP8266_CH_DISABLE();
}static void ESP8266_GPIO_Config ( void )
{GPIO_InitTypeDef GPIO_InitStructure;macESP8266_CH_PD_APBxClock_FUN ( macESP8266_CH_PD_CLK, ENABLE ); GPIO_InitStructure.GPIO_Pin = macESP8266_CH_PD_PIN;  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init ( macESP8266_CH_PD_PORT, & GPIO_InitStructure );    macESP8266_RST_APBxClock_FUN ( macESP8266_RST_CLK, ENABLE );    GPIO_InitStructure.GPIO_Pin = macESP8266_RST_PIN;GPIO_Init ( macESP8266_RST_PORT, & GPIO_InitStructure );
}static void ESP8266_USART_Config ( void )
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;macESP8266_USART_APBxClock_FUN ( macESP8266_USART_CLK, ENABLE );macESP8266_USART_GPIO_APBxClock_FUN ( macESP8266_USART_GPIO_CLK, ENABLE );GPIO_InitStructure.GPIO_Pin =  macESP8266_USART_TX_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(macESP8266_USART_TX_PORT, &GPIO_InitStructure);  GPIO_InitStructure.GPIO_Pin = macESP8266_USART_RX_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(macESP8266_USART_RX_PORT, &GPIO_InitStructure);USART_InitStructure.USART_BaudRate = macESP8266_USART_BAUD_RATE;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No ;USART_InitStructure.USART_HardwareFlowControl
USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(macESP8266_USARTx, &USART_InitStructure);USART_ITConfig ( macESP8266_USARTx, USART_IT_RXNE, ENABLE ); USART_ITConfig ( macESP8266_USARTx, USART_IT_IDLE, ENABLE ); ESP8266_USART_NVIC_Configuration ();USART_Cmd(macESP8266_USARTx, ENABLE);
}static void ESP8266_USART_NVIC_Configuration ( void )
{NVIC_InitTypeDef NVIC_InitStructure;  NVIC_PriorityGroupConfig ( macNVIC_PriorityGroup_x );NVIC_InitStructure.NVIC_IRQChannel = macESP8266_USART_IRQ;  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}void ESP8266_Rst ( void )
{#if 0ESP8266_Cmd ( "AT+RST", "OK", "ready", 2500 );     #elsemacESP8266_RST_LOW_LEVEL();Delay_ms ( 500 ); macESP8266_RST_HIGH_LEVEL();#endif
}bool ESP8266_Cmd ( char * cmd, char * reply1, char * reply2, u32 waittime )
{    strEsp8266_Fram_Record .InfBit .FramLength = 0;               macESP8266_Usart ( "%s\r\n", cmd );if ( ( reply1 == 0 ) && ( reply2 == 0 ) )        return true;Delay_ms ( waittime );               strEsp8266_Fram_Record.Data_RX_BUF[strEsp8266_Fram_Record.InfBit .FramLength ]='\0';macPC_Usart ( "%s", strEsp8266_Fram_Record .Data_RX_BUF );if ( ( reply1 != 0 ) && ( reply2 != 0 ) )
return((bool)strstr strEsp8266_Fram_Record .Data_RX_BUF,reply1)||(bool)strstr ( trEsp8266_Fram_Record .Data_RX_BUF, reply2 )); else if ( reply1 != 0 )return ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply1 ) );elsereturn ( ( bool ) strstr ( strEsp8266_Fram_Record .Data_RX_BUF, reply2 ) );}void ESP8266_AT_Test ( void )
{char count=0;macESP8266_RST_HIGH_LEVEL(); Delay_ms ( 1000 );while ( count < 10 ){if( ESP8266_Cmd ( "AT", "OK", NULL, 500 ) ) return;ESP8266_Rst();++ count;}
}bool ESP8266_Net_Mode_Choose ( ENUM_Net_ModeTypeDef enumMode )
{switch ( enumMode ){case STA:return ESP8266_Cmd ( "AT+CWMODE=1", "OK", "no change", 2500 ); case AP:return ESP8266_Cmd ( "AT+CWMODE=2", "OK", "no change", 2500 ); case STA_AP:return ESP8266_Cmd ( "AT+CWMODE=3", "OK", "no change", 2500 ); default:return false;}}bool ESP8266_JoinAP ( char * pSSID, char * pPassWord )
{char cCmd [120];sprintf ( cCmd, "AT+CWJAP=\"%s\",\"%s\"", pSSID, pPassWord );return ESP8266_Cmd ( cCmd, "OK", NULL, 5000 );}bool ESP8266_BuildAP ( char * pSSID, char * pPassWord, ENUM_AP_PsdMode_TypeDef enunPsdMode )
{char cCmd [120];sprintf ( cCmd, "AT+CWSAP=\"%s\",\"%s\",1,%d", pSSID, pPassWord, enunPsdMode );return ESP8266_Cmd ( cCmd, "OK", 0, 1000 );}
bool ESP8266_Enable_MultipleId ( FunctionalState enumEnUnvarnishTx )
{char cStr [20];sprintf ( cStr, "AT+CIPMUX=%d", ( enumEnUnvarnishTx ? 1 : 0 ) );return ESP8266_Cmd ( cStr, "OK", 0, 500 );}bool ESP8266_Link_Server ( ENUM_NetPro_TypeDef enumE, char * ip, char * ComNum, ENUM_ID_NO_TypeDef id)
{char cStr [100] = { 0 }, cCmd [120];switch (  enumE ){case enumTCP:sprintf ( cStr, "\"%s\",\"%s\",%s", "TCP", ip, ComNum );break;case enumUDP:sprintf ( cStr, "\"%s\",\"%s\",%s", "UDP", ip, ComNum );break;default:break;}if ( id < 5 )sprintf ( cCmd, "AT+CIPSTART=%d,%s", id, cStr);elsesprintf ( cCmd, "AT+CIPSTART=%s", cStr );return ESP8266_Cmd ( cCmd, "OK", "ALREAY CONNECT", 4000 );
}bool ESP8266_StartOrShutServer ( FunctionalState enumMode, char * pPortNum, char * pTimeOver )
{char cCmd1 [120], cCmd2 [120];if ( enumMode ){sprintf ( cCmd1, "AT+CIPSERVER=%d,%s", 1, pPortNum );sprintf ( cCmd2, "AT+CIPSTO=%s", pTimeOver );return ( ESP8266_Cmd ( cCmd1, "OK", 0, 500 ) &&ESP8266_Cmd ( cCmd2, "OK", 0, 500 ) );}else{sprintf ( cCmd1, "AT+CIPSERVER=%d,%s", 0, pPortNum )return ESP8266_Cmd ( cCmd1, "OK", 0, 500 );}
uint8_t ESP8266_Get_LinkStatus ( void )
{if ( ESP8266_Cmd ( "AT+CIPSTATUS", "OK", 0, 500 ) ){if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:2\r\n" ) )return 2;else if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:3\r\n" ) )return 3;else if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "STATUS:4\r\n" ) )return 4;        }return 0;}
uint8_t ESP8266_Get_IdLinkStatus ( void )
{uint8_t ucIdLinkStatus = 0x00;if ( ESP8266_Cmd ( "AT+CIPSTATUS", "OK", 0, 500 ) ){if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:0," ) )ucIdLinkStatus |= 0x01;else ucIdLinkStatus &= ~ 0x01;if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:1," ) )ucIdLinkStatus |= 0x02;else ucIdLinkStatus &= ~ 0x02;if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:2," ) )ucIdLinkStatus |= 0x04;else ucIdLinkStatus &= ~ 0x04;if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:3," ) )ucIdLinkStatus |= 0x08;else ucIdLinkStatus &= ~ 0x08;if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+CIPSTATUS:4," ) )ucIdLinkStatus |= 0x10;else ucIdLinkStatus &= ~ 0x10;   }return ucIdLinkStatus;}uint8_t ESP8266_Inquire_ApIp ( char * pApIp, uint8_t ucArrayLength )
{char uc;char * pCh;ESP8266_Cmd ( "AT+CIFSR", "OK", 0, 500 );pCh = strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "APIP,\"" );if ( pCh )pCh += 6;elsereturn 0;for ( uc = 0; uc < ucArrayLength; uc ++ ){pApIp [ uc ] = * ( pCh + uc);if ( pApIp [ uc ] == '\"' ){pApIp [ uc ] = '\0';break;}}return 1;}
bool ESP8266_UnvarnishSend ( void )
{if ( ! ESP8266_Cmd ( "AT+CIPMODE=1", "OK", 0, 500 ) )return false;return ESP8266_Cmd ( "AT+CIPSEND", "OK", ">", 500 );}void ESP8266_ExitUnvarnishSend ( void )
{Delay_ms ( 1000 );macESP8266_Usart ( "+++" );Delay_ms ( 500 );
}
bool ESP8266_SendString ( FunctionalState enumEnUnvarnishTx, char * pStr, u32 ulStrLength, ENUM_ID_NO_TypeDef ucId )
{char cStr [20];bool bRet = false; if ( enumEnUnvarnishTx ){macESP8266_Usart ( "%s", pStr );bRet = true;}else{if ( ucId < 5 )sprintf ( cStr, "AT+CIPSEND=%d,%d", ucId, ulStrLength + 2 );elsesprintf ( cStr, "AT+CIPSEND=%d", ulStrLength + 2 );ESP8266_Cmd ( cStr, "> ", 0, 1000 );bRet = ESP8266_Cmd ( pStr, "SEND OK", 0, 1000 );}return bRet;}
char * ESP8266_ReceiveString ( FunctionalState enumEnUnvarnishTx )
{char * pRecStr = 0;strEsp8266_Fram_Record .InfBit .FramLength = 0;strEsp8266_Fram_Record .InfBit .FramFinishFlag = 0;while ( ! strEsp8266_Fram_Record .InfBit .FramFinishFlag );strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ] = '\0';if ( enumEnUnvarnishTx )pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;else {if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+IPD" ) )pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;}return pRecStr;
}/*******************************************************************/
@file    common.h
@function   通用功能头文件
********************************************************************/
#ifndef __COMMON_H
#define __COMMON_H
#include "stm32f10x.h"
#define   macNVIC_PriorityGroup_x     NVIC_PriorityGroup_2
void  USART_printf    ( USART_TypeDef * USARTx, char * Data, ... );
#endif
/*******************************END OF FILE************************//********************************************************************
@file    common.c
@function   通用功能
********************************************************************/
#include "common.h"
#include "stm32f10x.h"
#include <stdarg.h>
static char * itoa       ( int value, char * string, int radix );
void USART_printf ( USART_TypeDef * USARTx, char * Data, ... )
{const char *s;int d;   char buf[16];va_list ap;va_start(ap, Data);while ( * Data != 0 )    {                                        if ( * Data == 0x5c )  {                                      switch ( *++Data ){case 'r':                          USART_SendData(USARTx, 0x0d);Data ++;break;case 'n':                                   USART_SendData(USARTx, 0x0a);    Data ++;break;default:Data ++;break;}            }else if ( * Data == '%'){                                 switch ( *++Data ){               case 's':                                     s = va_arg(ap, const char *);for ( ; *s; s++) {USART_SendData(USARTx,*s);while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );}Data++;break;case 'd':         d = va_arg(ap, int);itoa(d, buf, 10);for (s = buf; *s; s++) {USART_SendData(USARTx,*s);while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );}Data++;break;default:Data++;break;}      }else USART_SendData(USARTx, *Data++);while ( USART_GetFlagStatus ( USARTx, USART_FLAG_TXE ) == RESET );}
}
static char * itoa( int value, char *string, int radix )
{int     i, d;int     flag = 0;char    *ptr = string;/* This implementation only works for decimal numbers. */if (radix != 10){*ptr = 0;return string;}if (!value){*ptr++ = 0x30;*ptr = 0;return string;}/* if this is a negative value insert the minus sign. */if (value < 0){*ptr++ = '-';/* Make the value positive. */value *= -1;}for (i = 10000; i > 0; i /= 10){d = value / i;if (d || flag){*ptr++ = (char)(d + 0x30);value -= (d * i);flag = 1;}}/* Null terminate the string. */*ptr = 0;return string;
}
/**********************************END OF FILE*********************//*******************************************************************/
@file    bsp_dht11.h
@function   温湿度度采集模块头文件
********************************************************************/
#ifndef __DHT11_H
#define __DHT11_H
#include "stm32f10x.h"typedef struct
{uint8_t  humi_int;     uint8_t  humi_deci;     uint8_t  temp_int;      uint8_t  temp_deci;     uint8_t  check_sum;     } DHT11_Data_TypeDef;#define    macDHT11_Dout_SCK_APBxClock_FUN     RCC_APB2PeriphClockCmd
#define    macDHT11_Dout_GPIO_CLK       RCC_APB2Periph_GPIOE
#define      macDHT11_Dout_GPIO_PORT                      GPIOE
#define      macDHT11_Dout_GPIO_PIN                       GPIO_Pin_6
#define      macDHT11_Dout_0                                GPIO_ResetBits ( macDHT11_Dout_GPIO_PORT, macDHT11_Dout_GPIO_PIN )
#define      macDHT11_Dout_1                                GPIO_SetBits ( macDHT11_Dout_GPIO_PORT, macDHT11_Dout_GPIO_PIN )
#define      macDHT11_Dout_IN()                           GPIO_ReadInputDataBit ( macDHT11_Dout_GPIO_PORT, macDHT11_Dout_GPIO_PIN )
void                     DHT11_Init                      ( void );
uint8_t DHT11_Read_TempAndHumidity( DHT11_Data_TypeDef * DHT11_Data );#endif
/**********************************END OF FILE*********************//*******************************************************************/
@file    bsp_dht11.c
@function   温湿度度采集模块功能文件
********************************************************************/#include "bsp_dht11.h"
#include "bsp_SysTick.h"
static void                           DHT11_GPIO_Config                       ( void );
static void                           DHT11_Mode_IPU                          ( void );
static void                           DHT11_Mode_Out_PP                       ( void );
static uint8_t        DHT11_ReadByte           ( void );
void DHT11_Init ( void )
{DHT11_GPIO_Config ();macDHT11_Dout_1;
}
static void DHT11_GPIO_Config ( void )
{       GPIO_InitTypeDef GPIO_InitStructure;macDHT11_Dout_SCK_APBxClock_FUN ( macDHT11_Dout_GPIO_CLK, ENABLE ); GPIO_InitStructure.GPIO_Pin = macDHT11_Dout_GPIO_PIN;  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init ( macDHT11_Dout_GPIO_PORT, &GPIO_InitStructure );
}
static void DHT11_Mode_IPU(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = macDHT11_Dout_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; GPIO_Init(macDHT11_Dout_GPIO_PORT, &GPIO_InitStructure);  }
static void DHT11_Mode_Out_PP(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = macDHT11_Dout_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(macDHT11_Dout_GPIO_PORT, &GPIO_InitStructure);
}
static uint8_t DHT11_ReadByte ( void )
{uint8_t i, temp=0;for(i=0;i<8;i++)    {  while(macDHT11_Dout_IN()==Bit_RESET);Delay_us(40);if(macDHT11_Dout_IN()==Bit_SET){while(macDHT11_Dout_IN()==Bit_SET);temp|=(uint8_t)(0x01<<(7-i)); }{            temp&=(uint8_t)~(0x01<<(7-i)); }}return temp;
}
uint8_t DHT11_Read_TempAndHumidity(DHT11_Data_TypeDef *DHT11_Data)
{  DHT11_Mode_Out_PP();macDHT11_Dout_0;/*延时18ms*/Delay_ms(18);/*总线拉高 主机延时30us*/macDHT11_Dout_1; Delay_us(30);  DHT11_Mode_IPU();if(macDHT11_Dout_IN()==Bit_RESET)     {  while(macDHT11_Dout_IN()==Bit_RESET);while(macDHT11_Dout_IN()==Bit_SET);DHT11_Data->humi_int= DHT11_ReadByte();DHT11_Data->humi_deci= DHT11_ReadByte();DHT11_Data->temp_int= DHT11_ReadByte();DHT11_Data->temp_deci= DHT11_ReadByte();DHT11_Data->check_sum= DHT11_ReadByte();DHT11_Mode_Out_PP();macDHT11_Dout_1;if(DHT11_Data->check_sum == DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int+ DHT11_Data->temp_deci)return SUCCESS;else return ERROR;}elsereturn ERROR;
}
/*****************************END OF FILE***************************//*******************************************************************/
@file    test.h
@function   TCP连接配置功能文件
********************************************************************/
#ifndef  __TEST_H
#define  __TEST_H
#include "stm32f10x.h
#define  macUser_ESP8266_ApSsid "test"         //要连接的热点的名称
#define macUser_ESP8266_ApPwd "xuhao123456"   //要连接的热点的密钥
#define macUser_ESP8266_TcpServer_IP   "192.168.1.100"
//要连接的服务器的 IP
#define macUser_ESP8266_TcpServer_Port  "8888"
//要连接的服务器的端口extern volatile uint8_t ucTcpClosedFlag;void   ESP8266_StaTcpClient_UnvarnishTest  ( void );
#endif
/**********************************END OF FILE*********************//*******************************************************************/
@file    test.c
@function   TCP连接发送
********************************************************************/
#include "test.h"
#include "bsp_esp8266.h"
#include "bsp_SysTick.h"
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include "bsp_dht11.h"volatile uint8_t ucTcpClosedFlag = 0;void ESP8266_StaTcpClient_UnvarnishTest ( void )
{uint8_t ucStatus;char cStr [ 100 ] = { 0 };DHT11_Data_TypeDef DHT11_Data;printf ( "\r\n正在配置 ESP8266 ......\r\n" );macESP8266_CH_ENABLE();ESP8266_AT_Test ();ESP8266_Net_Mode_Choose ( STA );while ( ! ESP8266_JoinAP ( macUser_ESP8266_ApSsid, macUser_ESP8266_ApPwd ) );   ESP8266_Enable_MultipleId ( DISABLE );while ( ! ESP8266_Link_Server ( enumTCP, macUser_ESP8266_TcpServer_IP, macUser_ESP8266_TcpServer_Port, Single_ID_0 ) );while ( ! ESP8266_UnvarnishSend () );printf ( "\r\n配置 ESP8266 完毕\r\n" );while ( 1 ){     if ( DHT11_Read_TempAndHumidity ( & DHT11_Data ) == SUCCESS )  sprintf ( cStr, "Hy%d.%d%%RH Te%d.%dC\r\n", DHT11_Data .humi_int, DHT11_Data .humi_deci, DHT11_Data .temp_int, DHT11_Data.temp_deci );ESP8266_SendString ( ENABLE, cStr, 0, Single_ID_0 );  Delay_ms ( 1000 );if ( ucTcpClosedFlag )       {ESP8266_ExitUnvarnishSend ();     do ucStatus = ESP8266_Get_LinkStatus ();        while ( ! ucStatus );if ( ucStatus == 4 )        {printf ( "\r\n正在重连热点和服务器 ......\r\n" );while ( ! ESP8266_JoinAP ( macUser_ESP8266_ApSsid, macUser_ESP8266_ApPwd ) );while ( !   ESP8266_Link_Server ( enumTCP, macUser_ESP8266_TcpServer_IP, macUser_ESP8266_TcpServer_Port, Single_ID_0 ) );printf ( "\r\n重连热点和服务器成功\r\n" );}while ( ! ESP8266_UnvarnishSend () );       }}
}
/**********************************END OF FILE*********************/

温湿度监控端

/****************************************************************************
@file    index.html-
@function    通过WebSocket获取到的数据的页面显示
*****************************************************************************/
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Data Monitoring</title><link rel="stylesheet" href="css/style.css"><script type="text/javascript">var data = [];var count = 0;var humidity = 0;var temperature = 0;var time = 0;window.onload = function () {var websocket = null;if ('WebSocket' in window) {websocket = new WebSocket("ws://localhost:8080/index");//向要显示数据的网页发送websocket连接请求} else {alert('当前浏览器不支持Websocket')}websocket.onerror = function () {alert(window.location.href);};websocket.onopen = function () {//alert("Websocket建立成功");}websocket.onmessage = function (event) {setMessageInnerHTML(event.data);}websocket.onclose = function () {//alert("Websocket连接关闭")}window.onbeforeunload = function () {closeWebSocket();}function getTime() {var dateObj = new Date();var year = dateObj.getFullYear();var month = dateObj.getMonth()+1;var day = dateObj.getDate();var hour = dateObj.getHours();var min = dateObj.getMinutes();return year + "-" + month + "-" + day + "-" + hour + "-" + min;}function setMessageInnerHTML(innerHTML) {var json = {};json.time = getTime();json.message = innerHTML;data[count++] = json;//document.getElementById('text').innerHTML += JSON.stringify(data[count]) + '<br/>';var str = JSON.stringify(json.message);time = JSON.stringify(json.time);humidity = parseFloat(JSON.stringify(json.message).substring(str.indexOf("y") + 1, str.indexOf("R")-1));temperature = parseFloat(JSON.stringify(json.message).substring(str.indexOf("e") + 1, str.indexOf("C")));document.getElementById('text').innerHTML += "时间:"+ time + "\t湿度:" + humidity.toString() + '%RH\t温度:'+ temperature.toString() + '℃\n';var chart = new CanvasJS.Chart("chartContainer", {title: {text: "温度湿度动态显示图"},data: [{type: "column",yValueFormatString: "#,###.#",indexLabel: "{y}",dataPoints: [{label: "boiler1", y: humidity},{label: "boiler2", y: temperature},]}]});function updateChart() {var boilerColor, yVal;var dps = chart.options.data[0].dataPoints;for (var i = 0; i < dps.length; i++) {yVal = dps[i].y;boilerColor1 = yVal > 120 ? "#FF2500" : yVal >= 91 ? "#FF6000" : yVal >= 20 ? "#6B8E23 " : null;boilerColor2 = yVal > 37 ? "#FF2500" : yVal >= 27 ? "#FF6000" : yVal >= 0 ? "#6B8E23 " : null;if (i === 0) {dps[i] = {label: "湿度 %RH", y: yVal, color: boilerColor1};} else if (i === 1) {dps[i] = {label: "温度 ℃", y: yVal, color: boilerColor2};}}chart.options.data[0].dataPoints = dps;chart.render();};updateChart();}}function search() {var count = 1;var str = '"'+ document.getElementById('val').value + '"';for (var i = 0 ;i<data.length;i++){if (JSON.stringify(data[i].time) == str){if (count == 1){document.getElementById('text').innerHTML = "";document.getElementById('text').innerHTML = "搜索结果如下:\n";count = 0;}var temp = JSON.stringify(data[i].message);var H = temp.substring(temp.indexOf('y')+1,temp.indexOf('R')-1);var T = temp.substring(temp.indexOf('e')+1,temp.indexOf('C'));document.getElementById('text').innerHTML += str + ": 湿度为"+H+"%RH  温度为"+T+"℃\n";}}}function closeWebSocket() {websocket.close();}</script><script src="js/canvasjs.min.js"></script>
</head>
<body><div id="message"><div id="chartContainer" style="height: 370px; max-width: 850px; margin: 0px auto;"></div><div class="parent"><input id="val" type="text" value=""><input id="search" type="button" value="按时间搜索" onclick="search()"></div><textarea id="text" readonly></textarea>
</div>
</body>
</html>
/******************************END OF FILE************************************//****************************************************************************
@file    style.css -
@function    前端页面样式*****************************************************************************/
*{padding: 0;margin: 0;box-sizing: border-box;
}body{background-repeat: no-repeat;background-attachment: fixed;overflow: hidden;bottom: 0px;background-color: #c6ecd9;
}.parent {width: 100%;height: 42px;top: 4px;position: relative;
}#val{width: 750px;height: 40px;margin-left: 530px;border: 1px solid #ccc;font-size: 16px;outline: none;border-radius: 1.2rem;
}#search {/*button按钮border并不占据外围大小,设置高度42px*/width: 100px;height: 40px;position: absolute;background: #317ef3;border: 1px solid #317ef3;color: #fff;font-size: 16px;outline: none;border-radius: 1.2rem;
}#message{width: auto;height: auto;
}#text{width: 850px;height: 500px;margin-left: 530px;padding: 0;font-size: 18px;border-radius: 1.1rem;/*cursor: pointer;*/resize: none;outline: none;}
/******************************END OF FILE************************************//****************************************************************************
@file   WebSocketServer.java -
@function    集成ServerSocket以及WebSocket 通过ServerSocket监听获取的数据以WebSocket传送到页面显示
*****************************************************************************/
package com.example.tcpwebsocket;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;@ServerEndpoint("/index")
@Component
public class WebSocketServer extends Thread {//与某个客户端的连接会话,需要通过它来给客户端发送数据Session session;/*** 连接建立成功调用的方法** @param session 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据*/@OnOpenpublic void onOpen(Session session) throws IOException {Scanner scanner = new Scanner(System.in);System.out.print("输入待监听的端口:");int port = scanner.nextInt();WebSocketServer server = new WebSocketServer(port, session);server.start();}/*** 收到客户端消息后调用的方法** @param message 客户端发送过来的消息*/@OnMessagepublic void onMessage(String message) throws IOException {System.out.println("来自客户端的消息:" + message);}/*** 发生错误时调用** @param session* @param error*/@OnErrorpublic void onError(Session session, Throwable error) {System.out.println("发生错误");}/*** @param message* @throws IOException*///给客户端传递消息public void sendMessage(String message) throws IOException {this.session.getBasicRemote().sendText(message);}ServerSocket server = null;Socket socket = null;public WebSocketServer() {}public WebSocketServer(int port, Session session) {try {this.session = session;server = new ServerSocket(port);} catch (IOException e) {e.printStackTrace();}}@Overridepublic void run() {super.run();try {while (true) {socket = server.accept();if (socket != null) {InputStream in = socket.getInputStream();int len = 0;byte[] buf = new byte[1024];while ((len = in.read(buf)) != -1) {sendMessage(new String(buf, 0, len));}}}} catch (IOException e) {e.printStackTrace();}}}
/******************************END OF FILE************************************//****************************************************************************
@file   HelloController.java
@function    SpringBoot主程序web首页设定*****************************************************************************/
package com.example.tcpwebsocket.controller;import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class HelloController implements WebMvcConfigurer {@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/").setViewName("forward:/index.html");registry.setOrder(Ordered.HIGHEST_PRECEDENCE);}
}
/******************************END OF FILE************************************//****************************************************************************
@file   WebSocketConfig.java
@function    WebSocket的配置部分*****************************************************************************/
package com.example.tcpwebsocket.Config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;@Configuration
public class WebSocketConfig {/*** ServerEndpointExporter 作用** 这个Bean会自动注册使用@ServerEndpoint注解声明的websocket endpoint** @return*/@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}
}
/******************************END OF FILE************************************/

测试


基于STM32F1单片机、ESP8266WIFI模块、DHT11温湿度传感的WIFI网络温湿度传输系统相关推荐

  1. BLDC无刷直流电机和PMSM永磁同步电机 基于stm32F1的有传感器和无传感驱动 直流无刷电机有传感器和无传感驱动程序

    BLDC无刷直流电机和PMSM永磁同步电机 基于stm32F1的有传感器和无传感驱动 直流无刷电机有传感器和无传感驱动程序, 无传感的实现是基于反电动势过零点实现的,有传感是霍尔实现. 永磁同步电机有 ...

  2. 基于STM32F1与NRF24L01模块的SPI简单通信

    一.前言 1.简介: 本文是基于STM32F1,将数据发送至NRF模块的寄存器,并将数据重新读取,通过串口发送出来的简单SPI单通信. 2.SPI简介: 调过STM8的都已经对SPI有所了解,调法都一 ...

  3. 基于STM32的ESP8266WiFi模块波形检测仪

    使用STM32f103c8t6制作简易示波器将波形检测后上传到网页进行描点绘图.我负责下位机部分我的同学负责网页部分. 附带网址用Django写网页通过tcp-client,接收单片机所发的数据,进行 ...

  4. 基于51单片机的电子密码指纹锁无线WiFi通信原理图PCB

    功能介绍: 0.本系统采用STC12C5A60S2-35I作为单片机,因本系统需要使用WiFi模块和指纹模块,两者均是串口串口通信,89C52只有一路串口,因此无法满足需求,STC12C5A60S2- ...

  5. 基于51单片机心率计脉搏体温测量仪WIFI无线通信proteus仿真原理图PCB

    功能: 0.本系统采用STC89C52作为单片机 1.系统实时监测当前佩戴者的心率和体温,通过LCD1602显示相关数据 2.定时通过WIFI串口发送佩戴者的心率和体温 3.系统预留出串口接口,需要注 ...

  6. 基于Arduino的智能家居系统【ESP8266WIFI模块 DHT11温湿度模块 继电器 加湿模块 APP远程控制 数据上传机智云】

  7. 0343基于STM32单片机的茶园大棚环境土壤湿度光强WiFi监测系统proteus仿真原理图PCB

    功能介绍: 0.本系统采用STM32F103RCT6作为单片机 1.采用的LCD1602液晶实时显示当前光强土壤湿度等参数信息 2.当土壤湿度超过设定的阈值,蜂鸣器报警,同时控制水泵工作状态 3.按键 ...

  8. 基于51单片机的酒精检测仪

    目录 1.主要功能 2.仿真图 3.实验验证 4.程序源码 1.主要功能 如果实际的酒精值小于报警值且在正常显示状态下:绿灯闪,关蜂鸣器和继电器:如果实际的酒精值大于报警值且在正常显示状态:红灯闪,开 ...

  9. 基于51单片机的出租车计价器(程序+仿真+论文)

    1.主要功能 设计要求 : ①.不同情况具有不同的收费标准. 白天,晚上,途中等待(>10min 开始收费): ②.能进行手动修改单价 : ③.具有数据的复位功能: ④.具有启动计时开关.白天/ ...

最新文章

  1. 面向对象之内置方法(简单)、组合。以及接口归一化设计与抽象类
  2. InvisionApp学习
  3. JS ===和==区别
  4. 计算机病毒及其防治评课,区初中信息技术教研活动公开课评课感想
  5. 【题解】Grape luogu1156改 dp
  6. java为什么删除jpg删不掉_java-如何在不损失质量的情况下从图像(JPG)删除元数据?...
  7. java hash简易_Java手写简易版HashMap的使用(存储+查找)
  8. python discover()没有加载测试用例_Python系统学习 - Unittest
  9. Kali Linux 2022下载
  10. PackageInstaller 类安装/卸载应用
  11. A065_运行前端_跨域_列表_删除
  12. 开源机器学习之MATLAB代码--LSTM-SVRNN(五)
  13. 非常好用的开源矢量地图切片工具
  14. DirectX函数总结2
  15. 2022年国内私网IP地址
  16. 中国人寿财险java_中国人寿财险社会招聘笔试内容: 今天刚笔试完,蹭着记着赶紧写上来,以便大家以后参考;...
  17. 01005英制_高精度转换和格式化英制距离(英尺和英寸)
  18. Johnson法则证明
  19. input输入框限制中文汉字只能输入20个字符,英文10个字符!
  20. HTML11 表格和表单

热门文章

  1. deian   授权用户 sudo权限
  2. cdev_init函数
  3. [每日一题] 11gOCP 1z0-052 :2013-09-24 temporary tables.........................................C11...
  4. 女方妈妈和男方爸爸这样告诉即将结婚的儿女,写的真好,希望每个人都可以认真的把它看完...
  5. 深入系统底层trace
  6. 用openswan 2.4.7构建ipsec ×××笔记
  7. 与图论的邂逅09:树上启发式合并
  8. 浏览器内容双缓冲的设想
  9. SQL Server数据库漏洞评估了解一下
  10. 如何让div中的文字只显示一行,多余的文字隐藏并加上省略号(超链接形式)...