• 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
Podstawowy problem z sygnałem czujnika
#1
Witam Was ponownie.

Zrobiłem sobie prosty podajnik sterowany elektrozaworami. Pracę ma wyzwalać czujnik, który podpiąłem sobie pod wejście analogowe nr 2. 

Sekwencja wygląda tak:
1. Czujnik optyczny daje krótki sygnał
2. Uruchamiam 3 elektrozawory w określonej kolejności
3. Sprawdzam odległość od przedmiotu (czujnik ultradźwiękowy)
4. Jak:
a) jest przedmiot to go łapię przyssawkami i odstawiam do pozycji 0
b) jak nie ma to czekam aż się pojawi w odpowiedniej odległości po czym wykonuję to co w podpunkcie a

Niestety przez to że wszystko działa w pętli to nie potrafię wymusić czekania opisanego w podpunkcie b. Program po prostu leci od początku i flaga "czekaj" ustawiona jest na 0, mimo że niżej ustawiłem ją na 1. 

Nie jestem ani elektrykiem ani programistą, stąd nie potrafię sobie z tym poradzić. 
Będę wdzięczny za podpowiedź. 
PS kod źródłowy obsługujący czujnik wziąłem z internetu i go wstawiłem w swój.

Kod wygląda tak:
Kod:
// ustawienie pinów i definicje

#define z1 4 // zawór 1 (siłownik główny 50 cm)
#define z2 2 // zawór 2 (przyssawki)
#define z3 3 // zawór 3 (siłownik opuszczający)
int Trig = 12;   // Numer pinu wyzwolenia
int Echo = 11;   // Numer pinu odpowiedzi

long EchoTime;  // Czas trwania sygnału ECHO
int  Distance;  // Odległość w centymetrach
int  MaximumRange = 20; // Maksymalna odległość
int  MinimumRange = 2;   // Minimalna odległość
int start = 0;
int czekaj = 1;

// parametry główne
void setup() {

  Serial.begin(9600); // testowe uruchomienie logów
  pinMode(z1,OUTPUT);
  pinMode(z2,OUTPUT);
  pinMode(z3,OUTPUT);
  pinMode(A2,INPUT); // czujnik optyczny na wejściu analogowym
  // Konfiguracja pinów czujnika
  pinMode(Trig, OUTPUT);
  pinMode(Echo, INPUT);
 
 

}

void loop() {
int v2 = analogRead(2); //odczytanie wartości z czujnika optycznego
 
if (v2 < 1020 || czekaj == 1) { // jesli otrzymuje sygnal z czujnika lub flaga czekaj jest = 1

  // uruchamian elektrozawor nr 1
  digitalWrite (z1, HIGH);


  // Ustawiam TRIG w stan niski na 2us
  digitalWrite(Trig, LOW);
  delayMicroseconds(2);

  // Ustawiam TRIG w stan wysoki na 10us
  digitalWrite(Trig, HIGH);
  delayMicroseconds(10);

  // Ustawiam TRIG w stan niski - rozpoczynamy pomiar
  digitalWrite(Trig, LOW);

  // Odczytuje czas trwania stanu wysokiego na pinie ECHO
  EchoTime = pulseIn(Echo, HIGH);

  // Obliczam odległość
  Distance = EchoTime / 58;

  // Sprawdzam zakres pomiarowy
  if (Distance >= MaximumRange)
  {
    // jesli jest poza zakresem to zmieniam stan elektrozaworu 3
     digitalWrite (z3, LOW);
     
  } else 
  {
    if (Distance < 4)
    {
          // jesli przedmiot jest blizej niz 4 cm od czujnika to uruchamiam sekwencje elektrozaworow
          digitalWrite (z3, LOW);
          delay (200);
          digitalWrite (z1, LOW);
          // potrzebny czas na schowanie sie silownika 50 cm
          delay (900);
          // wypuszczam przedmiot z przyssawek
          digitalWrite (z2, LOW);
          delay (200);
          czekaj = 0;   
   
    } else
    {
          //delay (200);
          digitalWrite (z3, HIGH);
          digitalWrite (z2, HIGH);
          czekaj = 1;
           
   

    }   
    Serial.print("Odleglosc: ");
    Serial.println(Distance);   
     
  }
  digitalWrite (z3, HIGH);
  // Opóźnienie kolejnego pomiaru
  delay(5);


}
}
}
 
Odpowiedź
#2
Trafiłeś na klasyczną ścianę z delay. Naucz się używać millis() i poczytaj o maszynie stanów, case.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości