I ordered this to use in my senior project and I have a few questions. I'm using an Arduino Uno to create an optical tachometer using IR components from Radioshack. I ordered this board because it was easy to instal, but I did not realize it had headers that took up EVERY digital pin on my uno. Does anyone know what pins this LCD requires to work? I planned on using 3, but I can realistically only need one pin, as I can run my +V and ground somewhere else on the Uno. I know this isnt the code forum, but I attached my code just in case someone might need it to reference to. Thanks in advance everyone!
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // DEFINE LCD PINS
volatile byte REV; // VOLATILE DATA TYPE TO STORE REVOLUTIONS
unsigned long int rpm;
unsigned long int maxRPM; // DEFINE RPM AND MAXIMUM RPM
unsigned long time; // DEFINE TIME TAKEN TO COVER ONE REVOLUTION
int ledPin = 12; // STATUS LED
int led = 0,RPMlen , prevRPM; // INTEGERS TO STORE LED VALUE AND CURRENT RPM AND PREVIOUS RPM
int flag = 0; // A VARIABLE TO DETERMINE WHETHER THE LCD NEEDS TO BE CLEARED OR NOT
long prevtime = 0; // STORE IDLE TIME TO TOGGLE MENU
void setup()
{
Serial.begin (9600); // GET VALUES USING SERIAL MONITOR
lcd.begin(16, 2); // INITIATE LCD
attachInterrupt(0, RPMCount, RISING); // ADD A HIGH PRIORITY ACTION ( AN INTERRUPT) WHEN THE SENSOR GOES FROM LOW TO HIGH
REV = 0; // START ALL THE VARIABLES FROM 0
rpm = 0;
time = 0;
pinMode; ledPin, OUTPUT;
pinMode ;3, OUTPUT;
pinMode ;4, OUTPUT;
digitalWrite(3, HIGH); // VCC PIN FOR SENSOR
digitalWrite(4, LOW); // GND PIN FOR SENSOR
lcd.print("TACHOMETER"); // STARTUP TEXT
lcd.setCursor(0, 1);
lcd.print("- Adam Gipe"); // THAT'S ME
delay(2000);
lcd.clear();
}
void loop()
{
long currtime = millis(); // GET CURRENT TIME
long idletime = currtime - prevtime; // CALCULATE IDLE TIME
if(REV >= 5 ) // IT WILL UPDATE AFETR EVERY 5 READINGS
{
if(flag==0) // CLEAR THE LCD TO AVOID ANY GARBAGE TEXT
{
lcd.clear();
lcd.print("SENSOR MEASURING");
flag=1; // AFTER FLAG = 1 , THE LOOP WILL NOT EXECUTE AGAIN
}
rpm = 30*1000/(millis() - time)*REV; // CALCULATE RPM USING REVOLUTIONS AND ELAPSED TIME
if(rpm > maxRPM)
maxRPM = rpm; // GET THE MAX RPM THROUGHOUT THE RUN
time = millis();
REV = 0;
int x= rpm;
// CALCULATE NUMBER OF DIGITS IN RPM
while(x!=0)
{
x = x/10;
RPMlen++;
}
if(RPMlen!=prevRPM) // IF THE RPM FALLS TO A LOWER NUMBER WITH LESS DIGITS , THE LCD WILL GET CLEARED
{
lcd.clear();
prevRPM = RPMlen;
flag=0;
lcd.print("SENSOR MEASURING");
}
lcd.setCursor(0, 1);
lcd.print(rpm,DEC); // PRINT RPM IN DECIMAL SYSTEM
lcd.setCursor(6,1);
lcd.print("RPM");
delay(500);
prevtime = currtime; // RESET IDLETIME
}
if(idletime > 5000 ) // IF THERE ARE NO READING FOR 5 SEC , THE SCREEN WILL SHOW MAX RPM
{
if(flag==1) // CLEAR THE LCD
{
lcd.clear();
flag=0;
}
lcd.clear();
lcd.print("MAXIMUM RPM");
lcd.setCursor(0, 1);
lcd.print(maxRPM,DEC); // DISPLAY MAX RPM
lcd.print(" RPM");
delay(2000);
lcd.clear();
lcd.print("IDLE STATE");
lcd.setCursor(0, 1);
lcd.print("READY TO MEASURE");
delay(2000);
prevtime = currtime;
}
}
void RPMCount() // EVERYTIME WHEN THE SENSOR GOES FROM LOW TO HIGH , THIS FUNCTION WILL BE INVOKED
{
REV++; // INCREASE REVOLUTIONS
if (led == LOW)
{
led = HIGH; // TOGGLE STATUS LED
}
else
{
led = LOW;
}
digitalWrite(ledPin, led);
}