[作品提交] 日历时钟+环境检测——作品提交

anni_zzg   2022-6-3 19:12 楼主

 

日历时钟+环境检测

 

作者:andy

  • 项目背景

        随着生活水平的提高,人们对居住的室内环境要求越来越高,除了温湿度,还对室内的PM2.5浓度,CO2及TVOC等数值越来越关注。所以想开发一个设备可以显示日历、时钟的同时可以显示室内的环境数值。平头哥提供的RVB2601提供的丰富接口资源,比如按键,I2C接口,WiFi接口,OLED显示等。我利用这些资源,采购了几个环境模块,实现了温湿度、CO2,TVOC和PM2.5等的检测与显示。并将采集到的数据上传到阿里云生活物联网,可以远程检测室内的温湿度等信息

  • 作品简介

       本作品平时可以作为室内的一个电子小摆件,主要功能是用来显示日历时间,室内的实时温湿度、CO2、TVOC,PM2.5浓度日历时钟实现了开机网络对时,无需手动调节。由于OLED的显示区域有限,所以通过操作按键1切换屏幕的方式来显示不同页面的内容,上电开机后默认显示的是日历、时间和星期几。按一次按键后跳到温湿度面,再按按键跳到CO2等气体显示面。蓝色LED灯每闪一次读取一次环境数值,每隔五秒上传一次采集到的数值到阿里云物联网平台。

    84.png

  • 系统框图

         本作品除了几个环模块外,其余全部使用板载资源主控为CH2601,WIFI芯片为W800与主控之间采用SPI接口连接,OLED显示部分也是通过SPI与主控连接,DEBUG通过USB转串口芯片与主控芯片的串口相连, LED按键直接与主控的GPIO连接外采的模块主要有温湿度模块、激光粉尘模块、气体传感模块。温度传感器和气体传感器并联后与主控I2C连接。激光粉尘模块直接与主控的按键2连接。

81.png

 

各个部分功能说明:

1.OLED显示模块

(1)用来显示日历和时间 

         82.png

 csi_rtc_get_time(&aita_rtc, &rtc);

    strftime(oled_buf, sizeof(oled_buf), "%Y-%m-%d", &rtc);//日期显示
    show_string(32, 0, oled_buf);

    strftime(oled_buf, sizeof(oled_buf), "%T", &rtc);//时间显示
    show_string(40, 16, oled_buf);
	
	
	strftime(oled_buf, sizeof(oled_buf), "%A", &rtc);//星期几
    show_string(44, 32, oled_buf);

(2)显示采集到的温度和湿度 

83.png

	uint8_t o_x,o_y;
	
	o_x=8;o_y=16;	
	
	LCD_ShowWord(o_x,o_y,0);//温
	o_x+=16;
	LCD_ShowWord(o_x,o_y,4);//度
	o_x+=16;
		
	sprintf(oled_buf, ":%5.2f", Temperature); // 111.01*C 100.01%(保留2位小数)
	show_string(o_x, o_y, oled_buf);
	o_x+=48;
	
	LCD_ShowWord(o_x,o_y,6);//℃
	
	o_x=8;o_y=32;	
	
	//湿度:xx.xx%RH
	LCD_ShowWord(o_x,o_y,2);//
	o_x+=16;
	LCD_ShowWord(o_x,o_y,4);//
	o_x+=16;
	
	sprintf(oled_buf, ":%5.2f%%RH",Humidity); // 111.01*C 100.01%(保留2位小数)
	show_string(o_x,o_y, oled_buf);

(3)显示室内的二氧化碳和TVOC值,PH2.5值。

85.png

o_x=32;o_y=0;
	//气体浓度
	LCD_ShowWord(o_x,o_y,26);//
	o_x+=16;
	LCD_ShowWord(o_x,o_y,28);//
	o_x+=16;
	LCD_ShowWord(o_x,o_y,30);//
	o_x+=16;
	LCD_ShowWord(o_x,o_y,4);//
	

    o_x=8;o_y=16;
	sprintf(oled_buf, "eCO2:%3dppm ", eco2);
	
	show_string(o_x,o_y, oled_buf);
	
	
	o_x=8;o_y=32;
	sprintf(oled_buf, "TVOC:%3dppb",tvoc);
	
	show_string(o_x,o_y, oled_buf);
	
	o_x=8;o_y=48;
	sprintf(oled_buf, "PM2.5:%3d",pm2d5);
	
	show_string(o_x,o_y, oled_buf);

2.WIFI网络模块

通过连接无线路由,连接NTP服务器对RTC进行校时,连接阿里云生活物联网平台上传采集到的环境数据。

 

86.png

3.温湿度和气体传感器

采集温湿度值,二氧化碳、TVOC浓度。

//温湿度采集   
    write_data[0] = 0x2c;
    write_data[1] = 0x06;

    num = csi_iic_master_send(&master_iic, STHT30_ADDR, write_data, 2, 1000);
    if(num != 2) {
	printf("csi_iic_master_send error\n");
	return -1;
    }
    mdelay(500);
    num = csi_iic_master_receive(&master_iic, STHT30_ADDR, buff, 6, 1000);

    tem = ((buff[0] << 8) | buff[1]); //温度拼接
    hum = ((buff[3] << 8) | buff[4]); //湿度拼接

    /*转换实际温度*/
    Temperature = (175.0 * (float)tem / 65535.0 - 45.0); // T = -45 + 175 * tem / (2^16-1)
    Humidity = (100.0 * (float)hum / 65535.0);           // RH = hum*100 / (2^16-1)
//eco2,tvoc采集
    write_data[0] = 0x20;
    write_data[1] = 0x08;

    num = csi_iic_master_send(&master_iic, SGP30_ADDR, write_data, 2, 100);
    if(num != 2) {
	printf("csi_iic_master_send error\n");
	return -1;
    }
    mdelay(20);

    num = csi_iic_master_receive(&master_iic, SGP30_ADDR, buff, 6, 200);
    if(num != 6) {
	printf("csi_iic_master_receive error\n");
	return -1;
    }

    if(sgp30_checksum(buff, 2) == buff[2]) {
	eco2 = (buff[0] << 8) | buff[1]; // co2拼接
	tvoc = (buff[3] << 8) | buff[4]; // tvoc拼接

4.激光粉尘模块

采集室内的PM2.5浓度值。

//pm2.5采集
static void key2_interrupt_handler(csi_gpio_pin_t* pin, void* arg)
{
	 if(csi_gpio_pin_read(&pin_key2) == GPIO_PIN_LOW) //下降沿
	{
		pm2d5=ms_count;
		ms_count=0;
		csi_gpio_pin_irq_enable(&pin_key2, false);
		csi_gpio_pin_irq_mode(&pin_key2, GPIO_IRQ_MODE_RISING_EDGE);
		csi_gpio_pin_irq_enable(&pin_key2, true);
		

	}else
	{
		
		ms_count=0;
		csi_gpio_pin_irq_enable(&pin_key2, false);
		csi_gpio_pin_irq_mode(&pin_key2, GPIO_IRQ_MODE_FALLING_EDGE);
		csi_gpio_pin_irq_enable(&pin_key2, true);
		
	}
}

5.RTC实时时钟模块

进行日历和时间的显示。

6.显示按键

屏幕内容的切屏操作

static void key1_interrupt_handler(csi_gpio_pin_t* pin, void* arg)
{
	 if(csi_gpio_pin_read(&pin_key1) == GPIO_PIN_LOW) {
		
		Fill_RAM(0x00); // Clear Screen
		menu_item = (++menu_item)%3;
		
	//printf("menu item %d times\r\n", menu_item);
    }
}

7.LED指示灯

数据采集、更新指示灯。

 

 

源码:

ch2601_helloworld.rar (64.56 MB)
(下载次数: 0, 2022-6-24 11:02 上传)

 

  • 视频演示(视频简介+链接)

      从开机到NTP校时,数据上传阿里云物联网平台,操作按键分别显示日历时间页面,温湿度页面和CO2,TVOC,PM2.5页面。

863b6ac081a57b81e99fcd0d170657aa

  • 项目总结(项目文字总结+帖子分享链接汇总)

        首次使用平头哥的芯片与开发板,受益匪浅。熟悉了平头哥芯片的开发环境和开发流程。学会了使用平台提供的API库进行应用程序的开发。

对于本项目完成了日历、时间的显示。实现了NTP校时功能。通过库提供的I2C函数对I2C设备进行操作。学会了阿里云物联网平台的设置与数据上传。但是由于开发工程中遇到了一些网络问题,导致时间上太仓促,没有实现手机端APP端的开发。

 

开发中遇到的开发板的问题

最后,再次感谢平头哥和EEWORLD提供这次机会,期待平头哥继续完善生态,发布更好的产品

下面是帖子汇总

【平头哥RVB2601创意应用开发】一 搭建CDK开发环境 - 平头哥RISC-V RVB2601活动专区 - 电子工程世界-论坛 (eeworld.com.cn)

【平头哥RVB2601创意应用开发】二 搞定GPIO - 平头哥RISC-V RVB2601活动专区 - 电子工程世界-论坛 (eeworld.com.cn)

【平头哥RVB2601创意应用开发】三 OLED显示日历,时间,温湿度 - 平头哥RISC-V RVB2601活动专区 - 电子工程世界-论坛 (eeworld.com.cn)

【平头哥RVB2601创意应用开发】四 SGP30环境传感器都取eCO2TVOC - 平头哥RISC-V RVB2601活动专区 - 电子工程世界-论坛 (eeworld.com.cn)

【平头哥RVB2601创意应用开发】五。使用NTP授时RTC时钟 - 平头哥RISC-V RVB2601活动专区 - 电子工程世界-论坛 (eeworld.com.cn)

【平头哥RVB2601创意应用开发】六。环境传感器数据上传阿里云服务器 - 平头哥RISC-V RVB2601活动专区 - 电子工程世界-论坛 (eeworld.com.cn)

回复评论 (4)

1 来自 5楼 nmg 

作品源码链接更新

链接:https://pan.baidu.com/s/1skOiqMMEE_-i_UeL_69rhQ
提取码:8w7b

点赞  2022-6-21 16:58
恭喜作品完成,辛苦了!
点赞  2022-6-8 07:54
学习,开发板还是很强大的,可玩性真的高
点赞  2022-6-8 08:18

听两遍都是

虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2022-6-21 16:13
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复