Wojtelux Napisano Styczeń 11, 2022 Udostępnij Napisano Styczeń 11, 2022 (edytowany) 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 Styczeń 12, 2022 przez Gieneq Link do komentarza Share on other sites More sharing options...
farmaceuta Styczeń 12, 2022 Udostępnij Styczeń 12, 2022 (edytowany) A pin 4 obsluguje przerwania zewnetrzne?? Mozesz uzyc tylko pinow 0/1/2/3/7 Edytowano Styczeń 12, 2022 przez farmaceuta Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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ę »