• 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
Problem z kodem (delay)
#1
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
  }
}
 
Odpowiedź
#2
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-w...is-id18418 - a tu kurs, polecam cały.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
Przeczytałem, cały artykuł. Właśnie tego było mi trzeba, wszystko pięknie, ładnie opisane. Dzięki Wielkie.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości