DuboisP

Chronographe

Mar 10th, 2022 (edited)
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.48 KB | None | 0 0
  1. /*
  2.    Chronomètre
  3.    Affichage du temps courant
  4.    Affichage du meilleur temps
  5.    Remise à zéro des compteurs
  6.    Nécessite :
  7.       Arduino nano ou équivalent
  8.       écran LCD1602A I2C
  9.       régulateur de tension LM2596 pour fournir une tension 5 volts (ou légérement supérieure) à partir du 12 volts batterie
  10.       2 boutons
  11.       2 résistances 1kOhm
  12.      
  13.    Auteur      : Patrick Dubois
  14.                   squiplanche@free.fr
  15.                   sur une idée d'Equatorus Rider (Facebook)
  16.    Date        : 2022-03-10
  17.    Copyright   : domaine public
  18.  
  19. */
  20.  
  21. #include <LiquidCrystal_I2C.h>      // use this library for LCD displays with I2C backpack
  22. #include <Wire.h>                   // needed for the LCD I2C library.  SCL connects to pin A5.  SDA connects to pin A4.  
  23.                                     // Jumper the LED backlight pin on the I2C board
  24.  
  25. #define STARTSTOPBUTTON    2        // D2 interruptions only working on D2 and D3
  26. #define REINITZEROBUTTON   3        // D3
  27.  
  28. int buttonStartStopState;           // variable to store the status
  29. boolean bStartButton;               // timer is running or not
  30.  
  31. unsigned long lStartTime, lCurrentTime, lBestTime;    // to manage timer counters and display
  32.  
  33. LiquidCrystal_I2C lcd(0x27, 16, 2); // use this for I2C LCD.  Assumes default address of 0x27. 16 columns 2 rows
  34.  
  35.  
  36. String MM_SS_ccc(unsigned long elapsed) {  // converts millisecondes to MM:SS:ccc
  37.    char cReturn[10];
  38.    
  39.    int MM  = elapsed / 60000;
  40.    int SS  = (elapsed - (MM * 60000)) / 1000;
  41.    int ccc = (elapsed - (MM * 60000) - (SS * 1000));
  42.    
  43.    sprintf(cReturn,"%02d:%02d.%03d", MM, SS, ccc);
  44.    return cReturn;
  45.  }
  46.  
  47.  
  48. void setup() {
  49.    
  50.    lcd.init();                      // I2C LCD init command
  51.    lcd.backlight();                 // I2C LCD turn backlight on
  52.  
  53.    lcd.setCursor(0, 0);             // Startup screen start
  54.    lcd.print("Time Attack 1.00");  
  55.    lcd.setCursor(0, 1);          
  56.    lcd.print("by Patrick D.");  
  57.    delay(2500);                  
  58.    lcd.clear();                     // Startup screen end
  59.  
  60.    lcd.setCursor(0, 0);             // cols, rows
  61.    lcd.print("Time: ");        
  62.    lcd.setCursor(0, 1);          
  63.    lcd.print("Best:");
  64.  
  65.    // initialize the pushbutton pins as input:
  66.    pinMode(STARTSTOPBUTTON, INPUT);
  67.    attachInterrupt(digitalPinToInterrupt(STARTSTOPBUTTON), onButtonStartStopEvent, RISING);
  68.    pinMode(REINITZEROBUTTON, INPUT);
  69.    attachInterrupt(digitalPinToInterrupt(REINITZEROBUTTON), onButtonReinitZeroEvent, RISING);
  70.    
  71.    lBestTime = 0;
  72.    bStartButton = false;
  73.    buttonStartStopState = LOW;
  74. }
  75.  
  76.  
  77. void onButtonReinitZeroEvent(){
  78.    // reinit timer counters to zero if not counting :-)
  79.    if (! bStartButton){
  80.       lBestTime = lStartTime = lCurrentTime = 0;  
  81.    }
  82. }
  83.  
  84.  
  85. void onButtonStartStopEvent() {
  86.  
  87.    buttonStartStopState = HIGH;  
  88. }
  89.  
  90.  
  91. void loop() {
  92.  
  93.    if (buttonStartStopState){
  94.       if (not bStartButton) {
  95.          bStartButton = true;
  96.          lStartTime = millis();
  97.       } // end if not bStartButton
  98.       else {  
  99.          bStartButton = false;
  100.          if ((lBestTime == 0) || (lBestTime > lCurrentTime)) {
  101.             lBestTime = lCurrentTime;
  102.          }
  103.       }  // end else
  104.       buttonStartStopState = LOW;
  105.    } // end if buttonstartStopState
  106.      
  107.    if (bStartButton){
  108.       lCurrentTime = millis() - lStartTime;
  109.    }
  110.    lcd.setCursor(7, 0); lcd.print(MM_SS_ccc(lCurrentTime));  
  111.    lcd.setCursor(7, 1); lcd.print(MM_SS_ccc(lBestTime));
  112. }
  113.  
Add Comment
Please, Sign In to add comment