Skocz do zawartości

Wysterowanie przy 2 sygnałach wejściowych


kellyq

Pomocna odpowiedź

Hejka, nie wiem czy prawidłowo zatytułowałem wątek.

Mam 2 sygnały wejściowe, pojawiają się po zapełnieniu 2 koszy wagowych, każdy kosz wysyła osobny sygnał, działają niezależnie (naważony lewy i prawy). Mam też pojedynczy przycisk wyzwalający wysypanie z tych koszy (kiprowanie). No i 2 sygnały zwrotne do koszy które przekazują informację że mają wysypać (kiper lewy i prawy).

Czy taki kod jest poprawny? Zamysłem jest żeby pojedyncze naciśnięcie przycisku wyzwalało tylko wysypanie z jednego kosza, nawet jeśli oba zgłaszają gotowość do wysypania. Kiedy pracują na zmianę to nie ma problemu, ale na samym początku kiedy maszyna startuje siłą rzeczy oba kosze zasypują się równocześnie. W kodzie są 2 x delay, wcześniej wynosiły one 200 to jeśli za długo przytrzymało się przycisk to oba kosze wysypywały. Zmieniłem na 600 ale to tylko maskowanie problemu, bo jak odpowiednio długo przytrzyma się przycisk dalej będą obydwa wysypywać na raz. Podpowie ktoś jak się za to zabrać

 

 

#define kiperLewy 4
#define kiperPrawy 2
#define nawazonyLewy 3                 
#define nawazonyPrawy 1
#define kiprowanie 0

  
void setup() {
  
 pinMode(kiperLewy, OUTPUT);
 pinMode(kiperPrawy, OUTPUT);
 pinMode(nawazonyLewy, INPUT);
 pinMode(nawazonyPrawy, INPUT);
 pinMode(kiprowanie, INPUT);

   
 digitalWrite(kiperLewy, HIGH);       //kosze zamknięte na starcie
 digitalWrite(kiperPrawy, HIGH);      //------

}
 

void loop() {

  while(digitalRead(nawazonyLewy)==HIGH){
    if(digitalRead(kiprowanie)==LOW){
      digitalWrite(kiperLewy,LOW);
      delay(600);
      digitalWrite(kiperLewy,HIGH);
      break;
    }
  }

  while(digitalRead(nawazonyPrawy)==HIGH){
    if(digitalRead(kiprowanie)==LOW){
      digitalWrite(kiperPrawy,LOW);
      delay(600);
      digitalWrite(kiperPrawy,HIGH);
      break;
    }
  }
}


    

 

Link do komentarza
Share on other sites

Tak jak teraz to trochę nie tak...jeśli chcesz kupować osobno wspólnym guzikiem to najlepiej  tak napisać że pojedyncze wciśnięcie kieruje lewy i dwu klik szybki kieruje prawy...masz jedna zmienna, klikasz przycisk, czekasz aż minie ustalony czas (millis) jeśli nie kliknales ponownie to zmienna równa się jeden, jeśli kliknales dwa razy to zmienna równa się dwa...inkrementujesz ta zmienna podczas sprawdzania guzika, gdzieś to już bazgralel do pilota, jak znajdę to wrzucę

Link do komentarza
Share on other sites

A teraz wymyśliłem coś takiego żeby sprawdzać czy pierwszy kosz jest gotowy, jeśli tak, wysypać. Jeśli nie jest gotowy sprawdzić czy drugi gotowy i z niego wysypać. Kosze nie muszą w sumie chodzić na zmianę ważne żeby zachować ciągłość wysypywania, co myślicie?

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Ja akurat jestem z ludzi co lubią dużo przycisków 😄 

Ale zawsze możesz sprawdzić, który kosz się pierwszy zapełnił i wtedy go wykiprować.

A co do blokady wystarczy zmienna flagowa, która się resetuje po zwolnieniu przycisku.

#define kiperLewy 4
#define kiperPrawy 2
#define nawazonyLewy 3                 
#define nawazonyPrawy 1
#define kiprowanie 0

#define CZAS_PODNIESIENIA_KOSZA 600

bool kiper_lewy_w_toku = false;
bool kiper_prawy_w_toku = false;
  
void setup() {
  
 pinMode(kiperLewy, OUTPUT);
 pinMode(kiperPrawy, OUTPUT);
 pinMode(nawazonyLewy, INPUT);
 pinMode(nawazonyPrawy, INPUT);
 pinMode(kiprowanie, INPUT);

   
 digitalWrite(kiperLewy, HIGH);       //kosze zamknięte na starcie
 digitalWrite(kiperPrawy, HIGH);      //------

}
 

void loop() {
  bool powinno_kiprowac = digitalRead(kiprowanie) == LOW;

  // Jezeli przycisk jest wcisniety i zaden kosz nie kipruje zacznij kiprowac
  if(powinno_kiprowac && !kiper_prawy_w_toku && !kiper_lewy_w_toku)
  {    
    // Jezeli lewy jest pelny
    if(digitalRead(nawazonyLewy) == HIGH)
    {
      // Kipruj
      digitalWrite(kiperLewy,LOW);
      kiper_lewy_w_toku = true;
    }

    // Jezeli lewy nie jest pelny i prawy jest pelny
    else if(digitalRead(nawazonyPrawy) == HIGH)
    {  
      // Kipruj
      digitalWrite(kiperPrawy,LOW);
      kiper_prawy_w_toku = true;
    }
  }  
  // Jezeli lewy kosz kipruje, a przycisk nie jest wcisniety
  else if(kiper_lewy_w_toku && !powinno_kiprowac) 
  {
    // Anuluj kiprowanie
    digitalWrite(kiperLewy,HIGH);
    delay(CZAS_PODNIESIENIA_KOSZA);
    kiper_lewy_w_toku = false;
  }
  // Jezeli prawy kosz kipruje, a przycisk nie jest wcisniety
  else if(kiper_prawy_w_toku && !powinno_kiprowac)
  {
    // Anuluj kiprowanie
    digitalWrite(kiperPrawy,HIGH);
    delay(CZAS_PODNIESIENIA_KOSZA);
    kiper_prawy_w_toku = false;
  }
}

Jakoś tak, pisane na kolanie

Link do komentarza
Share on other sites

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