【教程】T-TV制作汽车抬头显示器
本帖最后由 沧海笑1122 于 2021-2-16 16:11 编辑【项目故事】汽车抬头显示器是近年来汽车车主们的新工具。可以连接行车电脑,将车辆的基本参数(车速、油量、水温、电压、转速等)通过投屏方式,显示在透明屏幕或者投射在前风挡玻璃上。便于驾驶人员在行车过程中,抬头就可以掌握这些参数,而不需要低头查看仪表台数据。提升驾驶人员的行车安全的同时,也增加了不少乐趣。(此图片来自网络)
本项目是利用lilygo出品的t-tv(基于esp32的透明oled系统),制作了一款有趣的、可以显示车速、本次行程累计例程、累计行程时间等信息的抬头显示器。由于在驾驶时,不可以分心操作,所以我拍摄了安装好的图片、地库、红绿灯处以及在室内静态试验时的0速时的照片。本玩具已经通过了路测。
本项目主要知识点:一是了解BLE透传;二是了解esp32的软串口使用;三是掌握U8g2以及TinyGPS++库的使用。我给本项目的难度系数评价是1.5星(★✦☆☆☆),属于易于上手、完成度较高的实用器。
【硬件准备】
内容型号备注
1Lilygo T-TVOled驱动为ssd1309透明oled+esp32主控
2抬头显示器端HC-08模块盒汇承HC-08模块空盒以及PCB板为m5stack的PROTO unit
3HC-08+gps模块自制GPS模块+HC-08透传模块
4吸盘式车载手机支架原配nokia手机的支架
【软件准备】
内容来源备注
1Espsoftwareserialhttps://giuhub.com/plerup/espsoftwareserial软串口库
2U8g2_Arduinohttps:// giuhub.com /olikraus/U8g2_ArduinoOled显示库
3TinyGPS++https:// giuhub.com /mikalhart/TinyGPSPlus伟大的gps解析库
【制作过程】一、基本原理框图
其中:分离式蓝牙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的原理图。三、利用m5stack的PROTO unit制作HC-08小盒子。
M5Stack出品的PROTO unit是一个很方便的扩展工具,可以将一些细小的传感器以及必要的零件和接线集成在一个48.5*24*8的小盒子里,对外是4p的grove接口。查看t-tv原理图后,将hc-08焊接在PROTO unit上。注意:这个接线顺序和包装盒上的标识是不一致的,我查询了原理图并且对引出线进行了测量才确认了顺序。四、编写代码代码部分比较简单,本身不到100行。分为几个部分:#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include <U8g2lib.h>
#include "utilities.h"
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
SoftwareSerial swSer;
// The TinyGPS++ object
TinyGPSPlus gps;
U8G2_SSD1309_128X64_NONAME2_F_4W_SW_SPI u8g2(U8G2_MIRROR,
/* clock=*/ OLED_SCLK,
/* data=*/OLED_MOSI,
/* cs=*/ OLED_CS,
/* dc=*/ OLED_DC,
/* reset=*/ OLED_RST);
//U8G2_MIRROR为镜像参数,设置为水平镜像显示内容,这样面对type-c侧即变为正方向,便于在车内为其提供外部电源
String s_speed="";
String s_sats="";
void setup(void)
{
Serial.begin(9600);
swSer.begin(9600, 21, 22, SWSERIAL_8N1, false, 256, 11); //软串口,因为ttv引出来的是IO21、IO22,所以只能用软串口
/*Turn on power control*/
pinMode(PWR_ON, OUTPUT);
digitalWrite(PWR_ON, HIGH);
/*Power on the display*/
pinMode(OLED_PWR, OUTPUT);
digitalWrite(OLED_PWR, HIGH);
/*Set touch Pin as input*/
pinMode(TOUCH_PIN, INPUT);
/*Touch chip power control*/
pinMode(TOUCH_PWR, PULLUP);
digitalWrite(TOUCH_PWR, HIGH);
u8g2.begin();
u8g2.enableUTF8Print(); // enable UTF8 support for the Arduino print() function
}
void loop(void)
{
int v_TOUCH_PIN = digitalRead(TOUCH_PIN);
Serial.println(v_TOUCH_PIN);
delay(50);
if (v_TOUCH_PIN== 1)
{
delay(10);
digitalWrite(PWR_ON, LOW); //关断电源
digitalWrite(OLED_PWR, LOW);
esp_deep_sleep_start(); //esp32进入深度休眠
}
else
{
u8g2.setFont(u8g2_font_luBS24_tf);
u8g2.setFontDirection(0);
u8g2.clearBuffer();
u8g2.setCursor(0, 25);
s_speed=String(gps.speed.kmph());
u8g2.print(s_speed); //显示实时速度
u8g2.setFont(u8g2_font_lubBI08_tf);
u8g2.setCursor(85, 25);
u8g2.print("kM/h");
u8g2.setCursor(0, 45);
s_sats=String(gps.satellites.value());
u8g2.print("Sats : "+s_sats);//显示实时搜星数量
u8g2.sendBuffer();
smartDelay(1000);
if (millis() > 5000 && gps.charsProcessed() < 10)
Serial.println(F("No GPS data received: check wiring"));
//delay(1000);
}
}
static void smartDelay(unsigned long ms)
{
unsigned long start = millis();
do
{
while (swSer.available())
gps.encode(swSer.read());
} while (millis() - start < ms);
}
注意:1、U8G2_MIRROR为镜像参数,设置为水平镜像显示内容,这样面对type-c侧即变为正方向,便于在车内为其提供外部电源。2、关于esp32的串口问题,esp32一共有三个硬串口(0~2),可是ttv引出的是I021/22,这样就必须用软串口解决,好在github.com上有着很成熟的esp32/8266软串口库,因此非常方便地实现了这一功能。3、关于触摸板,ttv提供了一个很有意思的触摸板,在typec一侧的面板上,轻触后会导入一个数字量的输入,由此来控制电源关断以及esp32休眠。一、整体调试以及路测在装配、代码编写并且上传后,可以根据显示情况对代码的显示参数进行微调,就可以上路进行路测了。我使用了一个手机吸盘式支架,可以将ttv通过一个空的小塑料盒,并且用橡皮筋固定在支架上,很方便地固定在风挡玻璃上。整个行进过程中没有发生摇晃或者脱落。路测的结果:一是测速和显示均正常;二是面对晴天和强光,透明oled的显示会大大减弱。可以考虑在背面贴防紫外线单透膜试试。另外,本项目中仅放置了车速以及搜星数量,没有写累计运行里程以及累计时间,这两个参数在我的其他项目里(运动手表)都有,玩家可以自行参考。【小结】这是一个比较简单的入门程序,一共四个知识点,便于爱好者掌握并且熟悉hc-08的透传。同时也是一个实用器,可以在实际行车中应用。感谢《无线电杂志》、arduino.cn提供交流平台。春节过半,节日期间整理点滴积累,也是乐事。沧海抱拳。
【代码以及资料分享】
注意:由于论坛上传限制,所以只提供size较小的软串口库,其他库请自行下载。
页:
[1]