零知开源-室内温湿度监控系统1-本地进行数据显示

步骤

1、我们首先需要获取温湿度数据,我们将温湿度模块和零知开发板按照下面电路连接:

在零知开发工具中新建项目并编写如下代码:


												
	/**
	*    文件: 室内温湿度监控系统.ino      by 零知实验室([url=http://www.lingzhilab.com]www.lingzhilab.com[/url])
	*    -- 零知开源,让电子制作变得更简单! --
	*    时间: 2018/07/04 11:01
	*    说明: 使用零知开发板获取室内温湿度数据经过wifi上传到APP显示
	**/
	 
	#include "HTU3X.h" //加入SHT3X的库
	 
	//定义连接模块的各个引脚
	 
	 
	//SHT3X实例
	HTU3X myHumidity;
	//存放获取的温湿度数据
	float sht3x_humd, sht3x_temp;
	 
	//获取sht3x的数据
	void SHT3X_get_sample(float *humd, float *temp);
	 
	void setup() {
	    //打开串口,方便在串口中显示
	        Serial.begin(9600);
	        Serial.println("program start!");
	 
	        //开启SHT3X
	        myHumidity.begin();
	}
	 
	void loop() {
	     
	        SHT3X_get_sample(&sht3x_humd, &sht3x_temp);
	         
	        delay(500);
	}
	 
	void SHT3X_get_sample(float *humd, float *temp)
	{
	        myHumidity.readTempAndHumi(temp, humd);
	         
	        //在串口中显示
	        Serial.print(" 温度:");
	        Serial.print(*temp, 1);
	        Serial.print(" °C");
	        Serial.print(" 湿度:"); 
	        Serial.print(*humd, 1);
	        Serial.print("%");
	        Serial.println();
	}												
						

我们把代码编译后上传到开发板中验证一下是否是正确的结果,上传后打开串口监视器得到如下结果:

2、现在我们已经得到正确的温湿度数据了,下面我们把数据显示到OLED模块上,按照我们之前零知快速入门系列的OLED模块使用中进行连接硬件(这里我们的A5,A4两个接口被SHT3X占用了,所以我们把OLED的换成2,3脚),然后我们编写如下代码:


												
	/**
	*    文件: 室内温湿度监控系统.ino      by 零知实验室([url=http://www.lingzhilab.com]www.lingzhilab.com[/url])
	*    -- 零知开源,让电子制作变得更简单! --
	*    时间: 2018/07/04 11:01
	*    说明: 使用零知开发板获取室内温湿度数据经过wifi上传到APP显示
	**/
	 
	#include "HTU3X.h" //加入SHT3X的库
	#include "oled_demo.h"//OLED的库
	 
	//定义连接OLED模块的各个引脚
	#define OLED_DC 1
	#define OLED_RST 0
	#define OLED_SCL 2
	#define OLED_SDA 3
	 
	//OLED需要显示的内容
	unsigned char  oled_str_head[] =                    
	{           
	0x00,0x00,0x80,0x80,0x80,0x80,0xC0,0xFC,0xF8,0xC0,0x80,0x80,0x80,0x80,0x00,0x00,
	0x00,0x00,0x00,0x41,0x39,0x1F,0x1F,0x0F,0x0F,0x1F,0x1F,0x71,0x01,0x00,0x00,0x00,/*"★"*/
	0x00,0x00,0x80,0x80,0x80,0x80,0x60,0x1C,0x38,0x40,0x80,0x80,0x80,0x80,0x00,0x00,
	0x00,0x00,0x00,0x41,0x3E,0x22,0x10,0x08,0x08,0x10,0x2E,0x72,0x01,0x00,0x00,0x00,/*"☆"*/
	 
	0x00,0x00,0xC0,0x30,0x90,0xF0,0x54,0xFC,0x92,0x7A,0x08,0x08,0x28,0x10,0x00,0x00,
	0x00,0x00,0x10,0x08,0x04,0x1A,0x09,0x36,0x6A,0x19,0x02,0x04,0x08,0x08,0x00,0x00,/*"零",0*/
	 
	0x00,0x00,0x00,0x00,0x3C,0xA0,0x50,0x30,0x00,0x80,0x00,0x80,0x80,0x40,0x80,0x00,
	0x00,0x00,0x04,0x22,0x13,0x0E,0x09,0x09,0x01,0x03,0x0D,0x08,0x08,0x07,0x00,0x00,/*"知",1*/
	 
	0x00,0x00,0x00,0x00,0x80,0xE8,0x48,0x28,0x18,0x1C,0xE4,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x02,0x03,0x22,0x1E,0x01,0x01,0x01,0x01,0x7F,0x01,0x01,0x00,0x00,0x00,/*"开",2*/
	 
	0x00,0x00,0x40,0x84,0x18,0x08,0xC0,0xB8,0x48,0x34,0xC4,0xA4,0xE0,0x00,0x00,0x00,
	0x00,0x00,0x1F,0x7E,0x1A,0x06,0x31,0x13,0x25,0x43,0x3F,0x0B,0x10,0x30,0x00,0x00,/*"源",3*/
	 
	0x00,0x00,0x80,0x80,0x80,0x80,0x60,0x1C,0x38,0x40,0x80,0x80,0x80,0x80,0x00,0x00,
	0x00,0x00,0x00,0x41,0x3E,0x22,0x10,0x08,0x08,0x10,0x2E,0x72,0x01,0x00,0x00,0x00,/*"☆"*/       
	0x00,0x00,0x80,0x80,0x80,0x80,0xC0,0xFC,0xF8,0xC0,0x80,0x80,0x80,0x80,0x00,0x00,
	0x00,0x00,0x00,0x41,0x39,0x1F,0x1F,0x0F,0x0F,0x1F,0x1F,0x71,0x01,0x00,0x00,0x00,/*"★"*/
	 
	};
	 
	uint8_t oled_str_webaddr[] = "www.lingzhilab.com";
	 
	unsigned char oled_str_hutemp[] = 
	{
	0x10,0x60,0x02,0x8C,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,
	0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00,/*"温",0*/
	 
	0x10,0x60,0x02,0x8C,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,
	0x04,0x04,0x7E,0x01,0x44,0x48,0x50,0x7F,0x40,0x40,0x7F,0x50,0x48,0x44,0x40,0x00,/*"湿",1*/
	 
	0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00,
	0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00,/*"度",2*/
	 
	0x06,0x09,0x09,0xE6,0xF8,0x0C,0x04,0x02,0x02,0x02,0x02,0x02,0x04,0x1E,0x00,0x00,
	0x00,0x00,0x00,0x07,0x1F,0x30,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x10,0x00,0x00,/*"℃",0*/
	};
	 
	//SHT3X实例化
	HTU3X myHumidity;
	//存放获取的温湿度数据
	float sht3x_humd, sht3x_temp;
	 
	//oled实例化
	OLED_DEMO myoled(OLED_SDA, OLED_SCL, OLED_DC, OLED_RST);
	 
	//获取sht3x的数据
	void SHT3X_get_sample(float *humd, float *temp);
	 
	//在OLED显示温湿度数据
	void oled_show_sample(float humd, float temp);
	 
	void setup() {
	    //打开串口,方便在串口中显示
	        Serial.begin(9600);
	        Serial.println("program start!");
	 
	        //开启SHT3X
	        myHumidity.begin();
	         
	        //打开OLED
	        myoled.begin();
	         
	        //显示标题"零知开源"
	        for(int i=0; i<8; i++){
	                myoled.print_p16x16(i, 0, oled_str_head);//显示在第0行的第0-8列,这里一共可以显示4行
	        }
	        //显示网址[url=http://www.lingzhilab.com]www.lingzhilab.com[/url]
	        myoled.print_p6x8(16,7,oled_str_webaddr);
	         
	}
	 
	void loop() {
	     
	        //获取温湿度
	        SHT3X_get_sample(&sht3x_humd, &sht3x_temp);
	         
	        //数据显示到OLED
	        oled_show_sample(sht3x_humd, sht3x_temp);
	         
	         
	        delay(500);
	}
	 
	void SHT3X_get_sample(float *humd, float *temp)
	{
	        myHumidity.readTempAndHumi(temp, humd);
	         
	        //在串口中显示
	        Serial.print(" 温度:");
	        Serial.print(*temp, 1);
	        Serial.print(" °C");
	        Serial.print(" 湿度:"); 
	        Serial.print(*humd, 1);
	        Serial.print("%");
	        Serial.println();
	}
	 
	//我们的温湿度都是1位小数,并且都是 xx.x 的格式
	//这个函数把一个1位的小数转换成字符串数组,便于显示,其中最高位放在第一个下标中
	//例如:32.1 存放到数组中为:{'3','2','1'};
	void float_to_int_array(float f, unsigned char *arr)
	{
	        unsigned int intdata = f*10;//转换为整数
	         
	        //分别取出每一位
	        unsigned char d0 = intdata%10;
	        unsigned char d1 = (intdata%100)/10;
	        unsigned char d2 = intdata/100;
	         
	        //转换为数字的ASCII码
	        arr[0] = d2 + '0';
	        arr[1] = d1 + '0';
	        arr[2] = d0 + '0';
	}
	 
	void oled_show_sample(float humd, float temp)
	{        
	        //湿度信息显示,这里主要是位置需要调整
	        unsigned char arr_str_hum[3];
	        unsigned char arr_str_tem[3];
	        float_to_int_array(humd, arr_str_hum);
	        unsigned char str1[2] = {arr_str_hum[0], '\0'};
	        unsigned char str2[2] = {arr_str_hum[1], '\0'};
	        unsigned char str3[2] = {arr_str_hum[2], '\0'};
	        unsigned char str4[2] = ".";
	        unsigned char str5[2] = ":";
	        unsigned char str6[2] = "%";
	        myoled.print_p8x16(50, 4, str5);
	        myoled.print_p8x16(60, 4, str1);
	        myoled.print_p8x16(70, 4, str2);
	        myoled.print_p8x16(78, 4, str4);
	        myoled.print_p8x16(86, 4, str3);
	        myoled.print_p8x16(100, 4, str6);
	        myoled.print_p16x16(1, 2, oled_str_hutemp, 1);
	        myoled.print_p16x16(2, 2, oled_str_hutemp, 2);
	         
	        //温度信息
	        float_to_int_array(temp, arr_str_tem);
	        unsigned char str7[2] = {arr_str_tem[0], '\0'};
	        unsigned char str8[2] = {arr_str_tem[1], '\0'};
	        unsigned char str9[2] = {arr_str_tem[2], '\0'};
	        myoled.print_p8x16(50, 2, str5);
	        myoled.print_p8x16(60, 2, str7);
	        myoled.print_p8x16(70, 2, str8);
	        myoled.print_p8x16(78, 2, str4);
	        myoled.print_p8x16(86, 2, str9);
	 
	        myoled.print_p16x16(1, 1, oled_str_hutemp, 0);
	        myoled.print_p16x16(2, 1, oled_str_hutemp, 2);
	        myoled.print_p16x16(6, 1, oled_str_hutemp, 3);
	}												
						

把上面代码进行编译后上传到开发板中,可以看到OLED已经可以显示温湿度的信息了:

本次我们完成了本地的显示,我们接下来把数据经过wifi传输到远程进行显示,本次的完整代码工程见附件(复制到软件库的project目录后直接打开工程即可)。

完整工程下载:室内温湿度监控系统-v1.zip(点击下载)