本帖最后由 symic 于 2022-6-5 22:24 编辑
一、项目背景
物联网时代,数据采集成为一项重要的任务,数以万计的数据可以通过采集上云实现万物互联,本次作品以平头哥RVB2601为基础平台,结合外部的温湿度传感器等传感设备,实现数据采集,阿里云平台显示等功能。
二、作品简介
断断续续的对平头哥RVB2601进行了试用,目前完成了大部分的试用任务,准备进行总结,并提交相应的作品。由于手里的辐射盖格管不慎损坏了,疫情期间正好居家办公,不能去单位再取,现在只好简化处理,将传感器改为别的。由于原理相近,都是先从传感器采集数据,再在LCD上显示,最后可能的话再上传到阿里云。正好可以将之前学到的一些方法都串起来。这里使用的是seeed startkit 中的温湿度传感器DHT11,和光感传感器。实物连接方式如下图
三、系统框图
本作品结合平头哥RVB2601的开发板,及温湿度传感器DHT11,并将数据上传到阿里云平台。
如上图所示,主要以RVB2601为核心处理器,DHT11和光敏传感器负责实现数据采集,并分别通过GPIO口和ADC采集到RVB2601,W800负责连接WIFI,并进而实现与阿里云平台的连接,串口使用打印信息,主要可观察设备运行状态。LED显示则更直观地看出整个数据处理过程,采用多页面的方式处理,通过按键控制翻页。
四、各部分功能说明和解析
利用多任务的设计方法,设计了以下几个任务。
主任务:Main_Task主要做初始化等
Lcd屏显示任务:display_Task,用于动态显示采集的数据
DHT11任务:DHT11_Task,用于采集温湿度数据
阿里云任务:WIFI_Task,用于上传数据到阿里云平台。
主任务主要代码段:
int main(void)
{
// must call this func when use c++
// cxx_system_init();
board_yoc_init();
// player_init();
// cli_reg_cmd_player();
led_pin_init();
//多任务创建
display_task_create(); //显示屏子任务
DHT11_task_create(); //温湿度子任务
LM358_task_create(); //光照强度子任务
/* Subscribe */
event_subscribe(EVENT_NETMGR_GOT_IP, network_event, NULL);
event_subscribe(EVENT_NETMGR_NET_DISCON, network_event, NULL);
//连接阿里云例程添加
if(!iot_connect_demo())
{
printf("connect iot succeed\n");
}
else
{
printf("connect iot failed\n");
}
}
display_Task主要代码段
//初始化界面闪屏
static void power_on_display(u8g2_t* u8g2)
{
LOGD(TAG, "SPLASH SCREEN\r\n");
u8g2_ClearBuffer(u8g2); // clear all
//display_chinese_str(u8g2, 0, 20, "多传感器采集京", 1, 0, u8g2_font_unifont_t_chinese1);
display_str(u8g2, 0, 20, "MuitiSensors", 1, 0, u8g2_font_fub11_tf);
aos_msleep(2000);
u8g2_DrawXBMP(u8g2, 8, 20, 48, 48, (const uint8_t*)&weather_na_pic);
u8g2_SendBuffer(u8g2);
aos_msleep(2000);
// u8g2_ClearBuffer(u8g2); // clear all
}
//显示任务主体
static void gui_lvgl_task(void* arg)
{
char strTemp[32], strHumi[32], strLight[32];
uint8_t ret;
float hum = 0.0;
float tem = 0.0;
uint32_t light;
u8g2Init(&u8g2);
//开机显示闪屏
power_on_display(&u8g2);
display_page = 0; //显示时钟
usr_button_init();
while(1) {
button_ticks();
//button_test();
aos_msleep(5);
if(display_page == 1) //显示温湿度
{
//LOGD(TAG, "display page = 1\r\n");
u8g2_ClearBuffer(&u8g2); // clear all
ret = DHT11ReadData(&hum, &tem);
if(ret == 0)
{
sprintf(strTemp, "Temp: %.1f C", tem);
sprintf(strHumi, "Humi : %.1f %%", hum);
u8g2_ClearBuffer(&u8g2);
u8g2_DrawStr(&u8g2, 0, 30, strTemp);
u8g2_DrawCircle(&u8g2, 89, 22, 2, U8G2_DRAW_ALL);
u8g2_DrawStr(&u8g2, 0, 60, strHumi);
u8g2_SendBuffer(&u8g2);
//aos_msleep(1000);
}
}
else if(display_page == 2) //显示iqt光照强度
{
//LOGD(TAG, "display page = 2\r\n");
//light_display(queue_msg);
light = LM358_readData();
if(light != 0)
{
sprintf(strLight, "Light : %d ", light);
u8g2_ClearBuffer(&u8g2);
u8g2_DrawStr(&u8g2, 0, 30, strLight);
u8g2_SendBuffer(&u8g2);
}
}
}
}
DHT11_Task主要代码段
// display任务创建
void DHT11_task_create(void)
{
aos_task_new("DHT11", DHT11_task, NULL, 1024);
}
//显示任务主体
static void DHT11_task(void* arg)
{
uint8_t ret;
ret = DHT11Init();
if(ret == 1) {
LOGD(TAG, "DHT11Init ok\r\n");
}
else {
LOGD(TAG, "DHT11Init failed\r\n");
}
while(1) {
aos_msleep(1000);
}
}
LM358主要代码段
// display任务创建
void LM358_task_create(void)
{
aos_task_new("LM358", LM358_task, NULL, 1024);
}
//显示任务主体
static void LM358_task(void* arg)
{
csi_pin_set_mux(EXAMPLE_ADC_CH0, EXAMPLE_ADC_CH0_FUNC);
csi_adc_init(&adc1, 0);
uint32_t freq_value = csi_adc_freq_div(&adc1, 128);
printf("get freq_value: %d\n", freq_value);
csi_adc_sampling_time(&adc1, 2);
csi_adc_continue_mode(&adc1, 1);//这句是连续采样,不使能只能采样一次
csi_adc_channel_enable(&adc1, 0, true);
while(1)
{
aos_msleep(1000);
}
}
uint32_t LM358_readData(void)
{
uint32_t data;
lv_task_handler();
aos_msleep(400);
lv_tick_inc(1);
data = csi_adc_read(&adc1);
LOGD(TAG, "ADC:%d\r\n", data);
return data;
}
五、视频演示
680befc7eb9a5edf1ae470431bef4a8b
六、项目总结
这次试用是一次十分难得的学习机会,也是在特殊时期对自己的一种升华。通过试用对平头哥开发板及CDK开发环境有了一定的理解,对RSIC-V及阿里云平台也有一定的理解,不可否认,由于学习不够系统化,对很多知识都是浅尝辄止,不能很好地深入学习,特别是在碰到问题时,有时一个人调试很耗时费力,所幸平头哥平台提供的工单系统给了很大帮助,这次试用由于各种各样的原因没有完全按照原计划开展,这是比较遗憾的,但万变不离其中,通过其它案例的试用也间接地熟悉了开发流程,为将来结合实际开发提供了有益的借鉴。
几点吐槽
1、针对CDK,最大的不适应是打开软件时间太长,开启的splash占用很多时间,让人觉得很慢,此外,还存在明明在工程中有头文件,但在编译时常常找不到.h文件;在线调试功能不完善等问题,还需要进一步改进。
2、对于开发板,喇叭声音设置得太大了,在室内很吵,同时JTAG和串口两个USB接口要是能合成一个就好了,现在应用时要么接两根线,要么来回切换不方便。
3、建议通过此将试用,能整理出一些基础教程,也方便后来者更快上手。
七、帖子分享链接汇总
【平头哥RVB2601创意应用开发】+ 开箱试用
【平头哥RVB2601创意应用开发】+ 2个简单demo测试
【平头哥RVB2601创意应用开发】+ 2个DEMO试用
【平头哥RVB2601创意应用开发】+webplay Demo试用及源码分析
【平头哥RVB2601创意应用开发】+ 连接阿里云初探
【平头哥RVB2601创意应用开发】+ 关于开发的小经验汇总
【平头哥RVB2601创意应用开发】+ RTC时钟显示实验
【平头哥RVB2601创意应用开发】记一次开发板修复过程
|