基于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 目录)
- 新建arm-alsa/目录: mkdir /usr/share/arm-alsa (空格) -p
- 新建arm-alsa/目录: mkdir /usr/share/arm-alsa (空格) -p
- 拷贝到/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;
}