Trzy programy uruchamiane z trzech przycisków

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
bsw
Młodszy majsterkowicz
Posty: 8
Rejestracja: 3 maja 2013, 05:08

Trzy programy uruchamiane z trzech przycisków

Post autor: bsw » 24 sie 2013, 06:30

Witam.
Jakieś czas temu zacząłem moją przygodę z arduino i powiedzmy że coś niecoś już wiem ;-) niestety jednak poległem przy pewnym zadaniu.
Chcę sterować pięcioma zaworkami w różnych sekwencjach (program 1 załączanie od 1 do 5, program 2 załączanie od 5 do 1, program 3 załączanie 1,3,5,2,4) w zależności od wciśniętego przycisku.
Czyli mam tak:
- Cztery wejścia (program 1, program 2, program 3, stop)
- Pięć wyjść sterujących zaworkami (zastosowałem tutaj separację za pomocą CNY17 w celu "ochrony" płytki UNO)
- Trzy niezależne sekwencje załączania w zależności od wciśniętego przycisku.
O tyle o ile wiem jak napisać program żeby po naciśnięciu przycisku 1 program wykonywał daną sekwencję to nie wiem jak to zrobić dla trzech przycisków a już najlepiej w taki sposób ażeby przejście z programu 1 do np. 2 nie było możliwe bez wcześniejszego wciśnięcia przycisku stop.
Za wszelką pomoc z góry serdecznie dziękuję.

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


Awatar użytkownika
rafalzaq
Majsterkowicz
Posty: 180
Rejestracja: 2 maja 2013, 23:57

Re: Trzy programy uruchamiane z trzech przycisków

Post autor: rafalzaq » 24 sie 2013, 11:06

Blokadę uruchomienia bez przycisku stop możesz zrealizować za pomocą dodatkowej zmiennej. Niech uruchomienie dowolnego programu ustawia tą zmienną na jakąś określoną wartość (np. true). Naciśnięcie STOP będzie kasowało tą wartość. A uruchomić program będzie się dało tylko wtedy gdy wartość będzie skasowana.
Awatar użytkownika
Marhef
Złota rączka
Posty: 1257
Rejestracja: 18 lis 2011, 02:18

Re: Trzy programy uruchamiane z trzech przycisków

Post autor: Marhef » 24 sie 2013, 12:31

Do obsługi każdego przycisku (każdego programu) zrób osobną funkcję (np taką, jak setup(), loop()). Tak, jak pisał rafalzaq, do przycisku stop przypisujesz zmienną typu boolean.
Wywołujesz np tak:
W funkcji setup() dopisujesz stop = false;
W funkcji loop():

Kod: Zaznacz cały

if ( przycisk1 == true && stop != true ) 
 {
   stop = true;
   program1();
 }
if ( przycisk2 == true && stop != true ) 
 {
   stop = true;
   program2();
 }
if ( przycisk3 == true && stop != true ) 
 {
   stop = true;
   program3();
 }
I tworzysz trzy funkcje:
void program1()
void program2()
void program3()
W każdej opisujesz, jak mają być sterowane zaworki.
Obsługę przycisku stop robisz na przerwaniu.
bsw
Młodszy majsterkowicz
Posty: 8
Rejestracja: 3 maja 2013, 05:08

Re: Trzy programy uruchamiane z trzech przycisków

Post autor: bsw » 26 sie 2013, 05:38

Dzięki za podpowiedzi lecz chyba nie do końca wiem o co chodzi :(
Wyskrobałem coś takiego:

int start1 = 4;
int start2 = 5;
int start3 = 6;
int stop = 7;
int zawor1 = 9;
int zawor2 = 10;
int zawor3 = 11;
int zawor4 = 12;
int zawor5 = 13;

void setup()
{
pinMode(start1, INPUT);
pinMode(start2, INPUT);
pinMode(start3, INPUT);
pinMode(stop, INPUT);
pinMode(zawor1, OUTPUT);
pinMode(zawor2, OUTPUT);
pinMode(zawor3, OUTPUT);
pinMode(zawor4, OUTPUT);
pinMode(zawor5, OUTPUT);
}

void loop()
if (digitalRead(start1) == HIGH && stop != LOW )
{
stop = LOW;
program1();
}
if (digitalRead(start2) == HIGH && stop != LOW )
{
stop = LOW;
program2();
}
if (digitalRead(start3) == HIGH && stop != LOW )
{
stop = LOW;
program3();
}}

void program1()
{
digitalWrite(zawor1, HIGH);
delay(1000);
digitalWrite(zawor1, LOW);
delay(1000);
digitalWrite(zawor2, HIGH);
delay(1000);
digitalWrite(zawor2, LOW);
delay(1000);
digitalWrite(zawor3, HIGH);
delay(1000);
digitalWrite(zawor3, LOW);
delay(1000);
digitalWrite(zawor4, HIGH);
delay(1000);
digitalWrite(zawor4, LOW);
delay(1000);
digitalWrite(zawor5, HIGH);
delay(1000);
digitalWrite(zawor5, LOW);
delay(1000);
}

void program2()
{
digitalWrite(zawor5, HIGH);
delay(1000);
digitalWrite(zawor5, LOW);
delay(1000);
digitalWrite(zawor4, HIGH);
delay(1000);
digitalWrite(zawor4, LOW);
delay(1000);
digitalWrite(zawor3, HIGH);
delay(1000);
digitalWrite(zawor3, LOW);
delay(1000);
digitalWrite(zawor2, HIGH);
delay(1000);
digitalWrite(zawor2, LOW);
delay(1000);
digitalWrite(zawor1, HIGH);
delay(1000);
digitalWrite(zawor1, LOW);
delay(1000);
}

void program3()
{
digitalWrite(zawor1, HIGH);
delay(1000);
digitalWrite(zawor1, LOW);
delay(1000);
digitalWrite(zawor3, HIGH);
delay(1000);
digitalWrite(zawor3, LOW);
delay(1000);
digitalWrite(zawor5, HIGH);
delay(1000);
digitalWrite(zawor5, LOW);
delay(1000);
digitalWrite(zawor2, HIGH);
delay(1000);
digitalWrite(zawor2, LOW);
delay(1000);
digitalWrite(zawor4, HIGH);
delay(1000);
digitalWrite(zawor4, LOW);
delay(1000);
}

Podczas próby kompilacji otrzymuję:
test_ze_startem:25: error: expected initializer before 'if'
test_ze_startem:30: error: expected unqualified-id before 'if'
test_ze_startem:35: error: expected unqualified-id before 'if'
test_ze_startem:39: error: expected declaration before '}' token
tłumacząc powiedzmy wiem o co chodzi ale w programie gdzie to zastosować to już niestety nie.

Oczywiście szukałem po necie na temat błędów ale niestety tu gdzie przebywam (220.191.168.176) czasami z gogle jest problem nie wspominając o youtube które po prostu nie działa :(
Awatar użytkownika
Janus
Majsterkowicz
Posty: 110
Rejestracja: 3 gru 2012, 07:48
Lokalizacja: Mikołów

Re: Trzy programy uruchamiane z trzech przycisków

Post autor: Janus » 26 sie 2013, 06:26

Brakuje klamry po loop.
Jest

Kod: Zaznacz cały

void loop()
if (digitalRead(start1) == HIGH && stop != LOW )
a powinno być

Kod: Zaznacz cały

void loop()
{
if (digitalRead(start1) == HIGH && stop != LOW )
bsw
Młodszy majsterkowicz
Posty: 8
Rejestracja: 3 maja 2013, 05:08

Re: Trzy programy uruchamiane z trzech przycisków

Post autor: bsw » 26 sie 2013, 08:05

Dzięki Janus.
Klamra dodana i program się skompilował.
Niestety po uruchomieniu arduino (i tu w zależności od podłączonego przycisku 1, 2, 3) uruchamia się program 1, 2 lub 3 ale tylko 1 raz. Według założenia dopiero wciśnięcie któregoś z przycisków miało uruchamiać dany program.
Dodatkowo wciśnięcie przycisku stop nie powoduje zatrzymania programu (sprawdzałem podczas tego jednorazowego uruchomienia), a ponowne wciśnięcie przycisku 1, 2 lub 3 nie powoduje załączenia programu.
:(
Awatar użytkownika
Janus
Majsterkowicz
Posty: 110
Rejestracja: 3 gru 2012, 07:48
Lokalizacja: Mikołów

Re: Trzy programy uruchamiane z trzech przycisków

Post autor: Janus » 26 sie 2013, 09:37

Dobrze. To teraz przejdźmy do działania programu.
Przyciski najlepiej obsłużyć za pomocą jakiejś biblioteki która niweluje efekt bounce np. http://www.mathertel.de/Arduino/OneButtonLibrary.aspx

Program wykonuje się raz ponieważ po wciśnięciu ustawiasz stop=LOW a w warunku masz stop != LOW.
I tu moja uwaga.
Z definicji wynika że zmienna stop to nr wejścia dla przycisku "STOP". Natomiast Ty tą zmienną używasz do ... hm, nie wiem do czego.
Jeśli chcesz żeby przycisk zatrzymywał Ci działanie programu, to musisz podpiąć go pod pin przerwania.
W kodzie wywołania przerwania, ustawiasz zmienną np zatrzymaj = True, informującą o naciśnięciu przycisku.
Następnie w każdym programie (1,2,3) sprawdzasz czy zmienna zatrzymaj == True.
Jeśli tak to przerywasz działanie programu.
bsw
Młodszy majsterkowicz
Posty: 8
Rejestracja: 3 maja 2013, 05:08

Re: Trzy programy uruchamiane z trzech przycisków

Post autor: bsw » 30 sie 2013, 08:09

Witam.
Bardzo dziękuję wszystkim za pomoc, ale ... ;-)
W związku z problemami związanymi z przyciskiem stop (wielki problem zielonego w programowaniu gdzie to diabelstwo wsadzić :D ) postanowiłem zrezygnować z przycisków i zastosowałem małe przełączniki hebelkowe. Oczywiście wszystko działa jak należy. Trzy przyciski załączają odpowiednio trzy programy. Dodatkowo zastosowałem "zabezpieczenie" działające na zasadzie: jeżeli przełącznik 1 = 1, przełącznik 2 = 0, przełącznik 3 = 0 wtedy start program 1. Załączenie któregokolwiek z przełączników oprócz aktualnie uruchamiającego program powoduje zatrzymanie całości.
Teraz po powrocie do domu mogę już śmiało zacząć uruchamiać baseno-fontannę :D
A może do tego jeszcze światła dołożyć? Zobaczymy. :D
bsw
Młodszy majsterkowicz
Posty: 8
Rejestracja: 3 maja 2013, 05:08

Re: Trzy programy uruchamiane z trzech przycisków

Post autor: bsw » 4 wrz 2013, 09:09

Żeby nie zakładać nowego tematu to jak można mam jeszcze jeden "problem" i po prostu nie wiem jak go "ugryźć" jak to przy początkach bywa.
Mam taki oto kod:

int ledPin1 = 3;
int ledPin2 = 5;
int ledPin3 = 6;
int ledPin4 = 9;
int ledPin5 = 10;
int ledPin6 = 11;

void setup()
{
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(ledPin4, OUTPUT);
pinMode(ledPin5, OUTPUT);
pinMode(ledPin6, OUTPUT);
}

void loop()
{
if ((digitalRead(2) && !(digitalRead(4)) && !(digitalRead(7))))
{
Program1();
}
if ((digitalRead(4) && !(digitalRead(2)) && !(digitalRead(7))))
{
Program2();
}
if ((digitalRead(7) && !(digitalRead(2)) && !(digitalRead(4))))
{
Program3();
}
}

void Program1()
{
digitalWrite(ledPin1, HIGH);
delay(100);
digitalWrite(ledPin1, LOW);
delay(100);
digitalWrite(ledPin2, HIGH);
delay(100);
digitalWrite(ledPin2, LOW);
delay(100);
digitalWrite(ledPin3, HIGH);
delay(100);
digitalWrite(ledPin3, LOW);
delay(100);
digitalWrite(ledPin4, HIGH);
delay(100);
digitalWrite(ledPin4, LOW);
delay(100);
digitalWrite(ledPin5, HIGH);
delay(100);
digitalWrite(ledPin5, LOW);
delay(100);
digitalWrite(ledPin6, HIGH);
delay(100);
digitalWrite(ledPin6, LOW);
delay(100);
digitalWrite(ledPin1, HIGH);
delay(100);
digitalWrite(ledPin1, LOW);
delay(100);
digitalWrite(ledPin2, HIGH);
delay(100);
digitalWrite(ledPin2, LOW);
delay(100);
digitalWrite(ledPin3, HIGH);
delay(100);
digitalWrite(ledPin3, LOW);
delay(100);
digitalWrite(ledPin4, HIGH);
delay(100);
digitalWrite(ledPin4, LOW);
delay(100);
digitalWrite(ledPin5, HIGH);
delay(100);
digitalWrite(ledPin5, LOW);
delay(100);
digitalWrite(ledPin6, HIGH);
delay(100);
digitalWrite(ledPin1, HIGH);
delay(100);
digitalWrite(ledPin1, LOW);
delay(100);
digitalWrite(ledPin2, HIGH);
delay(100);
digitalWrite(ledPin2, LOW);
delay(100);
digitalWrite(ledPin3, HIGH);
delay(100);
digitalWrite(ledPin3, LOW);
delay(100);
digitalWrite(ledPin4, HIGH);
delay(100);
digitalWrite(ledPin4, LOW);
delay(100);
digitalWrite(ledPin5, HIGH);
delay(100);
digitalWrite(ledPin6, HIGH);
delay(100);
digitalWrite(ledPin1, HIGH);
delay(100);
digitalWrite(ledPin1, LOW);
delay(100);
digitalWrite(ledPin2, HIGH);
delay(100);
digitalWrite(ledPin2, LOW);
delay(100);
digitalWrite(ledPin3, HIGH);
delay(100);
digitalWrite(ledPin3, LOW);
delay(100);
digitalWrite(ledPin4, HIGH);
delay(100);
digitalWrite(ledPin5, HIGH);
delay(100);
digitalWrite(ledPin6, HIGH);
delay(100);
digitalWrite(ledPin1, HIGH);
delay(100);
digitalWrite(ledPin1, LOW);
delay(100);
digitalWrite(ledPin2, HIGH);
delay(100);
digitalWrite(ledPin2, LOW);
delay(100);
digitalWrite(ledPin3, HIGH);
delay(100);
digitalWrite(ledPin4, HIGH);
delay(100);
digitalWrite(ledPin5, HIGH);
delay(100);
digitalWrite(ledPin6, HIGH);
delay(100);
digitalWrite(ledPin1, HIGH);
delay(100);
digitalWrite(ledPin1, LOW);
delay(100);
digitalWrite(ledPin2, HIGH);
delay(100);
digitalWrite(ledPin3, HIGH);
delay(100);
digitalWrite(ledPin4, HIGH);
delay(100);
digitalWrite(ledPin5, HIGH);
delay(100);
digitalWrite(ledPin6, HIGH);
delay(100);
digitalWrite(ledPin1, HIGH);
delay(100);
digitalWrite(ledPin2, HIGH);
delay(100);
digitalWrite(ledPin3, HIGH);
delay(100);
digitalWrite(ledPin4, HIGH);
delay(100);
digitalWrite(ledPin5, HIGH);
delay(100);
digitalWrite(ledPin6, HIGH);
delay(100);
digitalWrite(ledPin6, LOW);
delay(100);
digitalWrite(ledPin5, LOW);
delay(100);
digitalWrite(ledPin4, LOW);
delay(100);
digitalWrite(ledPin3, LOW);
delay(100);
digitalWrite(ledPin2, LOW);
delay(100);
digitalWrite(ledPin1, LOW);
delay(500);
}

void Program2()
{
// fade in from min to max in increments of 5 points:
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin1, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
analogWrite(ledPin2, fadeValue);
delay(30);
}
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
analogWrite(ledPin3, fadeValue);
delay(30);
}
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
analogWrite(ledPin4, fadeValue);
delay(30);
}
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
analogWrite(ledPin5, fadeValue);
delay(30);
}
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
analogWrite(ledPin6, fadeValue);
delay(30);
}
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
analogWrite(ledPin6, fadeValue);
delay(30);
}
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
analogWrite(ledPin5, fadeValue);
delay(30);
}
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
analogWrite(ledPin4, fadeValue);
delay(30);
}
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
analogWrite(ledPin3, fadeValue);
delay(30);
}
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
analogWrite(ledPin2, fadeValue);
delay(30);
}
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
analogWrite(ledPin1, fadeValue);
delay(30);
}
}

void Program3()
{
// fade in from min to max in increments of 5 points:
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin6, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(10);
}
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
analogWrite(ledPin6, fadeValue);
delay(10);
}
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
analogWrite(ledPin5, fadeValue);
delay(10);
}
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
analogWrite(ledPin5, fadeValue);
delay(10);
}
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
analogWrite(ledPin4, fadeValue);
delay(10);
}
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
analogWrite(ledPin4, fadeValue);
delay(10);
}
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
analogWrite(ledPin3, fadeValue);
delay(10);
}
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
analogWrite(ledPin3, fadeValue);
delay(10);
}
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
analogWrite(ledPin2, fadeValue);
delay(10);
}
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
analogWrite(ledPin2, fadeValue);
delay(10);
}
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
analogWrite(ledPin1, fadeValue);
delay(10);
}
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
analogWrite(ledPin1, fadeValue);
delay(10);
}
}

wszystko ładnie pięknie działa, tylko jeżeli przykładowo wykonuje się podprogram 1 (przełącznik 1=1, 2=0, 3=0), to jeżeli chcę go wyłączyć (przełącznik 1=0, 2=0, 3=0), to i tak musi dojść do końca (dany podprogram).
Czy ktoś może mi wyjaśnić "łopatologicznie" albo podać jakiś przykład lub zrobić wstawkę do tego programu w celu wyjaśnienia jak np. zakończyć program natychmiast i żeby po ponownym uruchomieniu wykonywał się od początku?
Awatar użytkownika
Marhef
Złota rączka
Posty: 1257
Rejestracja: 18 lis 2011, 02:18

Re: Trzy programy uruchamiane z trzech przycisków

Post autor: Marhef » 4 wrz 2013, 19:54

Dzieje się tak, ponieważ wszystkie zmiany stanów masz w pętli for i na opóznieniach (delay).
Musiałbyś sprawdzać stan przełączników np. w każdej iteracji pętli, i w razie wyłączenia, przerywasz działanie programu.
bsw
Młodszy majsterkowicz
Posty: 8
Rejestracja: 3 maja 2013, 05:08

Re: Trzy programy uruchamiane z trzech przycisków

Post autor: bsw » 5 wrz 2013, 08:16

Spłodziłem coś takiego:

void loop()
{
if ((digitalRead(A0) && !(digitalRead(A1)) && !(digitalRead(A2)))) //zmieniłem wejścia
{
Program1();
}
else
{
digitalWrite (ledPin1, 0);
digitalWrite (ledPin2, 0);
digitalWrite (ledPin3, 0);
digitalWrite (ledPin4, 0);
digitalWrite (ledPin5, 0);
digitalWrite (ledPin6, 0);
}
}

Niestety po wyłączeniu przełączników i tak program musi "dolecieć" do końca :-(

Jeżeli można bardzo bym prosił o jakiś przykład jak zatrzymać program bezpośrednio po wyłączeniu przełącznika.

A czy do takiego bezwarunkowego zatrzymania nie można by użyć wejścia reset?

Np. w części else coś takiego:

{
digitalWrite (ledPin*, 0) //* - odpowiedni pin
}
ODPOWIEDZ

Strony partnerskie: