合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(三)

news2024/11/16 1:29:54

基于ARM语音识别的智能家居系统

我们上一篇,我们实现在Linux系统下编译程序,我们首先通过两个小练习来熟悉一下如何去编译。今天,我们来介绍一下LCD屏幕基本使用。

一、LCD屏幕基本使用

如何使用LCD屏幕?
    1、打开开发板LCD设备驱动文件。  (/dev/fb0)
    2、准备颜色数据。
    3、写入颜色像素点数据。
    4、关闭设备文件。

示例代码:

#include <stdio.h> 
#include <sys/types.h>  //open()
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>    //write()

int main()  
{
	//1、打开开发板LCD设备驱动文件。  (/dev/fb0)
	int lcd_fd = open("/dev/fb0", O_RDWR);
	if(lcd_fd == -1)
	{
		perror("open lcd_fd failed!");  //通过错误码打印错误信息
		return -1;   //程序非正常结束
	}
	
	//2、准备颜色数据。
	int buf[1024*600] = {0};        //像素数据缓冲区
	// A R G B :  0 255 0 0  -----> 0x00FF0000;
	int R = 0x00FF0000;
	
	int i;
	for(i = 0; i<1024*600; i++)
	{
		buf[i] =  R;
	}
	
	//3、写入颜色像素点数据。
	int w_size = write(lcd_fd, buf, 1024*600*4);
	
	//4、关闭设备文件。
	close(lcd_fd);

	return 0;
}

二、开发板运行程序

1、在Ubuntu平台上使用交叉编译器arm-linux-gcc 编译程序。

2、下载程序到开发板。

3、给予权限,运行程序。

三、界面显示(bmp图片)

bmp:BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式。
​
它是用位映射存储的方式的图片格式,图像数据中的RGB数据直接可以使用。

1、图片准备

2、显示bmp图片

1、打开开发板LCD设备驱动文件。  (/dev/fb0)
2、打开bmp图片文件。
3、读取bmp图片像素颜色数据。
4、写入颜色像素点数据到LCD。
5、关闭设备关闭文件。
头文件: 
    #include <unistd.h>
函数原型:
    ssize_t read(int fd, void *buf, size_t count);
    从文件描述符fd指代的文件中,读取count字节数据存入buf指向缓冲区中。
参数列表:
    int fd:读取的目标文件的文件描述符。
    void *buf:存储读到的数据的内存缓冲区。
    size_t count:要读取的字节数。
返回值:
    成功: 成功读取的字节个数。
    失败: -1,并且errno被设置。

示例代码:

#include <stdio.h> 
#include <sys/types.h>  //open()
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>    //write()

int showBmp(char *bmp_path)
{
	//1、打开开发板LCD设备驱动文件。  (/dev/fb0)
	int lcd_fd = open("/dev/fb0", O_RDWR);
	if(lcd_fd == -1)
	{
		perror("open lcd failed!");  //通过错误码打印错误信息
		return -1;   //程序非正常结束
	}
	
	//2、打开bmp图片文件。
	int bmp_fd = open(bmp_path, O_RDWR);
	if(bmp_fd == -1)
	{
		perror("open bmp failed!");  //通过错误码打印错误信息
		return -1;   //程序非正常结束
	}
	
	//3、读取bmp图片像素颜色数据。
	//文件偏移量(光标),从文件开始位置偏移54字节,去除无效数据。
	char buf[54] = {0};
	read(bmp_fd, buf, 54);
		
	char bmp_buf[1024*600*3] = {0};
	read(bmp_fd, bmp_buf, 1024*600*3);
	
	//3.1数据处理
	//将3字节的bgr 的bmp图像像素点数据处理为 lcd 屏幕所需要的 argb像素数据
	int lcd_buf[1024*600] = {0};  //lcd 像素数据缓冲区
	
	int i, j = 0;
	for(i = 0; i<1024*600; i++, j+=3)
	{
		//  ARGB        b   			g					r  			a
		lcd_buf[i] = bmp_buf[0+j]<<0 | bmp_buf[1+j]<<8 | bmp_buf[2+j]<<16 | 0x00<<24;
	}
	
	//3.2 图片上下翻转
	int show_buf[1024*600] = {0};  //lcd 像素数据缓冲区
	int x, y;
	for(y = 0; y<600; y++)
	{
		for(x = 0; x<1024; x++)
		{
			show_buf[y*1024+x] = lcd_buf[(599-y)*1024+x];
		}
	}
	
	//4、写入颜色像素点数据到LCD。
	write(lcd_fd, show_buf, 1024*600*4);
	
	//5、关闭设备,关闭文件。
	close(lcd_fd);
	close(bmp_fd);
	
	return 0;
}

int main()  
{
	showBmp("./1.bmp");

	return 0;
}

四、音视频播放:

mplayer 是一款开源的多媒体播放器,可以用来播放音视频,mplayer 自带多种格式的解码器,不需要我们再另外安装。开发板并未安装配置mplayer,需要自行移植。

直接移植我提供的mplayer:

文件使用说明:

alsa-lib--lib.tar.gz:

此为alsa-lib的编译结果 lib库文件压缩包,先把该文件拷贝到开发板。

tftp下载命令为: tftp 192.168.1.100 -gr alsa-lib--lib.tar.gz

解压,并将此目录下的所有库文件拷贝到开发板的/usr/lib 目录下。

解压命令为: tar -zxvf alsa-lib--lib.tar.gz
进入解压目录:  cd lib/ 
拷贝到/usr/lib目录下: cp ./* /usr/lib -r

arm-alsa.tar.gz:

         此为alsa-lib编译出的配置文件压缩包,把该文件拷贝到开发板。

tftp下载命令为: tftp 192.168.1.100 -gr arm-alsa.tar.gz

解压后,将此目录下所有文件拷贝开发板的 /usr/share/arm-alsa 目录下。(需要先在开发板根文件系统中也创建一个/usr/share/arm-alsa 目录)

  1. 新建arm-alsa/目录: mkdir /usr/share/arm-alsa (空格) -p 
  2. 新建arm-alsa/目录: mkdir /usr/share/arm-alsa (空格) -p 
  3. 拷贝到/usr/share/arm-alsa目录:    cp ./arm-alsa/* /usr/share/arm-alsa/ -r

 

zlib--lib.tar.gz:

此文件为zlib的编译结果lib库文件压缩包,先把该文件拷贝到开发板。

tftp下载命令为: tftp 192.168.1.100 -gr zlib--lib.tar.gz

解压后,将此目录下的 lib 库文件拷贝到开发板根文件系统的/usr/lib 目录下。

解压命令为: tar -zxvf zlib--lib.tar.gz
拷贝到/usr/lib目录: 
    cd lib/            //进入解压得到的lib目录
    cp ./* /usr/lib -r    //拷贝

mplayer:

此为mplayer的可执行文件,这就是我们需要的 mplayer播放器!将其拷贝到开发板根文件系统的/bin 目录下,并给予执行权限即可。

cd /usr/bin/
tftp下载命令为: tftp 192.168.1.100 -gr mplayer
给予执行权限: chmod +x mplayer

使用:

    mplayer是一个命令行音视频播放工具。

代码方式:
system函数

#include <stdlib.h>
int system(const char *command);
command:命令

前台播放,可以直接停掉,后台播放,只能通过发送信号来停止,暂停,继续
killall -19 mplayer        暂停
killall -18 mplayer        继续
killall -9 mplayer        杀死进程

#include <stdlib.h>

int main(int argc, char const *argv[])
{

	system("mplayer 1.mp3 </dev/null &");
	
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1236501.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(02)vite环境变量配置

文章目录 将开发环境和生产环境区分开环境变量vite处理环境变量loadEnv 业务代码需要使用环境变量.env.env.development.env.test修改VITE_前缀 将开发环境和生产环境区分开 分别创建三个vite 的配置文件&#xff0c;并将它们引入vite.config.js vite.base.config.js import…

阿里云oss存储文件上传功能实现(保姆级教程)

先登录&#xff1a; 点击进入控制台 点击左上角导航栏按钮 搜索oss&#xff0c;点击进入 进入之后点击立即开通oss按钮&#xff0c;开通之后点击下图立即创建&#xff0c;弹出创建Bucket 填上Bucket名称&#xff0c;读写权限改为公共读。其他不变点击确定创建&#xff0c;完成…

SpringBoot中使用注解的方式创建队列和交换机

SpringBoot中使用注解的方式创建队列和交换机 前言 最开始蘑菇博客在进行初始化配置的时候&#xff0c;需要手动的创建交换机&#xff0c;创建队列&#xff0c;然后绑定交换机&#xff0c;这个步骤是非常繁琐的&#xff0c;而且一不小心的话&#xff0c;还可能就出了错误&…

【C++进阶之路】第七篇:异常

文章目录 一、C语言传统的处理错误的方式二、 C异常概念三、异常的使用1.异常的抛出和捕获2.异常的重新抛出3.异常安全4.异常规范 四、自定义异常体系五、C标准库的异常体系&#xff08;了解&#xff09;六、异常的优缺点 一、C语言传统的处理错误的方式 传统的错误处理机制&am…

2021秋招-算法-递归

算法-递归 教程: ⭐告别递归&#xff0c;谈谈我的一些经验 LeetCode刷题总结-递归篇 基础框架 leetcode刷题 1.leetcode-101. 对称二叉树-简单 101. 对称二叉树 给定一个二叉树&#xff0c;检查它是否是镜像对称的。 例如&#xff0c;二叉树 [1,2,2,3,4,4,3] 是对称的。…

docker通过挂载conf文件启动redis

初衷&#xff1a;之前直接在启动脚本中没有挂载配置文件&#xff0c;并且直接设置了密码等&#xff0c;后续要使用集群&#xff0c;苦于无法修改配置&#xff0c;进入redis容器也找不到redis.conf&#xff0c;所以写这个文章用来使用redis的配置&#xff0c;来达到后续都可动态…

Spring Boot要如何学习?【云驻共创】

Spring Boot 是由 Pivotal 团队提供的全新框架&#xff0c;其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。我这里会分享一些学习Spring Boot的方法和干货&#xff0c;包括…

文章系列2:Unraveling the functional dark matter through global metagenomics

这篇文章发布于2023年10月nature。通讯作者是来自于 DOE Joint Genome Institute, Lawrence Berkeley National Laboratory, Berkeley, CA, USA. 背景介绍&目标 作者首先背景介绍了两种主流宏基因组分析方法&#xff0c;包括reads-based reference mapping&#xff08;eg…

PyTorch 之 Dataset 类入门学习

PyTorch 之 Dataset 类入门学习 Dataset 类简介 PyTorch 中的 Dataset 类是一个抽象类&#xff0c;用来表示数据集。通过继承 Dataset 类可以进行自定义数据集的格式、大小和其它属性&#xff0c;供后续使用&#xff1b; 可以看到官方封装好的数据集也是直接或间接的继承自 …

云原生Docker系列 | Docker私有镜像仓库公有镜像仓库使用

云原生Docker系列 | Docker私有镜像仓库&公有镜像仓库使用 1. 使用公有云镜像仓库1.1. 阿里云镜像仓库1.2. 华为云镜像仓库1.3. 腾讯云镜像仓库2. 使用Docker Hub镜像仓库3. 使用Harbor构建私有镜像仓库4. 搭建本地Registry镜像仓库1. 使用公有云镜像仓库 1.1. 阿里云镜像…

数据结构与算法编程题6

将两个有序顺序表合并成一个新的有序表&#xff0c;并有函数返回有序顺序表 #include <iostream> using namespace std;typedef int ElemType; #define Maxsize 100 #define OK 1 #define ERROR 0 typedef struct SqList {ElemType data[Maxsize];int length; }SqList;…

spring boot零配置

spring boot是如何选择tomcat还是Jett作为底层服务器的呢&#xff1f; springboot通过ServletWebServerApplicationContext的onRefresh()方法&#xff0c;会创建web服务 protected void onRefresh() {super.onRefresh();try {// 创建web服务createWebServer();}catch (Throwab…

功率放大器应用领域分享:微流控细胞分选在“软骨”芯片关节炎治疗研究中的应用

微流控技术是一种通过微小的通道和微型装置对流体进行精确操控和分析的技术&#xff0c;它是现代医学技术发展过程中的一种重要的生物医学工程技术&#xff0c;具有广泛的应用前景和重要性&#xff0c;它在高通量分析、个性化医疗、细胞筛选等方面有着巨大的潜力&#xff0c;Ai…

redis的数据类型的增删改查

redis的高可用 在集群中有一个非常重要的指标&#xff0c;提供服务的时间的百分比&#xff08;365天&#xff09;99.9% redis的高可用含义更加宽泛&#xff0c;正常服务是指标之一&#xff0c;数据容量的扩展&#xff0c;数据的安全性 在redis中实现高可用技术 持久化&…

11.21序列检测,状态机比较与代码,按键消抖原理

序列检测 用一个atemp存储之前的所有状态&#xff0c;即之前出现的七位 含无关项检测 要检测011XXX110 对于暂时变量的高位&#xff0c;位数越高就是越早出现的数字&#xff0c;因为新的数字存储在TEMP的最低位 不重叠序列检测 &#xff0c;一组一组 011100 timescale 1ns…

从零开始学习typescript——数据类型

数据类型 以前我们用js编写代码的时候&#xff0c;都是直接使用let、var、const 来定义数据类型&#xff1b;js会在运行时来确定数据类型&#xff0c;但是在ts中&#xff0c;可以在声明时就可以指定数据类型。如果你学过其他编程语言&#xff0c;比如c、java就能更好的理解了。…

kolla 安装多节点openstack kolla部署openstack

Kolla 概述&#xff1a; Kolla是OpenStack下用于自动化部署的一个项目&#xff0c;它基于docker和ansible来实现&#xff0c;其中docker主要负责镜像制作和容器管理&#xff0c;ansible主要负责环境的部署和管理。Kolla实际上分为两部分&#xff1a;Kolla部分提供了生产环境级…

一种全新且灵活的 Prompt 对齐优化技术

并非所有人都熟知如何与 LLM 进行高效交流。 一种方案是&#xff0c;人向模型对齐。 于是有了 「Prompt工程师」这一岗位&#xff0c;专门撰写适配 LLM 的 Prompt&#xff0c;从而让模型能够更好地生成内容。 而另一种更为有效的方案则是&#xff0c;让模型向人对齐。 这也是…

迅为RK3568开发板学习之Linux驱动篇第十三期输入子系统

驱动视频全新升级&#xff0c;并持续更新~更全&#xff0c;思路更科学&#xff0c;入门更简单。 迅为基于iTOP-RK3568开发板进行讲解&#xff0c;本次更新内容为第十三期&#xff0c;主要讲解输入子系统&#xff0c;共计24 讲。 关注B站&#xff1a;北京迅为电子&#xff0c;在…

腾讯云代金券怎么领取(腾讯云代金券在哪领取)

腾讯云代金券是可抵扣费用的优惠券&#xff0c;领券之后新购、续费、升级腾讯云相关云产品可以直接抵扣订单金额&#xff0c;节省购买腾讯云的费用&#xff0c;本文将详细介绍腾讯云代金券的领取方法和使用教程。 一、腾讯云代金券领取 1、新用户代金券【点此领取】 2、老用户…