Easy and cheap HeadUp display under 15 $.
First - English is not my native language - so sorry for bad grammar :-)
Second - My first Instructable. Please, be patient... :-)
I´ve started thinking about HeadUp diplay in summer, when I left piece of paper on my car , near front window.
I´ve been surprised when reflection of this paper has been perfectly readable - so I decided to try to mirror something more usefull than just sheet of paper.
And when I found prices of GPS modules and LED matrix displays for Arduino, I was sure - I need GPS driven HeadUp speed display.
So, what we need?
Used material -
Arduino - Arduino Pro Mini 5V/16Mhz ... (Aprox. $ 1,8 )
GPS module - Ublox Neo-M8N module chip UART TTL Smart GPS gnss antenna dual GLONASS receiver (Aprox. $ 6.90)
LED matrix display - MAX7219 Dot Matrix Module For Arduino Microcontroller 4 In One Display (Aprox. $ 3,75)
Photoresistor - 5549 Light Dependent Resistor LDR 5MM (Aprox. $ 0.70 (20pcs))
StepDown Voltage convertor - Mini360 DC-DC Buck Converter Step Down Module (Aprox. $ 0.33)
Arduino can be used any type - I´ve choosed this small chinese clone. It works on 5V TTL logic. - If you use the same type as me, you will need USB to TTL convertor for loading code into arduino. It is just for loading, for normal operation is not necessary.
GPS module - So there are plenty of cheap GPS modules on eBay or AliExpress. Most of them works on 3,3V.... I decided to pay little bit more and buy 5V TTL logic module. So, I need no level shifters for Rx/Tx communication and I need only one DC stepDown module for 12V to 5V conversion. Integrated antena is benefit :-) And can receive GPS, GLONASS and BAIDOU satellites.
Display - For our pusposes is purchased module too big - for correct speed information is needed to display three digits. There is so few drivers, who can reach more than 999 km/h :-) So... Half of this display module is enough. Fotrunatelly pcb is modular and can be divided, for example, by fret saw. Carefully :-)
Display brightness is regulated according to ambient light. More bright in sunny afternoon, less in highway tunnel. Voltage divider is created by LDR 5549 and 150k resistor - voltage according to light is measured on analog port A0 of Arduino.
There is optional use of two, or one LED for indication GPS lock. In case of two LEDs there are Green and Red LED connected to pin D8 and D9. Green means 2D fix, Red means 3D fix... After aprox. 5 month use i can say, that they are not necessary :-) But, if you want to know... There is also possible to use Pps pin from GPS module - if GPS is locked there is appearing 5V pulses (one second duration if fixed).
A few words about power - All components are powered by 5V. So we need make 5V from 12V (or 24V) from board power. I have good experience with DC-DC converter mentioned above. It is small, cheap and can handle current up to 2A. Which is much more than we need. Device has consumption around 150mA. Output voltage of converter is regulated by small screw - Make sure, that is 5V before connect Arduino and rest of device.
Input voltage you can take, for example, from cigaret lighter socket in your car, or from power socket of your radio... But, be carefull. If you do not know, where take your 12V, use lighter socket!
About code -
Library for serial communication should be common SoftwareSerial library, I´ve used NeoSWSerial library because is little smaller. You can even use Rx/TX pins of Arduino and avoid SoftwareSerial, but in this case, you have to accordingly change code.
Library for matrix display is brilliant PAROLA https://github.com/MajicDesigns/MD_Parola It allow us to display mirrored text just in one command :-) So, thanks to author.
GPS - Module gives in text mode straight informations about time, position, fix, number of satelites, speed and more... It is defined by NMEA protocol. I´ve tried some of GPS parser libraries, but finally I decided to directly parse NMEA messages to get required informations. Mainly because all tried libraries has been too big and provide lot of unwanted informations.
Speed is displayed in km/h. If you want to use miles per hour, please make changes in code. Comment conversion from knots to km/h and uncomment conversion to mph
my_speed = my_speed*1.852; //Original speed from NMEA is in KNOTS... So we have to convert it to km/h
//my_speed = my_speed*1.15077945; //This is conversion for mph
So... That´s all...
I hope, that all is written in clear way and your device will work on first attempt :-)
Feel free to write me at firstname.lastname@example.org if you have any problems.
EDIT: Some users found strange behaviour of display - digits are not mirrored and they are shifted about half of position.
This is, probably, caused by new version of MD_Parola library...
So. Here is solution, which works for me -
Go to your Arduino library folder. Find folder according to MD_MAX72xx library . And inside this folder find folder named src...
In this src folder find file MD_MAX72xx.h. Open this file in some text editor and change
#define USE_FC16_HW 0
#define USE_FC16_HW 1
accordingly find and change
#define USE_PAROLA_HW 1
#define USE_PAROLA_HW 0
Detailed info about display HW settings -> https://arduinoplusplus.wordpress.com/2017/04/14/parola-a-to-z-adapting-for-different-hardware/
New version of code - version10. Changed startup - now is displayed number of satellites before fix.
Added support for speed limit warning - three LEDs according to limits inside city, outside city and highway...