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

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.