2015-02-08 21:40:02 +00:00
/* Bike Computer V1.1 - with diagnostics
2015-02-02 02:24:02 +00:00
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 ,
Measuring distance traveled , average speed , and logs to a microSD card .
Future versions will also be able to communicate to other
microcontrollers through the serial interface .
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 .
Other responsibilities will be blinking pairs of LEDs ( front and back ) on either side
of the bike to indicate turning .
*/
2015-02-08 21:40:02 +00:00
# include <SoftwareSerial.h>
SoftwareSerial lcd ( 2 , 8 ) ; // This is required, to start an instance of an LCD
const int dispSw = A3 ;
2015-02-02 02:24:02 +00:00
// D4 and D5 are reserved for I2C
// Headlight
const int ambientIn = A0 ; // Analog input pin that the potentiometer is attached to
2015-02-08 21:40:02 +00:00
const int headlight = 3 ; // Digital output pin that the LED is attached to
2015-02-02 02:24:02 +00:00
const int incrBy = 5 ; // Amount to increase or decrease LED brightness by
int sensorValue = 0 ; // value read from the pot
int outputValue = 0 ; // value output to the PWM (analog out)
// Blinkers
const int lBnkSw = A1 ; // Left Blinker switch
const int rBnkSw = A2 ; // Right Blinker switch
const int lBnk = 6 ; // Left Blinker
const int rBnk = 7 ; // Right Blinker
const int bnkSpeed = 500 ; // in ms, 500 = twice a second
int lBnkSt = LOW ;
int rBnkSt = LOW ;
int lBnkSwSt = 0 ;
int rBnkSwSt = 0 ;
unsigned long previousMillis = 0 ;
void setup ( ) {
2015-02-08 21:40:02 +00:00
lcd . begin ( 9600 ) ; // Start the LCD at 9600 baud
clearDisplay ( ) ; // Clear the display
setBacklight ( 20 ) ;
2015-02-02 02:24:02 +00:00
// initialize serial communications at 9600 bps:
Serial . begin ( 9600 ) ;
Serial . println ( " Loading bike computer diagnostics. " ) ;
Serial . println ( " This computer will log output to the console in the format: key = value \t key = value " ) ;
// Set out outputs
Serial . println ( " Setting our output pins " ) ;
pinMode ( headlight , OUTPUT ) ;
pinMode ( lBnk , OUTPUT ) ;
pinMode ( rBnk , OUTPUT ) ;
// Set our inputs
Serial . println ( " Setting our input pins " ) ;
pinMode ( ambientIn , INPUT ) ;
pinMode ( lBnkSw , INPUT ) ;
pinMode ( rBnkSw , INPUT ) ;
2015-02-08 21:40:02 +00:00
pinMode ( dispSw , INPUT ) ;
setLCDCursor ( 0 ) ;
lcd . print ( " c0defox.es BCPU " ) ;
setLCDCursor ( 18 ) ;
lcd . print ( " Bike Computer " ) ;
2015-02-02 02:24:02 +00:00
Serial . println ( " Let the games begin! " ) ;
}
void echo ( String key , String value ) { // This function logs all information to the console and saves on space without having to repeat itself
Serial . print ( key ) ;
Serial . print ( " = " ) ;
Serial . print ( value ) ;
Serial . print ( " \t " ) ;
}
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 ) ;
if ( sensorValue < = 45 & & outputValue < = 250 ) {
outputValue = outputValue + incrBy ;
}
if ( sensorValue > = 50 & & outputValue > 0 ) {
outputValue = outputValue - incrBy ;
}
analogWrite ( headlight , outputValue ) ;
2015-02-08 21:40:02 +00:00
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
}
2015-02-02 02:24:02 +00:00
echo ( " Ambient " , String ( sensorValue ) ) ;
echo ( " Headlight " , String ( outputValue ) ) ;
}
void blinker ( ) { // Controls the blinkers
unsigned long currentMillis = millis ( ) ;
// Get info from switches
lBnkSwSt = digitalRead ( lBnkSw ) ;
rBnkSwSt = digitalRead ( rBnkSw ) ;
// Automatically turn off LEDs if switch is off
if ( lBnkSwSt = = LOW ) { digitalWrite ( lBnk , LOW ) ; }
if ( rBnkSwSt = = LOW ) { digitalWrite ( rBnk , LOW ) ; }
if ( lBnkSwSt = = HIGH ) { // Test if left blinker switch is on
echo ( " lBlinkSw " , " ON " ) ;
if ( currentMillis - previousMillis > = bnkSpeed ) {
previousMillis = currentMillis ;
if ( lBnkSt = = LOW ) {
lBnkSt = HIGH ;
2015-02-08 21:40:02 +00:00
setLCDCursor ( 0 ) ;
lcd . print ( " < " ) ;
2015-02-02 02:24:02 +00:00
echo ( " lBlinker " , " ON " ) ;
} else {
lBnkSt = LOW ;
2015-02-08 21:40:02 +00:00
setLCDCursor ( 0 ) ;
lcd . print ( " " ) ;
2015-02-02 02:24:02 +00:00
echo ( " lBlinker " , " OFF " ) ;
}
digitalWrite ( lBnk , lBnkSt ) ; // Begin blinking
}
}
if ( rBnkSwSt = = HIGH ) { // Test if right blinker is on
echo ( " rBlinkSw " , " ON " ) ;
if ( currentMillis - previousMillis > = bnkSpeed ) {
previousMillis = currentMillis ;
if ( rBnkSt = = LOW ) {
rBnkSt = HIGH ;
2015-02-08 21:40:02 +00:00
setLCDCursor ( 15 ) ;
lcd . print ( " > " ) ;
2015-02-02 02:24:02 +00:00
echo ( " rBlinker " , " ON " ) ;
} else {
rBnkSt = LOW ;
2015-02-08 21:40:02 +00:00
setLCDCursor ( 15 ) ;
lcd . print ( " " ) ;
2015-02-02 02:24:02 +00:00
echo ( " rBlinker " , " OFF " ) ;
}
digitalWrite ( rBnk , rBnkSt ) ; // Begin blinking
}
}
}
2015-02-08 21:40:02 +00:00
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 " ) ;
2015-02-02 02:24:02 +00:00
headLight ( ) ;
blinker ( ) ;
// End of secondary functions, append new line to console
Serial . println ( ) ;
}