Add LCD panel to show stats

This commit is contained in:
Arctic Code 2015-02-08 15:38:26 -06:00
parent e523caf8e1
commit 43438997ab
1 changed files with 86 additions and 25 deletions

View File

@ -1,23 +1,31 @@
/* Bike Computer V1 /* Bike Computer V1.1
Using the serial functions signifigantly increases compiled size, use this if you have a problem in execution or are testing.
Use the version without diagnostics in production (once you work out the bugs of course)
Provides controls to basic functions on a bike, such as turning on and off lights, Provides controls to basic functions on a bike, such as turning on and off lights,
Measuring distance traveled, average speed, and logs to a microSD card. Measuring distance traveled, average speed, and logs to a microSD card.
Future versions will also be able to communicate to other Future versions will also be able to communicate to other
microcontrollers through the serial interface. microcontrollers through the serial interface.
Version 1 (This version) will be responsible for detecting ambiant light and ramping Version 1 (This version) will be responsible for detecting ambiant light and ramping
up/down the front and rear LED brightness once light levels reach a certain level. up/down the front and rear LED brightness once light levels reach a certain level.
Other responsibilities will be blinking pairs of LEDs (front and back) on either side Other responsibilities will be blinking pairs of LEDs (front and back) on either side
of the bike to indicate turning. of the bike to indicate turning.
*/ */
#include <SoftwareSerial.h>
SoftwareSerial lcd(2, 8); // This is required, to start an instance of an LCD
const int dispSw = A3;
// D4 and D5 are reserved for I2C // D4 and D5 are reserved for I2C
// Headlight // Headlight
const int ambientIn = A0; // Analog input pin that the potentiometer is attached to const int ambientIn = A0; // Analog input pin that the potentiometer is attached to
const int headlight = 3; // Analog output pin that the LED is attached to const int headlight = 3; // Digital output pin that the LED is attached to
const int incrBy = 5; // Amount to increase or decrease LED brightness by const int incrBy = 5; // Amount to increase or decrease LED brightness by
int sensorValue = 0; // value read from the pot int sensorValue = 0; // value read from the pot
int outputValue = 0; // value output to the PWM (analog out) int outputValue = 0; // value output to the PWM (analog out)
@ -34,22 +42,31 @@ int lBnkSwSt = 0;
int rBnkSwSt = 0; int rBnkSwSt = 0;
unsigned long previousMillis = 0; unsigned long previousMillis = 0;
void setup() {
lcd.begin(9600); // Start the LCD at 9600 baud
clearDisplay(); // Clear the display
setBacklight(20);
void setup() {
// Set out outputs // Set out outputs
pinMode(headlight, OUTPUT); pinMode(headlight, OUTPUT);
pinMode(lBnk, OUTPUT); pinMode(lBnk, OUTPUT);
pinMode(rBnk, OUTPUT); pinMode(rBnk, OUTPUT);
// Set our inputs // Set our inputs
pinMode(ambientIn, INPUT); pinMode(ambientIn, INPUT);
pinMode(lBnkSw, INPUT); pinMode(lBnkSw, INPUT);
pinMode(rBnkSw, INPUT); pinMode(rBnkSw, INPUT);
pinMode(dispSw, INPUT);
setLCDCursor(0);
lcd.print("c0defox.es BCPU");
setLCDCursor(18);
lcd.print("Bike Computer");
} }
void headLight(){ // Main function for determining whether or not to ramp up or ramp down the headlight and taillight. Uses ambient light sensor for that void headLight(){ // Main function for determining whether or not to ramp up or ramp down the headlight and taillight. Uses ambient light sensor for that
sensorValue = analogRead(ambientIn); sensorValue = analogRead(ambientIn);
if(sensorValue <= 45 && outputValue <= 250){ if(sensorValue <= 45 && outputValue <= 250){
outputValue = outputValue + incrBy; outputValue = outputValue + incrBy;
} }
@ -58,48 +75,92 @@ void headLight(){ // Main function for determining whether or not to ramp up or
outputValue = outputValue - incrBy; outputValue = outputValue - incrBy;
} }
analogWrite(headlight, outputValue); analogWrite(headlight, outputValue);
if(outputValue >= 20){ // Ramp up/down lcd brightness with headlight - anything lower than 20 is too hard to read
setBacklight(outputValue);
setLCDCursor(16);
lcd.print("*"); // Headlight indicator on lcd
lcd.print(outputValue); // Brightness level of headlight
}
} }
void blinker(){ // Controls the blinkers void blinker(){ // Controls the blinkers
unsigned long currentMillis = millis(); unsigned long currentMillis = millis();
// Get info from switches // Get info from switches
lBnkSwSt = digitalRead(lBnkSw); lBnkSwSt = digitalRead(lBnkSw);
rBnkSwSt = digitalRead(rBnkSw); rBnkSwSt = digitalRead(rBnkSw);
// Automatically turn off LEDs if switch is off // Automatically turn off LEDs if switch is off
if(lBnkSwSt == LOW){ digitalWrite(lBnk, LOW); } if(lBnkSwSt == LOW){ digitalWrite(lBnk, LOW); }
if(rBnkSwSt == LOW){ digitalWrite(rBnk, LOW); } if(rBnkSwSt == LOW){ digitalWrite(rBnk, LOW); }
if(lBnkSwSt == HIGH){ // Test if left blinker switch is on if(lBnkSwSt == HIGH){ // Test if left blinker switch is on
if(currentMillis - previousMillis >= bnkSpeed){ if(currentMillis - previousMillis >= bnkSpeed){
previousMillis = currentMillis; previousMillis = currentMillis;
if(lBnkSt == LOW) if(lBnkSt == LOW){
lBnkSt = HIGH; lBnkSt = HIGH;
else
setLCDCursor(0);
lcd.print("<");
}else{
lBnkSt = LOW; lBnkSt = LOW;
setLCDCursor(0);
lcd.print(" ");
}
digitalWrite(lBnk, lBnkSt); // Begin blinking digitalWrite(lBnk, lBnkSt); // Begin blinking
} }
} }
if(rBnkSwSt == HIGH){ // Test if right blinker is on if(rBnkSwSt == HIGH){ // Test if right blinker is on
echo("rBlinkSw", "ON");
if(currentMillis - previousMillis >= bnkSpeed){ if(currentMillis - previousMillis >= bnkSpeed){
previousMillis = currentMillis; previousMillis = currentMillis;
if(rBnkSt == LOW) if(rBnkSt == LOW){
rBnkSt = HIGH; rBnkSt = HIGH;
else
setLCDCursor(15);
lcd.print(">");
}else{
rBnkSt = LOW; rBnkSt = LOW;
setLCDCursor(15);
lcd.print(" ");
}
digitalWrite(rBnk, rBnkSt); // Begin blinking digitalWrite(rBnk, rBnkSt); // Begin blinking
} }
} }
} }
void setBacklight(byte brightness){
lcd.write(0x80); // send the backlight command
lcd.write(brightness); // send the brightness value
}
void clearDisplay(){
lcd.write(0xFE); // send the special command
lcd.write(0x01); // send the clear screen command
}
void setLCDCursor(byte cursor_position){
lcd.write(0xFE); // send the special command
lcd.write(0x80); // send the set cursor command
lcd.write(cursor_position); // send the cursor position
}
void loop(){
delay(500);
clearDisplay();
setLCDCursor(4);
lcd.print("MPH: 7.5");
void loop() {
headLight(); headLight();
blinker(); blinker();
} }