Arduino based RPM meter (3D printed case)
Libraries
Now that we have the case we have to program the Arduino. For that you first need to download the next two libraries for the OLED screen. Download them from the next link or install them using the library manager in the Arduino IDE.
Download theDownload the
Or you could just install the libraries using the Arduino IDE. For that go to Sketch, include library, library managesr and search for your desired library. Once found, select the version and click install just as in the picture below.
The code
The code is simple. When the push button is pressed, the meter is activated. We know that the LM324 will give us a low pulse each time the white stripe pases in front of the sensor representing one full rotation. We have to start a counter when we detect the first positive edge representing the final of the white stripe and count the time till we detect another positive pulse, representing the start of the white stripe again. We make the difference of the measure counters and we obtain the time for one rotation in microseconds. We divide one minute (60.000.000us) by that value and we obtain the rotations per minute. We print the value to the OLED screen uisng the text function.
When the push button is released the Arduino will be in low power mode. You could turn it off with the slide switch as well.
//For low power mode
#include <avr/sleep.h>
#include <avr/power.h>
//OLED libraries
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
First we include all the libraries. Remember to download the liblaries above. Now that we have the libraries we define the vareiables and start the Setup loop. In the Setup loop we start the OLED screen, define the pins as inputs and print the electronoobs LOGO.
//In and Out
int in = 13;
int pushbutton=9;
//Variables
unsigned long duration = 0;
float rpm = 0;
float rpm_a = 0;
int counter = 0;
int present = 0;
int previous = 0;
unsigned long elapsed = 0;
unsigned long elapsed_prev = 0;
int disabled = 0;
void setup() {
Serial.begin(9600);
pinMode(in,INPUT);
pinMode(pushbutton,INPUT);
// by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64)
// init done
// Clear the buffer.
display.clearDisplay();
// text display tests
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("ELECTRONOOBS RPMmeter");
display.display();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0,19);
display.println("RPM:");
display.setCursor(80,19);
display.println(rpm);
display.display();
//We print the ELECTRONOOBS logo
scrollENlogo();
elapsed = micros();
}
Now in the loop we check if the push button is pressed. If yes we measure the elapsed time for each rotation. Next we calculate the rotation per minute and print the value to the OLED screen. If the button is not presed we put the Arduino in low power mode.
void loop() {
if(digitalRead(pushbutton))
{
//Arduino low power enabled
if(disabled==0)
{
sleep_disable();
disabled = 1;
}
///////////////////////one rotation measure///////////////////
if (digitalRead(in) == 1 && previous == 0)
{
previous = 1;
duration = elapsed - elapsed_prev;
elapsed_prev = micros();
}
if (digitalRead(in) == 1 && previous == 1)
{
previous = 1;
}
if (digitalRead(in) == 0 && previous == 1)
{
previous = 0;
}
if (digitalRead(in) == 0 && previous == 0)
{
previous = 0;
elapsed = micros();
}
//////////////////////////////////////////////////////////////
rpm = 60000000/duration;
//We add a small error in the rpm value (in this case +-2)
if ( (rpm_a-2) < rpm && rpm < (rpm_a+2))
{
rpm_a = rpm;
counter = counter +1;
if (counter == 50)
{
// text display tests
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("ELECTRONOOBS RPMmeter");
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0,19);
display.println("RPM:");
display.setCursor(80,19);
display.println(rpm);
display.display();
counter = 0;
}
}
if (!( (rpm_a-2) < rpm && rpm < (rpm_a+2)))
{
rpm_a=rpm;
}
}//end if pushbutton=1
else{
//Variables
display.display();
display.clearDisplay();
delay(10);
duration = 0;
rpm = 0;
rpm_a = 0;
counter = 0;
present = 0;
previous = 0;
//Arduino low power enabled
set_sleep_mode (SLEEP_MODE_PWR_DOWN);
sleep_enable();
disabled = 0;
}//end pushbutton =0
}//end of void loop
void scrollENlogo(void) {
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(7,0);
display.clearDisplay();
display.println("ELECTRONOOBS");
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0,10);
display.println("WELCOME");
display.display();
delay(1);
display.startscrolldiagright(0x00, 0x07);
delay(5000);
display.stopscroll();
}