【教程】T-TV制作汽车抬头显示器-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6328|回复: 0

【教程】T-TV制作汽车抬头显示器

[复制链接]
发表于 2021-2-15 19:43 | 显示全部楼层 |阅读模式
本帖最后由 沧海笑1122 于 2021-2-16 16:11 编辑

【项目故事】
汽车抬头显示器是近年来汽车车主们的新工具。可以连接行车电脑,将车辆的基本参数(车速、油量、水温、电压、转速等)通过投屏方式,显示在透明屏幕或者投射在前风挡玻璃上。便于驾驶人员在行车过程中,抬头就可以掌握这些参数,而不需要低头查看仪表台数据。提升驾驶人员的行车安全的同时,也增加了不少乐趣。
汽车抬头显示器1.jpg
(此图片来自网络)

本项目是利用lilygo出品的t-tv(基于esp32的透明oled系统),制作了一款有趣的、可以显示车速、本次行程累计例程、累计行程时间等信息的抬头显示器。
由于在驾驶时,不可以分心操作,所以我拍摄了安装好的图片、地库、红绿灯处以及在室内静态试验时的0速时的照片。本玩具已经通过了路测。

本项目主要知识点:一是了解BLE透传;二是了解esp32的软串口使用;三是掌握U8g2以及TinyGPS++库的使用。我给本项目的难度系数评价是1.5星(★✦☆☆☆),属于易于上手、完成度较高的实用器。
抬头显示器1_副本.jpg 抬头显示器3_副本.jpg
道路行驶1_副本.jpg 地下车库3_副本.jpg

【硬件准备】

  
  
内容
型号
备注
1
Lilygo T-TV
Oled驱动为ssd1309
透明oled+esp32主控
2
抬头显示器端HC-08模块盒
汇承HC-08
模块空盒以及PCB板为m5stack的PROTO unit
3
HC-08+gps模块
自制
GPS模块+HC-08透传模块
4
吸盘式车载手机支架
原配nokia手机的支架

unit及线材_副本.jpg ttv及gps模块_副本.jpg 支架_副本.jpg


【软件准备】
  
  
内容
来源
备注
  
1
  
Espsoftwareserial
https://giuhub.com/plerup/espsoftwareserial
软串口库
  
2
  
U8g2_Arduino
https:// giuhub.com /olikraus/U8g2_Arduino
Oled显示库
  
3
  
TinyGPS++
https:// giuhub.com /mikalhart/TinyGPSPlus
伟大的gps解析库


【制作过程】
一、基本原理框图
软件原理.png
其中:分离式蓝牙GPS模块(hc-08)在我以前的帖子里(运动蓝牙心率表2019版)有专门的介绍,在此不多赘述。https://www.arduino.cn/forum.php?mod=viewthread&tid=85796&highlight=BLE%E8%83%B8%E5%B8%A6%2BGPS%E5%A2%A8%E6%B0%B4%E5%B1%8F%E8%BF%90%E5%8A%A8%E5%BF%83%E7%8E%87%E8%A1%A8
二、硬件接线图
图中grove接线,从左往右(红:3.3v,绿色:IO21,蓝色:IO22,黑色:GND)
这是蓝牙(HC08)+GPS的原理图。
接线图.jpg
三、利用m5stack的PROTO unit制作HC-08小盒子。

M5Stack出品的PROTO unit是一个很方便的扩展工具,可以将一些细小的传感器以及必要的零件和接线集成在一个48.5*24*8的小盒子里,对外是4p的grove接口。查看t-tv原理图后,将hc-08焊接在PROTO unit上。注意:这个接线顺序和包装盒上的标识是不一致的,我查询了原理图并且对引出线进行了测量才确认了顺序。
原理图接口.png unit内部1_副本.jpg unit内部2_副本.jpg
四、编写代码
代码部分比较简单,本身不到100行。分为几个部分:
  1. #include <Arduino.h>
  2. #include <SPI.h>
  3. #include <Wire.h>
  4. #include <U8g2lib.h>
  5. #include "utilities.h"
  6. #include <TinyGPS++.h>
  7. #include <SoftwareSerial.h>
  8. SoftwareSerial swSer;

  9. // The TinyGPS++ object
  10. TinyGPSPlus gps;

  11. U8G2_SSD1309_128X64_NONAME2_F_4W_SW_SPI u8g2(U8G2_MIRROR,
  12.         /* clock=*/ OLED_SCLK,
  13.         /* data=*/  OLED_MOSI,
  14.         /* cs=*/    OLED_CS,
  15.         /* dc=*/    OLED_DC,
  16.         /* reset=*/ OLED_RST);
  17. //U8G2_MIRROR为镜像参数,设置为水平镜像显示内容,这样面对type-c侧即变为正方向,便于在车内为其提供外部电源
  18. String s_speed="";
  19. String s_sats="";
  20. void setup(void)
  21. {
  22.     Serial.begin(9600);
  23.     swSer.begin(9600, 21, 22, SWSERIAL_8N1, false, 256, 11); //软串口,因为ttv引出来的是IO21、IO22,所以只能用软串口
  24.    
  25.     /*Turn on power control*/
  26.     pinMode(PWR_ON, OUTPUT);
  27.     digitalWrite(PWR_ON, HIGH);

  28.     /*Power on the display*/
  29.     pinMode(OLED_PWR, OUTPUT);
  30.     digitalWrite(OLED_PWR, HIGH);

  31.     /*Set touch Pin as input*/
  32.     pinMode(TOUCH_PIN, INPUT);
  33.    /*Touch chip power control*/
  34.     pinMode(TOUCH_PWR, PULLUP);
  35.     digitalWrite(TOUCH_PWR, HIGH);
  36.    
  37.     u8g2.begin();
  38.     u8g2.enableUTF8Print(); // enable UTF8 support for the Arduino print() function

  39. }

  40. void loop(void)
  41. {
  42.   int v_TOUCH_PIN = digitalRead(TOUCH_PIN);
  43.   Serial.println(v_TOUCH_PIN);
  44.   delay(50);
  45.   if (v_TOUCH_PIN== 1)
  46.    {
  47.     delay(10);
  48.    digitalWrite(PWR_ON, LOW); //关断电源
  49.    digitalWrite(OLED_PWR, LOW);
  50.    esp_deep_sleep_start(); //esp32进入深度休眠
  51.    }
  52.   else
  53.   {
  54.    
  55.     u8g2.setFont(u8g2_font_luBS24_tf);
  56.     u8g2.setFontDirection(0);
  57.     u8g2.clearBuffer();
  58.     u8g2.setCursor(0, 25);
  59.     s_speed=String(gps.speed.kmph());
  60.     u8g2.print(s_speed); //显示实时速度
  61.     u8g2.setFont(u8g2_font_lubBI08_tf);
  62.     u8g2.setCursor(85, 25);
  63.     u8g2.print("kM/h");
  64.     u8g2.setCursor(0, 45);
  65.     s_sats=String(gps.satellites.value());
  66.     u8g2.print("Sats : "+s_sats);  //显示实时搜星数量
  67.     u8g2.sendBuffer();

  68.     smartDelay(1000);
  69.    
  70.    
  71.   if (millis() > 5000 && gps.charsProcessed() < 10)
  72.     Serial.println(F("No GPS data received: check wiring"));
  73.     //delay(1000);
  74.    
  75.   }
  76. }

  77. static void smartDelay(unsigned long ms)
  78. {
  79.   unsigned long start = millis();
  80.   do
  81.   {
  82.     while (swSer.available())
  83.       gps.encode(swSer.read());
  84.   } while (millis() - start < ms);
  85. }
复制代码
注意:1、U8G2_MIRROR为镜像参数,设置为水平镜像显示内容,这样面对type-c侧即变为正方向,便于在车内为其提供外部电源。
2、关于esp32的串口问题,esp32一共有三个硬串口(0~2),可是ttv引出的是I021/22,这样就必须用软串口解决,好在github.com上有着很成熟的esp32/8266软串口库,因此非常方便地实现了这一功能。
3、关于触摸板,ttv提供了一个很有意思的触摸板,在typec一侧的面板上,轻触后会导入一个数字量的输入,由此来控制电源关断以及esp32休眠。
一、整体调试以及路测
在装配、代码编写并且上传后,可以根据显示情况对代码的显示参数进行微调,就可以上路进行路测了。我使用了一个手机吸盘式支架,可以将ttv通过一个空的小塑料盒,并且用橡皮筋固定在支架上,很方便地固定在风挡玻璃上。整个行进过程中没有发生摇晃或者脱落。
路测的结果:一是测速和显示均正常;二是面对晴天和强光,透明oled的显示会大大减弱。可以考虑在背面贴防紫外线单透膜试试。
另外,本项目中仅放置了车速以及搜星数量,没有写累计运行里程以及累计时间,这两个参数在我的其他项目里(运动手表)都有,玩家可以自行参考。
抬头显示器2_副本.jpg 抬头显示器4_副本.jpg 抬头显示器21_副本.jpg 抬头显示器22_副本.jpg
【小结】
这是一个比较简单的入门程序,一共四个知识点,便于爱好者掌握并且熟悉hc-08的透传。
同时也是一个实用器,可以在实际行车中应用。
感谢《无线电杂志》、arduino.cn提供交流平台。
春节过半,节日期间整理点滴积累,也是乐事。
沧海抱拳。

【代码以及资料分享】
upload.zip (165.78 KB, 下载次数: 3)
注意:由于论坛上传限制,所以只提供size较小的软串口库,其他库请自行下载。
gps原理图.png
ttv.png
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 02:35 , Processed in 0.219877 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表