当前位置: 首页 > 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;
}

相关文章:

  • 机器视觉技术在现代汽车制造中的应用
  • 基本锁介绍
  • Multi-Modal Multi-Stream UNET Model for Liver Segmentation
  • HTML5 的离线储存怎么使用,工作原理
  • Vue网页中使用PDF.js弹窗显示pdf文档所有内容
  • Spark---转换算子、行动算子、持久化算子
  • 【C语言】函数(四):函数递归与迭代,二者有什么区别
  • django restful framework序列化与反序列化
  • 二十三、RestClient操作索引库
  • EPT-Net:用于3D医学图像分割的边缘感知转换器
  • gitlab图形化界面使用
  • Verilog基础:时序调度中的竞争(一)
  • ElasticSearch之cat aliases API
  • Redis中文结果查看方式
  • 【Python 千题 —— 基础篇】删除列表值
  • [deviceone开发]-do_Webview的基本示例
  • C++类的相互关联
  • canvas 高仿 Apple Watch 表盘
  • CSS 提示工具(Tooltip)
  • download使用浅析
  • HashMap ConcurrentHashMap
  • isset在php5.6-和php7.0+的一些差异
  • JavaScript 一些 DOM 的知识点
  • java取消线程实例
  • PHP 的 SAPI 是个什么东西
  • Puppeteer:浏览器控制器
  • quasar-framework cnodejs社区
  • Ruby 2.x 源代码分析:扩展 概述
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • webpack入门学习手记(二)
  • Web标准制定过程
  • windows下mongoDB的环境配置
  • 技术胖1-4季视频复习— (看视频笔记)
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 设计模式 开闭原则
  • 深度学习在携程攻略社区的应用
  • 我感觉这是史上最牛的防sql注入方法类
  • 系统认识JavaScript正则表达式
  • 小程序测试方案初探
  • 学习Vue.js的五个小例子
  • 一、python与pycharm的安装
  • Linux权限管理(week1_day5)--技术流ken
  • Python 之网络式编程
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (4)logging(日志模块)
  • (42)STM32——LCD显示屏实验笔记
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (独孤九剑)--文件系统