Skocz do zawartości

Problem z barmanem - robotem do drinków


Pomocna odpowiedź

Napisano

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
  }

 
}  

 

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 😞

 

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...

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ę.

 

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.

 

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
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);
  }

 

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
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ć 😄

 

 

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😒)

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
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...😉

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.

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...