Advertisement
Guest User

Untitled

a guest
Jun 21st, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.94 KB | None | 0 0
  1. #include<ShiftLCD.h>
  2.  
  3. ShiftLCD lcd(8 ,10 , 9);    // DEFINE LCD PINS
  4.  
  5. volatile byte REV;       //  VOLATILE DATA TYPE TO STORE REVOLUTIONS
  6.  
  7. unsigned long int rpm, maxRPM;  //  DEFINE RPM AND MAXIMUM RPM
  8.  
  9. unsigned long time;         //  DEFINE TIME TAKEN TO COVER ONE REVOLUTION
  10.  
  11. int ledPin = 12;           //   STATUS LED
  12.  
  13. int led = 0,RPMlen , prevRPM;  //  INTEGERS TO STORE LED VALUE AND CURRENT RPM AND PREVIOUS RPM
  14.  
  15. int flag = 0;             //  A VARIABLE TO DETERMINE WHETHER THE LCD NEEDS TO BE CLEARED OR NOT
  16.  
  17. long prevtime = 0;       //  STORE IDLE TIME TO TOGGLE MENU
  18.    
  19.  void setup()
  20.  {
  21.      Serial.begin(9600);   // GET VALUES USING SERIAL MONITOR
  22.      
  23.      lcd.begin(16, 2);     // INITIATE LCD
  24.      
  25.      attachInterrupt(0, RPMCount, RISING);     //  ADD A HIGH PRIORITY ACTION ( AN INTERRUPT)  WHEN THE SENSOR GOES FROM LOW TO HIGH
  26.      
  27.      REV = 0;      //  START ALL THE VARIABLES FROM 0
  28.      
  29.      rpm = 0;
  30.      
  31.      time = 0;
  32.      
  33.      pinMode(ledPin, OUTPUT);
  34.      
  35.      pinMode(3, OUTPUT);          
  36.      
  37.      pinMode(4, OUTPUT);
  38.      
  39.      digitalWrite(3, HIGH);             //  VCC PIN FOR SENSOR
  40.      
  41.      digitalWrite(4, LOW);              // GND PIN FOR SENSOR
  42.      
  43.      lcd.print("TACHOMETER");           //   STARTUP TEXT
  44.      lcd.setCursor(0, 1);
  45.      lcd.print("- ELECTRO18");          //  THAT'S ME
  46.      delay(2000);
  47.      lcd.clear();
  48.      
  49.  }
  50.  
  51.  void loop()
  52.  {
  53.   long currtime = millis();                 // GET CURRENT TIME
  54.  
  55.   long idletime = currtime - prevtime;        //  CALCULATE IDLE TIME
  56.    
  57.     if(REV >= 5 )                  //  IT WILL UPDATE AFETR EVERY 5 READINGS
  58.    {
  59.      
  60.              
  61.      if(flag==0)                     //  CLEAR THE LCD TO AVOID ANY GARBAGE TEXT
  62.      {
  63.        lcd.clear();
  64.        lcd.print("SENSOR MEASURING");
  65.        flag=1;                          //   AFTER FLAG = 1 , THE LOOP WILL NOT EXECUTE AGAIN
  66.      }
  67.      
  68.      rpm = 30*1000/(millis() - time)*REV;       //  CALCULATE  RPM USING REVOLUTIONS AND ELAPSED TIME
  69.      
  70.      if(rpm > maxRPM)
  71.      maxRPM = rpm;                             //  GET THE MAX RPM THROUGHOUT THE RUN
  72.    
  73.      time = millis();                            
  74.      
  75.      REV = 0;
  76.      
  77.      int x= rpm;                                //  CALCULATE NUMBER OF DIGITS IN RPM
  78.      while(x!=0)
  79.      {
  80.        x = x/10;
  81.        RPMlen++;
  82.      }      
  83.          
  84.      
  85.      
  86.      if(RPMlen!=prevRPM)                             // IF THE RPM FALLS TO A LOWER NUMBER WITH LESS DIGITS , THE LCD WILL GET CLEARED
  87.      {
  88.        lcd.clear();
  89.        prevRPM = RPMlen;
  90.        flag=0;
  91.        lcd.print("SENSOR MEASURING");
  92.      }
  93.      
  94.      lcd.setCursor(0, 1);
  95.      lcd.print(rpm,DEC);                        //  PRINT RPM IN DECIMAL SYSTEM
  96.      
  97.      lcd.setCursor(6,1);
  98.      lcd.print("RPM");
  99.      delay(500);
  100.      
  101.      prevtime = currtime;                        // RESET IDLETIME
  102.    
  103.    }
  104.    
  105.    if(idletime > 5000 )                      //  IF THERE ARE NO READING FOR 5 SEC , THE SCREEN WILL SHOW MAX RPM
  106.    {
  107.      
  108.      if(flag==1)                            // CLEAR THE LCD
  109.      {
  110.        lcd.clear();
  111.        flag=0;
  112.      }
  113.      
  114.      lcd.clear();
  115.      lcd.print("MAXIMUM RPM");
  116.      lcd.setCursor(0, 1);
  117.      lcd.print(maxRPM,DEC);                     // DISPLAY MAX RPM
  118.      lcd.print("   RPM");
  119.      delay(2000);
  120.      lcd.clear();
  121.      lcd.print("IDLE STATE");
  122.      lcd.setCursor(0, 1);
  123.      lcd.print("READY TO MEASURE");
  124.      delay(2000);
  125.      prevtime = currtime;
  126.    }
  127.      
  128.  }
  129.  
  130.  void RPMCount()                                // EVERYTIME WHEN THE SENSOR GOES FROM LOW TO HIGH , THIS FUNCTION WILL BE INVOKED
  131.  {
  132.    REV++;                                         // INCREASE REVOLUTIONS
  133.    
  134.    if (led == LOW)
  135.    {
  136.      
  137.      led = HIGH;                                 //  TOGGLE STATUS LED
  138.    }
  139.    
  140.    else
  141.    {
  142.      led = LOW;
  143.    }
  144.    digitalWrite(ledPin, led);
  145.  }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement