1366|1

73

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

平头哥RVB2601创意应用开发 试用总结 [复制链接]

  本帖最后由 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创意应用开发】记一次开发板修复过程

最新回复

喇叭的音量是可以自己定义的,很多网友有提过,恭喜完成作品,期待继续关注平头哥!  详情 回复 发表于 2022-6-8 07:56
点赞 关注
 
 

回复
举报

6960

帖子

11

TA的资源

版主

沙发
 
喇叭的音量是可以自己定义的,很多网友有提过,恭喜完成作品,期待继续关注平头哥!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表