Åtgärd RPM - optisk varvräknare (7 / 10 steg)
Steg 7: Program
KodenKOPIERA DENNA KOD TILL DIN ARDUINO IDE
#include < ShiftLCD.h >
ShiftLCD lcd (8, 10, 9); DEFINIERA LCD-PINS
flyktiga byte REV; FLYKTIGA DATATYP STORE VARVTAL
osignerade långa int rpm, maxRPM; DEFINIERA RPM OCH MAX RPM
osignerad länge; DEFINIERA TID DET TAR ATT TÄCKA ETT VARV
int ledPin = 12; STATUS LED
int ledde = 0, RPMlen, prevRPM; HELTAL ATT LAGRA LEDDE VÄRDE OCH STRÖM RPM OCH TIDIGARE RPM
int flagga = 0; EN VARIABEL FÖR ATT AVGÖRA OM LCD BEHÖVER RENSAS ELLER INTE
lång prevtime = 0; LAGRA INAKTIV TID ATT VÄXLA MENY
void setup()
{
Serial.BEGIN(9600); HÄMTA VÄRDEN ANVÄNDER SERIAL MONITOR
LCD.BEGIN (16, 2); INITIERA LCD
attachInterrupt (0, RPMCount, RISING); LÄGGA TILL EN HÖGT PRIORITERAD ÅTGÄRD (AVBROTT) NÄR SENSORN GÅR FRÅN LÅG TILL HÖG
REV = 0; BÖRJA ALLA VARIABLER FRÅN 0
RPM = 0;
tid = 0;
pinMode (ledPin, produktionen);
pinMode (3, OUTPUT);
pinMode (4, OUTPUT);
digitalWrite (3, hög). VCC PIN FÖR SENSOR
digitalWrite (4, låg). GND PIN FÖR SENSOR
LCD.Print("TACHOMETER"); START TEXT
lcd.setCursor (0, 1);
LCD.Print ("-ELECTRO18"); DET ÄR JAG
Delay(2000);
LCD.Clear();
}
void loop()
{
lång currtime = millis(); FÅ AKTUELL TID
lång inaktivitet = currtime - prevtime; BERÄKNA INAKTIVITETSTID
om (REV > = 5) / / det kommer uppdatera AFETR varje 5 AVLÄSNINGAR
{
IF(Flag==0) / / CLEAR LCD för att undvika sopor TEXT
{
LCD.Clear();
LCD.Print ("SENSOR mäta");
Flagga = 1; EFTER FLAGGA = 1, SLINGAN KOMMER INTE ATT KÖRA IGEN
}
RPM = 30*1000/(millis() - tid) * REV; BERÄKNA RPM MED ROTATIONER OCH FÖRFLUTEN TID
IF(rpm > maxRPM)
maxRPM = varvtal. FÅ MAX RPM UNDER HELA KÖRNINGEN
tid = millis();
REV = 0;
int x = varvtal. BERÄKNA ANTALET SIFFROR I RPM
While(x!=0)
{
x = x / 10;
RPMlen ++;
}
IF(RPMlen!=prevRPM) / / om THE RPM FALLS till ett lägre nummer med mindre siffror, LCD kommer få rensas
{
LCD.Clear();
prevRPM = RPMlen;
flagga = 0;
LCD.Print ("SENSOR mäta");
}
lcd.setCursor (0, 1);
LCD.Print(rpm,dec); SKRIVA UT RPM I DECIMAL SYSTEM
lcd.setCursor(6,1);
LCD.Print("rpm");
Delay(500);
prevtime = currtime; ÅTERSTÄLLA INAKTIVITET
}
IF(IdleTime > 5000) / / om det finns ingen läsning för 5 sek, THE skärmen kommer att Visa MAX RPM
{
IF(Flag==1) / / CLEAR LCD
{
LCD.Clear();
flagga = 0;
}
LCD.Clear();
LCD.Print ("maximalt varvtal").
lcd.setCursor (0, 1);
LCD.Print(maxRPM,dec); DISPLAY MAX RPM
LCD.Print ("RPM");
Delay(2000);
LCD.Clear();
LCD.Print ("inaktiv");
lcd.setCursor (0, 1);
LCD.Print ("redo att åtgärden");
Delay(2000);
prevtime = currtime;
}
}
void RPMCount() / / varje gång när THE SENSOR går från låg till hög, denna funktion kommer att ANROPAS
{
REV ++; ÖKA REVOLUTIONER
om (ledde == låg)
{
LED = hög; TOGGLE STATUS LED
}
annat
{
LED = låg;
}
digitalWrite (ledPin, ledde);
}
////////////////////////////////////////////////////////////// END OF THE PROGRAM ///////////////////////////////////////////////////////////////////////