Skocz do zawartości

Ciągłe liczenie zamiast dodania tylko 1


slon2005

Pomocna odpowiedź

Jestem z siebie dumny. Dziękuję BARDZO BARDZO BARDZO za pomoc, i nie chodzi tu o wykonanie zadania do pracy ale o przeskoczenie problemu który wydawał mi się bardzo skomplikowany. Jest na początku taki niesmak kiedy od fachowca nie dostajesz rozwiązania na tacy, ale później..... ten smak jak sam dojdziesz do rozwiązania jest ..... nooo nie będę już tu słodził 😉

Teraz wystawiam kod na krytykę, działa poprawnie, przynajmniej nie widzę żadnych błędów w działaniu. Próbowałem switch case, ale nie wyszło. Więc skopiowałem i dopasowałem rozwiązanie z wpisywania pinu do alarmu z kursu. No i zaskoczyło.

Weszła też zmiana, że zamiast paczek jest całkowita ilość wykonanych sztuk, oraz klawisz do odejmowania sztuki, ponieważ czasem po wygięciu może się okazać że sztuka nie przechodzi kontroli jakości i trafia do złomu. Całość wyświetla się na TFT 1.8  Chcę dodać jeszcze jakieś wodotryski w postaci migania przy 18 sztuce,  najchętniej bym to zrobił tłem ekranu ale nie wyszło mi to za pierwszym razem, a jak wyszło to strasznie wolno się odświeżało. Więc możliwe że zrobię to zewnętrzną diodą, albo buzzerem. Będzie jeszcze jakiś obrazek na powitanie. Narazie są dwa 3 czujniki indukcyjne, będzie 4 albo 5 no i skobel wyskakujący. albo z serwa , bo jeszcze serwem sie "nie bawiłem" albo z solenoidu. Ekran jest podzielony na 3 części, w tej wolnej chyba zrobię świecące punkty które będą wyświetlały po sygnale z czujnika - w razie jakiejś awarii będzie łatwiej dojść w którym etapie nie ma sygnału. Efekt końcowy na pewno pokażę ale to pewnie koło wtorku, albo i piątku jak mnie zasypią czymś ważniejszym 😉 

Dziękuję Pozdrawiam 😉 

A teraz zapraszam do komentarza.
P.S. 
jest błąd.

kiedy daje mu sygnał z czujnika 2 później z czujnika 1 i później z czujnika to liczy tak jak powinno być, ale jak zmienię kolejność na czujnik 1, czujnik 2 i czujnik to liczy co drugie takie przejście. Dla działania to nie jest problem bo nikt pewnie by tego nigdy nie zauważył ale dla satysfakcji muszę to odnaleźć

#include <TFT.h>  
#include <SPI.h>
TFT TFTscreen = TFT(10, 8, 9);
int sztuki = 0;
int wszystkie = 0;
int stanCzujnika = 0;
int poprzedniStanCzujnika = 0;
int stanCzujnika1 = 0;
int poprzedniStanCzujnika1 = 0;
int stanCzujnika2 = 0;
int poprzedniStanCzujnika2 = 0;
char printout[4];
char wyswietl[5];
int pozycja = 1;

void setup() {
  TFTscreen.begin();
  TFTscreen.background(0, 0, 0);
  pinMode(2, INPUT);
  pinMode(5, INPUT);
  pinMode(6, INPUT);
  
  Serial.begin(9600);
  TFTscreen.setTextSize(3);
  TFTscreen.stroke(0, 255, 0);
  TFTscreen.text("Witaj ;)", 6, 9);
  TFTscreen.text("", 6, 50);             // Powitanie
   delay(3000);
  TFTscreen.setTextSize(3);
  TFTscreen.stroke(0, 0, 0);
  TFTscreen.text("Witaj ;)", 6, 9);
  
   TFTscreen.stroke(255, 255, 255);
   TFTscreen.line(0, 86, 122, 86);
   TFTscreen.line(0, 87, 122, 87);
   TFTscreen.line(0, 88, 122, 88);
   TFTscreen.line(120, 0, 120, 128);
   TFTscreen.line(121, 0, 121, 128);
   TFTscreen.line(122, 0, 122, 128);
   TFTscreen.line(0, 0, 0, 128);
   TFTscreen.line(1, 0, 1, 128);                    // rysowanie ramek
   TFTscreen.line(2, 0, 2, 128);
   TFTscreen.line(0, 0, 160, 0);
   TFTscreen.line(0, 1, 160, 1);
   TFTscreen.line(0, 2, 160, 2);
   TFTscreen.line(0, 127, 160, 127);
   TFTscreen.line(0, 126, 160, 126);
   TFTscreen.line(0, 125, 160, 125);
   TFTscreen.line(157, 0, 157, 128);
   TFTscreen.line(158, 0, 158, 128);
   TFTscreen.line(159, 0, 159, 128);
}

void loop() {

  stanCzujnika = digitalRead(2); // odczyty stanó przycisków
  stanCzujnika1 = digitalRead(5); 
  stanCzujnika2 = digitalRead(6); 

   if (pozycja == 1 && stanCzujnika2 == HIGH) {   //     ustawienie kolejnosci sygnałów z czujników
          pozycja++; 
        } else if (pozycja == 2 && stanCzujnika1 == HIGH) { 
          pozycja++;       
        } else if (pozycja == 3 && stanCzujnika != poprzedniStanCzujnika) { 
   
    if (stanCzujnika == HIGH) {            //   wymazywanie poprzedniej wartosci na wyswietlaczu
         TFTscreen.setTextSize(10);
         TFTscreen.stroke(0, 0, 0);
         TFTscreen.text(printout, 6, 9);
         TFTscreen.setTextSize(4);
         TFTscreen.stroke(0, 0, 0);
         TFTscreen.text(wyswietl, 15, 93); 
      sztuki++; // dodaj zmnienną sztuki
      wszystkie++;
      pozycja = 1;
}
 
  if (sztuki == 19){
       sztuki = 1;
  } 
 }
  
  String szt = String (sztuki);
  szt.toCharArray(printout,4);
  String p = String (wszystkie);
  p.toCharArray(wyswietl,5);
  
   TFTscreen.setTextSize(10);                         // wyswietlanie nowych wartosci
   TFTscreen.stroke(100, 50, 255);
   TFTscreen.text(printout, 6, 9);

   TFTscreen.setTextSize(4);
   TFTscreen.stroke(0, 255, 0);
   TFTscreen.text(wyswietl, 15, 93);     
    poprzedniStanCzujnika = stanCzujnika;
    poprzedniStanCzujnika1 = stanCzujnika1;
    poprzedniStanCzujnika2 = stanCzujnika2;

   if (digitalRead(4) == HIGH) {                // przycisk kasowania sztuki
        TFTscreen.setTextSize(10);
        TFTscreen.stroke(0, 0, 0);
        TFTscreen.text(printout, 6, 9);
           TFTscreen.setTextSize(4);
           TFTscreen.stroke(0, 0, 0);
           TFTscreen.text(wyswietl, 15, 93); 
    sztuki = sztuki - 1;
    wszystkie = wszystkie - 1;
    if (sztuki < 1) {
      sztuki = 18;
    }
    delay(250);
   }
}

 

116405838_905455119951765_7097281735954299430_n.jpg

Link do komentarza
Share on other sites

Tak krótko:

Dobrze że wiesz jak sprawdzać zmianę stanu pinu, teraz wywalenie tego do archiwum i zastosowanie Bounce2 (na klawiszu kasowania też) uprości program.

A błąd masz w założeniach (wciąż nie jest do końca jasne co się stanie przy błędnej sekwencji). Jak to dokładnie określisz (i umieścisz w programie) błąd powinien zniknąć w magiczny sposób...

Link do komentarza
Share on other sites

Klawisz kasowania jest specjalnie na delay żeby jego przytrzymanie powtarzało kasowanie. Próbowałem dodawać else że jak jest pozycja 1 a czujnik  to w pozycja zostaje 1. 
Jeżeli kolejność będzie inna to w sumie nic ma się nie dziać program ma czekać aż będzie właściwa.
Czy powinienem wyjść z tym wszystkim z pętli loop i dopiero jak właściwy czujnik dostanie sygnał to wywołać własną pętlę? czy powinienem dodać pomocnicze wartości tak jak w kodzie PIN  i jak czujnik zmieni stan to pomocnicza wartość zmieni się na właściwą.

najbardziej by tutaj pasowała komenda if (pozycja ==1 && "Czujnik jest inny niż 2 to") to nie rób nic.

Już chyba mi się paliwo skończyło do myślenia, dobrze że weekend idzie może coś świeżego do głowy wpadnie do poniedziałku. 😉

Link do komentarza
Share on other sites

1 godzinę temu, slon2005 napisał:

najbardziej by tutaj pasowała komenda if (pozycja ==1 && "Czujnik jest inny niż 2 to") to nie rób nic

A coś w stylu (zakładam użycie Bounce2 żeby nie mylić stanu ze zmianą stanu):

czujnik1.update();
czujnik2.update();
czujnik3.update();



switch(pozycja) {
	case 1:
	if (czujnik1.rose()) pozycja = 2; 
	break;

	case 2:
	
	if (czujnik1.rose() || czujnik3.rose()) pozycja = 1; // błędna sekwencja
	else if (czujnik2.rose()) pozycja = 3; // prawidłowa sekwencja

	break;

	/* i tak dalej */

Pozycja 1 jest trywialna - po prostu zmiana stanu jest możliwa tylko przy reakcji czujnika 1. Przy pozycji 2:

jeśli wystąpiło zdarzenie inne niż reakcja czujnika 1, cofnij pozycję  do początku, a jeśli był to czujnik 1, zmień na 3. Jeśli nie było żadnej reakcji czujników nie rób nic.

 

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

Dnia 31.07.2020 o 10:20, slon2005 napisał:

kiedy daje mu sygnał z czujnika 2 później z czujnika 1 i później z czujnika to liczy tak jak powinno być, ale jak zmienię kolejność na czujnik 1, czujnik 2 i czujnik to liczy co drugie takie przejście. Dla działania to nie jest problem bo nikt pewnie by tego nigdy nie zauważył ale dla satysfakcji muszę to odnaleźć

Trochę się zapętliłeś, dlatego polecałem switch case 🙂. Analizując Twoją pętlę i sekwencję błędnego ciągu sygnałów

Dnia 31.07.2020 o 10:20, slon2005 napisał:

if (pozycja == 1 && stanCzujnika2 == HIGH) { // ustawienie kolejnosci sygnałów z czujników 
  pozycja++;} 
else if (pozycja == 2 && stanCzujnika1 == HIGH) { 
  pozycja++; 
} else if (pozycja == 3 && stanCzujnika != poprzedniStanCzujnika) { ...

 

1. pozycja=1;  czujnik1 = 1 - pętla ominięta
2. pozycja=1; czujnik2 = 1 -> pierwszy if zaliczony -> pozycja++
3. pozycja=2; czujnik = 1 - pętla ominięta
4. pozycja=2; czujnik1 = 1 - drugi if zaliczony -> pozycja++
5. pozycja=3; czujnik = 1 - trzeci if zaliczony -> pozycja wyzerowana, liczniki zwiększone.

 

Link do komentarza
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...

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.