基于 IMX6ULL 的环境监测自主调控系统

文章目录

  • 前言
  • 一、项目介绍
  • 二、前台QT界面
    • 1. 界面设计
    • 2. 代码示例
  • 三、后台硬件驱动
  • 四、JsonRPC 实现前后台分离
    • 1. 为什么要拆分?
    • 2. 如何拆分?
  • 五、总结

前言

项目完整代码:基于 IMX6ULL 的环境监测自主调控系统完整代码

该项目的源代码适用于韦东山老师提供的出厂镜像,使用韦东山老师的 IMX6ULL 开发板可以直接运行代码复刻,其它开发板需要自行移植。

一、项目介绍

作者在去年实习期间做了与 Linux 相关的项目,在这里我用韦东山老师的 IMX6ULL 开发板把用到的关键技术展现出来,主要用到 Linux 驱动,QT界面设计,JsonRPC 前后台分离。

该项目主要使用 JsonRPC 把程序拆分为前台QT和后台APP,实现远程数据采集,设备控制和设备自动化运行等功能。
我们需要实现:

  1. 后台 APP 传感器及控制设备的驱动编写和设备树修改。
  2. 前台 QT GUI 界面设计,实时接收后台APP传感器数据和控制后台APP传感器。
  3. 实现前台 QT GUI 界面和后台APP进程间通信,JsonRPC 远程调用。

项目实物示例如下,控制灯开关:
在这里插入图片描述

人体红外检测人数,超声波判断距离:
在这里插入图片描述
遥控控制空调:
在这里插入图片描述
E2PROM记录存放东西:
在这里插入图片描述

温湿度绘制成图表:
在这里插入图片描述
室外环境监测:
在这里插入图片描述
项目演示视频:

基于 IMX6ULL 的环境监测自主调控系统

二、前台QT界面

前台界面主要实现了一个主界面和六个跳转界面,对于界面的跳转我们可以用两种方法,第一种是在槽函数中先关闭当前界面,再new出来新的页面展示,第二种方法是先new出来界面,再隐藏当前界面,展示新的界面,用信号作为跳转,考虑到第一种需要不断开辟新空间浪费资源,所以我们采用第二种方法。

1. 界面设计

主界面设计:
在这里插入图片描述
LED,DAC控制灯界面:
在这里插入图片描述
空调控制界面:
在这里插入图片描述

E2PROM存储界面:
在这里插入图片描述
行人监测界面:
在这里插入图片描述

温湿度图表界面:
在这里插入图片描述

室外环境监测界面:
在这里插入图片描述

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的终端上打开一个可执行文件,然后可执行文件就会执行程序。那么这个可执行文件做了什么呢?

可执行文件先是在应用层读取程序,其中会有很多库函数,库函数是属于内核之中。而内核又会往下调用驱动层程序。最终驱动层控制具体硬件。

所以我们需要编写两个程序,一个是驱动层的,一个是应用层的,最后驱动层需要注册进入内核,应用层才能够使用。

框架流程图:​​
在这里插入图片描述

该项目中QT代码编写相当于应用层,所以我们还需要编写后台硬件驱动。

编写驱动主要为以下七个步骤:

  1. 确定主设备号,也可以让内核分配
  2. 定义自己的 file_operations 结构体
  3. 实现对应的 drv_open/drv_read/drv_write 等函数,填入 file operations 结构体
  4. 把 file_operations 结构体告诉内核: register_chrdev
  5. 谁来注册驱动程序啊? 得有一个入口函数:安装驱动程序时,就会去调用这个入口函数
  6. 有入口函数就应该有出口函数: 卸载驱动程序时,出口函数调用unregister_chrdev
  7. 其他完善:提供设备信息,自动创建设备节点: class_create,device_create

具体每个模块的驱动实现可以看我之前的文章:

    1. hello驱动
    1. LED驱动
    1. SR501(人体红外模块)驱动
    1. SR04(超声波)驱动
    1. DHT11(温湿度传感器)驱动
    1. IRDA(红外遥控模块)驱动
    1. I2C驱动
    1. SPI驱动

将每个模块的驱动都装载到开发板后,编译运行QT程序,就可以通过上位机界面控制下位机传感器了。

四、JsonRPC 实现前后台分离

1. 为什么要拆分?

对于比较复杂的程序,前台界面显示、后台程序由不同的团队进行开发,双方定义好交互的接口即可。这样,前台、后台程序可以分别独立开发,降低相互之间的依赖。

例如:

  1. 当更改硬件,比如更换LED引脚时,前台程序无需改变,只需要修改后台程序。
  2. 想调整界面时,只需要修改前台程序,无需修改后台程序。

2. 如何拆分?

前台程序、后台程序分别属于不同的“进程”,它们之间的交互需要通过“进程间通信”来实现,比如:网络通信、管道、共享内存等等。

在这里我将演示使用基于网络通信的“JsonRPC远程调用”来实现前后台程序的交互:

image.png

RPC 是远程过程调用(Remote Procedure Call)的意思,而 json 是比较流行的传递信息的格式。

详细讲解可看:

  • 使用JsonRPC实现前后台独立开发与通信

全部源码我都放在资料包里面了,链接:

  • 基于 IMX6ULL 的环境监测自主调控系统完整代码

包括QT界面设计,各个模块驱动和设备树,前后台分离代码。
在这里插入图片描述
编译QT程序:
在这里插入图片描述
编译JsonRPC程序:
在这里插入图片描述

开发板上电,装载驱动,运行可执行文件,示例如下:
在这里插入图片描述

五、总结

该项目是作者去年在公司实习的时候结合自身所学知识做的,教学博客篇幅有限,作者基本将所有用到的知识点都列了出来,在以往写的文章里面。项目代码整体框架兼容性很高,方便大家扩展,你们可以根据自己的逻辑思维在作者的代码上自行添加功能。

项目改进之处:
原本作者想要加上v4l2摄像头和STM32单片机,v4l2摄像头可以在IMX6ULL开发板屏幕上显示,一些简单的传感器驱动可以通过单片机实现,利用MQTT协议进行发布和订阅,从而实现IMX6ULL与STM32单片机通信,减少占用IMX6ULL开发板上限有的资源,由于作者本人时间有限,目前没有空可以实现,后续空闲之后会完善上述提到的功能,希望博客对你有所帮助,谢谢大家阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/977637.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

洛谷:花神的数论题--数位dp

求乘积 const int N 1e2 10,T 20;LL n; LL a[N]; LL dp[N][N];//枚举的第i位,没有任何限制,已经填写了j个1的数的乘积 //表示在[pos 1, len]中已经填写了cnt个1,[1, pos]任意填写数,所有合法方案的乘积LL mo(LL x) {return (x % mod mod) % mod; }…

【Linux探索学习】第三十一弹——线程互斥与同步(下):深入理解确保线程安全的机制

线程互斥与同步(上):【Linux探索学习】第三十弹——线程互斥与同步(上):深入理解线程保证安全的机制-CSDN博客 Linux探索学习: https://blog.csdn.net/2301_80220607/category_12805278.html?…

UVM_CALLBACK 应用举例

UVM_CALLBACK是一种基于回调函数的设计模式,允许用户在特定事件发生时插入自定义的行为。UVM提供了uvm_callback类作为基类,用户可以通过继承该类来定义自己的回调行为。采用uvm_callback基类,用户可以在不更改原始代码的情况下轻松插入调试代…

优选算法大集合(待更新)

1.双指针 1.1.移动零 leetcode链接:283. 移动零 - 力扣(LeetCode)​​​​​​ 移动零的问题我们可以将它归类为数组划分的问题,我们将数组划分为非零部分和零部分。我们会使用到双指针的算法,在这里,我…

本地大模型编程实战(22)用langchain实现基于SQL数据构建问答系统(1)

使 LLM(大语言模型) 系统能够查询结构化数据与非结构化文本数据在性质上可能不同。后者通常生成可在向量数据库中搜索的文本,而结构化数据的方法通常是让 LLM 编写和执行 DSL(例如 SQL)中的查询。 我们将演练在使用基于 langchain 链 &#x…

在 Mac mini M2 上 MaxKb配置ollama,API域名无效的解决方案

环境说明 docker方案安装与使用的maxkb 本地ollama安装deekseek r1 解决方案 参考https://bbs.fit2cloud.com/t/topic/4165 mac m1用户,根据github的以下回复,成功绑定域名api 如果你想调用本地的ollama 中的大模型,域名试试:…

【STL专题】优先级队列priority_queue的使用和模拟实现,巧妙利用仿函数解决优先级

欢迎来到 CILMY23的博客 🏆本篇主题为:优先级队列priority_queue的使用和模拟实现,巧妙利用仿函数解决优先级 🏆个人主页:CILMY23-CSDN博客 🏆系列专栏: C | C语言 | 数据结构与算法 | Linux…

【NLP 23、预训练语言模型】

人类发明后悔,来证明拥有的珍贵 —— 25.1.15 Bert的优势:① 预训练思想 ② Transformer模型结构 一、传统方法 VS 预训练方式 Pre-train: ① 收集海量无标注文本数据 ② 进行模型预训练,并在任务模型中使用 Fine-tune&#xff1a…

阳光高考瑞数6vmp算法还原

URL aHR0cHM6Ly9nYW9rYW8uY2hzaS5jb20uY24v这个站平时没有防护的,只有在平时填报高峰期,才会出来防护,也是为了防护自动脚本吧瑞数就是典型的cookie反爬 O开头cookie 6开头6代vmp,P值是加密的cookie,只有带上0开头的…

危化品经营单位安全管理人员的职责及注意事项

危化品经营单位安全管理人员肩负着保障经营活动安全的重要责任,以下是其主要职责及注意事项: 职责 1. 安全制度建设与执行:负责组织制定本单位安全生产规章制度、操作规程和生产安全事故应急救援预案,确保这些制度符合国家相关法…

微软推出Office免费版,限制诸多,只能编辑不能保存到本地

易采游戏网2月25日独家消息:微软宣布推出一款免费的Office版本,允许用户进行基础文档编辑操作,但限制颇多,其中最引人关注的是用户无法将文件保存到本地。这一举措引发了广泛讨论,业界人士对其背后的商业策略和用户体验…

VMware虚拟机安装win10系统详细图文安装教程(附安装包) 2025最新版详细图文安装教程

文章目录 前言一、软件下载二、安装步骤1.创建新的虚拟机2.安装 Windows 10 系统: 前言 在计算机使用中,有时需借助虚拟机来拓展功能。VMware 虚拟机是强大的工具,能让我们在同一台电脑上运行多个系统。Windows 10 系统功能丰富、应用广泛。本教程将详细…

开源基准测试模拟器:BlueROV2 水下机器人的控制

拜读An Open-Source Benchmark Simulator: Control of a BlueROV2 Underwater Robot 非常感谢Esben Uth的帮助。 本文介绍了在 Simulink™ 中实现的常用且低成本的遥控潜水器 (ROV) BlueROV2 的仿真模型环境,该环境已针对水下航行器的基准控…

联想 SR590 服务器 530-8i 更换损坏的硬盘

坏了的硬盘会自动亮黄灯。用一个空的新盘来替换,新盘最好不要有东西。但是有东西可能也没啥,因为我看 RAID 控制器里有格式化的选项 1. 从 IPMI 把服务器关机,电源键进入绿色闪烁状态 2. 断电,推开塑料滑块拉出支架,…

【多模态处理篇三】【DeepSeek语音合成:TTS音色克隆技术揭秘】

最近帮某明星工作室做AI语音助手时遇到魔幻需求——要求用5秒的咳嗽声克隆出完整音色!传统TTS系统直接翻车,生成的语音像得了重感冒的电音怪物。直到祭出DeepSeek的TTS音色克隆黑科技,才让AI语音从"机器朗读"进化到"声临其境"。今天我们就来扒开这个声音…

Bybit事件技术分析

事件概述 2025年2月21日UTC时间下午02:16:11,Bybit的以太坊冷钱包(0x1db92e2eebc8e0c075a02bea49a2935bcd2dfcf4)因恶意合约升级遭到资金盗取。根据Bybit CEO Ben Zhou的声明,攻击者通过钓鱼攻击诱骗冷钱包签名者错误签署恶意交易…

002简单MaterialApp主题和Scaffold脚手架

002最简单的MaterialApp主题和Scaffold脚手架使用导航栏_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1RZ421p7BL?spm_id_from333.788.videopod.episodes&vd_source68aea1c1d33b45ca3285a52d4ef7365f&p1501.MaterialApp纯净的 /*MaterialApp 是主题,自带方向设…

本地部署AI模型 --- DeepSeek(二)---更新中

目录 FAQ 1.Failed to load the model Exit code: 18446744072635812000 FAQ 1.Failed to load the model Exit code: 18446744072635812000 问题描述: 🥲 Failed to load the model Error loading model. (Exit code: 18446744072635812000). Unkn…

FastAPI系列:Ubuntu部署FastAPI项目实战

这篇文章提供了在Ubuntu上部署FastAPI应用程序的详细指南。首先,读者将学习如何创建项目目录并设置Python虚拟环境,接着安装FastAPI、Uvicorn和Gunicorn等必要依赖。随后,文章指导用户编写基本的FastAPI应用程序代码,并使用Gunico…

【ECMAScript6】

【ECMAScript6】 01. ES6介绍02. let和const命令03. 模板字符串04. 函数之默认值、剩余参数05. 函数之扩展运算符、箭头函数06. 箭头函数this指向和注意事项07. 解构赋值08. 扩展的对象的功能(简写)09. Symbol类型10. Set集合数据类型11. Map数据类型12.…