Zmiana programu kliknięciem

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
svalmont
Majsterkowicz
Posty: 119
Rejestracja: 20 paź 2013, 21:22

Zmiana programu kliknięciem

Post autor: svalmont » 5 lut 2014, 20:18

Witam,
mam zmontowany układ który steruje układem ledów i do tego kilka programów jak miganie, losowe zapalanie, kolejne zapalanie i gaszenie itp.
Chciałbym wrzucić wszystko w jeden program tak by kliknięcie przycisku zmieniało program:
klick : program 1 działa w kułko
klick : program 1 się wyłancza a zaczyna działać program 2
itp.

Popraw pisownię.

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Malen
Młodszy majsterkowicz
Posty: 27
Rejestracja: 2 sty 2014, 22:47

Re: Zmiana programu kliknięciem

Post autor: Malen » 5 lut 2014, 23:08

Załączam kod programu który kiedyś wykonałem. Są 3 tryby pracy zmieniane przyciskiem i oddzielny przycisk ON/OFF.
Przeanalizuj kod masz komentarze.

http://wklej.org/id/1263579/
svalmont
Majsterkowicz
Posty: 119
Rejestracja: 20 paź 2013, 21:22

Re: Zmiana programu kliknięciem

Post autor: svalmont » 5 lut 2014, 23:56

Dzięki wielkie, chyba sobie z tym poradze bo na pierwszy rzut oka jest to nieskomplikowane i nakierowało mnie w którą stronę myśleć.
Troszkę mnie zaskoczyło że dałeś int po void setup gdyż nigdy się nie spotkałem że taką kolejnością, zawsze int dawałem pierwsze.
svalmont
Majsterkowicz
Posty: 119
Rejestracja: 20 paź 2013, 21:22

Re: Zmiana programu kliknięciem

Post autor: svalmont » 6 lut 2014, 00:26

a jakbym chciał używać tylko jednego przycisku do zmiany programu?
Malen
Młodszy majsterkowicz
Posty: 27
Rejestracja: 2 sty 2014, 22:47

Re: Zmiana programu kliknięciem

Post autor: Malen » 6 lut 2014, 12:03

Coś w sylu

Kod: Zaznacz cały

if(digitalRead(8) == HIGH )      // Jezeli wcisniemy przycisk podlaczony pod pin nr 8 
 {
     if(tryb != 2)
       tryb++;
     else
       tryb = 0;
   while(digitalRead(8)==HIGH);
  
 
 }
i potem sprawdzasz if'em albo switch'em jaka jest wartość trybu i odpowiednio reagujesz.

Kod: Zaznacz cały

if(tryb == 0)
  XXXX();
if(tryb == 1)
  YYYY();
if(tryb == 2)
 CCCCC();
albo

switch(tryb)
{
case 0:
XXXX();
break;
case 1:
YYYYY();
break;
case 2:
CCCCC();
break;
}
Malen
Młodszy majsterkowicz
Posty: 27
Rejestracja: 2 sty 2014, 22:47

Re: Zmiana programu kliknięciem

Post autor: Malen » 6 lut 2014, 12:04

Coś w sylu

Kod: Zaznacz cały

if(digitalRead(8) == HIGH )      // Jezeli wcisniemy przycisk podlaczony pod pin nr 8 
 {
     if(tryb != 2)
       tryb++;
     else
       tryb = 0;
   while(digitalRead(8)==HIGH);
  
 
 }
i potem sprawdzasz if'em albo switch'em jaka jest wartość trybu i odpowiednio reagujesz.

Kod: Zaznacz cały

if(tryb == 0)
  XXXX();
if(tryb == 1)
  YYYY();
if(tryb == 2)
 CCCCC();
albo

switch(tryb)
{
case 0:
XXXX();
break;
case 1:
YYYYY();
break;
case 2:
CCCCC();
break;
}
svalmont
Majsterkowicz
Posty: 119
Rejestracja: 20 paź 2013, 21:22

Re: Zmiana programu kliknięciem

Post autor: svalmont » 6 lut 2014, 19:30

Z pomocą waszych kodów napisałem prosty program który gasi jedną diode a zapala następną po kliknięciu, wygląda on tak:

Kod: Zaznacz cały

void setup() {
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, INPUT);
  
}
int tryb=0;  
void Jeden() ///pierwszy program
{
  do
  {
    digitalWrite(0, LOW);
  }
  while(digitalRead(7) == LOW);
}

void Dwa()  ///drugi program
{
  do
  {
    digitalWrite(1, LOW);
  }
  while(digitalRead(7) == LOW);
}

void Trzy()  ///trzeci program
{
  do
  {
    digitalWrite(2, LOW);
  }
  while(digitalRead(7) == LOW);
}

void loop() ///pętla
{           

  for( int i=0; i<=6; i++ )  ///pin od 0 do 6
  {
    digitalWrite(i,HIGH);      ///stna pinów okreslonych
  }

if(digitalRead(7) == HIGH);   
{
  if(tryb !=3)   ///ilość trybów
  tryb++;
  else
  tryb = 0;
  while(digitalRead(7)==HIGH);
}
if(tryb == 0)
Jeden();
if(tryb == 1)
Dwa();
if(tryb == 3)
Trzy();
}
Wszystko działa jak powinno z jednym wyjątkiem. Czemu gdy startuje procek to najpierw pali się dioda na pinie 1 która jest określona w programie 1, wydawało mi się że pierwszy wystartuje program 0
Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Re: Zmiana programu kliknięciem

Post autor: v-cu » 6 lut 2014, 21:48

Witam ja z swojej strony próbuje zrobić takie coś jak jest tu na filmiku: http://www.elektroda.pl/rtvforum/topic2742799.html
Lecz coś mi nie wychodzi, pomożecie ?
http://wklej.org/id/1264467/
svalmont
Majsterkowicz
Posty: 119
Rejestracja: 20 paź 2013, 21:22

Re: Zmiana programu kliknięciem

Post autor: svalmont » 7 lut 2014, 00:01

v-cu pisze:Witam ja z swojej strony próbuje zrobić takie coś jak jest tu na filmiku: http://www.elektroda.pl/rtvforum/topic2742799.html
Lecz coś mi nie wychodzi, pomożecie ?
http://wklej.org/id/1264467/
A co dokładnie Ci nie wychodzi?
Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Re: Odp: Zmiana programu kliknięciem

Post autor: v-cu » 7 lut 2014, 09:28

Mi działa to tak, że żeby przełączyć na następny tryb muszę przytrzymać przycisk tak długo aż skończy się tryb poprzedni i potem dopiero przełącza. Jak zrobić żeby tylko klikłem raz i zmieniało mi tryb?
Awatar użytkownika
cube
Złota rączka
Posty: 834
Rejestracja: 2 gru 2012, 17:02

Re: Zmiana programu kliknięciem

Post autor: cube » 7 lut 2014, 12:29

attachInterrupt();
Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Re: Zmiana programu kliknięciem

Post autor: v-cu » 7 lut 2014, 21:00

cube pisze:attachInterrupt();
Ale. W funkcji attachInterrupt(); nie działa delay();
Po drugie zdaje mi się funkcję tą szło by zastosować jeśli były by np. 3 przyciski a ja chcę zmieniać tryby tylko jednym.
svalmont
Majsterkowicz
Posty: 119
Rejestracja: 20 paź 2013, 21:22

Re: Zmiana programu kliknięciem

Post autor: svalmont » 12 lut 2014, 00:50

svalmont pisze:Z pomocą waszych kodów napisałem prosty program który gasi jedną diode a zapala następną po kliknięciu, wygląda on tak:

Kod: Zaznacz cały

void setup() {
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, INPUT);
  
}
int tryb=0;  
void Jeden() ///pierwszy program
{
  do
  {
    digitalWrite(0, LOW);
  }
  while(digitalRead(7) == LOW);
}

void Dwa()  ///drugi program
{
  do
  {
    digitalWrite(1, LOW);
  }
  while(digitalRead(7) == LOW);
}

void Trzy()  ///trzeci program
{
  do
  {
    digitalWrite(2, LOW);
  }
  while(digitalRead(7) == LOW);
}

void loop() ///pętla
{           

  for( int i=0; i<=6; i++ )  ///pin od 0 do 6
  {
    digitalWrite(i,HIGH);      ///stna pinów okreslonych
  }

if(digitalRead(7) == HIGH);   
{
  if(tryb !=3)   ///ilość trybów
  tryb++;
  else
  tryb = 0;
  while(digitalRead(7)==HIGH);
}
if(tryb == 0)
Jeden();
if(tryb == 1)
Dwa();
if(tryb == 3)
Trzy();
}
Wszystko działa jak powinno z jednym wyjątkiem. Czemu gdy startuje procek to najpierw pali się dioda na pinie 1 która jest określona w programie 1, wydawało mi się że pierwszy wystartuje program 0

Ponawiam pytanie.
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 311
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

Re: Zmiana programu kliknięciem

Post autor: wojtekizk » 13 lut 2014, 23:05

Witam... kurczę temat pewnie już nieaktualny ale mimo wszystko wtrącę tu swoje trzy grosze.
Jak dobrze zrozumiałem chodzi o kolejne np. zapalanie diód, wywoływanie określonej sekwencji itp. po kolejnym klikaniu na Buttona, tak?
Po pierwsze po co nam tutaj delay ? ( bo jak jeden z kolegów zauważył w interrup-tach nie działa delay)
Nie działa, bo nie powinien działać, to wynika z idei właśnie przerwań - przerwij program, przekaż sterowanie do funkcji, zrób tam najszybciej jak można co jest do zrobienia i NATYCHMIAST wracaj do swoich innych zadań !
Kolega cube słusznie podpowiada aby skorzystać z przerwania... i róbmy to tak często jak tylko można. Przerwania to wspaniałe narzędzie, niestety nie doceniane przez wielu kolegów. Szkoda. Być może wynika to z niewystarczającej wiedzy w tym temacie. Dla przykładu przerwania rozwiązują nam wiele problemów z obsługą niezależnych wątków. Bez przerwania nie zbudujesz np. robota MINISUMO, który będzie w stanie natychmiast zareagować po najechaniu na linię, bez przerwania będziesz musiał czekać aż wykona się np. delay, a chciałbyś aby po wciśnięcu Twojego przycisku program natychmiast zmienił kierunek obrotów silnika...itp. Przykładów jest tysiące. W postawionym tutaj zadaniu, banalnie z pozoru prostym, kolega svalmont stosuje jakieś tryby, funkcje jeden, dwa, trzy itp. Zgubić się można w tych zawiłościach :-)
Proponuję zrobić to właśnie na przerwaniu, tak jak podpowiada kolega cube. Poniżej zamieszczam kod z obszernymi komentarzami i mam nadzieję, że ten prosty kod przybliży nieco "tajniki" przerwań :-)

Kod: Zaznacz cały

/* 
Kolejne zapalanie 8-iu diód po wcisnieciu Buttona podpiętego na pin 2
z wykorzystaniem przerwania INT0 (Arduino UNO) (Leonardo ma INT0 na 3)
diody na pinach 3-10 
...by wojtekizk ([email protected])
*/
volatile int i=3;  // numer pinu dla pierwszej diody, dla pewności powinno być volatile 
// --- funkcja zmiana wywoływana z przerwania INT0
void zmiana()
{
  for(int k=3;k<11;k++)  // stan diód ustawiamy w pętli
    { 
    if(k==i)digitalWrite(k,HIGH); // zapalamy diodę 
    else digitalWrite(k,LOW);     // gasimy wszystkie inne
    }
  i++;            // zmiana diody
  if(i==11) i=3; // w kółko Macieju :-)
}
// -----------------------------------------------
void setup()
{
pinMode(2,INPUT);digitalWrite(2,HIGH); // na pinie 2 podpinamy Buttona
attachInterrupt(0,zmiana,FALLING);     // ust. przerwanie INT0 na funkcję zmiana 
                                       // przy wciśnięciu Buttona (zmiana stanu z HIGH na LOW )
// poniżej w pętli konfiguruję piny 3-10 dla diód
for(int k=3;k<11;k++) { pinMode(k,OUTPUT);digitalWrite(k,LOW); }
// digitalWrite(3,HIGH); i=4;  // -- jeśli na dzień dobry ma być zapalona
}
//-------------------------------------------------
void loop()
{
// a tu nie robimy nic, bo całą robotę odwala przerwanie :-)
}
Pozdrawiam :-)
ps. sorki za moje wymądrzanie się... kurcze natura starego belfera :-)
svalmont
Majsterkowicz
Posty: 119
Rejestracja: 20 paź 2013, 21:22

Re: Zmiana programu kliknięciem

Post autor: svalmont » 14 lut 2014, 00:25

Tu chodzi o kilka programów w jednym i zmianę kliknięciem.
Ponieważ tworzymy tak jakby kilka pętli wywoływanych kolejno po kliknięciu to funkcja delay ma zastosowanie gdy jedna z podpętli tego wymaga (choćby proste mruganie).

Idea postu to omówienie prostej zmiany między kilkoma programami (błyskaniem, świeceniem, obracaniu się śmigła).
Nie jest istotna konkretna czynność tylko sama funkcja klik>następny program
Awatar użytkownika
Marhef
Złota rączka
Posty: 1170
Rejestracja: 18 lis 2011, 02:18

Re: Zmiana programu kliknięciem

Post autor: Marhef » 14 lut 2014, 00:44

Do tego możesz użyć przerwań od timera (opisane w którymś wątku na tym forum, ale nie mogę teraz znaleźć).
I używasz również pzerwania od przycisku (w funkcji obsługi tego przerwania zwiększasz jakąś zmienną, a w pętli loop() wybierasz w instrukcji switch fragment kodu, który ma się wykonać).
Jeśli nie napisałem jasno, podaj przykładowe dwie sekwencje zapalania diod (czyli konkretnie, które diody mają się zapalać/gasnąć, przez jaki czas), to napiszę przykładowy kod.
ODPOWIEDZ

Strony partnerskie: