└── Laser_Tachometer_V1_0_0.ino /Laser_Tachometer_V1_0_0.ino: -------------------------------------------------------------------------------- 1 | //Laser Tachometer by Elite Worm (YouTube.com/c/EliteWorm) 2 | //Version 1.0.0 3 | 4 | //Make sure you have all the libraries installed! 5 | 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | #define SCREEN_WIDTH 128 12 | #define SCREEN_HEIGHT 32 13 | 14 | #define OLED_RESET 4 15 | Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); 16 | 17 | const byte sensor = 2; 18 | 19 | volatile unsigned long t_pulse_started_volatile = 0; 20 | volatile unsigned long t_pulse_duration_volatile = 0; 21 | unsigned long t_pulse_started = 0; 22 | unsigned long t_pulse_duration = 0; 23 | 24 | long rpm_sum = 0; 25 | long rpm_reading[100]; 26 | long rpm_average = 0; 27 | byte n_max = 0; 28 | byte n = 0; 29 | 30 | volatile bool timeout = 1; 31 | volatile bool newpulse = 0; 32 | 33 | void setup() { 34 | 35 | if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 36 | for(;;); 37 | } 38 | 39 | pinMode(sensor, INPUT); 40 | attachInterrupt(digitalPinToInterrupt(sensor), ISR_sensor, RISING); 41 | 42 | } 43 | 44 | void loop() { 45 | 46 | noInterrupts(); 47 | t_pulse_started = t_pulse_started_volatile; 48 | t_pulse_duration = t_pulse_duration_volatile; 49 | interrupts(); 50 | 51 | if(((micros() - t_pulse_started) > 2000000) && timeout == 0 && newpulse == 0) { 52 | 53 | timeout = 1; 54 | rpm_average = 0; 55 | n = 0; 56 | 57 | }; 58 | 59 | if(timeout == 0){ 60 | 61 | if(newpulse){ 62 | 63 | rpm_reading[n] = (60000000 / t_pulse_duration); 64 | n_max = constrain(map(rpm_reading[n], 60, 100000, 0, 100), 0, 100); 65 | n++; 66 | newpulse = 0; 67 | 68 | if(n > n_max){ 69 | 70 | for (byte i = 0; i <= n_max; i++) { 71 | 72 | rpm_sum = rpm_sum + rpm_reading[i]; 73 | 74 | }; 75 | 76 | rpm_average = rpm_sum / (n_max + 1); 77 | rpm_sum = 0; 78 | n = 0; 79 | 80 | } 81 | 82 | } 83 | 84 | } 85 | 86 | updatedisplay(); 87 | 88 | } 89 | 90 | void updatedisplay() { 91 | 92 | byte x = 0; 93 | 94 | display.clearDisplay(); 95 | display.setTextSize(3); 96 | 97 | if(rpm_average < 10) x = 80; 98 | if(rpm_average >= 10 && rpm_average < 100) x = 62; 99 | if(rpm_average >= 100 && rpm_average < 1000) x = 44; 100 | if(rpm_average >= 1000 && rpm_average < 10000) x = 26; 101 | if(rpm_average >= 10000 && rpm_average < 100000) x = 8; 102 | 103 | display.setTextColor(SSD1306_WHITE); 104 | 105 | if(rpm_average < 100000){ 106 | 107 | display.setCursor(x, 6); 108 | display.print(rpm_average); 109 | display.setTextSize(1); 110 | display.setCursor(104, 20); 111 | display.print(F("RPM")); 112 | display.display(); 113 | 114 | } else { 115 | 116 | display.setTextSize(2); 117 | display.setCursor(13, 8); 118 | display.print(F("MAX LIMIT")); 119 | display.display(); 120 | 121 | } 122 | 123 | } 124 | 125 | void ISR_sensor() { 126 | 127 | t_pulse_duration_volatile = micros() - t_pulse_started_volatile; 128 | t_pulse_started_volatile = micros(); 129 | timeout = 0; 130 | newpulse = 1; 131 | 132 | } 133 | --------------------------------------------------------------------------------