基于 IMX6ULL 的环境监测自主调控系统
前言项目完备代码:基于 IMX6ULL 的环境监测自主调控系统完备代码
该项目标源代码适用于韦东山老师提供的出厂镜像,利用韦东山老师的 IMX6ULL 开发板可以直接运行代码复刻,别的开发板需要自行移植。
一、项目先容
作者在客岁实习期间做了与 Linux 相关的项目,在这里我用韦东山老师的 IMX6ULL 开发板把用到的关键技能显现出来,主要用到 Linux 驱动,QT界面设计,JsonRPC 前后台分离。
该项目主要利用 JsonRPC 把步调拆分为前台QT和后台APP,实现远程数据采集,装备控制和装备主动化运行等功能。
我们需要实现:
[*]后台 APP 传感器及控制装备的驱动编写和装备树修改。
[*]前台 QT GUI 界面设计,及时吸收后台APP传感器数据和控制后台APP传感器。
[*]实现前台 QT GUI 界面和后台APP进程间通信,JsonRPC 远程调用。
项目实物示比方下,控制灯开关:
https://i-blog.csdnimg.cn/direct/6f9e606b49fc45b5bc0229cf5f15f61f.png
人体红外检测人数,超声波判定距离:
https://i-blog.csdnimg.cn/direct/f6c69fa9cd9948918334e64e1c921554.png
遥控控制空调:
https://i-blog.csdnimg.cn/direct/ae19b7d38e13430d9e0915bccce0dabf.png
E2PROM记载存放东西:
https://i-blog.csdnimg.cn/direct/5bab99caf6b840fdbb87de67d29c2179.png
温湿度绘制成图表:
https://i-blog.csdnimg.cn/direct/ceaa387551f34e49a771a6963abb4a7d.png
室外环境监测:
https://i-blog.csdnimg.cn/direct/37caf6cbe32b47b48d269ae89e7742c4.png
项目演示视频:
基于 IMX6ULL 的环境监测自主调控系统
二、前台QT界面
前台界面主要实现了一个主界面和六个跳转界面,对于界面的跳转我们可以用两种方法,第一种是在槽函数中先关闭当前界面,再new出来新的页面展示,第二种方法是先new出来界面,再隐藏当前界面,展示新的界面,用信号作为跳转,考虑到第一种需要不停开辟新空间浪费资源,以是我们采用第二种方法。
1. 界面设计
主界面设计:
https://i-blog.csdnimg.cn/direct/73dd40a40f3146888dcdbbd9eaf606e2.png
LED,DAC控制灯界面:
https://i-blog.csdnimg.cn/direct/27fd450d48ce4d648dcfc0a7d2f0a65f.png
空调控制界面:
https://i-blog.csdnimg.cn/direct/ce4824e39f724e67930336741f9b1d44.png
E2PROM存储界面:
https://i-blog.csdnimg.cn/direct/a4ad4a4e47984f1d9823b7bb0e47bf59.png
行人监测界面:
https://i-blog.csdnimg.cn/direct/15504ead58964cb3a1d41921fb5bd2e7.png
温湿度图表界面:
https://i-blog.csdnimg.cn/direct/6d4311f9161741e3b20c83624ea16be0.png
室外环境监测界面:
https://i-blog.csdnimg.cn/direct/5861cfc3fb1a4d509a69dd690a8ef132.png
2. 代码示例
核心界面跳转代码:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->led_page = new Ledpage;
connect(this->led_page, &Ledpage::back, [=]() {
this->led_page->hide();
this->show();
});
this->irda_page = new Irdapage;
connect(this->irda_page, &Irdapage::back, [=]() {
this->irda_page->hide();
this->show();
});
this->e2prom_page = new E2prompage;
connect(this->e2prom_page, &E2prompage::back, [=]() {
this->e2prom_page->hide();
this->show();
});
this->sr_page = new Srpage;
connect(this->sr_page, &Srpage::back, [=]() {
this->sr_page->hide();
this->show();
});
this->dht11_page = new Dht11page;
connect(this->dht11_page, &Dht11page::back, [=]() {
this->dht11_page->hide();
this->show();
});
this->ap3216c_page = new Ap3216cpage;
connect(this->ap3216c_page, &Ap3216cpage::back, [=]() {
this->ap3216c_page->hide();
this->show();
});
}
void MainWindow::on_led_open_clicked()
{
this->close();
this->led_page->show();
}
void MainWindow::on_irda_open_clicked()
{
this->close();
this->irda_page->show();
}
void MainWindow::on_e2prom_open_clicked()
{
this->close();
this->e2prom_page->show();
}
void MainWindow::on_sr_open_clicked()
{
this->close();
this->sr_page->show();
}
void MainWindow::on_dht11_open_clicked()
{
this->close();
this->dht11_page->show();
}
void MainWindow::on_ap3216c_open_clicked()
{
this->close();
this->ap3216c_page->show();
}
三、后台硬件驱动
该项目主要用到 LED,DHT11,AP3216C,SR501,SR04,IRDA,E2PROM,DAC 模块,我们需要分别实现它们的驱动步调,规定好底层编程和硬件接口,以便应用层可以直接调用。
我们通常都是在Linux的终端上打开一个可执行文件,然后可执行文件就会执行步调。那么这个可执行文件做了什么呢?
可执行文件先是在应用层读取步调,其中会有许多库函数,库函数是属于内核之中。而内核又会往下调用驱动层步调。最终驱动层控制具体硬件。
以是我们需要编写两个步调,一个是驱动层的,一个是应用层的,末了驱动层需要注册进入内核,应用层才可以大概利用。
框架流程图:
https://i-blog.csdnimg.cn/direct/d5016dad956f4010bdd21f348bcad1f5.png
该项目中QT代码编写相称于应用层,以是我们还需要编写后台硬件驱动。
编写驱动主要为以下七个步调:
[*]确定主装备号,也可以让内核分配
[*]定义自己的 file_operations 结构体
[*]实现对应的 drv_open/drv_read/drv_write 等函数,填入 file operations 结构体
[*]把 file_operations 结构体告诉内核: register_chrdev
[*]谁来注册驱动步调啊? 得有一个入口函数:安装驱动步调时,就会去调用这个入口函数
[*]有入口函数就应该有出口函数: 卸载驱动步调时,出口函数调用unregister_chrdev
[*]其他美满:提供装备信息,主动创建装备节点: class_create,device_create
具体每个模块的驱动实现可以看我之前的文章:
[*]
[*]hello驱动
[*]
[*]LED驱动
[*]
[*]SR501(人体红外模块)驱动
[*]
[*]SR04(超声波)驱动
[*]
[*]DHT11(温湿度传感器)驱动
[*]
[*]IRDA(红外遥控模块)驱动
[*]
[*]I2C驱动
[*]
[*]SPI驱动
将每个模块的驱动都装载到开发板后,编译运行QT步调,就可以通过上位机界面控制下位机传感器了。
四、JsonRPC 实现前后台分离
1. 为什么要拆分?
对于比力复杂的步调,前台界面表现、后台步调由不同的团队进行开发,两边定义好交互的接口即可。这样,前台、后台步调可以分别独立开发,低沉相互之间的依靠。
比方:
[*]当更改硬件,好比更换LED引脚时,前台步调无需改变,只需要修改后台步调。
[*]想调解界面时,只需要修改前台步调,无需修改后台步调。
2. 怎样拆分?
前台步调、后台步调分别属于不同的“进程”,它们之间的交互需要通过“进程间通信”来实现,好比:网络通信、管道、共享内存等等。
在这里我将演示利用基于网络通信的“JsonRPC远程调用”来实现前后台步调的交互:
https://i-blog.csdnimg.cn/img_convert/0e3ee44df437328f014b7fb807bc3ba3.png
RPC 是远程过程调用(Remote Procedure Call)的意思,而 json 是比力盛行的传递信息的格式。
详细解说可看:
[*]利用JsonRPC实现前后台独立开发与通信
全部源码我都放在资料包里面了,链接:
[*]基于 IMX6ULL 的环境监测自主调控系统完备代码
包括QT界面设计,各个模块驱动和装备树,前后台分离代码。
https://i-blog.csdnimg.cn/direct/4c8cbb811ea94eada79af63d7a36d823.png
编译QT步调:
https://i-blog.csdnimg.cn/direct/6315d94532904ba7b10e4846445a385f.png
编译JsonRPC步调:
https://i-blog.csdnimg.cn/direct/fa4bf068ad7d437cb83f2454b52c3dd7.png
开发板上电,装载驱动,运行可执行文件,示比方下:
https://i-blog.csdnimg.cn/direct/4275005ca6104cc4a25d1151ee96ede6.png
五、总结
该项目是作者客岁在公司实习的时候结合自身所学知识做的,教学博客篇幅有限,作者基本将所有用到的知识点都列了出来,在以往写的文章里面。项目代码整体框架兼容性很高,方便各人扩展,你们可以根据自己的逻辑思维在作者的代码上自行添加功能。
项目改进之处:
原本作者想要加上v4l2摄像头和STM32单片机,v4l2摄像头可以在IMX6ULL开发板屏幕上表现,一些简单的传感器驱动可以通过单片机实现,利用MQTT协议进行发布和订阅,从而实现IMX6ULL与STM32单片机通信,减少占用IMX6ULL开发板上限有的资源,由于作者本人时间有限,目前没有空可以实现,后续空闲之后会美满上述提到的功能,希望博客对你有所帮助,谢谢各人阅读!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]