Skocz do zawartości

Programowanie zwłoczne włączenie Arduino


wojt3k_h

Pomocna odpowiedź

Witam kiedyś z 12 lat temu się pisało ale w innych środowiskach, borykam się z problemem chodzi mi o mały programik

w sumie dla kogoś kto zna dobrze arduino to proste na pewno.

założenie ma być takie :

Posiadam dwa przyciski pod piny to obojętne jaki numer pinu

ale jedno wyjście

z tym że żeby załączyć program trzeba przycisnąć przycisk trzymając go np 3sekundy

do czego dwa przyciski już pisze 

jak jedne przycisnę to program podaje na wyjscie

stan 45 s wysoki 10s niski 45s wysoki 10s niski 45s  wysoki 

i przechodzi w stan pętli do kolejnego przyciśnięcia przycisku

natomiast jak drugi przycisnę to

45s wysoki i dalej przechodzi w stan petli

to jak napisać wiem  odnośnie przyciśnięcia przycisku i tylko obsłużenie jednej składnie wiem ale czy da rade jeszcze to przytrzymanie przycisku i druga składnie dodać?

Dzieki

 

Edytowano przez wojt3k_h
braki w opisie
Link do komentarza
Share on other sites

Tak z czysto programistycznego punktu widzenia to problem miałbym jedynie z "trzymając go 3 sekundy".

Ja bym to widział tak, w pętli loop():

  1. Sprawdzasz czy przycisk jest naciśnięty
    1. Jeżeli tak to do wyzerowanego licznika dodajesz wartość np 250 (o tym za chwilę)
    2. Jeżeli nie to zerujesz licznik
  2. Jeżeli licznik dla danego przycisku wynosi ustaloną z góry wartość (dla 3 sekund to będzie 3000) to wtedy w kodzie wywołaj funkcję przesyłającą stany, bądź po prostu poleć z samym kodem.
  3. Wykonujesz krótką pauzę poprzez delay(250), gdzie to 250 to dobrze by było ta sama wartość co powyżej bo wtedy łatwo przeliczać ile trzymany jest guzik

Bardziej siedzę w pythonie i mogłem walnąć jakiegoś byka, bo na samo Arduino to nigdy nic nie pisałem ale powinno to wyglądać mniej więcej tak: https://pastebin.com/Sb1xKX52 (już widzę błąd, że przy "definach" nie powinno byc na końcu średników)

Edytowano przez Kucharskov
Link do komentarza
Share on other sites

Jeśli przycisk nie jest wciśnięty - zerujesz licznik. Jeśli wciśnięty, to w przerwaniu od timera co x czasu (np. X ms) sprawdzasz stan i inkrementujesz licznik. Jeśli wartość licznika przekroczy ustaloną (czyli np. (3000 ms / X ms)), to rozpoczynasz wykonywanie instrukcji. Z delay() będę walczył do śmierci (o ile nie jest to jakiś RTOSowy delay), bo niepotrzebnie blokuje Ci procka - co jeśli w tym czasie ktoś wciśnie drugi przycisk albo będziesz chciał dodać jakieś instrukcje działające w tle, np. mruganie diodką? Hasło na google "arduino timer interrupt" i znajdziesz co trzeba, pewnie nawet gotowe programy robiące to, czego potrzebujesz.

Edytowano przez Nawyk
Link do komentarza
Share on other sites

@wojt3k_h ode mnie tylko drobna sugestia co do korzystania z forum - nie ma potrzeby, aby co kawałek zdania wciskać "Enter". Edytor mamy rozbudowany i sam radzi sobie z łamaniem tekstu. Klawisz "Enter" działa u nas jak np. w Wordzie, czyli służy do rozpoczynania nowego akapitu 😉

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

(edytowany)

Na jaką funkcje trzeba zmienić bo po zakończeniu 3 cykli robi przerwę jakby na te 250 milisekund i już miga w nieskończoność czasy długości świecenia skróciłem w celu testów

//Stałe z numerami pinów
#define wyjscie 13
#define przycisk1 6
#define przycisk2 7
#define czas 3000      //Czas do aktywacji
//Zmienna na zliczanie "czasu" kliknięcia guzików
int licznik1 = 0;
int licznik2 = 0;
 
//Funkcja ustawiająca, która konfiguruje ustawienia pinów
void setup() {
  pinMode(wyjscie, OUTPUT);
  pinMode(przycisk1, INPUT);
  pinMode(przycisk2, INPUT);
}
 
//Pętla główna programu
void loop() {
  //Sprawdzanie przyciśniętego przycisku 1 lub 2 i zliczanie czasu
  //Dodatkowo zeruję drugi licznik żeby nie wystąpił przypadek, że odpalą się oba tryby
  if(digitalRead(przycisk1) == HIGH) {
    licznik1 += 250;
    licznik2 = 0;
  } else if(digitalRead(przycisk2) == HIGH) {
    licznik2 += 250;
    licznik1 = 0;
  }
 
  //Jeżeli 1 przycisk będzie przytrzymany ustalony czas
  if(licznik1 >= czas) {
    //Wykonaj zadaną sekwencję podnieś, opuść, podnieś...
    digitalWrite(wyjscie, HIGH);
    delay(5000);
    digitalWrite(wyjscie, LOW);
    delay(1000);
    digitalWrite(wyjscie, HIGH);
    delay(5000);
    digitalWrite(wyjscie, LOW);
    delay(1000);
    digitalWrite(wyjscie, HIGH);
    delay(5000);
    digitalWrite(wyjscie, LOW);
   
  }
  //To samo z przyciskiem 2
  else if(licznik2 >= czas) {
    digitalWrite(wyjscie, HIGH);
    delay(5000);
    digitalWrite(wyjscie, LOW);
  }
  //Na samym końcu opuść zasilanie na pinie
  digitalWrite(wyjscie, LOW);
 
  delay(250);
}

 

Edytowano przez Treker
Kody programów należy umieszczać przez narzędzie "Kod".
Link do komentarza
Share on other sites

Fakt, mój błąd. Jak już mówiłem pisałem z palca bez testu. W kodzie należy zerowac licznik po wykonaniu sekwencji:

if(licznik1 >= czas) {
    //Wykonaj zadaną sekwencję podnieś, opuść, podnieś...
    digitalWrite(wyjscie, HIGH);
    delay(5000);
    digitalWrite(wyjscie, LOW);
    delay(1000);
    digitalWrite(wyjscie, HIGH);
    delay(5000);
    digitalWrite(wyjscie, LOW);
    delay(1000);
    digitalWrite(wyjscie, HIGH);
    delay(5000);
    digitalWrite(wyjscie, LOW);
    licznik1=0;
    licznik2=0;
  }
  //To samo z przyciskiem 2
  else if(licznik2 >= czas) {
    digitalWrite(wyjscie, HIGH);
    delay(5000);
    digitalWrite(wyjscie, LOW);
    licznik1=0;
    licznik2=0;
  }

Tak samo na początku całego loop mozmaby jeszcze poprawić:

if(digitalRead(przycisk1) == HIGH) {
    licznik1 += 250;
    licznik2 = 0;
  } else if(digitalRead(przycisk2) == HIGH) {
    licznik2 += 250;
    licznik1 = 0;
  } else {
    licznik1 = 0;
    licznik1 = 0;
  }

Nie dam sobie ręki uciąć bo pisze z telefonu ale powinno wystarczyć. 

Link do komentarza
Share on other sites

(edytowany)

 co może być przyczyną ze jeżeli zmienię  licznik1/2"  //Jeżeli 1 przycisk będzie przytrzymany ustalony czas   if(licznik1 >= czas) " miejscami to wykonuje mi tylko jedna operacje obojętnie krtóry przycisk przycisnę tak jak by tylko wykonywało dwoma przyciskami tylko polecenie funkcję licznika 1 licznika 2 nie wykonuje

 

//Stałe z numerami pinów
#define wyjscie 12
#define przycisk1 6
#define przycisk2 7
#define czas 3000   //Czas do aktywacji
#define przerwa 250
//Zmienna na zliczanie "czasu" kliknięcia guzików
int licznik1 = 0;
int licznik2 = 0;

 
//Funkcja ustawiająca, która konfiguruje ustawienia pinów
void setup() {
  pinMode(wyjscie, OUTPUT);
  pinMode(przycisk1, INPUT);
  pinMode(przycisk2, INPUT);


}
 
//Pętla główna programu
void loop() {
  //Sprawdzanie przyciśniętego przycisku 1 lub 2 i zliczanie czasu
  //Dodatkowo zeruję drugi licznik żeby nie wystąpił przypadek, że odpalą się oba tryby
  if(digitalRead(przycisk1) == HIGH) {
    licznik1 += przerwa;
    
  } else if(digitalRead(przycisk2) == HIGH) {
    licznik2 += przerwa;
    
  } else {
    licznik1=0;
    licznik2=0;
  }
 
  //Jeżeli 1 przycisk będzie przytrzymany ustalony czas
  if(licznik1 > czas) {
    //Wykonaj zadaną sekwencję podnieś, opuść, podnieś...
    digitalWrite(wyjscie, HIGH);
    delay(5000);
    digitalWrite(wyjscie, LOW);
    delay(1000);
    digitalWrite(wyjscie, HIGH);
    delay(5000);
    digitalWrite(wyjscie, LOW);
    delay(1000);
    digitalWrite(wyjscie, HIGH);
    delay(5000);
    digitalWrite(wyjscie, LOW);
    licznik1=0;
    licznik2=0;
     }
  //To samo z przyciskiem 2
  else if  (licznik2 > czas){
    digitalWrite(wyjscie, HIGH);
    delay(2000);
    digitalWrite(wyjscie, LOW);
    licznik2==0;
    licznik1==0;
   
  }
  else{
     digitalWrite(wyjscie, LOW);}
  //Na samym końcu opuść zasilanie na pinie
 
  delay(250);
}

 

Edytowano przez wojt3k_h
Link do komentarza
Share on other sites

@wojt3k_h, a pytanie trochę inne - jak dokładnie masz podłączone te przyciski? Wciśnięcie zwiera do masy czy do dodatniej szyny zasilania? Z programu wynika, że wciśnięcia u Ciebie zwiera wejście układu do 5V, a nie do masy (jak to najczęściej się robi). Chce się tylko upewnić, że na pewno masz odpowiednie podłączenia 😉

Link do komentarza
Share on other sites

4 godziny temu, wojt3k_h napisał:

  //To samo z przyciskiem 2
  else if  (licznik2 > czas){
    digitalWrite(wyjscie, HIGH);
    delay(2000);
    digitalWrite(wyjscie, LOW);
    licznik2==0;
    licznik1==0;

 

chyba chodziło Ci o

  //To samo z przyciskiem 2
  else if  (licznik2 > czas){
    digitalWrite(wyjscie, HIGH);
    delay(2000);
    digitalWrite(wyjscie, LOW);
    licznik2=0;
    licznik1=0;

 

Edytowano przez Nawyk
Link do komentarza
Share on other sites

Tu na Forbot jest kurs Arduino, przejdź go bo na razie to wygląda jakbyś przypadkowo wpadł do basenu i rozpaczliwie machał rękami. W Arduino są różne funkcje do zarządzania czasem, delay jest oczywiście bardzo przydatna na pierwszy dzień, ale lepsze są millis i micros, które nie blokują działania programu. Nawet nie musisz wiedzieć co to jest timer w Arduino/AVR. O tym jest odcinek zwieńczający kurs. 
Jak już umiesz millisami odliczyć 1s to przypisujesz ich odmierzoną ilość do jakieś zmiennej i po prostych porównaniach robisz co chcesz, a stan przycisków możesz sprawdzać dzięki temu w każdym momencie, np. by jednak przerwać jakiś proces, bo komuś wjeżdżasz w kartofle. A takie zliczanie w kodzie o 250 w oparciu o to, że na końcu jest dalay(250) da różne wyniki zależne od ilości poleceń w programie. Dodasz kolejne polecenia, jakiś pomiar temperatury, wyświetlacz i do tych 250ms trzeba będzie zrobić korektę, o czas poświęcony na inne funkcje. Chyba,  że to pierwszy i jedyny program w życiu do zrobienia?

Ktoś się napracował by przekazać początkującym podstawy w kursie, masz za darmo, doceń to.

Link do komentarza
Share on other sites

(edytowany)
5 godzin temu, kaczakat napisał:

Tu na Forbot jest kurs Arduino, przejdź go bo na razie to wygląda jakbyś przypadkowo wpadł do basenu i rozpaczliwie machał rękami. W Arduino są różne funkcje do zarządzania czasem, delay jest oczywiście bardzo przydatna na pierwszy dzień, ale lepsze są millis i micros, które nie blokują działania programu. Nawet nie musisz wiedzieć co to jest timer w Arduino/AVR. O tym jest odcinek zwieńczający kurs. 
Jak już umiesz millisami odliczyć 1s to przypisujesz ich odmierzoną ilość do jakieś zmiennej i po prostych porównaniach robisz co chcesz, a stan przycisków możesz sprawdzać dzięki temu w każdym momencie, np. by jednak przerwać jakiś proces, bo komuś wjeżdżasz w kartofle. A takie zliczanie w kodzie o 250 w oparciu o to, że na końcu jest dalay(250) da różne wyniki zależne od ilości poleceń w programie. Dodasz kolejne polecenia, jakiś pomiar temperatury, wyświetlacz i do tych 250ms trzeba będzie zrobić korektę, o czas poświęcony na inne funkcje. Chyba,  że to pierwszy i jedyny program w życiu do zrobienia?

Ktoś się napracował by przekazać początkującym podstawy w kursie, masz za darmo, doceń to.

Doceniam ale dziękuje nie chcesz pomóc nie pisz inaczej się pisało w tych programach co miałem 12 lat temu inaczej w tym.

a nad funkcja micros tez sie zastanawiam czy nie edytować  bo z czasem che dopiac modul gsm

Edytowano przez wojt3k_h
  • Nie zgadzam się! 1
Link do komentarza
Share on other sites

1 godzinę temu, wojt3k_h napisał:

Doceniam ale dziękuje nie chcesz pomóc nie pisz inaczej się pisało w tych programach co miałem 12 lat temu inaczej w tym.

Przecież ci właśnie pomaga. Trochę wychowania, nieładnie tak uciszać ludzi na forach tylko dlatego, że nie odpowiada ci (poprawna) odpowiedź.

Edytowano przez deshipu
Link do komentarza
Share on other sites

Odpowiem Ci taką anegdotką, ktoś kiedyś robił prace dyplomowe za kase, jednemu znajomemu zrobił i ten jeździ dzisiaj wózkiem widłowym w Belgi, drugiemu, sąsiadowi, powiedział, że woli mu pokazać jakie wybrać kalki i rapidografy, żeby mu się lepiej rysowało. Sąsiad się co prawda początkowo obraził, ale teraz jest geodetą i zarabia równie dobrą kasę jak ten drugi znajomy w Belgi. No tylko ten z Belgi rzadko widuje dzieciaki. Ja tego kursu o Arduino na Forbocie nie tworzyłem, ale wiem, że jest całkiem fajny i w każdej części coś nowego można przyswoić, do tego dorobić z kilkanaście różnych wariantów w swoim zakresie i wprawa sama przychodzi, sam zauważasz, że między 2 i 4 jest 3. Jak przejrzysz parę postów na tym forum to na pewno znajdziesz mnóstwo przykładów z millis() np. tu:  https://forbot.pl/forum/topic/11166-potrzebna-pomoc-w-napisaniu-kodu-dla-uno-z-obsluga-przekaznikow-rtc-i-czujnikow-temp-i-dht/?tab=comments#comment-106772 .  Programu Ci nie napiszę, ani tego poprawiał nie będę (bo nie ma czego - pardon, dopóki używasz delay to jest tylko demo) jeśli to uważasz za brak chęci pomocy, OK. 

Link do komentarza
Share on other sites

(edytowany)
Dnia 27.09.2018 o 23:33, Treker napisał:

@wojt3k_h, a pytanie trochę inne - jak dokładnie masz podłączone te przyciski? Wciśnięcie zwiera do masy czy do dodatniej szyny zasilania? Z programu wynika, że wciśnięcia u Ciebie zwiera wejście układu do 5V, a nie do masy (jak to najczęściej się robi). Chce się tylko upewnić, że na pewno masz odpowiednie podłączenia 😉

podłaczone mam jjak na schemacie w celu czasem niechcianego załączenia narazie diodą sprawdzam później będzie działało przez tranzystor

schemat.JPG

23 godziny temu, deshipu napisał:

Przecież ci właśnie pomaga. Trochę wychowania, nieładnie tak uciszać ludzi na forach tylko dlatego, że nie odpowiada ci (poprawna) odpowiedź.

Odpowiedz nie była poprawna bo o co innego pytałem.

Dziekuje

Edytowano przez wojt3k_h
Link do komentarza
Share on other sites

26 minut temu, wojt3k_h napisał:
23 godziny temu, deshipu napisał:

Przecież ci właśnie pomaga. Trochę wychowania, nieładnie tak uciszać ludzi na forach tylko dlatego, że nie odpowiada ci (poprawna) odpowiedź.

Odpowiedz nie była poprawna bo o co innego pytałem.

To tobie się tak wydaje.

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.