kellyq Napisano Styczeń 15, 2023 Udostępnij Napisano Styczeń 15, 2023 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; } } }
farmaceuta Styczeń 15, 2023 Udostępnij Styczeń 15, 2023 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ę
kellyq Styczeń 15, 2023 Autor tematu Udostępnij Styczeń 15, 2023 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?
farmaceuta Styczeń 15, 2023 Udostępnij Styczeń 15, 2023 Jak Ci tylko taka wersja odpowiada to jak najbardziej na tak...to już byłby zautomatyzowany proces więc 9 guzikach myśleć nie trzeba...
H1M4W4R1 Styczeń 15, 2023 Udostępnij Styczeń 15, 2023 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
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ę »