admin管理员组

文章数量:1531239

2024年2月4日发(作者:)

智能家居学习手册广州粤嵌通信科技股份有限公司作者日期版本粤嵌实验室2013-06beta

第一章智能家居伴随着数字化和网络化的进程,智能化的浪潮席卷了世界的每一个角落,成为一种势不可挡的历史化大趋势。这一切的最终目的为人们提供一个以人为本的舒适、便捷、高效安全的生活环境。如何建立一个高效率、高性能、低成本的智能家居系统是我们项目的主题。1.1智能家居的需求智能家居系统的使用者,他们追求舒适的生活环境,所有的系统一定要稳定、所有的软件界面操作起来一定要友好。智能家居系统有一个稳定可靠的中央控制系统,稳定的无线网络,通过这个无线网络可以控制多个智能模块。像一键触控的智能灯光模块、智能空调模块、智能窗帘模块、智能通讯模块;自动监控的智能温湿度模块、报警模块、RFID模块等。1.2系统功能智能家居根据用户的需求,如下图所示:中央控制系统通过无线网络,控制了智能灯光模块、智能温湿度模块、智能空调模块、智能窗帘模块、智能通讯模块、智能报警模块等多个功能模块。

1.1.1中央控制系统智能家居,需要一个使用GEC2440或者GEC210的开发板来设计一个中央控制系统,通过它来实现对室内电器的监控与控制。这个中央控制系统,使用Linux作为系统内核、QT作为用户界面、TCP/IP协议来通信、GPIO口来控制门口电机、温度传感器、窗台电机、烟雾传感器、灯、光传感器等功能模块。示意图如下所示:1.1.2智能家居的功能智能家居的要实现的功能:智能门禁、智能温湿度监控、智能灯光调节、智能空调、智能窗帘、RFID模块、智能GPRS通讯、智能报警。智能门禁:轻轻一点触摸屏上的按键,就可以驱动继电器开门。智能温湿度监控:从LCD屏幕上,我们可以看到读取的温度和湿度。智能灯光调节:进去灯光模块,轻轻一点触摸屏上的按键,就可以控制房间或者大厅的灯光。智能空调:除了可以通过轻轻一点触摸屏上的按键实现空调的开关控制,也能和温湿度监控系统结合起来,在室内温度高于预设的温度时,自动开启。智能窗帘:除了可以通过轻轻一点触摸屏上的按键实现窗帘的开关控制,也能根据光感电阻的变化,在室内光线高于预设值时,自动关闭。RFID模块:刷卡识别是不是房主。智能GPRS通讯:可以实现通话和短信通知的功能,当房间的红外监控模块发现异常的事情发生时,会通过GPRS模块,将异常发送到房主的手机上。智能报警:当发现火警或者异常的事情发生,报警器会发出警告,同时通过GPRS模块,通知房主,房间发生异常。

1.1.3功能界面所有的功能模块,都需要通过友好的界面来控制,那么,我们就要为客户设计一个容易操作的友好界面。功能界面共分为:主界面、功能主界面、门禁界面、窗帘界面、空调界面、GPRS设置界面、报警界面。1.3开发流程简易的智能家居开发分为三个环节:构建家居的Linux系统、设计功能模块的驱动、设计图形界面。构建智能家居的Linux系统的开发流程是:移植uboot--->移植Linux内核--->移植Linux根文件系统--->移植Linux驱动,Linux具体的操作步骤请查看:系统移植手册。设计功能模块驱动:了解硬件--->设计Linux驱动--->加载驱动。具体的设计步骤请查看光盘目录中参考资料里所对应功能模块的源码和手册。设计图形界面:编写Qt界面--->移植qte到开发板--->界面调用驱动--->再次移植qte到开发板。具体的步骤请查看本手册的第二章、第三章、第四章。

第二章图形界面编程智能家居都是由多个界面切换而成的,所以首先我们要学会在pc机上面编写qt的界面,从单个界面到多个界面之间的却换,再到驱动调用和文件编译,接下来请跟着我们的文档提示,一步步地操作。我们先从最简单的灯光模块开始。2.1QT界面设计2.1.1建立工程1.建立工作目录#mkdir/home/smart_design#cd/home/smart_design2.建立QT工程输入下面的命令使QtDesigner运行,我们将会看到如图所示的界面,我们选择c++project,然后点击ok。#designer

smart_请点击Settings,在ProjectFile输入框中输入工程名称:然后点击按钮ok。2.1.2设计图形界面接着我们要新建一个控件编程的文件,请点击左上角的NewDialogorFile,选择Dialog然后在点击按钮ok确定。

点击保存按钮,在弹出的界面中输入filename为:smart_,保存路径在默认工程目录,点击save添加form的底层图片,该图片分辨率最好符合液晶屏分辨率,智能家居项目用到的4.3寸屏分辨率为480x272,所以图片的分辨率要裁剪为为480x272的大小。

如上图,找到propertyEditor/SignalHandlers,如果没打开,请按下面方法打开:菜单的Window—>Views—>PropertyEditor/SignalHandlers。请选择paletteBackgroundPixmap,添加图片,如下图所示。

请找到Toolbox栏,如果界面没直接显示,我们可以从菜单打开,点击菜单上的Window—>Views—>Toolbox。该栏有按键,标签,等等的控件,我们选择Buttons下的pushbutton,然后在form中拉出一个按钮,如图所示:

双击该按键,改写按键名字为led_key选中该按键,然后在propertyEditor/SignalHandlers栏中,对按键进行编辑,添加底图,如图所示:

2.1.3添加C++编程文件点击左上角的NewDialogorFile,新建文件,选择c++Main-File(),一直ok确定。

再点击左上角的保存键,保存后,可以关闭designer工具了此时回到了命令行。2.1.4编译QT工程执行以下命令#qmake–project#qmake#make在这里,我们要修改一下图片的路径,不然显示不了图片#vimsmart_修改如红色部分setPaletteBackgroundPixmap(QPixmap::fromMimeSource(""));改为setPaletteBackgroundPixmap(QPixmap::fromMimeSource("./images/"));pushButton1->setPaletteBackgroundPixmap(QPixmap::fromMimeSource(""));改为pushButton1->setPaletteBackgroundPixmap(QPixmap::fromMimeSource("./images/"));

重新编译#make#./smart_design此时qt可以跑起来了虽然可以跑起来了,但是还是不够完美,因为可以看到led_button字样,还有标题栏,我们可以对smart_进行修改#vimsmart_修改代码下面这句红色的代码请查找出来将其注释。//pushButton1->setText(tr("led_button"));修改如下的代码Form1::Form1(QWidget*parent,constchar*name,boolmodal,WFlagsfl):QDialog(parent,name,modal,fl)改为Form1::Form1(QWidget*parent,constchar*name,boolmodal,WFlagsfl):QDialog(parent,name,modal,fl=Qt::WStyle_Customize|Qt::WStyle_NoBorder)保存#make#./smart_design

2.2设计多界面2.2.1创建多界面工程请参考实验一的方法,我们再建立多一个工程,并编辑好界面,我们约定该工程目录为/home/led_design,并有如下效果,该工程的建立方法和实验一样的,只是加多了一个按钮pushButton,并且多一个按钮的图片而已,这些图片可以根据个人喜欢更改,没有影响。经过创建、添加控件、编写程序,我们有了两个单界面了,那让我们开始对界面切换功能的编写吧,下面请按我们的步骤来实现界面却换的功能。首先,我们建立一个工程目录,我们约定为/home/smart_connect#mkdir/home/smart_connect#cd/home/smart_connect#cp-rf/home/smart_design/{smart_,smart_design.h,,images}./

#cp#cp/home/led_design/{led_,led_design.h}.//home/led_design/images/*./images/2.2.2设计界面的信号与槽#geditled_,led_design.h使用替换功能,把led_,led_design.h文件中所有Form1换成Form2,并且led_,led_design.h文件分别添加#include,对于smart_,smart_design.h分别添加#include"led_design.h"修改smart_design.h如下,添加红色部分classForm1:publicQDialog{Q_OBJECTpublic:Form1(QWidget*parent=0,constchar*name=0,boolmodal=FALSE,WFlagsfl=0);~Form1();QPushButton*pushButton1;classForm2*led;protected:Protectedslots:virtualvoidlanguageChange();virtualvoidledslot();修改led_design.h如下,添加红色部分classForm2:publicQDialog{Q_OBJECTpublic:Form2(QWidget*parent=0,constchar*name=0,boolmodal=FALSE,WFlagsfl=0);~Form2();QPushButton*pushButton1;QPushButton*pushButton2;classForm1*smart;protected:protectedslots:

virtualvoidlanguageChange();virtualvoidled_on_off_slot();virtualvoidbackslot();对于smart_修改如下,添加红色部分Form1::Form1(QWidget*parent,constchar*name,boolmodal,WFlagsfl):QDialog(parent,name,modal,fl=Qt::WStyle_Customize|Qt::WStyle_NoBorder){if(!name)setName("Form1");setPaletteBackgroundPixmap(QPixmap::fromMimeSource("./images/"));pushButton1=newQPushButton(this,"pushButton1");pushButton1->setGeometry(QRect(160,100,60,60));pushButton1->setPaletteBackgroundPixmap(QPixmap::fromMimeSource("./images/"));connect(pushButton1,SIGNAL(clicked()),this,SLOT(ledslot()));languageChange();resize(QSize(480,272).expandedTo(minimumSizeHint()));clearWState(WState_Polished);}在文件最后添加函数voidForm1::ledslot(){led=newForm2(this,"Form2",0);led->show();led=NULL;}对于led_修改如下,添加红色部分Form2::Form2(QWidget*parent,constchar*name,boolmodal,WFlagsfl):QDialog(parent,name,modal,fl=Qt::WStyle_Customize|Qt::WStyle_NoBorder){if(!name)setName("Form2");setPaletteBackgroundPixmap(QPixmap::fromMimeSource("./images/"));pushButton1=newQPushButton(this,"pushButton1");pushButton1->setGeometry(QRect(120,70,60,61));

pushButton1->setPaletteBackgroundPixmap(QPixmap::fromMimeSource("./images/"));connect(pushButton1,SIGNAL(clicked()),this,SLOT(led_on_off_slot()));pushButton2=newQPushButton(this,"pushButton2");pushButton2->setGeometry(QRect(380,190,60,60));pushButton2->setPaletteBackgroundPixmap(QPixmap::fromMimeSource("./images/"));connect(pushButton2,SIGNAL(clicked()),this,SLOT(backslot()));languageChange();resize(QSize(480,272).expandedTo(minimumSizeHint()));clearWState(WState_Polished);}在文件后面添加如下函数voidForm2::led_on_off_slot(){}voidForm2::backslot(){parentWidget()->show();deletethis;}#qmake–project#qmake#make到此,已经完成界面的切换编程2.3搭建QT交叉环境2.3.1QTE的交叉编译要想将qt移植到到开发板上面跑,得将其交叉编译,首先需要安装交叉工具链。#mkdir/usr/local/arm#cd/usr/local/arm从光盘中把2复制到/usr/local/arm目录下#2解压后会在当前目录下生成一个eabi的工具链目录#mveabi4.1.2建立链接

光盘中找到4.1.2_sotf_#cp4.1.2_sotf_/usr/local/arm/4.1.2/bin#source/usr/local/arm/4.1.2/bin/4.1.2_sotf_光盘中找到tslibqte这两个库并且复制到/home目录中#cd/home/smart_connect#makeclean#编辑以下内容exportQTDIR=/home/qteexportQMAKEDIR=$QTDIR/qmakeexportLD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATHexportPATH=$QMAKEDIR/bin:$QTDIR/bin:/usr/local/arm/4.1.2/bin:$PATHexportQMAKESPEC=qws/linux-arm-g++执行脚本#//配置PC机的交叉环境3)、生成项目文件#qmake-project4)、生成Makefine文件#qmake修改Makefile文件添加tslib库的支持LIBS=$(SUBLIBS)-L$(QTDIR)/lib-L/home/tslib/lib–lts-lqte-mt★-L要根据实际路径填写,是在/home/tslib/lib下就填写-L/home/tslib/lib。5)、交叉编译应用程序#make2.3.2nfs挂载因为我们编译好的bin文件要放到开发板上面跑,所以我们选择nfs挂载的方式,把目标文件放到开发板,准备如下工作。一、新建nfs共享目录mkdir/root_nfs二、配置共享文件vim/etc/exports添加/root_nfs*(rw,sync,no_root_squash)三、重启服务/etc/init.d/nfsrestart四、测试是否安装成功showmount-e

五、本地测试能否挂载mount192.168.1.12:/root_nfs//tmpIp为本机ip如果tmp下面的内容是root_nfs里面的内容,则挂载成功六、取消挂载umount/tmp七、ARM板上的挂载mount-tnfs-onolock-otcp192.168.1.12:/root_nfs/tmp//这种在已经启动了nandflash上的根文件系统下的使用,意思是把宿主机的/root_nfs目录挂载到板上的/tmp目录下八、在pc机上,把编译好的代码放到root_nfs目录下,然后在开发板上tmp目录下把目标文件复制出来就可以了如果挂载不了,可能是开发板上的内核不支持nfs解决如下:配置内核:1.在makemenuconfig中添加几项即可:[*]NetworkFileSystems---><*>NFSclientsupport[*]NFSclientsupportforNFSversion3[*]RootfilesystemonNFS2.在Bootoptions写入noinitrdroot=/dev/nfsrwnfsroot=192.168.1.28:/root_nfsip=192.168.1.120init=/linuxrcconsole=ttySAC0,115200然后保存退出,make,把生成后的zImage烧写到板子上第一个ip是nfs服务器主机的地址,第二个ip是板子上的ip,这种是在uboot启动内核后,由内核来挂载网络上的根文件系统,这种文件系统有读写的权限此方式适合开发使用,这样可以减少烧写文件系统到板子上测试的时间。2.3.3移植到开发板上测试将交叉编译出来的QT程序移植到QT库己经成功安装的开发板上测试。#cpsmart_connect/root_nfs#chmod777/rootfs_nfs/smart_connect配置好网络ipifconfigeth0192.168.1.12重启nfs,并且开发板和pc机连接好交叉网线/etc/init.d/nfsrestart在arm终端输入如下命令

ifconfigeth0192.168.1.15mount-tnfs-onolock-otcp192.168.1.12:/root_nfs/tmpcp/tmp/smart_connect./#./smart_connect-qws

2.4加载驱动2.4.1上位机操作建立工作目录#mkdir/home/my_driver#cd/home/my_driver在光盘中找到文件夹houseled并且复制到/home/my_driver#cd/home/my_driver/houseled#makeclean#vimMakefile修改红色部分CONFIG_HOUSELED?=mifneq($(KERNELRELEASE),)#mychar-objs:=-$(CONFIG_HOUSELED)+=WD:=$(shellpwd)KERN_VER=$(shelluname-r)#KERN_DIR=/lib/modules/$(KERN_VER)/build#YOURCROSSCOMPILEKERNELDIRKERN_DIR=/home/kernel/linux-2.6.30.4//注意这里,我的linux源代码是在/home/kernel下,//你从光盘复制到哪里,路径就填写哪里modules:$(MAKE)-C$(KERN_DIR)M=$(PWD)modulesendifclean:rm-rf*.o*~*.cmd*.ko*.mod.c*.tmp_versions进行编译#make得到.ko文件,这个文件就是内核模块。测试程序也是在/home/my_driver/houseled目录下,进行交叉编译#arm-linux-gcc-ohouseled_testhouseled_test.c2.4.2开发板操作把内核模块和编译好的测试程序houseled_test通过nfs挂载到开发板(这部分在文档《智能家居界面编程学习》里面有介绍)

把开发板和智能家居底板连好线在开发板终端上测试##chmod777houseled_test加载内核模块#这时候会注册好一个字符设备,关于字符设备的函数,我们可以在上位机对houseled.c进行编辑,在houseled.c中找到这个函数。staticint__initchrdev_init(void){intresult;/*分配设备编号*/if(TestMajor){dev=MKDEV(TestMajor,TestMinor);//创建设备编号result=register_chrdev_region(dev,1,DEVICE_NAME);}else{result=alloc_chrdev_region(&dev,TestMinor,1,DEVICE_NAME);TestMajor=MAJOR(dev);}if(result<0){printk(KERN_WARNING"LED:cannotgetmajor%dn",TestMajor);returnresult;}/*注册字符设备*/test_cdev=cdev_alloc();cdev_init(test_cdev,&chardev_fops);test_cdev->ops=&chardev_fops;test_cdev->owner=THIS_MODULE;result=cdev_add(test_cdev,dev,1);if(result)printk("<1>Error%dwhileregisterleddevice!n",result);s3c2410_gpio_cfgpin(S3C2410_GPG0,S3C2410_GPG0_OUTP);s3c2410_gpio_pullup(S3C2410_GPG0,1);s3c2410_gpio_setpin(S3C2410_GPG0,0);s3c2410_gpio_cfgpin(S3C2410_GPG3,S3C2410_GPG3_OUTP);s3c2410_gpio_pullup(S3C2410_GPG3,1);s3c2410_gpio_setpin(S3C2410_GPG3,0);

my_class=class_create(THIS_MODULE,DEVICE_NAME);if(IS_ERR(my_class)){printk("createADCclassfailed!n");return0;}device_create(my_class,NULL,MKDEV(TestMajor,TestMinor),NULL,DEVICE_NAME);return0;}这个函数就是注册字符设备,找到定义DEVICE_NAME的宏//定义设备名称#defineDEVICE_NAME"houseled"可以知道,该字符设备名为houseled1.修改脚本编辑启动脚本vi/etc/init.d/rcS将脚本文件改为如下形式bash-4.0#catproc/devices#!/bin/sh#mountfs/bin/mount-tramfsramfs/tmp/bin/mount-tprocproc/proc/bin/mount-tsysfssysfs/sysecho/sbin/mdev>/proc/sys/kernel/hotplug//支持热插拔mdev-s2.输入命令所以,我们在开发板终端执行以下命令#catproc/devices可以看到253就是houseled设备的主设备号了

我们就是通过253这个设备号,找到houseled设备进行控制所以我们要创建一个主设备号为253的字符设备节点在houseled_test.c中,我们可以看到fd=open("/dev/houseled",O_RDWR);说明该设备节点要创建在dev目录下,名字为houseled所以在终端执行以下命令#mknod/dev/houseledc2530创建一个字符设备节点houseled,主设备号为253次设备号为0这时候会有以下提示说该设备节点已经存在了,原来在houseled.c里面,已经自动创建该设备节点了,可以找到相关函数my_class=class_create(THIS_MODULE,DEVICE_NAME);device_create(my_class,NULL,MKDEV(TestMajor,TestMinor),NULL,DEVICE_NAME);所以,如果驱动里面有以上两个函数,我们就不用手动创建设备节点了这时候我们可以测试驱动了#./houseled_test有以下打印信息同时可以看到D7灯在闪烁

2.5界面调用驱动在开始这章的实验前,要先认真照着上面两章:图形界面界面开发和linux驱动开发的步骤,完成图形界面和Linux驱动代码的编写。2.5.1准备工作界面调用驱动,首先要建立好工作目录。#mkdir/home/qt_driver#cd/home/qt_driver紧接着要复制图形界面编写完成的代码到该目录下:#cp-rf/home/smart_connect./#cdsmart_connect/2.5.2源码实现修改led_led_添加头文件#include#include#include#include#include#include#include添加宏#defineon1#defineoff0在下面函数添加红色部分Form2::Form2(QWidget*parent,constchar*name,boolmodal,WFlagsfl):QDialog(parent,name,modal,fl=Qt::WStyle_Customize|Qt::WStyle_NoBorder){if(!name)setName("Form2");setPaletteBackgroundPixmap(QPixmap::fromMimeSource("./images/"));led_key=newQPushButton(this,"led_key");

led_key->setGeometry(QRect(150,80,60,60));led_key->setPaletteBackgroundPixmap(QPixmap::fromMimeSource("./images/r_"));connect(led_key,SIGNAL(clicked()),this,SLOT(led_on_off_slot()));back_Button=newQPushButton(this,"back_Button");back_Button->setGeometry(QRect(370,190,60,60));back_Button->setPaletteBackgroundPixmap(QPixmap::fromMimeSource("./images/"));connect(back_Button,SIGNAL(clicked()),this,SLOT(backslot()));if((led_flag=::open("/dev/houseled",O_RDWR))<0)printf("OpenHouseledFailn");languageChange();voidForm2::led_on_off_slot(){if(!on_off_flag){ioctl(led_flag,on,0);on_off_flag=1;qDebug("ledonn");}else{ioctl(led_flag,off,0);on_off_flag=0;qDebug("ledoffn");}}voidForm2::backslot(){::close(led_flag);parentWidget()->show();deletethis;}修改led_design.h,添加红色部分classForm2:publicQDialog{Q_OBJECTpublic:Form2(QWidget*parent=0,constchar*name=0,boolmodal=FALSE,

WFlagsfl=0);~Form2();//voidled_on_off_slot();QPushButton*led_key;QPushButton*back_Button;unsignedcharled_flag;unsignedcharon_off_flag;protected:protectedslots:virtualvoidled_on_off_slot();virtualvoidbackslot();virtualvoidlanguageChange();};#//配置PC机的交叉环境#make到处为止,生成了目标文件smart_connect把前面所做实验生成的和本次实验生成的smart_connect下载到开发板执行以下命令##chmod777smart_connect##./smart_connect-qws&至此,我们就可以开始体验我们所编写的简易灯光控制系统,在我们设计的Qt图形界面上调用LED灯驱动。智能家居的其他系统中的界面和驱动设计与本手册教程的原理相同。

第三章空调模块有了前一章的基础,那么我们可以开始智能家居空调模块的设计工作,设计空调模块的方法与灯光模块相似,也是从编写单个界面开始,加载驱动,调用驱动,编译文件,完成空调模块的设计。3.1图形界面设计3.1.1建立工作目录#mkdir/home/smart_design/air_condition#cd/home/smart_design/air_condition先从光盘中拷贝Images文件夹到当前目录,Images中有我们需要的图片。#cp/mnt/hgfs/share/Images.–rf(根据自己共享文件夹拷贝到虚拟机)3.1.2建立QT工程在终端命令行中输入命令:#designer,打开Qt3设计器,如图所示,请选择C++project,然后点击ok,创建我们的Qt工程。

在新弹出来的界面上,填写好工程名称:air_,接着点击ok;3.1.3窗口界面设计紧接者点击左上角的NewDialogorFile,新建文件,选择Dialog,ok确定创建的控件编辑界面如图所示。

air_,在这里,请点击保存,我们在得到的界面中修改filename为:将保存路径选择为默认的工程目录,点击save。添加form的底层图片,该图片分辨率最好符合液晶屏分辨率,智能家居项目用到的4.3寸屏分辨率为480x272,所以图片的分辨率要裁剪为为480x272的大小。请在propertyEditor/SignalHandlers里修改,如图所示:找到propertyEditor/SignalHandlers,找到paletteBackgroundPixmap,点击右边的方框,添加背景图片。

选择paletteBackgroundPixmap,添加图片,操作方法如下图所示。

如果没打开如上图所示的propertyEditor/SignalHandlers,请找到Toolbox栏,从菜单打开,点击菜单上的Window—>Views—>Toolbox,然后选择propertyEditor/SignalHandlers。底层图片只是一个背景而已,我们要添加所要的控件。该栏有按键,标签,等等的控件,我们选择Buttons下的pushbutton,然后在form中拉出一个按钮,如下。

双击该按键,改写按键名字,直接去掉名字,点击OK。选中该按键,然后在propertyEditor/SignalHandlers栏中,对按键进行编辑,修改大小,添加底图如下,保存。3.2添加C++main文件点击左上角的NewDialogorFile,新建文件,选择c++Main-File(),一直ok确定。

再点击左上角的保存键,保存后,可以关闭designer工具了,最终界面如下所示:3.此时回到了命令行,执行以下命令进行编译#qmake–project#qmake#make生成若干个文件,把、air_、aircondition.h文件和Images文件夹留下,其他文件全部删除。

3.2C++文件设计3.2.1设置正确的图片位置修改,让文件能正常显示图片,在这里,我们要修改一下图片的路径,不然显示不了图片。#修改如红色部分setPaletteBackgroundPixmap(QPixmap::fromMimeSource(""));改为setPaletteBackgroundPixmap(QPixmap::fromMimeSource("./Images/));pushButton1->setPaletteBackgroundPixmap(QPixmap::fromMimeSource(""));改为pushButton1->setPaletteBackgroundPixmap(QPixmap::fromMimeSource("./Images/"));Form1::Form1(QWidget*parent,constchar*name,boolmodal,WFlagsfl):QDialog(parent,name,modal,fl)改为Form1::Form1(QWidget*parent,constchar*name,boolmodal,WFlagsfl):QDialog(parent,name,modal,fl=Qt::WStyle_Customize|Qt::WStyle_NoBorder)3.2.2设置槽函数对air_和air_conditionh进行修改,增添槽函数,打开air_conditionh。#vimair_conditionh添加槽函数的声明,如下图所示:

打开air_#vimair_在代码最后添加voidForm1::airSlot(){}函数。接着,添加连接函数,如下图所示:此刻我们的按钮已经有槽函数了,只是没有填充对应的功能而已,下面我将介绍如何完善槽函数。(1)编辑air_#vimair_(2)然后添加点击按钮后,按钮图标发生变化,注意要把对应的、拷贝到images目录下面,Images中有了就无需再拷贝。(3)然后对底层的空调模块进行打开操作3.2.3界面调用驱动增加头文件在air_中增加相对应的头文件

#include#include#include#include#include#include#include添加fdmotor_air的定义:intfdmotor_air;添加开关标志位:boolon_off_flag;添加开和关的宏定义:#defineMOTOR_ON1#defineMOTOR_OFF2在构造函数里面打开空调的设备节点:if((fdmotor_air=::open("/dev/motor",O_RDWR))<0)printf("/dev/motoropenfailn");在槽函数中,增加打开操作ioctl(fdmotor_air,MOTOR_ON,1);因为一个按钮同时具备开和关的功能,同时图标显示也不一样,所以槽函数最终的代码如下:voidForm1::airSlot(){if(!on_off_flag){ioctl(fdmotor_air,MOTOR_ON,1);on_off_flag=1;pushButton1->setPaletteBackgroundPixmap(QPixmap::fromMimeSource("./images/"));qDebug("motoronn");}else{ioctl(fdmotor_air,MOTOR_OFF,0);on_off_flag=0;pushButton1->setPaletteBackgroundPixmap(QPixmap::fromMimeSource("./images/"));qDebug("motoroffn");}}

最后我们编译一次,生成文件#qmake–project#qmake#make执行可执行文件#./airconditoner最终的界面如下图所示,点击按钮可以控制空调的开和关,虚拟机打印的信息是因为我们还没移植到开发板上。3.3交叉编译移植到开发板3.3.1上位机操作在当前目录下新建文件

#编辑以下内容exportQTDIR=/home/qteexportQMAKEDIR=$QTDIR/qmakeexportLD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATHexportPATH=$QMAKEDIR/bin:$QTDIR/bin:/usr/local/arm/4.1.2/bin:$PATHexportQMAKESPEC=qws/linux-arm-g++执行脚本#//配置PC机的交叉环境(3)生成项目文件#qmake-project(4)生成Makefine文件#qmake修改Makefile文件添加tslib库的支持LIBS=$(SUBLIBS)-L$(QTDIR)/lib-L/home/tslib/lib-lts-lqte-mt★-L要根据实际路径填写,是在/home/tslib/lib下就填写-L/home/tslib/lib。5)、交叉编译应用程序#make生成的执行文件就可以挂载到板上去运行,点击图片上的按钮可以控制智能家居上面的空调开关。3.3.2串口下载到开发板把编译好的bin文件要放到开发板上面跑,这一章节我们选择用串口来下载,如果Images的图片还没下载到开发板上,请使用nfs挂载的方法将其复制到开发板上,具体方法请参考2.3.2章节。请将电脑和开发板用串口线连接起来,然后打开超级终端,输入名称gec2440,随意选择一个图标,点击确定,如图所示。

如下图所示,选择可用的串口COM4(根据你的具体情况来定),点击确定。弹出的窗口如下图所示,请将位/秒(B)的值设置为115200,数据流控制(F)设置为无,然后点击确定。在超级终端中输入cd/smart_home进入目录smart_home,(根据你的具体情况而定,我们进入这个目录,是因为这个目录有Images文件夹。)进入目录后,输入命令rxair_condition下载.bin文件,接下来的具体步骤如图所示:

点击上图红色方框位置的按钮,弹出对话框,如下图所示:点击浏览选择要传送的文件air_condition,点击选择协议为Xmodem,然后点击“发送”。下载完成后,输入输入命令chmod777air_condition,将已经下载好的air_condition文件设置为可执行文件,未设置为可执行文件前,我们可以看到

air_condition文件是灰色的,设置好之后是绿色的。输入./air_condition果。-qws来挂载空调模块的界面,请点击触摸屏来看一下效

第四章窗帘模块智能家居有一个窗帘模块,我们接下来就是为这个窗帘模块设计QT的界面,步骤与上面的灯光模块、空调模块类似。4.1图形界面设计4.1.1建立工作目录#mkdir/home/smart_design/curtaincontrol#cd/home/smart_design/curtaincontrol先从光盘中拷贝Images文件夹到当前目录,Images中有我们需要的图片。#cp/mnt/hgfs/yao/Images.–rf(根据自己共享文件夹拷贝到虚拟机)4.1.2建立QT工程在终端命令行里面执行以下命令,打开qt3设计器,界面如下图所示,我们选择c++project,然后点击ok。#designer在弹出来的界面上,填写好工程名称,如,点击ok;

4.1.3窗口界面设计然后点击左上角的NewDialogorFile,新建文件,选择Dialog,ok确定,将得到如下图所示的图形界面。

,如下图所示,修改filename为:保存路径在默认工程目录,点击save保存。

添加form的底层图片,该图片分辨率最好符合液晶屏分辨率,智能家居项目用到的4.3寸屏分辨率为480x272,所以图片的分辨率要裁剪为为480x272的大小。找到propertyEditor/SignalHandlers,如下图所示:选择paletteBackgroundPixmap,添加图片,如下图

找到Toolbox栏,可以从菜单打开,点击菜单上的Window—>Views—>Toolbox。底层图片只是一个背景而已,我们要添加所要的控件。该栏有按键,标签,等等的控件,我们选择Buttons下的pushbutton,然后在form中拉出一个按钮,如下

双击该按键,改写按键名字,直接去掉名字,点击保存。选中该按键,然后在propertyEditor/SignalHandlers栏中,对按键进行编辑,添加底图,如下所示,然后保存。4.1.4添加C++Main文件点击左上角的NewDialogorFile,新建文件,选择c++Main-File(),一直ok确定

本文标签: 界面模块文件智能