esp8266 实现温湿度上传(透传)

1.利用串口三给esp8266发送AT指令,串口一打印调试信息

下面附上主要代码

esp8266.c的重要函数

先介绍一个非常有意思的函数,利用下面这个函数可以直接用串口发送指令

//串口3,printf 函数
//确保一次发送数据不超过USART3_MAX_SEND_LEN字节
void u3_printf(char* fmt,...)  
{  
	u16 i,j; 
	va_list ap; 
	va_start(ap,fmt);
	vsprintf((char*)USART3_TX_BUF,fmt,ap);
	va_end(ap);
	i=strlen((const char*)USART3_TX_BUF);		//此次发送数据的长度
	printf("i is %d\r\n",i);
	printf("USART3_TX_BUF[j] is  ");
	for(j=0;j<i;j++)							//循环发送数据
	{
	  while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕   
		USART_SendData(USART3,USART3_TX_BUF[j]); 
		printf("%c",USART3_TX_BUF[j]);
	} 
	printf("\r\n");
}

 向esp8266发送AT指令的函数,相比较u3_printf()函数,多了一个对应答的判断。核心还是用u3_printf()发送。

//向ESP8266发送命令
//cmd:发送的命令字符串;ack:期待的应答结果,如果为空,则表示不需要等待应答;waittime:等待时间(单位:10ms)
//返回值:0,发送成功(得到了期待的应答结果);1,发送失败
u8 esp8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
	u8 res=0; 
	USART3_RX_STA=0;
	u3_printf("%s\r\n",cmd);	//发送命令
	printf("cmd is %s\r\n",cmd);
	if(ack&&waittime)		//需要等待应答
	{
		
		while(--waittime)	//等待倒计时
		{
			delay_ms(10);
			if(USART3_RX_STA&0X8000)//接收到期待的应答结果
			{
				if(esp8266_check_cmd(ack))
				{
					printf("ack:%s\r\n",(u8*)ack);
					break;//得到有效数据 
				}
					USART3_RX_STA=0;
			} 
		}
		if(waittime==0)
		{
			res=1; 
			printf("send error\r\n");
		}
	}
	return res;
} 

1.配置esp8266连接WiFi,设置工作模式。相当于初始化的过程

void esp8266_start_trans(void)
{
	//设置工作模式 1:station模式   2:AP模式  3:兼容 AP+station模式
	esp8266_send_cmd("AT+CWMODE=1","OK",500);
	//让Wifi模块重启的命令
	esp8266_send_cmd("AT+RST","ready",200);
	delay_ms(1000);         //延时3S等待重启成功
	delay_ms(1000);
	delay_ms(1000);
	
	//让模块连接上自己的路由
	while(esp8266_send_cmd("AT+CWJAP=\"wifi名\",\"wifi密码\"","WIFI GOT IP",900));
	//=0:单路连接模式     =1:多路连接模式
	esp8266_send_cmd("AT+CIPMUX=0","OK",90);
	//建立TCP连接  这四项分别代表了 要连接的ID号0~4   连接类型  远程服务器IP地址   远程服务器端口号
	while(esp8266_send_cmd("AT+CIPSTART=\"TCP\",\"192.168.0.106\",1234","CONNECT",200));	
	//是否开启透传模式  0:表示关闭 1:表示开启透传
	esp8266_send_cmd("AT+CIPMODE=1","OK",900);
//透传模式下 开始发送数据的指令 这个指令之后就可以直接发数据了
	esp8266_send_cmd("AT+CIPSEND","OK",50);
}

 发送数据的函数

//向ESP8266发送数据
//cmd:发送的命令字符串;waittime:等待时间(单位:10ms)
//返回值:发送数据后,服务器的返回验证码
u8* esp8266_send_data(u8 *cmd,u16 waittime)
{
	char temp[5];
	char *ack=temp;
	USART3_RX_STA=0;
	u3_printf("%s\r\n",cmd);		//发送命令
	if(waittime)		//需要等待应答
	{
		while(--waittime)	//等待倒计时
		{
			delay_ms(10);
			if(USART3_RX_STA&0X8000)//接收到期待的应答结果
			{
				USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符
				ack=(char*)USART3_RX_BUF;
				printf("ack:%s\r\n",(u8*)ack);
				printf("esp8266_send_data is ok");
					
				USART3_RX_STA=0;
				break;//得到有效数据 
			} 
		}
	}
	return (u8*)ack;
} 

利用adc1来采集

float Get_Temprate(void)
{
	u32 adcx;
	float result;
 	double temperate;
	adcx=Get_Adc_Average(ADC_Channel_16,10);	//读取通道16内部温度传感器通道,10次取平均
	temperate=(float)adcx*(3.3/4096);		//电压值
	temperate=(temperate-0.76)/0.0025 + 25; //转换为温度值 
	//result=temperate*=100;					//扩大100倍.
	return temperate;
}

利用adc3来采集光敏传感器数据

u8 Lsens_Get_Val(void)
{
	u32 temp_val=0;
	u8 t;
	for(t=0;t<LSENS_READ_TIMES;t++)
	{
		temp_val+=Get_Adc3(ADC_Channel_5);	//读取ADC值,通道5
		delay_ms(5);
	}
	temp_val/=LSENS_READ_TIMES;//得到平均值 
	if(temp_val>4000)temp_val=4000;
	return (u8)(100-(temp_val/40));
}

主函数

void DataAnalysis(void)
{
	
	float a,b;
	a=Get_Temprate();
	
	sprintf(data.TEM, "%f",a);
	printf("TEM IS %f\r\n",a);
	b=Lsens_Get_Val();
	sprintf(data.Light, "%f",b);
	printf("Light is %f\r\n",b);
}
int main(void)
{ 
	 
	delay_init(168);	    	 			//延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 			//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	 				//串口初始化为115200
	usart3_init(115200);	 				//串口初始化为115200
	Adc_Init();     
  Lsens_Init();
	DataAnalysis();
  creatjson();
	esp8266_start_trans();							//esp8266进行初始化

	esp8266_send_data(out,50);

	esp8266_quit_trans();

 	while(1)
	{
		
	}
 
}

实验结果

1串口打印信息

2利用手机的网络调试精灵,创建一个TCP服务端

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基于ESP8266温湿度报警器可以通过以下步骤实现: 1. 准备材料:ESP8266模块、温湿度传感器、蜂鸣器、LED灯、杜邦线、面包板、电源等。 2. 连接电路:将ESP8266模块、温湿度传感器、蜂鸣器、LED灯等连接在面包板上,并使用杜邦线连接各个模块。 3. 编写代码:使用Arduino IDE编写代码,实现温湿度传感器采集数据、ESP8266模块连接WiFi网络、上传数据到云端、接收云端指令等功能。 4. 部署设备:将设备安装在需要监测的环境中,如室内、温室等,实现温湿度数据的实时监测和报警功能。 需要注意的是,在实现过程中需要考虑到设备的稳定性、数据的准确性、网络连接的可靠性等因素,以确保设备的正常运行和数据的可靠性。 以下是一个基于ESP8266温湿度报警器的示例代码,你可以根据实际需求进行修改: ```C++ #include <ESP8266WiFi.h> #include <DHT.h> #define DHTPIN 2 // 温湿度传感器的引脚 #define DHTTYPE DHT11 // 使用DHT11传感器 #define buzzerPin 4 // 蜂鸣器的引脚 #define ledPin 5 // LED灯的引脚 const char* ssid = "your_SSID"; // WiFi网络名称 const char* password = "your_PASSWORD"; // WiFi网络密码 // 创建一个DHT对象 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); dht.begin(); // 初始化DHT传感器 pinMode(buzzerPin, OUTPUT); pinMode(ledPin, OUTPUT); WiFi.begin(ssid, password); // 连接WiFi网络 while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to WiFi"); } void loop() { // 读取温湿度传感器的数据 float temperature = dht.readTemperature(); float humidity = dht.readHumidity(); // 如果读取数据失败,则重新读取 while (isnan(temperature) || isnan(humidity)) { delay(1000); temperature = dht.readTemperature(); humidity = dht.readHumidity(); } // 将温湿度数据上传到云端 String url = "http://your_server_url/upload?temperature=" + String(temperature) + "&humidity=" + String(humidity); HTTPClient http; http.begin(url); int httpCode = http.GET(); if (httpCode > 0) { Serial.println("Upload temperature and humidity data"); } else { Serial.println("Failed to upload temperature and humidity data"); } http.end(); // 如果温度超过阈值,则触发报警 if (temperature > 30) { digitalWrite(buzzerPin, HIGH); // 开启蜂鸣器 digitalWrite(ledPin, HIGH); // 开启LED灯 } else { digitalWrite(buzzerPin, LOW); // 关闭蜂鸣器 digitalWrite(ledPin, LOW); // 关闭LED灯 } delay(10000); // 延时10秒 } ``` 上述代码中,ESP8266连接WiFi网络后,使用DHT11传感器读取温湿度数据,并上传到云端。如果温度超过设定的阈值,则触发报警,蜂鸣器和LED灯同时亮起。你可以根据自己的需求修改阈值和报警方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值