diff --git a/Bike_Computer.ino b/Bike_Computer.ino index 7a0a5c5..f8c9709 100644 --- a/Bike_Computer.ino +++ b/Bike_Computer.ino @@ -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, 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. - + 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 + Other responsibilities will be blinking pairs of LEDs (front and back) on either side of the bike to indicate turning. - + */ +#include + +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 // Headlight 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 int sensorValue = 0; // value read from the pot int outputValue = 0; // value output to the PWM (analog out) @@ -34,22 +42,31 @@ int lBnkSwSt = 0; int rBnkSwSt = 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 pinMode(headlight, OUTPUT); pinMode(lBnk, OUTPUT); pinMode(rBnk, OUTPUT); - + // Set our inputs pinMode(ambientIn, INPUT); pinMode(lBnkSw, 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 sensorValue = analogRead(ambientIn); - + if(sensorValue <= 45 && outputValue <= 250){ outputValue = outputValue + incrBy; } @@ -58,48 +75,92 @@ void headLight(){ // Main function for determining whether or not to ramp up or outputValue = outputValue - incrBy; } 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 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 if(currentMillis - previousMillis >= bnkSpeed){ - previousMillis = currentMillis; - - if(lBnkSt == LOW) + previousMillis = currentMillis; + + if(lBnkSt == LOW){ lBnkSt = HIGH; - else + + setLCDCursor(0); + lcd.print("<"); + }else{ lBnkSt = LOW; - + + setLCDCursor(0); + lcd.print(" "); + } + 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) + previousMillis = currentMillis; + + if(rBnkSt == LOW){ rBnkSt = HIGH; - else + + setLCDCursor(15); + lcd.print(">"); + }else{ rBnkSt = LOW; - + + setLCDCursor(15); + lcd.print(" "); + } + 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(); blinker(); }