当前位置: 首页 > news >正文

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

基于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  			alcd_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;
}

相关文章:

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

基于ARM语音识别的智能家居系统 我们上一篇&#xff0c;我们实现在Linux系统下编译程序&#xff0c;我们首先通过两个小练习来熟悉一下如何去编译。今天&#xff0c;我们来介绍一下LCD屏幕基本使用。 一、LCD屏幕基本使用 如何使用LCD屏幕&#xff1f; 1、打开开发板LCD设…...

Web前端—移动Web第四天(vw适配方案、vw和vh的基本使用、综合案例-酷我音乐)

版本说明 当前版本号[20231122]。 版本修改说明20231122初版 目录 文章目录 版本说明目录移动 Web 第四天01-vw适配方案vw和vh基本使用vw布局vh布局混用问题 02-综合案例-酷我音乐准备工作头部布局头部内容搜索区域banner 区域标题公共样式排行榜内容推荐歌单布局推荐歌单内…...

报错注入 [极客大挑战 2019]HardSQL1

打开题目 输入1或者1"&#xff0c;页面均回显NO,Wrong username password&#xff01;&#xff01;&#xff01; 那我们输入1 试试万能密码 1 or 11 # 输入1 and 12 # 输入1 union select 1,2,3 # 输入1 ununionion seselectlect 1,2,3 # 输入1 # 输入1# 页面依旧回…...

【MATLAB源码-第83期】基于matlab的MIMO中V-BALST结构ZF和MMSE检测算法性能误码率对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 在多输入多输出&#xff08;MIMO&#xff09;通信系统中&#xff0c;V-BLAST&#xff08;垂直波束形成层间空间时间编码技术&#xff09;是一种流行的技术&#xff0c;用于提高无线通信的数据传输速率和容量。它通过在不同的…...

Android13 新增 Stable AIDL接口

问题描述&#xff1a; 我需要在netd aidl 中添加新的接口&#xff1a; 设置网卡MAC地址&#xff1a; void setHardwareAddress(in utf8InCpp String iface, in utf8InCpp String hwAddr); 背景&#xff1a; Android 10 添加了对稳定的 Android 接口定义语言 (AIDL) 的支持&…...

Postman API Enterprise 10.18.1 Crack

适合您企业的 Postman API 平台 掌控您的 API 环境。构建更好的 API。加快产品开发。 无论您处于 API 之旅的哪个阶段&#xff0c;Postman 都会为您提供帮助 想让您团队的 API 更容易被发现吗&#xff1f;希望减少开发和质量检查之间的滞后时间&#xff1f;想要更快地让新开发…...

电脑内存升级

ddr代兼容 自从DDR内存时代开启之后&#xff0c;只要满足内存的插槽规格相同(DDR3或DDR4或DDR5即为内存规格)这一条件&#xff0c;不同品牌、不同频率以及不同容量的茶品都可以一起使用&#xff0c;除了品牌和容量的影响之外&#xff0c;不同频率的搭配可能会造成性能方面的影…...

ExcelBDD PHP Guideline

在PHP里面支持利用Excel的BDD&#xff0c;也支持利用Excel进行参数化测试 ExcelBDD Use Excel file as BDD feature file, get example data from Excel files, support automation tests. Features The main features provided by this library are: Read test data acco…...

C++静态链接库的生成以及使用

目录 一.前言二.生成静态链接库三.使用静态链接库四.其他 一.前言 这篇文章简单讨论一下VS如何生成和使用C静态链接库&#xff0c;示例使用VS2022环境。 二.生成静态链接库 先创建C项目-静态库 然后将默认生成的.h和.cpp文件清理干净&#xff0c;当然你也可以选择保留。 然…...

【2024系统架构设计】 系统架构设计师第二版-未来信息综合技术

目录 一 信息物理系统 二 人工智能 三 机器人技术 四 边缘计算 五 数字孪生体...

JavaFX修改软件图标

JavaFX默认使用jdk的程序图片显示&#xff0c;可以通过以下代码进行修改设置 stage.getIcons().add(new Image("static/icon.png")); static/icon.png改为自己图片路径 这里可以使用相对路径和绝对路径&#xff0c;看自己需求设置 例&#xff1a; import javafx.a…...

Linux ps -ef|grep去除 grep --color=auto信息

linux 监控 进程判断是否启动可通过该指令实现 ps -ef|grep java指令结果为 # -v 参数有过滤作用 ps -ef|grep java |grep -v grep...

jQuery的学习(一篇文章齐全)

目录 Day29 jQuery 1、jQuery介绍 2、jQuery的选择器 2.1、直接查找 2.2、导航查找 3、jQuery的绑定事件 案例1&#xff1a;绑定取消事件 案例2&#xff1a;模拟事件触发 4、jQuery的操作标签 tab切换案例jQuery版本&#xff1a; 案例1&#xff1a; 案例2&#xff…...

注塑行业各类业务流程图(系统化)

...

Android Studio 安装及使用

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…...

计算机网络的OSI七层模型

目录 1、OSI七层模型是什么 1.1 物理层&#xff08;Physical Layer&#xff09; 1.2 数据链路层&#xff08;Data Link Layer&#xff09; 1.3 网络层&#xff08;Network Layer&#xff09; 1.4 传输层&#xff08;Transport Layer&#xff09; 1.5 会话层&#xff08;S…...

如何一次性解压多个文件

第一步&#xff1a;多选压缩包 第二步&#xff1a;右键解压即可 一句话&#xff0c;单个怎么解压&#xff0c;多个就怎么解压&#xff0c;只不过先选中 参考&#xff1a;如何一次性解压多个文件...

类和对象学习笔记

类和对象 类的定义this指针类的6个默认成员函数构造函数析构函数拷贝构造函数赋值运算符重载赋值运算符重载运算符重载const成员 取地址操作符重载const取地址操作符重载 初始化列表explicit关键字static成员匿名对象友元内部类拷贝对象时编译器的优化 类的定义 c类的定义形式…...

Linux程序之可变参数选项那些事!

一、linux应用程序如何接收参数&#xff1f; 1. argc、argv Linux应用程序执行时&#xff0c;我们往往通过命令行带入参数给程序&#xff0c;比如 ls /dev/ -l 其中参数 /dev/ 、-l都是作为参数传递给命令 ls 应用程序又是如何接收这些参数的&#xff1f; 通常应用程序都…...

【1day】泛微e-office OA系统user_page接口未授权访问漏洞学习

注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞描述 二、影响版本 三、资产测绘 四、漏洞复现...

终极解决方案:用easy-topo免费创建专业级网络拓扑图

终极解决方案&#xff1a;用easy-topo免费创建专业级网络拓扑图 【免费下载链接】easy-topo vuesvgelement-ui 快捷画出网络拓扑图 项目地址: https://gitcode.com/gh_mirrors/ea/easy-topo 还在为复杂的网络架构图而头疼吗&#xff1f;easy-topo是一款基于VueSVGElemen…...

WorldCanvas:多模态可控世界事件生成框架解析

1. 项目概述&#xff1a;当AI学会"导演"世界事件WorldCanvas这个命名本身就充满想象力——它把整个世界当作一张画布&#xff0c;让开发者能够像导演一样编排各种事件。作为一个多模态提示下的可控世界事件生成框架&#xff0c;它本质上解决的是"如何让AI系统按…...

深入/dev/xdma*:手把手教你用XDMA驱动工具链(reg_rw, dma_to/from_device)进行FPGA数据读写调试

深入解析XDMA驱动工具链&#xff1a;FPGA数据交互实战指南 在FPGA与主机系统的高速数据交互场景中&#xff0c;Xilinx的XDMA&#xff08;PCI Express DMA&#xff09;解决方案凭借其高性能和灵活性成为众多工程师的首选。本文将带您深入探索/dev/xdma*设备节点的奥秘&#xff0…...

Orange Pi OS:融合Windows 11界面与Android生态的桌面系统解析

1. Orange Pi OS&#xff1a;一款融合Windows 11界面与Android生态的桌面操作系统 深圳迅龙软件&#xff08;Shenzhen Xunlong Software&#xff09;近期正式发布了基于Android的Orange Pi OS操作系统&#xff0c;这款系统最引人注目的特点是其高度模仿Windows 11的桌面界面设计…...

【Prometheus】 `by` 和 `without` 子句在聚合操作中的作用是什么?请举例说明

Prometheus 聚合中的 by 与 without 深度解析:从 Kafka Lag 全局视图到 ClickHouse 合并压力的精准标签控制 用户问题原文: 32. by 和 without 子句在聚合操作中的作用是什么?请举例说明。 本文将围绕上述问题,系统性剖析 Prometheus 聚合操作中 by 与 without 子句 的设计…...

告别if-else混乱:用行为树重构你的ROS2机器人决策逻辑(以Nav2恢复机制为例)

告别if-else混乱&#xff1a;用行为树重构你的ROS2机器人决策逻辑&#xff08;以Nav2恢复机制为例&#xff09; 在开发自主移动机器人时&#xff0c;最令人头疼的莫过于处理各种异常情况和恢复逻辑。当机器人遇到规划失败、传感器异常或环境突变时&#xff0c;传统的if-else嵌套…...

避坑指南:用Open-GroundingDino训练自定义数据集,我踩过的那些环境与数据格式的坑

Open-GroundingDino实战&#xff1a;从数据集构建到模型训练的全流程避坑指南 当你第一次尝试用Open-GroundingDino训练自定义数据集时&#xff0c;可能会被各种环境配置、数据格式转换的问题搞得焦头烂额。作为一个在计算机视觉领域摸爬滚打多年的从业者&#xff0c;我最近刚完…...

深度解析Cursor AI编辑器:重塑人机协作编程工作流

1. 从零到一&#xff1a;深度解析Cursor AI编辑器的核心价值与上手心法 如果你是一名开发者&#xff0c;最近一定在技术社区里频繁听到“Cursor”这个名字。它不仅仅是一个披着AI外衣的代码编辑器&#xff0c;更是一个试图重新定义“人机协作编程”工作流的革命性工具。我使用C…...

旧电脑也能焕发新生?实测在不符合官方要求的设备上安装Windows 11 23H2的几种方法

旧硬件逆袭指南&#xff1a;无TPM设备安装Windows 11 23H2的实战手册 当微软发布Windows 11时&#xff0c;TPM 2.0芯片和第八代以上CPU的强制要求让无数老设备用户感到被时代抛弃。但技术社区从未停止探索——我的ThinkPad T450s&#xff08;2015年机型&#xff09;现在正流畅运…...

跟着 MDN 学 HTML day_20:(Web 媒体容器格式完全指南)

引言 在现代 Web 项目开发中&#xff0c;音频、视频等富媒体内容已是全站标配&#xff0c;从首页宣传视频、课程讲解视频到播客语音、背景音效&#xff0c;全覆盖各类业务场景。很多前端开发者常会混淆媒体底层核心逻辑&#xff0c;想要零报错、全兼容落地媒体播放业务&#x…...