手机APP远程温湿度监控系统(连上公网、阿里云)

APP界面:
在这里插入图片描述
实物图:
在这里插入图片描述
操作演示:
在这里插入图片描述

一、 硬件电路图

在这里插入图片描述
这里有两点需要说明:

1.第一点是关于LCD1602需不需要加上拉电阻的说明。

51单片机P0口作为IO口输出时,输出低电平为0 输出高电平为高组态(并非5V,相当于悬空状态,也就是说P0
口不能真正的输出高电平)。给所接的负载提供电流,因此必须接上拉电阻(一电阻连接到VCC),

这句话是对的,但是当P0口作为总线输出的时候,他是不需要加上拉电阻的,例如图中P0口接的是LCD的数据口,赋值时 P0=DATA;

另一种情况是如果是用STM32来驱动的话,请注意。
还要根据LCD1602是5V还是3.3V来加上拉电阻。此处不细说。

2.第二点是关于继电器电路的说明。

图中的继电器电路我采用的是低电平触发,为什么是低电平触发而不是高电平触发呢?这也是有讲究的。

目前我这个系统想法是上电的时候,指示灯是暗的,当收到开启命令后,继电器“嗒”的一声,灯亮。

重点来了,51单片机上电瞬间IO口是高电平,所以
如果采用高电平触发的话,继电器一上电就吸合了。

三极管的作用是放大电流,因为51单片机的输出电流较小。

二、软件程序

1.单片机程序

单片机程序不难:
DHT11、LCD1602这些驱动程序网上都有
这里我把最主要的ESP8266通信程序
以及串口中断判断程序放出来。


//这里是某些宏定义
#define uchar unsigned char 
#define uint unsigned int 

volatile uchar Rec_stop = 0;  //接收停止位
volatile uchar flag = 0;      //连接标志位
volatile uchar RsPoint = 0;   //接收字节位
volatile uchar rec_buf[2];    //OK判断位
volatile uchar TX_Flag = 0;   //开启发送标志位
volatile uchar RX_Flag = 0;   //开启接收标志位
volatile uchar TH_Flag = 0;   //温湿度发送标志位

sbit keep_te = P1^6;   //定义保温开关接口
sbit keep_hu = P1^5;   // 定义保湿开关接口
1.1 ESP8266代码
void wifi_init()
{
    
    
    //esp8266复位
	memset(rec_buf,' ',sizeof(rec_buf));
   RsPoint=0;
    SendString("AT+RST\r\n");
    write_1602com(0x01);
	write_string(0x80,"AT+RST",0);
	while(Rec_stop==0);
	Rec_stop=0;
	write_string(0x80+0x40,rec_buf,0);
    delayms_1000ms(14);
	
    
    //设置sta兼ap模式
	memset(rec_buf,' ',sizeof(rec_buf));
  RsPoint=0;
    SendString("AT+CWMODE=1\r\n");
    write_1602com(0x01); 
	write_string(0x80,"AT+CWMODE=1",0);
    while(Rec_stop==0);
	Rec_stop=0;
    write_string(0x80+0x40,rec_buf,0);
    SendString("\r\n");
    delayms_1000ms(4);
    
	//清除回显
    memset(rec_buf,' ',sizeof(rec_buf));
   RsPoint=0;
    SendString("ATE0\r\n");
    write_1602com(0x01);  //清屏
	write_string(0x80,"ATE0",0);
    while(Rec_stop==0);
	Rec_stop=0;
    delayms_1000ms(4);

    //连接热点
	memset(rec_buf,' ',sizeof(rec_buf));
   RsPoint=0;
    SendString("AT+CWJAP=\"hhhh\",\"a123456789\"\r\n");
    write_1602com(0x01);
	write_string(0x80,"Linking AP...",0);
    while(Rec_stop==0);
	Rec_stop=0;
	write_string(0x80+0x40,rec_buf,0);
    delayms_1000ms(18);
    
    //设置单连接
  	memset(rec_buf,' ',sizeof(rec_buf));
    RsPoint=0;
    SendString("AT+CIPMUX=0\r\n");
    write_1602com(0x01);
	  write_string(0x80,"AT+CIPMUX=0",0);
    while(Rec_stop==0);
	  Rec_stop=0;
  	write_string(0x80+0x40,rec_buf,0);
    delayms_1000ms(4);
    
    //开始监听
    memset(rec_buf,' ',sizeof(rec_buf));
    SendString("AT+CIPSTART=\"TCP\",\"8.129.224.216\",3000\r\n");
    //这个就是公网的IP地址以及端口号。
    write_1602com(0x01);
    write_string(0x80,"AT+CIPSTART",0);
    while(Rec_stop==0);
    Rec_stop=0;
	  write_string(0x80+0x40,rec_buf,0);
    delayms_1000ms(4);

    //开启透传模式
		memset(rec_buf,' ',sizeof(rec_buf));
		SendString("AT+CIPMODE=1\r\n");
		write_1602com(0x01);
		write_string(0x80,"AT+CIPMODE=1",0);
		while(Rec_stop==0);
    Rec_stop=0;
		write_string(0x80+0x45,rec_buf,0);
    delayms_1000ms(4);


  //开始发送数据		
		memset(rec_buf,' ',sizeof(rec_buf));
		SendString("AT+CIPSEND\r\n");
		write_1602com(0x01);
		write_string(0x80,"AT+CIPSEND",0);
		while(Rec_stop==0);
    Rec_stop=0;
		write_string(0x80+0x40,rec_buf,0);
    delayms_1000ms(4);

//发送初始化的继电器开关值
    memset(rec_buf,' ',sizeof(rec_buf));
		SendString("{\"type\":\"kg\",\"wdkg\":\"0\",\"sdkg\":\"0\"}");
    write_1602com(0x01);
    write_string(0x80,"send_relay",0);	
		while(Rec_stop==0);
    Rec_stop=0;		
    write_string(0x80+0X40,"OK",0);
    delayms_1000ms(4);
    write_1602com(0x01);

//发送一段温湿度的数值
    memset(rec_buf,' ',sizeof(rec_buf));
		SendString("{\"type\":\"wsd\",\"wd\":\"0\",\"sd\":\"0\"}");
    write_1602com(0x01);
    write_string(0x80,"send_data",0);
}
1.2 串口判断字符代码
void Usart() interrupt 4//在中断里面进行两个判断,首先是WiFi响应"OK"的判断,接着是":A" ":B" ":C" ":D"的判断
{
	uchar receiveData;
    
    if(RI == 1)
    {       
				receiveData = SBUF;//出去接收到的数据
				flag = 1;
				RI = 0;//清除接收中断标志位	
					
				 if(TX_Flag == 1)	//进入通信部分 收发信息 做出反应
				 { 
								
					 if(receiveData == ':') 
							{
								RX_Flag = 1;
							}
							else if(RX_Flag == 1)
							{
								if(receiveData == 'A')
								{
								 SendString("{\"type\":\"kgchanged\"}");   //因为是低电平触发,所以改为0是触发
									keep_te=0;
									keep_hu=0;
								}
								if(receiveData == 'B')
								{
								 SendString("{\"type\":\"kgchanged\"}");
									keep_te=0;
									keep_hu=1;
									
								}
								if(receiveData == 'C')
								{
								 SendString("{\"type\":\"kgchanged\"}");
									keep_te=1;
									keep_hu=0;									
								}
								if(receiveData == 'D')
								{
								 SendString("{\"type\":\"kgchanged\"}");
									keep_te=1;
									keep_hu=1;
								}
								RX_Flag = 0; //自锁
								
							}
					}
				 
//上面的判断是来控制保温保湿开关的,下面的判断是用来判断ESP8266指令的OK返回
					if((RsPoint==0)&&(receiveData=='O'))
					{  
						rec_buf[RsPoint]=receiveData;
						RsPoint++;
					}
					else if((RsPoint==1)&&(receiveData=='K'))
					{
						rec_buf[RsPoint]=receiveData;
						RsPoint++;
						Rec_stop=1;
					}
					else
					{
						RsPoint=0;
					} 
									
	 }		 
}

RsPoint 代码解释。

因为我要判断对方有没有发送OK给我,OK是两个字符,占两个字节,而单片机是一个字节进入一次中断这样。所以接收到O进入中断,保存。接着处理剩下的K,进入下次中断、保存、接着Rec_stop置1,那么ESP8266就可以发送下一个指令了。

假设我收到的是OAK的话,那么Rec_stop也不会置1, 因为当时A的时候,RsPoint就会是0。
所以RsPoint的作用是保证O和K是连在一起的。

这里的重难点是连续字符的判断。

2.APP代码懒的贴了,太多。
3.视频展示

https://www.bilibili.com/video/BV1py4y1Y7tq

发邮件虽然说不是很麻烦,但是多起来就不想发了,所以大家关注我公众号:高精度小数 回复:代码 就可以得到代码了

在这里插入图片描述

需要完整代码的公众号回复

  • 11
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 37
    评论
远程温湿度监控系统项目是一种基于C51单片机的原理图。原理图中包含以下模块:传感器模块、C51单片机模块、无线传输模块、远程接收模块和控制模块。 传感器模块用于采集环境的温度和湿度数据,一般采用温湿度传感器,如DHT11或DHT22。传感器将采集到的数据通过模拟信号输出。 C51单片机模块是系统的核心部分,负责接收传感器模块的数据,通过模数转换将模拟信号转换为数字信号,并进行数据处理和存储。C51单片机还可以根据需要控制其他硬件模块的工作状态。 无线传输模块用于将C51单片机处理后的数据通过无线通信方式发送出去,一般可以选择蓝牙、Wi-Fi或LoRa等。无线传输模块将数据转换成无线信号,并通过天线进行传输。 远程接收模块负责接收无线传输模块发送的数据,并进行解码和解析。接收模块将数据转换成可读格式,并将数据传输到远程服务器或云平台。 控制模块是远程温湿度监控系统的用户界面,用户可以通过控制模块实时监控环境的温度和湿度数据,并可以设定报警阈值。当温度或湿度超过设定的阈值时,控制模块会触发报警。 通过以上模块的协同工作,远程温湿度监控系统能够实现对远程环境的实时监控和数据传输。用户可以通过手机APP或电脑等终端设备随时查看和控制监控系统。这样,无论用户身在何处,都可以远程监控并实时掌握目标环境的温湿度状况。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值