19、树莓派汽车仪表盘系统完善指南

树莓派汽车仪表盘系统完善指南

1. 数据实时更新

在处理模板时,要遵循一个黄金规则:简单的显示/隐藏数据逻辑或轻微的 UI 调整是可以直接在模板中实现的,但复杂的逻辑或计算应该放在 Python 类中。为了实现数据的近实时更新,在 HTML 的 head 标签中添加如下 meta 标签:

<meta http-equiv="refresh" content="0.25">

这个 HTML 标签会指示浏览器每四分之一秒重新加载一次页面。虽然实际不会达到这么快的速度,但也相当迅速了。之后,提交代码并推送到树莓派。启动后,观察仪表盘,通过按住按钮、遮挡光线传感器或加热温度传感器等操作,你会发现仪表盘能及时更新以反映这些变化。

2. 倒车模块集成

多个独立项目中包含了倒车模块的组件和传感器,如树莓派相机、蜂鸣器单元和后方距离传感器,都需要集成到这个仪表盘中。
- 倒车传感器检测 :每次主页面加载时检查倒车传感器。如果传感器被触发(汽车挂入倒档),则切换到倒车摄像头视频流页面。在 main.py 中的 Python 代码里,调整代码逻辑,确保先检查倒车传感器,避免在倒车屏幕启动时还去检查温度等其他传感器。使用简单的 if 语句来实现路由切换:

reverse_light = sensors.get_reverse_status()
if reverse_light:
    return reverse()

同时,需要从 reverse.py 文件中导入 reverse 函数:

from .reverse import reverse

当主页面检测到倒车传感器时,会重定向并运行倒车路由代码。不过,在树莓派上运行此代码时,会遇到视频流加载问题,因为 http://pi-car:8081 这个主机在树莓派上无法解析,需要进行如下修改:
1. 在树莓派上编辑 hosts 文件:

sudo nano /etc/hosts
2. 添加一个新条目,将 pi-car 路由到本地地址:
127.0.0.1 pi-car
3. 保存并重启树莓派。启动后,按住倒车传感器按钮(或触发传感器),树莓派应该会切换到视频流页面。
  • 倒车页面优化 :倒车页面需要调用蜂鸣器和距离传感器功能,将相机画面适配到页面,并进行一些样式设计。以下是 reverse.html 中的修订后的 HTML 代码:
<!doctype html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
        <title>Pi Car</title>
        <meta name="description" content="Raspberry Pi based car system">
        <meta name="author" content="Joe Coburn">
        <link rel="stylesheet" type="text/css" href="/static/css/style.css">
    </head>
    <body>
        <img src="{{ base_url }}">
    </body>
</html>

虽然这个 HTML 增加的功能不多,且仪表盘不在互联网上,不一定要遵循标准,但遵循标准是一个好习惯。后续还会对其进行修改,以包含读取传感器和发出蜂鸣声的必要代码。

  • 相机旋转调整 :根据最终屏幕方向,可能需要再次旋转相机。编辑 motion 配置文件来处理这个问题:
sudo nano /etc/motion/motion.conf

在文件中添加或修改旋转设置:

rotate 90
3. 倒车辅助功能实现

为了避免像主索引页面那样不断重启页面影响实时视频流的流畅性,这里使用 JavaScript 来实现倒车辅助功能。
- 创建 Flask 路由 :在 reverse.py 中创建一个名为 reverse_beep 的新 Flask 路由,路由地址为 /reverse/beep/ ,代码如下:

@reverse_blueprint.route("/reverse/beep/")
def reverse_beep():
    sensors = Sensors()
    rear_distance_item = sensors.get_rear_distance_sensor()
    if rear_distance_item:
        sensors.beep()
    return "Success"

这个函数会调用 Sensors 类的 get_rear_distance_sensor 函数,如果检测到有物体靠近,就会调用 beep 函数发出蜂鸣声。
- 编写 JavaScript 代码 :在 reverse.html 的 head 标签中创建一个 script 标签,并编写 JavaScript AJAX 代码:

var runSensors = function() {
  var xhttp = new XMLHttpRequest();
  xhttp.open("GET", "/reverse/beep/", true);
  xhttp.send();
}
window.onload = function() {
  setInterval(runSensors, 250);
}

这段代码创建了一个名为 runSensors 的函数,使用 XMLHttpRequest 对象发送 AJAX 请求到 /reverse/beep/ 路由。通过 setInterval 函数,每四分之一秒调用一次 runSensors 函数,实现对后方物体的检测和蜂鸣声的发出。

  • 返回主页面逻辑 :修改 reverse_beep 函数,检查倒车传感器状态,如果不再检测到倒车灯泡亮起,则返回 “Exit”:
@reverse_blueprint.route("/reverse/beep/")
def reverse_beep():
    sensors = Sensors()
    reverse_light = sensors.get_reverse_status()
    if not reverse_light:
        return "Exit"
    rear_distance_item = sensors.get_rear_distance_sensor()
    if rear_distance_item:
        sensors.beep()
    return "Success"

同时,修改 JavaScript 的 runSensors 函数,检查 Python 返回的结果,如果等于 “Exit”,则重定向到主仪表盘页面:

var runSensors = function() {
  var xhttp = new XMLHttpRequest();
  xhttp.open("GET", "/reverse/beep/", true);
  xhttp.onreadystatechange = function() {
    if (xhttp.readyState === 4) {
      result = xhttp.response
      if (result === "Exit") {
        window.location.href = "/";
      }
    }
  }
  xhttp.send();
}
window.onload = function() {
  setInterval(runSensors, 250);
}
4. 树莓派最终优化
  • 防止屏幕休眠 :树莓派为了节能会在大约五分钟后关闭显示屏,这对于汽车仪表盘项目来说是个麻烦。可以通过修改 Debian 显示配置文件 lightdm.conf 来解决这个问题:
sudo nano /etc/lightdm/lightdm.conf

滚动到 [Seat:*] 部分,去掉 xserver-command=X 行的注释符号,并扩展该行以防止显示屏休眠:

xserver-command=X -s 0 dpms

保存并退出文件,重启树莓派,等待五到十分钟,你会发现显示屏会一直保持开启状态。

  • 禁止自动更新 :树莓派从 Git 自动更新代码库的过程较慢,会导致浏览器先启动而服务器未运行的问题。编辑 rc.local 文件,注释掉缓慢的操作,如 sleep、clone 脚本和 pipenv install:
#sleep 15
export PATH=/home/pi/.pyenv/shims:$PATH
export FLASK_APP=Pi_Car.app
cd /home/pi/Documents/Pi-Car/
#./clone.sh
#pipenv install
pipenv run flask run --host=0.0.0.0 &
exit 0

重启树莓派后,你会发现启动速度明显加快,且不需要互联网连接也能正常工作。

5. 扩展项目建议

基于目前使用的硬件和软件,还可以进行以下扩展项目:
- 车门传感器
- 后备箱传感器
- 前照灯传感器
- 发动机温度传感器
- 随机“每日消息”(可能基于一天中的时间)
- 气候控制选项
- 仪表盘“调试”覆盖层/向仪表盘报告传感器故障
- 支持 Apple CarPlay/Android Auto
- 多个倒车传感器
- 通过互联网报告错误

在编写代码时,要记住代码是给人看的,应尽量使代码简单清晰,方便未来的修改和故障排除。

相关流程总结

以下是倒车模块集成和优化的主要流程:

graph LR
    A[主页面加载] --> B{检测倒车传感器}
    B -- 触发 --> C[切换到倒车摄像头页面]
    B -- 未触发 --> D[正常显示主页面]
    C --> E[检查视频流地址]
    E -- 需修改 --> F[编辑 hosts 文件]
    F --> G[重启树莓派]
    G --> H[显示倒车视频流]
    H --> I[JavaScript 定时检测后方距离]
    I -- 有物体靠近 --> J[发出蜂鸣声]
    I -- 倒车结束 --> K[返回主页面]

代码和配置总结

操作 代码/配置
数据实时更新 <meta http-equiv="refresh" content="0.25">
倒车传感器检测 python reverse_light = sensors.get_reverse_status() if reverse_light: return reverse()
导入 reverse 函数 python from .reverse import reverse
修改 hosts 文件 plaintext 127.0.0.1 pi-car
倒车页面 HTML html <!doctype html> <html lang="en"> <head> ... </head> <body> <img src="{{ base_url }}"> </body> </html>
相机旋转配置 plaintext rotate 90
Flask 倒车检测路由 python @reverse_blueprint.route("/reverse/beep/") def reverse_beep(): sensors = Sensors() rear_distance_item = sensors.get_rear_distance_sensor() if rear_distance_item: sensors.beep() return "Success"
JavaScript 检测代码 javascript var runSensors = function() { var xhttp = new XMLHttpRequest(); xhttp.open("GET", "/reverse/beep/", true); xhttp.send(); } window.onload = function() { setInterval(runSensors, 250); }
修改后的 Flask 路由 python @reverse_blueprint.route("/reverse/beep/") def reverse_beep(): sensors = Sensors() reverse_light = sensors.get_reverse_status() if not reverse_light: return "Exit" rear_distance_item = sensors.get_rear_distance_sensor() if rear_distance_item: sensors.beep() return "Success"
修改后的 JavaScript 代码 javascript var runSensors = function() { var xhttp = new XMLHttpRequest(); xhttp.open("GET", "/reverse/beep/", true); xhttp.onreadystatechange = function() { if (xhttp.readyState === 4) { result = xhttp.response if (result === "Exit") { window.location.href = "/"; } } } xhttp.send(); } window.onload = function() { setInterval(runSensors, 250); }
防止屏幕休眠配置 plaintext xserver-command=X -s 0 dpms
禁止自动更新配置 plaintext #sleep 15 export PATH=/home/pi/.pyenv/shims:$PATH export FLASK_APP=Pi_Car.app cd /home/pi/Documents/Pi-Car/ #./clone.sh #pipenv install pipenv run flask run --host=0.0.0.0 & exit 0

树莓派汽车仪表盘系统完善指南(续)

6. 技术原理深入剖析

在实现树莓派汽车仪表盘系统的过程中,涉及到了多种技术原理,下面对其中一些关键技术进行深入剖析。

  • AJAX 技术 :在倒车辅助功能中,使用了 AJAX(Asynchronous JavaScript and XML)技术。AJAX 允许在不刷新整个页面的情况下,与服务器进行异步通信并更新部分网页内容。在我们的代码中,JavaScript 通过 XMLHttpRequest 对象发送异步请求到 /reverse/beep/ 路由,实现了对后方距离传感器的实时检测和蜂鸣声的控制。这种异步通信方式不会阻塞浏览器的其他操作,保证了页面的流畅性。
var runSensors = function() {
  var xhttp = new XMLHttpRequest();
  xhttp.open("GET", "/reverse/beep/", true);
  xhttp.send();
}
window.onload = function() {
  setInterval(runSensors, 250);
}
  • Flask 框架 :Flask 是一个轻量级的 Python Web 框架,用于构建 Web 应用程序。在我们的项目中,使用 Flask 来处理路由和请求。例如, reverse_beep 路由处理来自 JavaScript 的 AJAX 请求,根据后方距离传感器的状态返回相应的结果。
@reverse_blueprint.route("/reverse/beep/")
def reverse_beep():
    sensors = Sensors()
    rear_distance_item = sensors.get_rear_distance_sensor()
    if rear_distance_item:
        sensors.beep()
    return "Success"
  • 传感器原理 :系统中使用了多种传感器,如倒车传感器、距离传感器、光线传感器等。这些传感器的工作原理各不相同,但都是将物理量转换为电信号,然后通过相应的接口传输到树莓派进行处理。例如,距离传感器通常使用红外或超声波技术来测量物体与传感器之间的距离。
7. 系统性能优化建议

虽然经过前面的优化,系统已经具备了较好的性能,但仍有一些可以进一步优化的地方。

  • 缓存机制 :对于一些不经常变化的数据,可以使用缓存机制来减少对服务器的请求。例如,仪表盘上的一些静态信息,如车辆的基本设置等,可以在客户端进行缓存,避免每次页面加载都从服务器获取。
  • 代码优化 :对 Python 和 JavaScript 代码进行优化,减少不必要的计算和循环。例如,在处理传感器数据时,可以使用更高效的算法来提高处理速度。
  • 资源管理 :合理管理系统资源,避免资源的浪费。例如,在使用摄像头和蜂鸣器等硬件设备时,及时释放占用的资源,避免出现资源泄漏的问题。
8. 常见问题及解决方案

在开发和使用树莓派汽车仪表盘系统的过程中,可能会遇到一些常见问题,下面给出相应的解决方案。

问题 解决方案
视频流加载失败 检查 hosts 文件是否正确配置,确保 pi-car 能够正确路由到本地地址。同时,检查摄像头和视频流服务是否正常运行。
蜂鸣器不响 检查蜂鸣器的硬件连接是否正确,确保 GPIO 引脚配置无误。同时,检查 reverse_beep 函数是否正常工作,是否能够正确检测到后方距离传感器的状态。
页面卡顿 检查系统资源使用情况,是否存在资源瓶颈。可以尝试优化代码和减少不必要的请求,提高系统的响应速度。
9. 未来展望

随着技术的不断发展,树莓派汽车仪表盘系统还有很大的发展空间。以下是一些未来可能的发展方向。

  • 智能化升级 :结合人工智能和机器学习技术,实现更多智能化的功能。例如,通过图像识别技术识别后方障碍物的类型,提供更准确的预警信息。
  • 与其他系统集成 :将仪表盘系统与车辆的其他系统进行集成,如导航系统、车载娱乐系统等,实现信息的共享和交互。
  • 远程控制 :通过互联网实现对仪表盘系统的远程控制和监控,方便用户在不在车内时也能了解车辆的状态。

整体系统架构图

graph LR
    A[树莓派] --> B[传感器模块]
    A --> C[显示模块]
    A --> D[蜂鸣器模块]
    A --> E[摄像头模块]
    B --> F[倒车传感器]
    B --> G[距离传感器]
    B --> H[光线传感器]
    C --> I[仪表盘页面]
    D --> J[发出蜂鸣声]
    E --> K[倒车视频流]
    I --> L[用户交互]
    L --> M[AJAX 请求]
    M --> A

总结

通过对树莓派汽车仪表盘系统的完善,我们实现了数据的实时更新、倒车模块的集成和优化、以及系统的性能优化等功能。同时,对关键技术进行了深入剖析,给出了常见问题的解决方案和未来的发展方向。希望本文能够为你在开发和使用树莓派汽车仪表盘系统时提供一些参考和帮助。在实际应用中,可以根据自己的需求对系统进行进一步的扩展和优化,打造出更加个性化和智能化的汽车仪表盘系统。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值