Arduino Polska Forum

Pełna wersja: Obrotomierz z limitem
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2

bullseye

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  ///////////////////////////////////////////////////////////////////////
Pokaż połączenie przekaźnika z arduino
Kod jak wnioskuje to gotowiec z neta

bullseye

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ł Smile

Tak, to gotowiec który przerabiam pod siebie, jest dodanych parę moich komend.

Kod błędu, bo o nim zaponiałem kompletnie Sad

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'
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ć

bullseye

Ok kompilacja przeszła bez problemu Smile zostało przyzwyczajnie ze rozmiar nie ma znacznia Smile

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ń.
sygnał z aparatu

bullseye

Podziękował, jak tylko ukończę prototyp i umieszczę go w klasycznym aucie na gaźniku z chęcią się pochwale Smile
Odgrzeję kotletaBig Grin Ż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
Ja też odgrzewam jak tam śmiga ? ja bym chciał zmieniać podświetlenie licznika tym Tongue
I co to ten shift lcd ?
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 Smile
Stron: 1 2