目录

51单片机检测温湿度并且上传到阿里云

51单片机检测温湿度并且上传到阿里云

这个项目基于51 、ESP8266WiFi模块、温湿度DHT11传感器、阿里云来完成。

目录


1、项目构思

DHT11温湿度传感器采集数据后发送给单片机,单片机在经过简单的数据处理后把数据发送给esp8266WiFi模块,WiFi模块再把数据发送到阿里云上。

2、各模块的硬件连线及代码编写

2.1、dht11温湿度模块

2.1.1、dht11硬件连接

https://i-blog.csdnimg.cn/blog_migrate/0e5783c3ec0a00f56566928a3ed795e0.png

根据淘宝客服给的dht11模块资料,我们可以得出 DHT11

的供电电压为

3-5.5V这个信息以及 dht11与单片机之间通过单总线的数据格式(即通信只需要用到data这一根引脚),因此关于dht11的引脚接线就是:

VCC接单片机上的上的5v引脚

DATA引脚接单片机任意一个IO引脚

GND接地

2.1.2dht11代码编写

单片机与dht11 一次完整的数据传输为40bit,高位先出。

数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和

通讯过程如下图所示:

https://i-blog.csdnimg.cn/blog_migrate/01dcafce5cb01c890208fe7bce59d7d1.png

接收到数据后,数据分为数据0和数据1

数字0信号表示方法如下图所示

https://i-blog.csdnimg.cn/blog_migrate/3e99741967b0dd973827495fbe7cf995.png

数据 1 信号表示方法如下图所示

https://i-blog.csdnimg.cn/blog_migrate/27337a95695d2f17dfc04771318453a2.png

由此,我们可以编写出dht11检测温湿度的代码(dht11.c)

#include "main.h"

//DHT11起始信号
void DHT11_start()	
{
	Temp_data=1;
	
	delay_us(2);
	
	Temp_data=0;
	
	delay_ms(20);
	
	Temp_data=1;
	
	delay_us(13);
}

//接收一个字节
unsigned char DHT11_rec_byte()
{	
	unsigned char i,dat;

	for(i=0;i<8;i++)
	{
			while(!Temp_data);
		  delay_us(8);
			dat<<=1;
			if(Temp_data==1)
			{
				dat+=1;
			}
			while(Temp_data);
	}
	return dat;	
}

//接收温湿度数据
void DHT11_receive()
{
	unsigned int R_H,R_L,T_H,T_L;
	unsigned char RH,RL,TH,TL,revise;
	
	DHT11_start();
	Temp_data=1;
	if(Temp_data==0)
	{
		while(Temp_data==0);   //等待拉高     
        delay_us(40);  //拉高后延时80us
		
        R_H=DHT11_rec_byte();    //接收湿度高八位  
        R_L=DHT11_rec_byte();    //接收湿度低八位  
        T_H=DHT11_rec_byte();    //接收温度高八位  
        T_L=DHT11_rec_byte();    //接收温度低八位
        revise=DHT11_rec_byte(); //接收校正位
     
        delay_us(25);    //结束
        if((R_H+R_L+T_H+T_L)==revise)      //校正
        {
            RH=R_H;
            RL=R_L;
            TH=T_H;
            TL=T_L;
        }  
        rec_dat[0]=RH;
        rec_dat[1]=RL;
        rec_dat[2]=TH;
        rec_dat[3]=TL;
	}	
}

2.2、esp8266(WiFi模块)

2.2.1、硬件连接

博主所使用的是8引脚的esp8266-01s,在拿到WIFI模块后,首先要进行的是使用esp8266的出厂固件库(AT指令集)来检查,ESP8266的接线方式如下:

EN引脚接高电平(3.3V或者5V都可以,5V可能会发烫)

GND引脚接地

VCC:接3.3V的高电平

RX:接TXD

TX:接RXD

接完之后在串口调试助手中输入AT来验证模块是否正常,如果正常模块会返回一个ok,检查完成之后我们要顺便配置一下ESP8266的波特率,把他从原来的115200改为9600,AT+CIOBAUD=9600。

完成这些步骤之后,就要为ESP8266模块编写代码了。

2.2.2 ESP8266代码编写

代码编写分为两个部分,一个是在keil软件上编写的,与单片机连接的串口模块。此模块十分简单,就配置一个串口来给单片机与ESP8266进行通信即可,博主使用的单片机晶振是11.0592MHZ的,因此串口的配置(usart.c)如下:

#include "main.h"

bit uart_busy = 0;

void usart_init(void)//4800bps@12.000MHZ
{
	SCON=0x40;					//串口通信工作方式1
	REN=1;						//允许接收
	TMOD=0x20;					//定时器1的工作方式2
	TH1=0xFd,TL1=0xFd;		
	TI=1;                       //这里一定要注意
	TR1=1;	
	EA =1;                 //开总中断  
	ES =1;                 //开串口1中断  
}

void Uart_SendByteData(unsigned char msg)
{
	while(uart_busy); //等待上一个数据发送完成
	SBUF=msg;		  
	uart_busy = 1;	 //串口发送置忙
}
void Uart_SendStrData(unsigned char *msg)
{
	while(*msg)
	{
		Uart_SendByteData(*msg++);
	}
}

void USART_IRQHandler() interrupt 4
{ 
	unsigned char one_char;
	
	if(RI)
	{
		one_char = SBUF;
		RI=0;        //清空接收标志位
	}
	if(TI)
	{
		TI=0;
		uart_busy = 0;
	}
}

keil软件的代码编写完之后,就是arduino软件上的代码编写,此代码编写需用到配置阿里云中得到的信息,这待会在阿里云的部分在介绍。

安装Arduino软件。

链接:https://pan.baidu.com/s/1OWmn4ei7JENqGbAFIylMxg

提取码:hcwa

安装CP210x驱动,安装了这个驱动之后才能下载程序到ESP8266中。这里要把网盘中整个文件夹进行下载,之后才能正常安装。

链接:https://pan.baidu.com/s/1e9-uI2qscRPam-OQ7csttw

提取码:dh8c

使用arduino软件时需要先下载各种需要使用的固件库,如果下载安装成功会显示浅绿色的“INSTALLED”字样。

https://i-blog.csdnimg.cn/blog_migrate/e632b07168732788eeb5e075c2975d24.png

分别下载AliyunIoTSDK,ArduinoJson,PubSubClient,Crypto,AWS-SDK-ESP8266这几个库。并且点开文件中的首选项,把附加开发板管理器网址设置成以下:

开发板管理器网址:

然后再进行以下配置:

https://i-blog.csdnimg.cn/blog_migrate/0540a5578d1a18f3c44f5f37d43ca4bb.png

https://i-blog.csdnimg.cn/blog_migrate/ac4abbecade6b35d9f8ea6799b9f7dcb.png

安装完所有的固件库后,还要进行以下文件的修改 ,修改刚刚下载库中的PubSubClient.h文件,此步是关键步骤,不修改将导致无法连接上阿里云平台。

https://i-blog.csdnimg.cn/blog_migrate/ba003c9b1b0146a2403edf781b8f440a.png

https://i-blog.csdnimg.cn/blog_migrate/0b6006a7d523264ee61fe338480a3527.png

然后就是进行arduino代码的编写:

// 引入 wifi 模块,并实例化,不同的芯片这里的依赖可能不同
#include <ESP8266WiFi.h>
static WiFiClient espClient;

// 引入阿里云 IoT SDK
#include <AliyunIoTSDK.h>


// 设置产品和设备的信息,从阿里云设备信息里查看
#define PRODUCT_KEY "xxxx"      //此信息在阿里云部分PRODUCT_KEY
#define DEVICE_NAME "xxxxx"     //同上DEVICE_NAME
#define DEVICE_SECRET "xxx"     //同上DEVICE_SECRET
#define REGION_ID "cn-shanghai"     //对应阿里云华东2(上海)服务器

// 设置 wifi 信息
#define WIFI_SSID "xxx"          //自己的手机热点WiFi名字(此处为自己手机开出的热点给esp8266                
                                 //连接)
#define WIFI_PASSWD "xxxxxxx"       //自己的手机热点WiFi密码

char Serial_Buf[50];                //可根据自己定义的数据长度自行修改

unsigned int Rx_Cnt = 0;

char Temp[20];
char Hum[20];

void setup()
{
  Serial.begin(9600);

  // 初始化 wifi
  wifiInit(WIFI_SSID, WIFI_PASSWD);

  // 初始化 iot,需传入 wifi 的 client,和设备产品信息
  AliyunIoTSDK::begin(espClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID);

  //AliyunIoTSDK::send("temperature", 11.8);  //修改阿里云平台上对应设备的Tempature属性
}

void loop()
{
  AliyunIoTSDK::loop();
  
  Serial_Rece_Process();    //串口接收数据与数据处理
  AliyunIoTSDK::send("temperature",atof(Temp));
  AliyunIoTSDK::send("Humidity",atof(Hum));
}

// 初始化 wifi 连接
void wifiInit(const char *ssid, const char *passphrase)
{
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, passphrase);

  while (WiFi.status() != WL_CONNECTED)
  {
    delay(1000);
    Serial.println("WiFi not Connect");
  }
  Serial.println("Connected to AP");
}




//ESP8266串口接收数据与数据处理函数
void Serial_Rece_Process(void)
{
  unsigned char i =0;
  unsigned char sg = 0;
  

  while (Serial.available())
  {
    Serial_Buf[Rx_Cnt] = Serial.read();
    Rx_Cnt++;
    delay(3);
  }

  if (Rx_Cnt != 0)    
    for(int i=0;i<Rx_Cnt;i++)
    {

      /*此段代码是因为博主从串口接收到的数据格式是t:%d.%d,h=%d.%d\r\n这种格式*/
      if(i>1&&i<6)
      {
        Temp[i-2]=Serial_Buf[i];
       }
      else if(i>8&&i<13)
      {
      Hum[i-9]=Serial_Buf[i];
      }
    }
   
    Rx_Cnt = 0;
    //此处放置串口数据处理等代码
}

代码写完之后,再设置端口以及开发板的型号

https://i-blog.csdnimg.cn/blog_migrate/8c5e9e17be46461b767d989a3cf589a9.png

https://i-blog.csdnimg.cn/blog_migrate/ef55ff0a627187af8639978fa734f926.png 点击左上角的箭头进行编译。

编译的接线也是十分重要的,因为博主手中的esp8266模块根据IO0引脚来区分下载模式还是运行模式,当IO0引脚接低电平的时候为下载模式,悬空的时候为运行模式,所以我们在使用arduino来下载esp8266的代码时需要把IO0引脚,以及RST复位引脚接地。当编译过程中出现connecting字样的时候,让RST复位引脚悬空,当出现Hard resetting via RTS pin…字样的时候,插上RST引脚复位后,拔掉IO0引脚以及RST引脚,这时候,arduino的代码就已经烧录到ESP8266当中。

2.3阿里云

此处是讲解阿里云的配置

1.登录阿里云平台账号

2.进入阿里云物联网平台(点击左上角的产品,然后点击物联网IOT,选择企业物联网平台)就会出现这个界面:

https://i-blog.csdnimg.cn/blog_migrate/3e8d76299ca5eaface5b906def11f06f.png

https://i-blog.csdnimg.cn/blog_migrate/a1e731ce6f769a8dba61ecef4883ca42.png

https://i-blog.csdnimg.cn/blog_migrate/6e3d0fbb7e5f31b313c2ea9a3c0a28d9.png

然后就是创建自定义产品

https://i-blog.csdnimg.cn/blog_migrate/b67880f39b528a9371d42236a25c4884.png

https://i-blog.csdnimg.cn/blog_migrate/128ab5a588383014659923304290b251.png

定义产品功能属性

https://i-blog.csdnimg.cn/blog_migrate/d31b58554fc16726e8e4058bcc7ff114.png

https://i-blog.csdnimg.cn/blog_migrate/02566526d08075b1ac72c7b3642eb7bf.png

https://i-blog.csdnimg.cn/blog_migrate/b9493c6d550e08aa6033f6a34dbb01e7.png

https://i-blog.csdnimg.cn/blog_migrate/38080e4e2275839cd074af11c2349386.png

添加刚刚创建的产品类别的设备。

https://i-blog.csdnimg.cn/blog_migrate/11a4034a339155e2cd503d508d9d9482.png

这一步很关键,复制设备三元组信息到文本文件中保存好,arduino软件编写esp8266代码部分会依靠这个信息才能连接上阿里云物联网平台。

https://i-blog.csdnimg.cn/blog_migrate/17e2238a1055264ac710569088a34862.png

https://i-blog.csdnimg.cn/blog_migrate/96bed93b9b51b6c30f99bd4800dec256.png 至此,阿里云配置完成。

3.产品结果展示:

https://i-blog.csdnimg.cn/blog_migrate/e13d137c4b49cf5d08319cc242f205be.png