talofer99

Bicycle speedometer

Oct 28th, 2020
1,069
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // include the library code:
  2. #include <LiquidCrystal.h>
  3.  
  4. // initialize the library with the numbers of the interface pins
  5. LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
  6. // general place holder (for use in functions)
  7. unsigned long millisValue = 0;
  8. // speed value
  9. float Speed = 0 ;
  10. // wheel size in CM
  11. const int Wheel_circumference_in_Cm = 210 ;  // (2PiR).
  12. // Magnatic reader params
  13. const int MagneticReader_Pin = 2;
  14. boolean MagneticReader_Last_state;
  15. boolean MagneticReader_Current_state;
  16. unsigned long MagneticReader_Last_state_Change = 0;
  17.  
  18. int MagneticReader_Last_state_isonMove_Millis_Gap = Wheel_circumference_in_Cm * 36 ; // the min for 1km/hour speed
  19. // isonMove
  20. boolean isonMove = false;
  21. // total distance and time
  22. unsigned long total_time_onMove = 0;
  23. unsigned long total_cm_onMove = 0;
  24. // for now leave this as indicator
  25. const int ledPin =  13;      // the number of the LED pin
  26. int tempcounter = 0;
  27.  
  28. void setup() {
  29.   // set serial
  30.   Serial.begin(115200);
  31.   // set up the LCD's number of columns and rows:
  32.   lcd.begin(16, 2);
  33.  
  34.   // set the fixed text
  35.   lcd.setCursor(0, 0);
  36.   lcd.print("SPEED:");
  37.   lcd.setCursor(0, 1);
  38.   lcd.print("TIME:");
  39.  
  40.   // initialize the LED pin as an output:
  41.   pinMode(ledPin, OUTPUT);
  42.   pinMode(MagneticReader_Pin, INPUT_PULLUP);
  43.  
  44.   MagneticReader_Last_state = digitalRead(MagneticReader_Pin);
  45. }
  46.  
  47. void loop() {
  48.   // read the state of the magnetic reader.
  49.   MagneticReader_Current_state = !digitalRead(MagneticReader_Pin);
  50.  
  51.   // if the last read was longer then 3 sec ... probably stop - show speed 0 (zero)
  52.   if (MagneticReader_Last_state_Change + MagneticReader_Last_state_isonMove_Millis_Gap < millis()) {
  53.     // set speed to ZERO For display
  54.     Speed = 0;
  55.     // set on the move to false
  56.     isonMove = false;
  57.   } // end if past time
  58.  
  59.   // set indicator // TO BE REMOVED (THIS ONLY FOR VISUAL DEBUG - BLIN KEVERY TIME THE WHEEL CROSS)
  60.   digitalWrite(ledPin, MagneticReader_Current_state);
  61.  
  62.   // if state changed
  63.   if (MagneticReader_Current_state != MagneticReader_Last_state)  {
  64.     // set the global var to use in all the functions to keep it on the same millis
  65.     millisValue = millis();
  66.  
  67.     // only when we turn HIGH we do the calc of speed and setting of the last chnage miliis
  68.     if (MagneticReader_Current_state)    {
  69.       // now only if we already on the move
  70.       if (isonMove) {
  71.  
  72.         // set the counter - will display for debugin TO BE REMOVED
  73.         tempcounter += 1;
  74.         Serial.println(tempcounter);
  75.  
  76.         // calc speed
  77.         Speed =  float(Wheel_circumference_in_Cm) / float((millisValue - MagneticReader_Last_state_Change) / 36) ;
  78.  
  79.         // Calculate totals :
  80.         total_time_onMove += millisValue - MagneticReader_Last_state_Change;
  81.         total_cm_onMove += Wheel_circumference_in_Cm;
  82.  
  83.         // if not is on move -
  84.       } else {
  85.         // flip satet
  86.         isonMove = true;
  87.       } // end  (isonMove)
  88.  
  89.       // set the time
  90.       MagneticReader_Last_state_Change = millisValue;
  91.     } // end if (MagneticReader_Current_state)
  92.  
  93.     // set the current to last - so this loop will not happen again untill it chnages again.
  94.     MagneticReader_Last_state = MagneticReader_Current_state;
  95.   } // end if state changed
  96.  
  97.   // print speed - if speed less then 10 print it align to right
  98.   lcd.setCursor(7, 0);
  99.   if (int(Speed) < 10) {
  100.     lcd.print(" ");  // if less then 10 add " " space - to remove prev carcters
  101.   }
  102.   lcd.print(int(Speed));
  103.  
  104.   // print total distance
  105.   lcd.setCursor(11, 0);
  106.   if (int(total_cm_onMove / 100000) < 10) {
  107.     lcd.print(" ");  // if less then 10 add " " space  so when its over 10 it will not move in "space"
  108.   }
  109.   lcd.print(float(float(total_cm_onMove) / 100000.00), 2);
  110.  
  111.   //calc and print time in MM:SS
  112.   int minutes_for_diplay = int(total_time_onMove / 60000);
  113.   int sec_for_display = int((total_time_onMove - minutes_for_diplay * 60000) / 1000);
  114.  
  115.   // print total time
  116.   lcd.setCursor(7, 1);
  117.   if (minutes_for_diplay < 10) {
  118.     lcd.print("0"); // if min less then 10 add 0 (zero)
  119.   }
  120.   lcd.print(minutes_for_diplay);
  121.   lcd.print(":");
  122.   if (sec_for_display < 10) {
  123.     lcd.print("0"); // if sec less then 10 add 0 (zero)
  124.   }
  125.   lcd.print(sec_for_display);
  126.  
  127.  
  128. } // end loop
  129.  
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×