Skocz do zawartości

Problem z barmanem - robotem do drinków


marboz

Pomocna odpowiedź

Mam problem i trochę zgłupiałem co się dzieje.

Robię barmana, na razie faza testów.

Mam 5 miejsc gdzie będą założone styczniki krańcowe - zdefiniowałem je jako guziki bo w sumie nie wiem jak inaczej żeby wskazywało LOW lub HIGH.

Jeżeli na tym miejscu będzie coś stało przekaźnik powinien włączyć pompę. Każde miejsce podpięte jest do pinu cyfrowego i ma wspólny minus z pozostałymi.

I tutaj pojawia się problem. Do czterech szklaneczek działa ale jak w poniższym kodzie dołożę jeszcze jedną instrukcję IF, przestaje działać wszystko. 

Jak ją usunę i zostanie w formie jak poniżej znowu działa. Co robię nie tak?

 

int pompa1=2;
int pompa2=3;
int szklanka1=4;
int szklanka2=5;
int szklanka3=6;
int szklanka4=7;
int szklanka5=8;



void setup() {
  pinMode(pompa1, OUTPUT); //pompa1 jako wyjście
  pinMode(pompa2,OUTPUT); //pompa2 jako wyjście
  pinMode(szklanka1, INPUT_PULLUP); //Przycisk jako wejście
  pinMode(szklanka2, INPUT_PULLUP); //Przycisk jako wejście
  pinMode(szklanka3, INPUT_PULLUP); //Przycisk jako wejście
  pinMode(szklanka4, INPUT_PULLUP); //Przycisk jako wejście
  pinMode(szklanka5, INPUT_PULLUP); //Przycisk jako wejście
  digitalWrite(pompa1, HIGH); //Wyłączenie pompy1
  digitalWrite(pompa2, HIGH); //Wyłączenie pompy2
}

 
void loop()

{ 
  
  //sprawdza czy stoi szklanka na miejscu i jeżeli tak włącza pompe1
  if (digitalRead(szklanka1) == HIGH) { //Jeśli przycisk wciśnięty
    digitalWrite(pompa1, HIGH); //Włącz pompe
  } else { //Jeśli warunek nie został spełniony (przycisk nie jest wciśnięty)
    digitalWrite(pompa1, LOW); //Wyłącz pompe 
    }

//sprawdza czy stoi szklanka na miejscu i jeżeli tak włącza pompe1
if (digitalRead(szklanka2) == HIGH) { //Jeśli przycisk wciśnięty
    digitalWrite(pompa1, HIGH); //Włącz pompe
  } else { //Jeśli warunek nie został spełniony (przycisk nie jest wciśnięty)
    digitalWrite(pompa1, LOW); //Wyłącz pompe
  }


//sprawdza czy stoi szklanka na miejscu i jeżeli tak włącza pompe1
if (digitalRead(szklanka3) == HIGH) { //Jeśli przycisk wciśnięty
    digitalWrite(pompa1, HIGH); //Włącz pompe
  } else { //Jeśli warunek nie został spełniony (przycisk nie jest wciśnięty)
    digitalWrite(pompa1, LOW); //Wyłącz pompe
  }


//sprawdza czy stoi szklanka na miejscu i jeżeli tak włącza pompe1
if (digitalRead(szklanka4) == HIGH) { //Jeśli przycisk wciśnięty
    digitalWrite(pompa1, HIGH); //Włącz pompe
  } else { //Jeśli warunek nie został spełniony (przycisk nie jest wciśnięty)
    digitalWrite(pompa1, LOW); //Wyłącz pompe
  }

 
}  

 

Link do komentarza
Share on other sites

Sprawdzałem dwa razy. Co ciekawe jak zamienię szklanka4 ze szklanka5  ale dalej będzie 4 razy instrukcja IF to zadziała więc połączenie powinno być ok. Zastanawiam się czy jest jakiś limit instrukcji IF albo podpiętych przycisków. Nie mam już pomysłu 😞

 

Link do komentarza
Share on other sites

Przed chwilą, marboz napisał:

Zastanawiam się czy jest jakiś limit instrukcji IF albo podpiętych przycisków.

 

Jak by tak bylo to by znaczylo ze ten kto to wymyslil byl totalnym....wiadomo kim, ale raczej byl totalnym geniuszem tak wiec nie ma limitu if'ow😉..no nie mam pojecia..🤔 no musi dzialac...

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

Nie bardzo rozumiem o co chodzi w tym kodzie.

Czy pompa ma się włączyć kiedy stoją wszystkie szklanki, czy wtedy gdy jedna dowolna?

Bo na razie ten kod będzie reagował tylko na ostatnia szklankę.

 

Link do komentarza
Share on other sites

docelowo będzie to działać tak:

serwo obraca kran nad szklankę nr1 - sprawdza czy coś tam stoi (tu jest ten IF)

jeżeli stoi włącza pompę. 

serwo obraca kran nad szklankę nr2 - sprawdza czy coś stoi  i nalewa.

 

Być może kod jest zły bo w sumie na tą chwilę zwieram poszczególne kabelki od pinów 4-8 z GND pojedyńczo żeby imitować naciśnietą krańcówkę.

W sumie nie wiem co by się stało jakby było naciśnietych kilka.

 

Tak czy inaczej jeżeli piszę 5 raz instrukjce IF przestaje działać choćbym wpisal dowolny pin. Usunę i zostawię 4 razy IF jest ok. 

Najprawdopodobniej błędnie to jest zapisane w kodzie. Tyle że nie mam pojęcia jak by było ok.

 

Link do komentarza
Share on other sites

To może dodaj kod serwa?

coś w stylu:

if (szklanka_na_miejscu) {
  przekrec_na_pozycje() ; // na razie delay(1000) na przykład  
  wlacz_pompe();
  poczekaj_aż naleje(); // symuluj przez delay(1000) na przykład
  wylacz pompe();
}

  

Poza tym wymyślili kiedyś taką instrukcję jak for, czyli:

int i;
for (i=0; i<ilosc_szklanek; i++) {
  if (szklanka_na_miejscu(i)) {
    przekrec_na_pozycje(i);
    wlacz_pompe();
    poczekaj_az_naleje();
    wylacz_pompe();
  }
}

W ten sposób nie będziesz musiał powielać kodu ani mnożyć ifów.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

14 minut temu, ethanak napisał:

Bo na razie ten kod będzie reagował tylko na ostatnia szklankę.

 

Racja!...na to nie zwrocilem uwagi..😉 chodzi o to ze jesli ktoras ze szklanek pierwszych chciala by sie nalac to nie zrobi tego bo nastepny w kolejce if wylaczy pompe...bo pompa jest wspolna dla wszystkich szklanek...mozna wrzucic while zeby blokowala kod do czasu nalania...

if (digitalRead(szklanka1) == LOW) {
  while (digitalRead(szklanka1) == LOW) { digitalWrite(pompa1, LOW);
  }
  } else {
  digitalWrite(pompa1, HIGH);
  }

 

Link do komentarza
Share on other sites

1 minutę temu, farmaceuta napisał:

Racja!..

while (digitalRead(szklanka1) == LOW) { digitalWrite(pompa1, LOW);

Czyli jeśli szklanka stoi, lej nie zwracając uwagi na to że wódka się skończyła...

No wiesz, nie podejrzewałem Ciebie o tendencje do wylewania wódki na podłogę 🙂

 

 

 

  • Lubię! 1
Link do komentarza
Share on other sites

5 minut temu, ethanak napisał:

To może dodaj kod serwa?

coś w stylu:


if (szklanka_na_miejscu) {
  przekrec_na_pozycje() ; // na razie delay(1000) na przykład  
  wlacz_pompe();
  poczekaj_aż naleje(); // symuluj przez delay(1000) na przykład
  wylacz pompe();
}

  

Poza tym wymyślili kiedyś taką instrukcję jak for, czyli:


int i;
for (i=0; i<ilosc_szklanek; i++) {
  if (szklanka_na_miejscu(i)) {
    przekrec_na_pozycje(i);
    wlacz_pompe();
    poczekaj_az_naleje();
    wylacz_pompe();
  }
}

W ten sposób nie będziesz musiał powielać kodu ani mnożyć ifów.

Dzięki ! To jest to. Teraz spróbuję to napisać 😄

 

 

Link do komentarza
Share on other sites

Przed chwilą, ethanak napisał:

Czyli jeśli szklanka stoi, lej nie zwracając uwagi na to że wódka się skończyła...

Nie no wiesz...ja bym zrobil cos bardzo podobnego do drugiej czesci twojego kodu, oczywiscie nie blokujacego...ale po kodzie zalozylem ze autor ma dopiero swoje poczatki i nie bede mu utrudnial...😉 ja zalozylem ze kolega trzyma kielicha i poprostu nadzoruje ile nalac trzeba...

 

3 minuty temu, ethanak napisał:

No wiesz, nie podejrzewałem Ciebie o tendencje do wylewania wódki na podłogę 🙂

Musze Cie zasmucic....ale jestem anty-alkoholikiem..w sensie nie pije wogole..😢😢(😱....co??? Nie pije wcale??....skad to to sie urwalo?..farmaceuta nie jest prawdziwym Polakiem...zdrajca😒)

Link do komentarza
Share on other sites

7 minut temu, farmaceuta napisał:

Musze Cie zasmucic....ale jestem anty-alkoholikiem.

Wcale mi nie jest smutno - ale np. wegetarianin nie musi kupować schabowego tylko po to aby go wyrzucić 😉

Poza tym ten "barman" może równie dobrze serwować sok pomarańczowy, a tego też nie należy wylewać!

  • Lubię! 1
Link do komentarza
Share on other sites

2 minuty temu, ethanak napisał:

Wcale mi nie jest smutno - ale np. wegetarianin nie musi kupować schabowego tylko po to aby go wyrzucić 😉

Poza tym ten "barman" może równie dobrze serwować sok pomarańczowy, a tego też nie należy wylewać!

Nie no jasne ze taki kod z while jak podalem to taki byle jaki...ja bym to zrobil na petli for i tablicach w ktorych przechowuje piny,czas nalewania,pozycje literatki(😇),flage wykonania nalania, ewentualnie czas odczekania po nalaniu zeby nie uronic ani kropli i np. krotka sygnalizacja ze mozna rzucic sie do wodopoju jak antylopa...😉

Link do komentarza
Share on other sites

Przed chwilą, farmaceuta napisał:

.ja bym to zrobil na petli for

Czy ja nie wspominałem o for?

A ja bym to zrobił na maszynie stanów, z czujnikiem kiedy przestać lać, czujnikiem ilości soku w pojemniku i silnikiem krokowym do napędu z odnośną krańcówką do homingu - tyle że na początek wystarczy najprostsze rozwiązanie, potem jak zadziała można ulepszać w miarę nabywania wiedzy.

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.