Obrotomierz z limitem - bullseye - 28-03-2016
Witam, dopiero zaczynam zabawę z Arduino i wpadłem na pomysł by wykorzystać płytkę Nano jako limiter obrotów (REV limiter potocznie). Poszperałem i jak na razie mam problem z kodem który nie chce współpracować, może ktoś podpowie co robię źle ?
Samo liczenie obrotów działa zacnie ale nie wiem co robię nie tak by wysterować przekaźnik który odłączy mi zasilani wtrysków. Poniżej kod:
Kod: #include<ShiftLCD.h>
ShiftLCD lcd(8 ,10 , 9); // DEFINE LCD PINS
volatile byte REV; // VOLATILE DATA TYPE TO STORE REVOLUTIONS
unsigned long int rpm, 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(7, OUTPUT);
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("- ELECTRO18"); // 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);
}
if (RPM > 7000)
{
digitalWrite(7, HIGH);
}
else
{
digitalWrite(7, LOW);
}
////////////////////////////////////////////////////////////// END OF THE PROGRAM ///////////////////////////////////////////////////////////////////////
RE: Obrotomierz z limitem - adix - 28-03-2016
Pokaż połączenie przekaźnika z arduino
Kod jak wnioskuje to gotowiec z neta
RE: Obrotomierz z limitem - bullseye - 28-03-2016
Problem w tym że nawet skompilować się nie chce i wysłać do Arduino więc na razie temat połączenia z przekaźnikiem bym zostawił
Tak, to gotowiec który przerabiam pod siebie, jest dodanych parę moich komend.
Kod błędu, bo o nim zaponiałem kompletnie
Kod: REV_LIMITER:149: error: expected unqualified-id before 'if'
REV_LIMITER:153: error: expected unqualified-id before 'else'
exit status 1
expected unqualified-id before 'if'
RE: Obrotomierz z limitem - adix - 28-03-2016
Kod: if (rpm > 7000)
{
digitalWrite(7, HIGH);
}
else
{
digitalWrite(7, LOW);
tak ma wyglądać wielkosc liter ma znaczenie pyzatym umieść to w jakieś fukci a nie poza pętlami
po drugie warunek if ma postać w przypadku tylko równości:
if(a==b){}
Kod: #include<ShiftLCD.h>
ShiftLCD lcd(8 ,10 , 9); // DEFINE LCD PINS
volatile byte REV; // VOLATILE DATA TYPE TO STORE REVOLUTIONS
unsigned long int rpm, 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(7, OUTPUT);
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("- ELECTRO18"); // 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);
if (rpm > 7000)
{
digitalWrite(7, HIGH);
}
else
{
digitalWrite(7, LOW);
}}
////////////////////////////////////////////////////////////// END OF THE PROGRAM ///////////////////////////////////////////////////////////////////////
po umieszczeniu tego kodu myślę ze oto ci chodziło spróbuj teraz to skompilować
RE: Obrotomierz z limitem - bullseye - 28-03-2016
Ok kompilacja przeszła bez problemu zostało przyzwyczajnie ze rozmiar nie ma znacznia
PS, do kontroli prędkości obrotowej wału lepiej użyć czujnika halla, podczerwieni czy po prostu wziąć sygnał masy z aparatu zapłonowego ?
Pytanie dodatkowe, bo na razie i tak zastosuję podczerwień.
RE: Obrotomierz z limitem - adix - 28-03-2016
sygnał z aparatu
RE: Obrotomierz z limitem - bullseye - 28-03-2016
Podziękował, jak tylko ukończę prototyp i umieszczę go w klasycznym aucie na gaźniku z chęcią się pochwale
RE: Obrotomierz z limitem - rocky59 - 08-01-2017
Odgrzeję kotleta Że tak zapytam udało Ci się to odpalić? Bo właśnie robię taki sam rev limiter który łączę z procedurą startu i shift lightem . Wykorzystałem funkcję pulsein i na generatorze na układzie ne555 jakoś odpaliło
RE: Obrotomierz z limitem - Lata - 08-01-2017
Ja też odgrzewam jak tam śmiga ? ja bym chciał zmieniać podświetlenie licznika tym
I co to ten shift lcd ?
RE: Obrotomierz z limitem - rocky59 - 11-01-2017
Jutro planuję projekt włożyć testowo do samochodu. Shift Light to taka lampka która zaświeci po przekroczeniu określonych obrotów celem wizualnego sygnału zmiany biegów powiedzmy
|