/* * Name: MiataDash * Author: Benjamin Moehring * Microcontroller: Arduino Uno r3 * Recent Edit: 8/18 * Description: A simple program running the basic operations of reading voltages * from the ECU and sending data to be displayed through PWM outputs to the LED * drivers and Serial outputs to the 7-seg displays. */ #include #include // Analog Inputs: // MPHi = A5; // 12V Input for Speedometer MPH // VLTi = A4; // 12V Input for Battery Voltage // WATi = A3; // 12V Input for Water Level // OILi = A2; // 12V Input for Oil Pressure // FULi = A1; // 12V Input for Fuel Level // ENGi = A0; // 5V Input for Engine RPM // PWM Outputs: const int RPMo = 3; // Output for Engine Tachometer LEDs const int FLGo = 5; // Output for Fuel Gauge LEDs const int OLGo = 6; // Output for Oil Gauge LEDs const int WTGo = 9; // Output for Water Gauge LEDs const int VTGo = 10; // Output for Battery Gauge LEDs const int SHSo = 11; // Output for Shift Sensor LEDs // Serial Outputs: const int MPH7 = 2; // Output for Speedometer 7-Seg Display // const int RPM7 = 4; // Output for Engine Tachometer 7-Seg Display // const int FLG7 = 7; // Output for Fuel Gauge 7-Seg Display // const int WTG7 = 8; // Output for Water Gauge 7-Seg Display SoftwareSerial s7sM = SoftwareSerial(13, MPH7); // SoftwareSerial s7sR = SoftwareSerial(13, RPM7); // Leftovers from original design // SoftwareSerial s7sF = SoftwareSerial(13, FLG7); // SoftwareSerial s7sW = SoftwareSerial(13, WTG7); char tempString[10]; // Used with sprintf to create strings // Program Setup void setup() { // Pin Setup pinMode(A5, INPUT); // Setting Analog Inputs pinMode(A4, INPUT); pinMode(A3, INPUT); pinMode(A2, INPUT); pinMode(A1, INPUT); pinMode(A0, INPUT); pinMode(3, OUTPUT); // Setting PWM Outputs pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT); pinMode(2, OUTPUT); // Setting Serial Outputs // pinMode(4, OUTPUT); // pinMode(7, OUTPUT); // pinMode(8, OUTPUT); // 7-Seg Setup Serial.begin(9600); // Serial port open, Data rate of 9600 bps for serial // transmission outputs to 7-Seg Displays s7sM.begin(9600); // Setting s7s baud to default 9600 bps setBrightness(127); // Brightness at medium setting, easiest on the eyes // LED Bars Startup Animation /* PWM Outputs to Voltages to LEDs lit up: * 0 = 0V = 0 LEDs * 26 = 0.51V = 1 LEDs * 51 = 1V = 2 LEDs * 77 = 1.5V = 3 LEDs * 103 = 2.01V = 4 LEDs * 128 = 2.5V = 5 LEDs * 154 = 3.01V = 6 LEDs * 179 = 3.5V = 7 LEDs * 205 = 4V = 8 LEDs * 231 = 4.51V = 9 LEDs * 255 = 4.98V = 10 LEDs */ clearDisplay(); s7sM.print("----"); // delay(50); analogWrite(FLGo, 26); // Output for Fuel Gauge LEDs delay(100); analogWrite(FLGo, 51); delay(100); analogWrite(FLGo, 77); delay(100); analogWrite(FLGo, 103); delay(100); analogWrite(FLGo, 128); delay(100); analogWrite(FLGo, 154); analogWrite(RPMo, 26); // Output for Engine Tachometer LEDs delay(50); analogWrite(RPMo, 51); delay(50); analogWrite(RPMo, 77); delay(50); analogWrite(RPMo, 103); delay(50); analogWrite(RPMo, 128); delay(50); analogWrite(RPMo, 154); delay(50); analogWrite(RPMo, 179); delay(50); analogWrite(RPMo, 205); analogWrite(SHSo, 26); // Output for Shift Sensor LEDs delay(150); analogWrite(SHSo, 54); delay(150); analogWrite(SHSo, 77); analogWrite(OLGo, 26); // Output for Oil Gauge LEDs delay(50); analogWrite(OLGo, 54); delay(50); analogWrite(OLGo, 77); delay(50); analogWrite(OLGo, 103); delay(50); analogWrite(OLGo, 128); delay(50); analogWrite(OLGo, 154); delay(50); analogWrite(OLGo, 179); delay(50); analogWrite(OLGo, 205); analogWrite(WTGo, 26); // Output for Water Gauge LEDs delay(50); analogWrite(WTGo, 54); delay(50); analogWrite(WTGo, 77); delay(50); analogWrite(WTGo, 103); delay(50); analogWrite(WTGo, 128); delay(50); analogWrite(WTGo, 154); delay(50); analogWrite(WTGo, 179); delay(50); analogWrite(WTGo, 205); delay(50); analogWrite(WTGo, 231); delay(50); analogWrite(WTGo, 255); analogWrite(VTGo, 26); // Output for Battery Gauge LEDs delay(50); analogWrite(VTGo, 54); delay(50); analogWrite(VTGo, 77); delay(50); analogWrite(VTGo, 103); delay(50); analogWrite(VTGo, 128); delay(50); analogWrite(VTGo, 154); delay(50); analogWrite(VTGo, 179); delay(50); analogWrite(VTGo, 205); delay(50); analogWrite(VTGo, 231); delay(50); analogWrite(VTGo, 0); // Battery Gauge Off delay(150); analogWrite(WTGo, 0); // Water Gauge Off delay(150); analogWrite(OLGo, 0); // Oil Gauge Off delay(150); analogWrite(SHSo, 0); // Shift Sensor Off delay(150); analogWrite(RPMo, 0); // Engine Tachometer Off delay(150); analogWrite(FLGo, 0); // Fuel Gauge Off // 7-Seg Startup Animation clearDisplay(); // Clearing displays for startup s7sM.print("1---"); // 7-Seg Startup Animation delay(250); s7sM.print("-1--"); delay(50); s7sM.print("--1-"); delay(50); s7sM.print("---1"); delay(50); s7sM.print("1--1"); delay(250); s7sM.print("-1-1"); delay(50); s7sM.print("--11"); delay(250); s7sM.print("1-11"); delay(50); s7sM.print("-111"); delay(250); s7sM.print("1111"); delay(250); s7sM.print("-111"); delay(50); s7sM.print("--11"); delay(50); s7sM.print("---1"); delay(50); s7sM.print("----"); delay(500); s7sM.print(" HI "); delay(500); s7sM.print(" "); delay(150); setDecimals(0b010000); // :3 s7sM.print(" 3 "); delay(1000); setDecimals(0b000000); // Remove colon // Run through 0-120 MPH unsigned int TV1 = 0; // Setting Test Value 1 to 0 while (TV1 < 150) { sprintf(tempString, "%4d", TV1); s7sM.print(tempString); // Output tempString to the s7sM TV1++; // Increment Test Value delay(5); } unsigned int TV2 = 150; // Setting Test Value 2 to 120 while (TV2 > 0) { sprintf(tempString, "%4d", TV2); s7sM.print(tempString); // Output tempString to the s7sM TV2--; // Decrement Test Value TV2--; // Decrement Test Value TV2--; // Decrement Test Value TV2--; // Decrement Test Value TV2--; // Decrement Test Value delay(25); } clearDisplay(); // 7-Seg Startup over /* The dual purpose of the startup animationa is to not only add style to the starting * of the displays, but also to show the quick response time of the displays themselves */ } void loop() { // Analog Inputs float MPHi = analogRead(A5); // 12V Input for Speedometer MPH float MPHiv = MPHi * (5.0/1023) * ((47000.0 + 33000.0)/33000.0); float VLTi = analogRead(A4); // 12V Input for Battery Voltage float VLTiv = VLTi * (5.0/1023) * ((47000.0 + 33000.0)/33000.0); float WATi = analogRead(A3); // 12V Input for Water Level float WATiv = WATi * (5.0/1023) * ((47000.0 + 33000.0)/33000.0); float OILi = analogRead(A2); // 12V Input for Oil Pressure float OILiv = OILi * (5.0/1023) * ((47000.0 + 33000.0)/33000.0); float FULi = analogRead(A1); // 12V Input for Fuel Level float FULiv = FULi * (5.0/1023) * ((47000.0 + 33000.0)/33000.0); float ENGi = analogRead(A0); // 5V Input for Engine RPM float ENGiv = ENGi * 5.0/1023; // Engine RPM value is read directly from the vehicle's ECU, meaning // no voltage division is required as the ECU outputs a readable 5V. // LED Bars Writeouts /* PWM Outputs to Voltages to LEDs lit up: * 0 = 0V = 0 LEDs * 26 = 0.51V = 1 LEDs * 51 = 1V = 2 LEDs * 77 = 1.5V = 3 LEDs * 103 = 2.01V = 4 LEDs * 128 = 2.5V = 5 LEDs * 154 = 3.01V = 6 LEDs * 179 = 3.5V = 7 LEDs * 205 = 4V = 8 LEDs * 231 = 4.51V = 9 LEDs * 255 = 4.98V = 10 LEDs */ float Rval = 51 * (ENGiv * 0.80); // 8 LEDs at max float Fval = 51 * (FULiv * 0.60); // 6 LEDs at max float Oval = 51 * (OILiv * 0.80); // 8 LEDs at max float Wval = 51 * (WATiv); // 10 LEDs at max float Vval = 51 * (VLTiv * 0.90); // 9 LEDs at max analogWrite(RPMo, Rval); // Output for Engine Tachometer LEDs analogWrite(FLGo, Fval); // Output for Fuel Gauge LEDs analogWrite(OLGo, Oval); // Output for Oil Gauge LEDs analogWrite(WTGo, Wval); // Output for Water Gauge LEDs analogWrite(VTGo, Vval); // Output for Battery Gauge LEDs // Shift Sensor Writeout if (ENGiv >= 3.8) { // Engine RPMs reach 6200, shift must occur analogWrite(SHSo, 77); // All 3 LEDs blink 10 times over 2 seconds delay(100); analogWrite(SHSo, 0); // No LEDs lit delay(100); analogWrite(SHSo, 77); // Blink 2 delay(100); analogWrite(SHSo, 0); // No LEDs lit delay(100); analogWrite(SHSo, 77); // Blink 3 delay(100); analogWrite(SHSo, 0); // No LEDs lit delay(100); analogWrite(SHSo, 77); // Blink 4 delay(100); analogWrite(SHSo, 0); // No LEDs lit delay(100); analogWrite(SHSo, 77); // Blink 5 delay(100); analogWrite(SHSo, 0); // No LEDs lit delay(100); analogWrite(SHSo, 77); // Blink 6 delay(100); analogWrite(SHSo, 0); // No LEDs lit delay(100); analogWrite(SHSo, 77); // Blink 7 delay(100); analogWrite(SHSo, 0); // No LEDs lit delay(100); analogWrite(SHSo, 77); // Blink 8 delay(100); analogWrite(SHSo, 0); // No LEDs lit delay(100); analogWrite(SHSo, 77); // Blink 9 delay(100); analogWrite(SHSo, 0); // No LEDs lit delay(100); analogWrite(SHSo, 77); // Blink 10 } else if (ENGiv >= 3.1 && ENGiv < 3.8) { // Engine RPMs reach 5000 analogWrite(SHSo, 51); // Only 2 LEDs } else if (ENGiv >= 2.5 && ENGiv < 3.1) { // Engine RPMs reach 4000 analogWrite(SHSo, 26); // Only 1 LED } else if (ENGiv < 2.5){ // Engine RPMs below 4000 analogWrite(SHSo, 0); // No LEDs lit } // 7-Seg Display Writeout unsigned int Mval = MPHiv * 40; // Max MPH set at 200 sprintf(tempString, "%4d", Mval); s7sM.print(tempString); // Output tempString to the s7sM } // Extra Functions void clearDisplay() { // Clears all 7-Seg Displays of text s7sM.write(0x76); // Speedometer } void setBrightness(byte value) { // Sets brightness levels for the 7-Seg Displays s7sM.write(0x7A); // Speedometer s7sM.write(value); } void setDecimals(byte decimals) { // Allows for direct input for lighting specific 7-Seg portions s7sM.write(0x77); // Speedometer s7sM.write(decimals); }