• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Obrotomierz z limitem
#1
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  ///////////////////////////////////////////////////////////////////////
 
Odpowiedź
#2
Pokaż połączenie przekaźnika z arduino
Kod jak wnioskuje to gotowiec z neta
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#3
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'
 
Odpowiedź
#4
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ć
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#5
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ń.
 
Odpowiedź
#6
sygnał z aparatu
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#7
Podziękował, jak tylko ukończę prototyp i umieszczę go w klasycznym aucie na gaźniku z chęcią się pochwale Smile
 
Odpowiedź
#8
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
 
Odpowiedź
#9
Ja też odgrzewam jak tam śmiga ? ja bym chciał zmieniać podświetlenie licznika tym Tongue
I co to ten shift lcd ?
 
Odpowiedź
#10
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
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości