本帖最后由 沧海笑1122 于 2021-2-16 16:11 编辑
【项目故事】 汽车抬头显示器是近年来汽车车主们的新工具。可以连接行车电脑,将车辆的基本参数(车速、油量、水温、电压、转速等)通过投屏方式,显示在透明屏幕或者投射在前风挡玻璃上。便于驾驶人员在行车过程中,抬头就可以掌握这些参数,而不需要低头查看仪表台数据。提升驾驶人员的行车安全的同时,也增加了不少乐趣。 (此图片来自网络)
本项目是利用lilygo出品的t-tv(基于esp32的透明oled系统),制作了一款有趣的、可以显示车速、本次行程累计例程、累计行程时间等信息的抬头显示器。 由于在驾驶时,不可以分心操作,所以我拍摄了安装好的图片、地库、红绿灯处以及在室内静态试验时的0速时的照片。本玩具已经通过了路测。
本项目主要知识点:一是了解BLE透传;二是了解esp32的软串口使用;三是掌握U8g2以及TinyGPS++库的使用。我给本项目的难度系数评价是1.5星(★✦☆☆☆),属于易于上手、完成度较高的实用器。
【硬件准备】
| | | | | | | | | | | 模块空盒以及PCB板为m5stack的PROTO unit | | | | | | | |
|
【软件准备】
| | | | 1 | | https://giuhub.com/plerup/espsoftwareserial | | 2 | | https:// giuhub.com /olikraus/U8g2_Arduino | | 3 | | https:// giuhub.com /mikalhart/TinyGPSPlus | |
【制作过程】 一、基本原理框图
二、硬件接线图 图中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提供交流平台。 春节过半,节日期间整理点滴积累,也是乐事。 沧海抱拳。
【代码以及资料分享】
upload.zip
(165.78 KB, 下载次数: 3)
注意:由于论坛上传限制,所以只提供size较小的软串口库,其他库请自行下载。
|