Skocz do zawartości
slon2005

Ciągłe liczenie zamiast dodania tylko 1

Pomocna odpowiedź

Witajcie,

Chce stworzyć program który będzie liczył sztuki i paczki po spełnieniu kilku warunków: 


mają zostać wciśnięte kolejno przyciski 1,2,3,4.

jeżeli to się spełni to ma być dodana liczba sztuk o 1 

jeżeli liczba sztuk osiągnie 18 to ma się się doliczyć 1 paczka a następna sztuka ma się wyświetlić 1.

Żeby zacząć od czegokolwiek to próbuję z jednym przyciskiem.

Proste? Myślałem że tak xD

Cały czas szukam rozwiązania i albo jeszcze za mało wiem, albo to faktycznie nie jest takie proste. 
Pierwszy raz spotkałem się z problemem kiedy chciałem zmienną np "int x" po wciśnięciu przycisku zwiększyć o 1. No ale jak przytrzymałem przycisk dłużej niż trwanie pętli to dodawanie leciało w nieskończoność. No więc zapytałem, ktoś podpowiedział przerwania, ktoś  podpowiedział flagi. Przerwania zrozumiałem ale jest ich ograniczona ilość, a co jak bym chciał 10 przycisków? Flagi, nie mam pojęcia o co chodzi, nie umiem odpowiedniego tłumaczenia dla mnie znaleźć.

Teraz oprócz trzymania przycisku okazuje się że jak liczba sztuk jest 18 to do póki się nie zmieni to paczki naliczają się z każdą pętlą o 1 do przodu. Czyli wszystko działa, ale jak to napisać żeby zmieniło się tylko o 1 i koniec? kombinowałem z dodaniem zmiennych np sztuka poprzednia sztuka bieżąca, porównywaniem ich jednak zawsze gdzieś ta pętla się zakręci i leci w kółko.
Siedzę i czytam, i szukam i czytam. nawet jakiś przykład żeby kod samemu przeanalizować. Przecież to nie może być takie trudne. Czy jakąś własną pętlę powinienem wykorzystać? Czy może wystarczy dodać jakiś prosty znaczek/ argument w kodzie i moje problemy się skończą? 
Dopiero raczkuje ale no na takiej rzeczy się zatrzymać to aż nie wypada.

int sztuki;
int paczki;
void setup() {
pinMode(13,INPUT_PULLUP);
Serial.begin(9600);
sztuki = 0;
paczki = 0;

}

void loop() {
  if (digitalRead(13) == LOW){
    sztuki = sztuki + 1;
  }

if (sztuki == 18) {
  paczki = paczki + 1;
}
  if (sztuki == 19){
  paczki = paczki + 1;
  sztuki = 1;
}
Serial.print("Sztuki:");
Serial.println(sztuki);
Serial.print("Paczki:");
Serial.println(paczki);
delay(200);
}

 

Udostępnij ten post


Link to post
Share on other sites

Biblioteka Bounce2, sprawdzasz przycisk.fell() albo przycisk.rose() zależnie od tego, jak masz podłączony przycisk. Możesz też użyć biblioteki od klawiatury matrycowej, która zwraca wciśnięcie klawisza. Ewentualnie zaprogramować samodzielnie - czyli zapamiętywać poprzedni stan klawisza i reagować tylko wtedy, jeśli poprzedni stan był "puszczony" a aktualny "wciśnięty".

Jak widzisz możliwości jest kilka, osobiście polecam albo samodzielne zaprogramowanie (jeśli dokładnie chcesz się nauczyć jak to działa) albo Bounce2 (jeśli chcesz po prostu zrobić działające urządzenie i nie wnikać w szczegóły typu debouncing). Co wybierasz?

Zacznij od tego, bo rozwiązywanie dwóch problemów na raz to niespecjalnie dobry pomysł 🙂

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

No to już mnie nakierowałeś troszkę tym zapamiętywaniem i porównywaniem. Oczywiście, że wybieram zaprogramowanie samemu, bo jak tego nie zrozumiem to nie zasnę xD
Proszę Cię nakieruj mnie tylko na jakieś informacje gdzie szukać. Gdzieś przeczytałem  - chyba nawet Twoją wypowiedź, że nie ma języka arduino tylko jest  C++  i biblioteki. To powinienem gdzieś w naukach C++ szukać? 

Udostępnij ten post


Link to post
Share on other sites

A kurs Arduino na Forbocie już przeszedłeś? Pytam, bo nie wiem jak odpowiedzieć.

Jak masz nie spać to podam najprostszy sposób:

Sprawdzasz, czy poprzedni stan był puszczony, a bieżący wciśnięty.

Jeśli nie, nie robisz nic. Jeśli tak, sprawdzasz czy od ostatniej zmiany stanu nie minęło np. 50 milisekund.

Jeśli nie, nie robisz nic. Jeśli tak, zapamiętujesz czas wciśnięcia przycisku i wykonujesz jakąś tam funkcję.

Może być czy będziesz ganiał do apteki po pigułki na sen? 🙂

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

Kurs Forbota przeszedłem pierwszą część w 100% drugą trochę pobieżnie ze względu na brak niektórych komponentów.

Czy to będzie przy pomocy pętli while?
W jaki sposób mam porównać stan, przy pomocy boolean?
Z tym spaniem to spokojnie, dzisiaj mnie nie dopadnie, ale jak jeszcze z tydzień nie ugryzę tematu to może być różnie;)

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Zasada numer jeden: żadnych while w programie. Żadnych for również (chyba że naprawdę wiesz co robisz).

Porównywać stan możesz jak chcesz, choćby zapamiętując w zmiennej int czy to LOW czy HIGH. Będzie działać, a potem się nauczysz że można prościej.

Popatrz sobie na kod Bounce2, zobacz co z tego rozumiesz, jak czegoś nie rozumiesz to pytaj o konkrety.

Tydzień to długo, jakieś 15 pytań z odpowiedziami 🙂

A tak przy okazji - co się ma stać jak wciśniesz 1, 2, 2, 4? Program musi to wiedzieć...

Edytowano przez ethanak
  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

Podoba mi się zasada nr 1 🙂 przechowywanie w int to ma wyglądać że int równa się np 1 jak jest high i 0 jak jest low czy jest jakaś inna metoda? 

Całość ma być licznikiem dla pracownika, żeby wiedział ile wykonał sztuk, że po 18 sztukach ma je związać w paczkę i ile paczek zrobił, a zamiast przycisków mają być czujniki indukcyjne które skontrolują czy wszystkie czynności zostały wykonane. Jeżeli nie zostaną wykonane to po prostu nie nabiją sztuki. 

 Jutro w pracy będę analizował bounce2 dzięki za aktywne naprowadzanie na właściwą drogę 🙂

Udostępnij ten post


Link to post
Share on other sites

Zadanie ma wiele rozwiązań. Ja proponuję zacząć od początku. 

Poprawnie rozpisać funkcjonowanie "urządzenia". Masz już jakieś stanowisko, które chcesz zmodernizować. Przeanalizuj czynności jakie są wykonywane i jakie stany będą miały czujniki, których będziesz używał. Pisałeś o czujnikach indukcyjnych, ale jakich? 2,3,4 przewodowych...?

Może pracownik będzie chciał wykonać czynności w innej kolejności niż 1 2 3 4, chyba że kolejność ma znaczenie (za mało informacji o problemie). 

Po skończeniu sztuki potrzeba informacji o zakończeniu etapu?...

Trochę przypomina mi to półautomatyczna linię produkcyjną z nadzorem pracownika....

Rozwiązań jest wiele od zrobienia układu na zwykłych układach cyfrowych a uC tylko do kontroli i prezentacji wyniku...

 Jeżeli wrócimy do arduino i przełączników moim zdaniem najłatwiej wykorzystać coś na wzór klawiatury matrycowej jak ktoś już chyba wspominał. Jeszcze raz przeczytaj drogą część kursu forbota, po Twoich wypowiedziach widać, że nie wszystko przyswoiłeś i zrozumiałeś jak działa. Zrobić kurs to nie wykonać coś wg opisu tylko zrozumieć dlaczego zadziałało tak a nie inaczej. 

Pozdrawiam i życzę wytrwałości. 

 

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

A więc tak, w firmie robimy różne detale z rurek stalowych miedzianych i aluminiowych, są to półprodukty w branży agd. Część gięć jest robiona na maszynach, a reszta których nie można było zrobić jest doginana ręcznie na dedykowanych stołach z dźwigniami.
Kolejność czynności jest i nie da się jej zmienić bo po prostu nic nie będzie pasowało na stole. W programie kolejność będzie zachowana żeby ktoś nie niabijał sobie sztuk na pusto. Być może kiedyś mikrokontroler zastąpi tutaj ręczne raportowanie sztuk.
Na dzień dzisiejszy ma być to tylko informacja dla pracownika żeby nie musiał myśleć ile zrobił lub drugi raz liczyć kontrolnie na stole już zrobione przed spakowaniem, oraz ma pilnować żeby newralgiczne punkty z którymi czasem są problemy były wykonane poprawnie - czyli np. dźwignia dociągnięta do końca. Wbrew pozorom rozbierając pralkę czy lodówkę możemy wygiąć jakąś rurkę i i tak będzie działać, ale my tu walczymy z setnymi mm więc jak ktoś czasem nie dognie do oporu to wiąże się to z reklamacją - a ta wiąże się z obcięciem premii za brak reklamacji - i tak czasem grupa ludzi przez jedną nową osobę nie dostanie premii. Więc to działanie robimy dla pracownika, a nie dla dyrektora czy właściciela. 
Żeby ktoś nie miał wyrzutów sumienia, nie jesteśmy żadnym obozem pracy wysysającym każdą sekundę z człowieka. Firma po prostu intensywnie wdraża ulepszenia zgodnie z Lean Managment, SMED, 5S itp. Obecnie wchodzimy na ISO14001 więc mamy tu ład, fajną atmosferę, dbamy o środowisko i przede wszystkim o ludzi. Są normy, bo jakoś trzeba produkcję zaplanować, ale nie są wyśrubowane i każdy robi w naturalnym tempie.
Moje stanowisko to inżynier oprzyrządowania, mam 31 lat, dysponujemy tokarką, frezarką, szlifierką płaszczyznową, spawarką MMA, TIG i wieloma narzędziami ręcznymi. Czasami robimy za zwykły warsztat, a czasami dokonujemy niemożliwego 😉 Głównie nasza praca przekłada się na ułatwianie życia produkcji 🙂 

Mikrokontrolery to moje marzenie z dzieciństwa. Niestety jak zacząłem się tym interesować miałem za dużego stracha że nie pojmę i nie doszło do żadnych zakupów. Dzisiaj, tzn jakoś od lutego w przeczuciu że "arduino to taka zabawka z uproszczonym swoim językiem programowania" zakupiłem trochę elementów i nadrabiam stracone dzieciństwo 😄 bardzo mnie ucieszyło że to moje przeczucie okazało się błędne, a w arduino ogranicza mnie tylko wyobraźnia i wiedza - język to C++ i jedynym ułatwieniem są biblioteki xD zrobiłem już wagę stanowiskową, z luźnych elementów zrobiłem klucz dydamometryczny( a raczej nakładkę na grzechotkę) - w wolnej chwili wrzucę na forum celem przyjęcia konstruktywnej krytyki:).

Moją ideą jest wdrożenie arduino czy innych mikrokontrolerów na produkcję, ponieważ uważam że sterowniki PLC to jak strzelanie z armaty do wróbla, w przypadku np. silnika który ma zrobić 10 obrotów, zatrzymać się i wrócić na start, albo obsłużyć kilka elektrozaworów pneumatycznych  i kilka guzików. Spokojnie arduino tu wystarcza. I dochodzą takie korzyści jak niskie napięcie, rozbudowanych skrzynek elektrycznych z transformatorami itp.

I tak macie racje, nie kryje się z tym, dopiero się uczę drugą część kursu zgodnie z zaleceniem zaraz zaczynam szlifować.

P.S. 

bo zgubiłem pytanie o czujniki. indukcyjne raczej 3 przewodowe, bo takie są w firmie w dziale utrzymania ruchu, jednak mam pod ręką kilka 4 przewodowych i nie ma problemu żeby ich też użyć. oczywiście mogą to być inne czujniki, jednak w większości są już takie stosowane i się sprawdzają.

 

Udostępnij ten post


Link to post
Share on other sites

Osiągnąłem swój cel liczę do 18, w momencie pojawienia się 18 dodaje się jedna paczka i sztuki znowu kolejno się liczą od 0. Wydaje mi się, że jest to najprościej jak się da, jednak jeżeli nie to proszę o sugestie. Doszedłem do tego przez analizę kodu ze strony od kolegi BananWszyscy. Tak że wielkie dzięki za niego.
Później zacząłem kombinować wartościami do paczek, ustaliłem bierzącą, poprzednią. porównywałem, po to żeby się nie dodawało cały czas, a na końcu się ocknąłem i pomyślałem że jak każde mu dodać paczkę przed zmianą sztuk na 0 to doda tylko raz bo w jednej pętli 😄 no to teraz czas na podłączenie kilku czujników indukcyjnych i sprawdzaniu ich w kolejności. 

int sztuki = 0;
int paczki = 0;
int stanPrzycisku = 0;
int poprzedniStanPrzycisku = 0;
void setup() {
  pinMode(2, INPUT);
  Serial.begin(9600);
}
void loop() {
stanPrzycisku = digitalRead(2); // odczytaj stan przycisku

  if (stanPrzycisku != poprzedniStanPrzycisku) { // jeżeli stan przycisku różni się od poprzedniego
    if (stanPrzycisku == HIGH) { //jeżeli przycisk jest wcisniety
      sztuki++; // dodaj zmnienną sztuki
      Serial.println(sztuki); //wyswietl sztuki
    }
  if (sztuki == 18){ //jeżeli sztuki = 18
       paczki++; // dodaj zmienną paczki 
       sztuki = 0; // ustaw zmienną sztuki = 0 
       Serial.println(paczki); //wyswietl paczki
  } 
    delay(50);
  }     
  poprzedniStanPrzycisku = stanPrzycisku;
  }

 

Udostępnij ten post


Link to post
Share on other sites

Na razie jest nieźle, jesteś na dobrej drodze. Tyle że pamiętaj: na razie wyjechałeś za bramę, a do autostrady masz jeszcze kawałek 🙂

Dalej nie określiłeś, co ma się stać,jeśli sekwencja będzie inna, niż 1 2 3 4. Jeśli zakładasz, że zawsze będzie taka - czujniki 1, 2 i 3 są niepotrzebne, wystarczy czujnik 4. Nawet w przypadku, gdy z jakichś przyczyn sekwencja skończy się na 2 czy 3 (jakaś awaria czy co) to i tak do zliczenia sztuki/paczki potrzebny jest tylko czujnik 4. 

Określ, w jakich warunkach sekwencja może być inna i co masz w takim przypadku zrobić. Bo jeśli wyłącznie zliczać udane operacje to taki jeden czujnik wystarczy. Jeśli jednak chciałbyś zliczać nieudane lub błędne (np. podwójna reakcja któregoś czujnika) program musi przewidzieć wszystkie możliwości.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

A tak... sam o tym zapomniałem 🙂  Jeżeli nie zrobi któregoś z ruchów, to nie schowa się bolec na elektromagnesie, który mu zablokuje ostatnią czynność. Ewentualnie jak elektromagnes się nie sprawdzi to jakiś siłownik pneumatyczny sterowany elektrozaworem ale myślę że taki elektromagnesik spokojnie tam wystarczy. Myślę nad rozwiązaniem z drugiej części kursu z budowania alarmu. Tam jest taka sekwencja przy wpisywaniu pinu(switch, case, break), jak pierwsza cyfra się zgadza to puszcza dalej, jak druga się zgadza to puszcza dalej, ale nie wiem czy to dobre rozwiązanie do tego? 

Udostępnij ten post


Link to post
Share on other sites

Ale to masz dwa różne programy: jeden, który blokuje wykonanie ostatniej czynności, a drugi zliczający wykonania. Oczywiście te "programy" mogą być częścią większej całości (czyli wykonane na jednym mikrokontrolerze), ale ważniejszy jest tu ten program numer jeden (bo on steruje produkcją).

Pracujesz na stanowisku "inżynier" więc myśl jak inżynier.

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites
6 godzin temu, slon2005 napisał:

A tak... sam o tym zapomniałem 🙂  Jeżeli nie zrobi któregoś z ruchów, to nie schowa się bolec na elektromagnesie, który mu zablokuje ostatnią czynność. Ewentualnie jak elektromagnes się nie sprawdzi to jakiś siłownik pneumatyczny sterowany elektrozaworem ale myślę że taki elektromagnesik spokojnie tam wystarczy. Myślę nad rozwiązaniem z drugiej części kursu z budowania alarmu. Tam jest taka sekwencja przy wpisywaniu pinu(switch, case, break), jak pierwsza cyfra się zgadza to puszcza dalej, jak druga się zgadza to puszcza dalej, ale nie wiem czy to dobre rozwiązanie do tego? 

Na wstępie dziękuję za przedstawienie sytuacji, cel "zacny" i przede wszystkim praktyczny...
W gruncie rzeczy już prawie masz program gotowy na funkcji "if". Jako, że sam niechętnie korzystałem z mocno zagnieżdżonych funkcji if (bardzo szybko gdzieś o błąd i trudno wprowadzić zmiany) zachęcę do skorzystania z funkcji switch case. Zamiast sprawdzania pojedynczego przycisku odczytaj stan całego portu (po odpowiednich operacjach bitowych i konwersji otrzymasz proste w sprawdzaniu int'y do porównania). Będziesz potrzebował jeszcze kilku zmiennych informujących Twój program o postępie pracy (czyli swego rodzaju flagi 😉 ). Myślę, że co najmniej będziesz potrzebował zmiennych globalnych: etapPracy, poprzedniStanCzujników, stanCzujników + liczniki, które posiadasz: sztuki, paczki. 

Jak wspomniał ethanak możesz podzielić wszystko na mniejsze podprogramy (własne funkcje), które później wywołasz np. w pętli loop. Dla Ciebie przy większych projektach będzie czytelniejsze, a jakiś nawyk już się utrwali.

W ten sposób powinieneś rozwiązać problem tego sekwencyjnego układu liczącego, a nawet dodać parę wodotrysków (może jakaś kontrolka informująca pracownika, który etap powinien teraz wykonać i czy poprzedni został zaliczony, a wspomniana dźwignia dociągnięta).

Przepraszam za trochę chaotyczną odpowiedź...

 

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...