Skocz do zawartości

Problem z pinami arduino


Wojtelux

Pomocna odpowiedź

Cześć. Od razu mówię, że jestem laikiem w świecie Arduino. Chciałem sobie zbudować prosty prędkościomierz oparty na kontaktronie. Gdzieś na forum znalazłem fajny program, wszystko było fajnie gdy niemiałem wyświetlacza, gdy kupiłem wyświetlacz i I2C podpiąłem go do pinów 2 i 3 oraz oczywiście 5v i GND, ponieważ mam arduino leonardo. NIestety ale ten program był tak napisany że kontaktron zwierał pin 2 do masy. Więc postanowiłem lekko zmodyfikować program aby zamiast pinu 2 był pin 4. I to przerosło moje umiejętności, ponieważ zmodyfikowałem program już parę razy, a program dalej nie działa. Czy bylibyście w stanie mi pomóc w zmianie z pinu 2 na pin 4.    Oryginalny kod:

 

float obwodkola = 2.0; // obwód koław metrach

word obrot;

byte state;

float czas3 = 0;

int czas1 = 0;

int czas2 = 0;

int zerowanie = 7000;

// Odczyt obrotĂłw (RPM)

int half_revolution_time = 0; //Utworzenie zmiennej przechowujÄcej

int rpm = 0; //Utworzenie zmiennej RPM (obroty)

unsigned long lastmillis = 0; //Utworzenie zmiennej long lastmilis

void rpm_fan() {

unsigned long static last_event = 0;

if (millis() - last_event < 5) { //debouncing

return;

}

half_revolution_time = (millis() - last_event);

last_event = millis();

}

void setup() {

Serial.begin(9600);

pinMode(2, INPUT_PULLUP); // Aktywowanie rezystora podciÄgajÄcego na pinie 2


attachInterrupt(digitalPinToInterrupt(2), rpm_fan, FALLING);

// Przypisanie funkcji rpm_fan przerwania zewnÄtrznego

// Przerwanie zostanie wykonane jeĹli stan zmieni siÄ z wysokiego na niski (Falling)

}

void loop() {

if (millis() - lastmillis >= 1000) //Aktualizuj co sekunda, bÄdzie to rĂłwnoznaczne z odczytem czÄstotliwoĹci (Hz)

{

lastmillis = millis(); // Aktualizacja lastmillis

noInterrupts(); // W trakcie kalkulacji wyłącz obsługę przerwań

rpm = (60000 / half_revolution_time) ;

interrupts() ; //Przywraca przerwania

}

float predkosc = (obwodkola / half_revolution_time) * 3600;

float droga = (obwodkola * obrot) / 1000; // pokonana droga

float hektary = droga * 3.0 / 10; // hektary - obwód koła x szerokość maszyny podzielić przez hektar (10000m20

float czas3 = czas1 - czas2;

if (digitalRead(2) == LOW && state == HIGH)

{

obrot++;

state = LOW;

czas2 = millis();

}

else if (digitalRead(2) == HIGH)

{

state = HIGH;

czas1 = millis();

}

if (czas3 >= zerowanie)// zerowanie liczników powyżej 7 sekund

{

rpm = 0;

predkosc = 0;

}

Serial.print(predkosc,1);

Serial.println(" km/h");

Serial.println();


}

a to program poprawiony kod który nie działa:

float obwodkola = 2.0; // obwód koław metrach

word obrot;

byte state;

float czas3 = 0;

int czas1 = 0;

int czas2 = 0;

int zerowanie = 7000;

// Odczyt obrotĂłw (RPM)

int half_revolution_time = 0; //Utworzenie zmiennej przechowujÄcej

int rpm = 0; //Utworzenie zmiennej RPM (obroty)

unsigned long lastmillis = 0; //Utworzenie zmiennej long lastmilis

void rpm_fan() {

unsigned long static last_event = 0;

if (millis() - last_event < 5) { //debouncing

return;

}

half_revolution_time = (millis() - last_event);

last_event = millis();

}

void setup() {

Serial.begin(9600);

pinMode(4, INPUT_PULLUP); // Aktywowanie rezystora podciÄgajÄcego na pinie 2


attachInterrupt(digitalPinToInterrupt(4), rpm_fan, FALLING);

// Przypisanie funkcji rpm_fan przerwania zewnÄtrznego

// Przerwanie zostanie wykonane jeĹli stan zmieni siÄ z wysokiego na niski (Falling)

}

void loop() {

if (millis() - lastmillis >= 1000) //Aktualizuj co sekunda, bÄdzie to rĂłwnoznaczne z odczytem czÄstotliwoĹci (Hz)

{

lastmillis = millis(); // Aktualizacja lastmillis

noInterrupts(); // W trakcie kalkulacji wyłącz obsługę przerwań

rpm = (60000 / half_revolution_time) ;

interrupts() ; //Przywraca przerwania

}

float predkosc = (obwodkola / half_revolution_time) * 3600;

float droga = (obwodkola * obrot) / 1000; // pokonana droga

float hektary = droga * 3.0 / 10; // hektary - obwód koła x szerokość maszyny podzielić przez hektar (10000m20

float czas3 = czas1 - czas2;

if (digitalRead(4) == LOW && state == HIGH)

{

obrot++;

state = LOW;

czas2 = millis();

}

else if (digitalRead(4) == HIGH)

{

state = HIGH;

czas1 = millis();

}

if (czas3 >= zerowanie)// zerowanie liczników powyżej 7 sekund

{

rpm = 0;

predkosc = 0;

}

Serial.print(predkosc,1);

Serial.println(" km/h");

Serial.println();


}

 

Edytowano przez Gieneq
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.