日历时钟+环境检测
作者:andy
随着生活水平的提高,人们对居住的室内环境要求越来越高,除了温湿度外,还对室内的PM2.5浓度,CO2及TVOC等数值越来越关注。所以想开发一个设备可以显示日历、时钟的同时可以显示室内的环境数值。平头哥提供的RVB2601提供的丰富接口资源,比如按键,I2C接口,WiFi接口,OLED显示等。我利用这些资源,另采购了几个环境模块,实现了温湿度、CO2,TVOC和PM2.5等的检测与显示。并将采集到的数据上传到阿里云生活物联网,可以远程检测室内的温湿度等信息。
本作品平时可以作为室内的一个电子小摆件,主要功能是用来显示日历、时间,室内的实时温湿度、CO2、TVOC,PM2.5浓度。日历时钟实现了开机网络对时,无需手动调节。由于OLED的显示区域有限,所以通过操作按键1切换屏幕的方式来显示不同页面的内容,上电开机后默认显示的是日历、时间和星期几。按一次按键后跳到温湿度页面,再按按键跳到CO2等气体显示页面。蓝色LED灯每闪一次读取一次环境数值,每隔五秒上传一次采集到的数值到阿里云物联网平台。
本作品除了几个环境模块外,其余全部使用板载资源,主控为CH2601,WIFI芯片为W800与主控之间采用SPI接口连接,OLED显示部分也是通过SPI与主控连接,DEBUG通过USB转串口芯片与主控芯片的串口相连, LED、按键直接与主控的GPIO连接,外采的模块主要有温湿度模块、激光粉尘模块、气体传感模块。温度传感器和气体传感器并联后与主控I2C连接。激光粉尘模块直接与主控的按键2连接。
各个部分功能说明:
1.OLED显示模块
(1)用来显示日历和时间
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)显示采集到的温度和湿度
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值。
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进行校时,连接阿里云生活物联网平台上传采集到的环境数据。
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指示灯
数据采集、更新指示灯。
源码:
(下载次数: 0, 2022-6-24 11:02 上传)
从开机到NTP校时,数据上传阿里云物联网平台,操作按键分别显示日历时间页面,温湿度页面和CO2,TVOC,PM2.5页面。
首次使用平头哥的芯片与开发板,受益匪浅。熟悉了平头哥芯片的开发环境和开发流程。学会了使用平台提供的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环境传感器都取eCO2和TVOC - 平头哥RISC-V RVB2601活动专区 - 电子工程世界-论坛 (eeworld.com.cn)
【平头哥RVB2601创意应用开发】五。使用NTP授时RTC时钟 - 平头哥RISC-V RVB2601活动专区 - 电子工程世界-论坛 (eeworld.com.cn)
【平头哥RVB2601创意应用开发】六。环境传感器数据上传阿里云服务器 - 平头哥RISC-V RVB2601活动专区 - 电子工程世界-论坛 (eeworld.com.cn)
作品源码链接更新
链接:https://pan.baidu.com/s/1skOiqMMEE_-i_UeL_69rhQ
提取码:8w7b