Problem z kodem (delay) - Wersja do druku +- Arduino Polska Forum (https://forum.arduinopolska.pl) +-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino) +--- Dział: Programowanie w Arduino (https://forum.arduinopolska.pl/dzial-programowanie-w-arduino) +--- Wątek: Problem z kodem (delay) (/watek-problem-z-kodem-delay) |
Problem z kodem (delay) - Halfi - 20-06-2018 Witam, Mam taki kod do sterowania przekaźnikiem zgrzewarki, własnej roboty i mam taki problem, że ten oto kod po wciśnięciu przycisku zaczyna odliczać czas 3 sekundy i wykonuje zgrzewanie. Problem polega na tym, że chciałbym aby zgrzewanie włączało się od razu po naciśnięciu tego przycisku, a po zgrzaniu odliczał te 3 sekundy w celu zablokowania możliwości ponownego zgrzewania przez ten czas. Przenosiłem wielokrotnie we wszelaki sposób niektóre polecenia, np. Funkcję digitalWrite(8, HIGH); //Zgrzewanie delay(czas);//czas trwania zgrzewania przenosiłem nad funkcję 3 sekundowego opóźnienia, to czas trwania zgrzewania wynosił (czas) + te 3 sekundy. Zamiast else zastosowałem ten kod i umiejscowiłem go nad funkcją 3 sekundowego opóźnienia digitalWrite(8, HIGH); //Zgrzewanie delay(czas);//czas trwania zgrzewania if (digitalRead(7) == HIGH){ digitalWrite(8, LOW); //Nie zgrzewaj to wtedy kod działał prawie tak jak chciałem, bo jeżeli przytrzymałem przycisk przez krótszy czas niż ustawione zgrzewanie to działało prawidłowo ale jak np. mam ustawiony czas zgrzewania na 75ms, to trzymając przycisk dłużej niż ten czas, to znów zgrzewanie wynosi (czas) + 3sekundy. Już od kilku godzin siedzę przy tym kodzie i już szlak mnie trafia. Bardzo proszę o pomoc. KOD int odczytanaWartosc = 0; int czas = 0; #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); void setup() { lcd.begin(16,2); lcd.clear(); lcd.backlight(); pinMode(8, OUTPUT); // zasilenie- przekaźnik pinMode(7, INPUT_PULLUP); // przycisk } void loop() { lcd.setCursor(0,0); lcd.print("Czas Zgrzewania:"); lcd.setCursor(0,1); lcd.print(" ms"); odczytanaWartosc = analogRead(A1); // odczyt ustawienia potencjometru lcd.setCursor(0,1); czas = odczytanaWartosc * (1000/1023.0) ; // zakres ustawienia czasu do 1000ms lcd.print(czas); delay(200); if (digitalRead(7) == LOW) { lcd.clear(); lcd.print("Zgrzewanie"); lcd.setCursor(0,1); lcd.print(" ms"); lcd.setCursor(0,1); lcd.print(czas) ; delay(1000); lcd.clear(); lcd.print("3") ; delay(1000); lcd.clear(); lcd.print("2") ; delay(1000); lcd.clear(); lcd.print("1") ; delay(1000); digitalWrite(8, HIGH); //Zgrzewanie delay(czas);//czas trwania zgrzewania } else { digitalWrite(8, LOW); //Nie zgrzewaj } } RE: Problem z kodem (delay) - kaczakat - 20-06-2018 Rozwiązaniem jest wykorzystanie millis(), są przykłady w Arduino IDE i specjalne lekcje w kursie na forbot. Jest też wiele przykładów tu na forum. https://forbot.pl/blog/kurs-arduino-ii-wielozadaniowosc-opoznienia-z-millis-id18418 - a tu kurs, polecam cały. RE: Problem z kodem (delay) - Halfi - 20-06-2018 Przeczytałem, cały artykuł. Właśnie tego było mi trzeba, wszystko pięknie, ładnie opisane. Dzięki Wielkie. |