【平头哥RVB2601创意应用开发】+室内环境监测平台
[复制链接]
本帖最后由 打破传统 于 2022-6-7 00:51 编辑
一、项目背景
RVB2601是基于平头哥生态芯片CH2601设计的一款开发板,板载JTAG调试器、WiFi&BLE芯片 W800,音频ADC-ES7210,音频DAC-ES8156,128X64 OLED屏幕,RGB三色指示灯,用户按键,兼容Arduino的扩展接口。非常适合智能家居领域的各种场景应用开发。
RVB2601 资源如下图:
当今世界室内空气质量已经越来越成为一个大家重点关注的问题,随着家装行业的繁荣,各大厂商也推出了很多有机物含量检测传感器,之前参加论坛里的一个活动得到一个包含温湿度和VCO检测的小板子,刚好可以结合平头哥的RVB2601做成一个室内环境监测平台,恰逢上海疫情,工作条件有限,想购置的器件也买不到,时间本来应该很充足,但由于这样那样的工作,终成下面的粗略结果,待后续完善。
二、项目框图
三、各个模块详解
1、主控模块CH2601
CH2601是基于平头哥32位玄铁CPU E906的RISC-V 生态芯片,配置如下:
cpu
•32 位 CPU 玄铁 E906
•支持 48 个可嵌套中断源
存储器资源
•512KB XIP Flash
•64KB(DSRAM)+64KB(DSRAM)+64KB(DSRAM)+32KB(ISRAM)+32KB(ISRAM)
•8KB BOOTROM
•1KB EFuse
外设
•DMAC
•RTC
•PWM
•32 位看门狗计数器
•USB1.1 Device
•GPIO
•7路 II2S
•12bit ADC
•4 路 32 位定时器
•2 路 SPI 串行接口
•1 路 I2C 串行接口
•2 路 UART 串行接口
复位电路
•外部复位电路
•看门狗复位
•上电复位
•掉电复位
•CPU 软复位
物理特性
•SMIC 55nm ULL 生产工艺
•220MHz 主频
2、2.42英寸OLED 单色显示屏
•分辨率 128x64
•控制芯片SSD1309
•接口类型 8-bit 68xx/80xx Parallel,4-wire SPI,I2C
•显示颜色 蓝色
•显示区域 55.01x27.49(mm)
•面板尺寸 60.50x37.00x2.00(mm)
•像素大小 0.40x0.40(mm)
•像素间距 0.43x0.43(mm)
•管脚数量 24pin
•视角方向 全视角
•工作温度 -40~70度
•工作电压 3.3V
•连接方式 0.5mm 间距 插接式FPC
3、SVM40 模块
•主控芯片 STM32G030F6P6 ARM 微控制器
•温湿度传感器 SHT40
•VOC传感器 SGP40
•SHT40相对湿度精度 ±1.8%RH
•SHT40温度精度 ±0.2 °C
•SHT40供电范围 1.08 V - 3.6 V
•SHT40平均电流 0.4µA(1 Hz速率测量值)
•SHT40待机电流 80nA
•SHT40接口 I2C
•SHT40测量范围 湿度 0-100%RH, 温度 -40 - 125 °C
•SHT40接口 I2C
•SGP40电压范围 1.7 V - 3.6 V
•SGP40电流消耗 2.6-3.5mA(分别对应3.3和1.8V)
•SGP40测量范围 0-1000ppm乙醇当量
•SGP40传感器输出 16位原始数字信号
•SGP40处理后输出 数字VOC指数信号
•SGP40响应时间 <10s(τ63)
•SGP40启动时间 <60s
•SGP40片内温度补偿
•SGP40尺寸 2.44x2.44x0.85mm
•模块接口 I2C /UART
四、软件流程图
五、各部分功能说明和解析
1、主体代码实现
通过参考gui_demo的实现系统初始化及多任务调度,代码如下:
int main(void)
{
board_yoc_init();
LOGD(TAG, "%s\n", aos_get_app_version());
player_init();
cli_reg_cmd_player();
delay_ms(5000);
// oled_init();
aos_task_new("uart", uart_voc_task, NULL, 10 * 1024);
aos_task_new("gui", gui_u8g2_task, NULL, 10 * 1024);
return 0;
}
2、开机语音功能
通过移植demo工程player_demo实现,语音是通过手机录入原始MP3音频,利用二进制音频转换软件转成对应的数组,然后替换原有的音频头文件,代码如下:
int cli_reg_cmd_player(void)
{
char url[128];
snprintf(url, sizeof(url), "mem://addr=%u&size=%u", (uint32_t)&_welcom_mp3, _welcom_len);
player_play(get_player_demo(), url, 0);
return 0;
}
3、uart任务功能
uart任务主要功能是实现svm40的串口驱动功能,实时读取传感器传回来的温湿度和有机物浓度信息,通过简单的数据转换后存入一个全局数组里。参考了论坛网友的DDZZ669的工程:
https://bbs.eeworld.com.cn/thread-1198007-1-1.html#pid3138530
代码如下:
int application_start(void)
{
int ret = -1;
uint32_t rx_size = 0;
char *pEnd;
float ret1,ret2;
csi_pin_set_mux(TEST_PIN_USART_TX, TEST_PIN_USART_TX_FUNC);
csi_pin_set_mux(TEST_PIN_USART_RX, TEST_PIN_USART_RX_FUNC);
/* uart port set */
uart1.port = TEST_USART_IDX;
/* uart attr config */
uart1.config.baud_rate = 115200;
uart1.config.data_width = DATA_WIDTH_8BIT;
uart1.config.parity = NO_PARITY;
uart1.config.stop_bits = STOP_BITS_1;
uart1.config.flow_control = FLOW_CONTROL_DISABLED;
uart1.config.mode = MODE_TX_RX;
/* init uart1 with the given settings */
ret = hal_uart_init(&uart1);
if (ret != 0) {
printf("uart1 init error !\n");
}
printf("uart1 init omplete !\n");
/* init the tx buffer */
memset(uart_data_buf,0,UART_BUF_SIZE);
hal_uart_send(&uart1, uart_tx_start, 7, UART_TX_TIMEOUT);
aos_msleep(50);
printf("start omplete !\n");
/* scan uart1 every 2000ms, if data received send it back */
while(1)
{
hal_uart_send(&uart1, uart_tx_get_signals, 7, UART_TX_TIMEOUT);
ret = hal_uart_recv_II(&uart1, uart_data_buf, UART_BUF_SIZE,&rx_size, UART_RX_TIMEOUT);
if(rx_size != 0)
{
read_svm40(&voc,&humi,&humi1,&temp,&temp1,&uart_data_buf);
}
memset(uart_data_buf,0,UART_BUF_SIZE);
/* sleep 2000ms */
aos_msleep(200);
};
void read_svm40(uint16_t *pvoc,uint16_t *phumi,uint16_t *phumi1,uint16_t *ptemp,uint16_t *ptemp1,uint8_t *data_buf)
{
// data_buf[5] data_buf[6] int16 provides the VOC Index (no unit) with a scaling factor of 10, e.g., an output of +250 corresponds to a VOC Index of +25.0.
*pvoc = data_buf[5];
*pvoc <<=8;
*pvoc += data_buf[6];
*pvoc =*pvoc / 10;
//data_buf[7] data_buf[8] int16 provides the relative humidity (in % RH) compensated for the temperature offset with a scaling factor of 100, e.g., an output of +2500 corresponds to +25.00 % RH.
*phumi = data_buf[7];
*phumi <<=8;
*phumi += data_buf[8];
*phumi1 = *phumi%100;
*phumi = *phumi/100;
//data_buf[9] data_buf[10] int16 provides the temperature (in °C) with a scaling factor of 200, e.g., an output of +5’000 corresponds to +25.00 C.
*ptemp = data_buf[9];
*ptemp <<=8;
*ptemp += data_buf[10];
*ptemp1 = *ptemp%200;
*ptemp = *ptemp/200;
}
4、gui任务功能
gui任务功能主要实现各个区域温湿度信息和气体浓度信息在按键的控制下实时的调取显示,参考了论坛网友的DDZZ669的移植的u8ge工程:
https://bbs.eeworld.com.cn/thread-1198007-1-1.html#pid3138530
由于传感器只有一套目前只实现一个房间的功能,扩展到几个房间只需要很小的改动即可:
代码如下:
static void gui_u8g2_task(void *arg)
{
extern uint16_t voc;
extern uint16_t humi;
extern uint16_t humi1;
extern uint16_t temp;
extern uint16_t temp1;
u8g2_t u8g2;
u8g2Init(&u8g2);
//<------------------测试DTH11温湿度显示
u8g2_SetFontMode(&u8g2, 1);
u8g2_SetFont(&u8g2, u8g2_font_unifont_t_symbols);
DHT11Init();
float Temp_t = 15;
float Humi_t = 50;
char strVoc[32];
char strTemp[32];
char strHumi[32];
char strTemp1[32];
char strHumi1[32];
static csi_gpio_pin_t key1;
int room_num=0;// 按下的时间计数
while(1)
{
printf("%4d \n\r",voc);
printf("%4d.%4d \n\r",humi,humi1);
printf("%4d.%4d \n\r",temp,temp1);
csi_pin_set_mux(PA11, PIN_FUNC_GPIO);
csi_gpio_pin_init(&key1, PA11);
csi_gpio_pin_dir(&key1, GPIO_DIRECTION_INPUT);
if(GPIO_PIN_LOW == csi_gpio_pin_read(&key1)) {
while(GPIO_PIN_LOW == csi_gpio_pin_read(&key1))
{
}
room_num ++;
if(room_num == 3){
room_num = 0;
}
}
if (room_num == 0) {
u8g2_FirstPage(&u8g2);
do
{
u8g2_ClearBuffer(&u8g2);
//u8g2_DrawStr(&u8g2, 0, 15, "room 0");
testDrawXBM(u8g2);
u8g2_SendBuffer(&u8g2);
delay_ms(300);
} while (u8g2_NextPage(&u8g2));
}else if (room_num == 1)
{
u8g2_FirstPage(&u8g2);
do
{
sprintf(strTemp1, "%02d", temp1);
sprintf(strHumi1, "%02d", humi1);
sprintf(strTemp, "Temp:%3d.%.1s C", temp,strTemp1);
sprintf(strVoc, "Voc :%3d PPM", voc);
sprintf(strHumi, "Humi:%3d.%.1s %%", humi,strHumi1);
u8g2_ClearBuffer(&u8g2);
u8g2_DrawStr(&u8g2, 0, 15, "room 1");
u8g2_DrawStr(&u8g2, 0, 30, strTemp);
u8g2_DrawCircle(&u8g2, 84, 22, 2, U8G2_DRAW_ALL);
u8g2_DrawStr(&u8g2, 0, 45, strVoc);
u8g2_DrawStr(&u8g2, 0, 60, strHumi);
u8g2_SendBuffer(&u8g2);
delay_ms(300);
} while (u8g2_NextPage(&u8g2));
}else {
u8g2_FirstPage(&u8g2);
do
{
sprintf(strTemp1, "%02d", temp1);
sprintf(strHumi1, "%02d", humi1);
sprintf(strTemp, "Temp:%3d.%.1s C", temp,strTemp1);
sprintf(strVoc, "Voc :%3d PPM", voc);
sprintf(strHumi, "Humi:%3d.%.1s %%", humi,strHumi1);
u8g2_ClearBuffer(&u8g2);
u8g2_DrawStr(&u8g2, 0, 15, "room 2");
u8g2_DrawStr(&u8g2, 0, 30, strTemp);
u8g2_DrawCircle(&u8g2, 84, 22, 2, U8G2_DRAW_ALL);
u8g2_DrawStr(&u8g2, 0, 45, strVoc);
u8g2_DrawStr(&u8g2, 0, 60, strHumi);
u8g2_SendBuffer(&u8g2);
delay_ms(300);
} while (u8g2_NextPage(&u8g2));
}
aos_msleep(1000);
}
}
5、工作流程
系统上电后播放开机语音并显示开机画面如下图:
通过按键key1切换查看不同房间的温湿度信息和有机物浓度信息如下图:
六、工程源码
工程源码已经上传云盘链接:
提取码:hwuv
七、视频演示
https://www.bilibili.com/video/BV16W4y1C7DY/
八、项目总结
本项目是基于平头哥RVB2601,设计的一款室内环境监测平台,刚开始本来打算加入语音识别功能,通过云语音识别,但后面实际着手发现芯片的存储有限果断放弃了原来的思路,考虑使用按键的切换的方式,后续继续深入研究,条件允许加上语音控制部分。由于上海疫情,被居家管控在家里条件有限只能初步完成基本的功能,之前也做了很多验证工作,一起整理出来供大家交流学习。通过这个小项目,了解了RVB2601的开发过程,目前该平台资源还不算太丰富,但该平台功能的确很强大,期待后续更多的开发人员加入并丰富它,我也将持续关注!感谢平头哥,感谢EE,给我了一个了解这个平台的机会。
连接汇总:
【平头哥RVB2601创意应用开发】player_demo移植 https://bbs.eeworld.com.cn/thread-1205787-1-1.html
【平头哥RVB2601创意应用开发】svm40的uart通讯实现 https://bbs.eeworld.com.cn/thread-1205786-1-1.html
|