Sygnalizator S.O.S. i związane z nim problemy...

Zrobiłeś coś fajnego z wykorzystaniem Arduino? Pochwal się tym!
ODPOWIEDZ
hubertk
Młodszy majsterkowicz
Posty: 16
Rejestracja: 24 paź 2014, 10:50

Sygnalizator S.O.S. i związane z nim problemy...

Post autor: hubertk » 12 lis 2014, 13:36

Witam wszystkich…

Jestem zupełnym nowicjuszem w dziedzinie elektroniki i Arduino, ale próbuję…

Mam Arduino UNO i "garść" elementów… Po zrobieniu pierwszych projektów tzn blinka i emitowania sygnału SOS (w pentli for) przyszedł czas na poważne projekty :). Od razu nadmienię, że na razie nie szukam pomocy w stylu to już było wklej sobie i załaduj kod - chcę sam do tego dojść naprowadzany przez Was koledzy na dobre tory...

Otóż - mój projekt to sygnalizator S.O.S. wymyśliłem sobie, że będzie wyglądało to tak, że w stanie OK (czuwania) pali się dioda zielona, a gdy dzieje się coś złego naciskamy przycisk i gaśnie dioda zielona i dioda czerwona emituje SOS powiedzmy trzy razy, następnie wszystko wraca do stanu OK (czuwanie) czyli zapala się dioda zielona i znowu czuwa.
Wszystko podłączyłem tak: rezystory to 10k przy switchu i po 180R przy diodach:
sos ze switchem_bb.pdf
I zacząłem tworzyć kod, najpierw wymyśliłem sobie, że zrobię wersję testową, która ma polegać na tym, że pali się zielona dioda i po naciśnięciu switcha zapala się czerwona. I teraz co się dzieje na razie kiedy ustawię stan switcha na LOW i diody na HIGH pali się zielona stosuje "if" i "elese", ale kiedy naciskam switch czerwona pali się tylko w momencie przyciśnięcia kiedy zwalniam znowu zielona, czyli nie to co ma być, ale prosze nie piszcie jak to zrobić sam do tego dojdę.

Problem jest inny tzn: dlaczego jeśli dłużej trzymam wciśniętego switcha, wszystko gaśnie tzn dioda czerwona, która powinna się palić i całe arduino też? Po chwili, kiedy puszczę switcha wszystko wraca do normy. Dodatkowo zauważyłem, że czasem jeśli włączę switcha na zasadzie chwilowego klika tak na "sekundę" to też nie wzbudza się wszystko od razu tylko po chwili…

Dzięki za pomoc, Hubert
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

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


stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Sygnalizator S.O.S. i związane z nim problemy...

Post autor: stiven » 12 lis 2014, 14:07

Wklej kod.

Proponuje zrezygnować z własnego podciągnięcia wejścia przycisku. Sam mikrokontroler wewnętrznie może sobie zrobić takie podciągnięcie do napięcia zasilania, a w programie ustawia się to tak, że zamiast w setup ustawić pin jako wejście - pinMode(2, INPUT), to się robi pinMode(2, INPUT_PULLUP). Wtedy nie robi się już tego połączenia z masą przez rezystor, tylko w miejsce połączenia z VCC daje się połączenie z masą.
http://arduino.cc/en/Tutorial/InputPullupSerial

EDIT
Jak się zrobi to programowe podciągnięcie, to kiedy przycisk nie jest wciśnięty to na wejściu jest stan wysoki, a jak się wciśnie przycisk, to jest stan niski. Czyli będzie to wymagało zmiany też w ifach rozpoznających wciśnięcie przycisku.
hubertk
Młodszy majsterkowicz
Posty: 16
Rejestracja: 24 paź 2014, 10:50

Re: Sygnalizator S.O.S. i związane z nim problemy...

Post autor: hubertk » 12 lis 2014, 21:50

dziękuję bardzo za odpowiedź i pomoc… Próbuję się wgłębić w tę opcje nie bardzo rozumiem tego - Serial.begin(9600);
dlaczego i co ma to robić?

h
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Sygnalizator S.O.S. i związane z nim problemy...

Post autor: stiven » 13 lis 2014, 11:03

W swoim programie masz mniej więcej tak:

Kod: Zaznacz cały

void setup()
{
  pinMode(2, INPUT);          //pin do którego podłączony przycisk

}

void loop()
{
  int stan;

  stan = digitalRead(2);

  if(stan == HIGH)		//stan wysoki jeśli przyciśnięto przycisk
  {
  //...//
  }

}
Zamieniając zwykłe wejście, na wejście z podciągnięciem do napięcia zasilania, różnica będzie taka:

Kod: Zaznacz cały

void setup()
{
  pinMode(2, INPUT_PULLUP);          //pin do którego podłączony przycisk

}

void loop()
{
  int stan;

  stan = digitalRead(2);	

  if(stan == LOW)		//stan niski jeśli przyciśnięto przycisk
  {
  //...//
  }

}

hubertk
Młodszy majsterkowicz
Posty: 16
Rejestracja: 24 paź 2014, 10:50

Re: Sygnalizator S.O.S. i związane z nim problemy...

Post autor: hubertk » 13 lis 2014, 21:52

Witam raz jeszcze i dziękuję za pomoc. Siedziałem, siedziałem i wysiedziałem. To co chciałem metodą prób i błędów zrobiłem tzn pali się zielona dioda (stan czuwania) i kiedy przycisnę switch'a gaśnie zielona i dwa razy emituje się sygnał SOS i znowu zapala się zielona. ALE mam pewien niedosyt tzn jak widać w kodzie, aby SOS wyemitował się dwa razy po prostu powtórzyłem kod. Pytanie czy jest jakaś opcja aby nie kopiować kodu dwa razy tylko zastosować jakąś funkcję i jaką, którą powtórzy kod SOS dwa razy.

Generalnie może można ten mój kod jakoś zmodyfikować - tak jak wspomniałem jestem zupełnym nowicjuszem więc wszystko robię sam na tzw czuja :)

raz jeszcze załączam widok mojego układu
sos ze switchem_bb.pdf
Mój projekt :)

* projekt ma na celu wyświetlenie zrobienie symulatora sygnału sos
z użyciem przycisku, który będzie przełączał z zielonej diody oznaczającej, że
wszystko jest OK na stan sos. Nastepnie po wyemitowaniu SOS znowu przechodzić będzie w stan zielony*/

int czerwona = 8; // definicja diody emitującej SOS i numeru pinu
int zielona = 7; // definicja diody zielonej
int przycisk = 2; // numer pinu przycisku
unsigned long changeTime;

void setup() {

pinMode(zielona, OUTPUT); // ustawienie stanu na wyjście
pinMode(czerwona, OUTPUT); // ustawienie stanu na wyjście
pinMode(przycisk, INPUT_PULLUP); // ustawienie przycisku bez rezystora podciągającego
}

void loop() {
digitalWrite(zielona, HIGH);

int stanprzycisku = digitalRead(przycisk);
Serial.println(stanprzycisku);

int state = digitalRead(przycisk);

if (state == LOW && (millis() - changeTime) > 1000) {

digitalWrite(zielona, LOW);

emisjaSOS();
}

}

void emisjaSOS() {
for (int x=0; x<3; x++)
{
digitalWrite(czerwona, HIGH);
delay(350);
digitalWrite(czerwona, LOW);
delay(150);
}

delay(500);

for (int x=0; x<3; x++)
{
digitalWrite(czerwona, HIGH);
delay(650);
digitalWrite(czerwona, LOW);
delay(150);
}

delay(500);

for (int x=0; x<3; x++)
{
digitalWrite(czerwona, HIGH);
delay(350);
digitalWrite(czerwona, LOW);
delay(150);
}
delay(1000);

for (int x=0; x<3; x++)
{
digitalWrite(czerwona, HIGH);
delay(350);
digitalWrite(czerwona, LOW);
delay(150);
}

delay(500);

for (int x=0; x<3; x++)
{
digitalWrite(czerwona, HIGH);
delay(650);
digitalWrite(czerwona, LOW);
delay(150);
}

delay(500);

for (int x=0; x<3; x++)
{
digitalWrite(czerwona, HIGH);
delay(350);
digitalWrite(czerwona, LOW);
delay(150);
}
delay(1000);

digitalWrite(zielona, HIGH);
}
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Sygnalizator S.O.S. i związane z nim problemy...

Post autor: stiven » 13 lis 2014, 23:13

Można w tej funkcji emisjaSOS dodać fora, który zamknie całość, żeby wykonała się 2 razy. Sama funkcja emisjaSOS, reszta programu zostaje taka sama:

Kod: Zaznacz cały

void emisjaSOS() {

for(int y = 0; y < 2; y++)
{
  for (int x=0; x<3; x++)
  {
    digitalWrite(czerwona, HIGH);
    delay(350);
    digitalWrite(czerwona, LOW);
    delay(150);
  }

  delay(500);

  for (int x=0; x<3; x++)
  {
    digitalWrite(czerwona, HIGH);
    delay(650);
    digitalWrite(czerwona, LOW);
    delay(150);
  }

  delay(500);

  for (int x=0; x<3; x++)
  {
    digitalWrite(czerwona, HIGH);
    delay(350);
    digitalWrite(czerwona, LOW);
    delay(150);
  }
  delay(1000);
}

  digitalWrite(zielona, HIGH);  //nie potrzebne
}

Można zrobić też zrobić coś takiego:

Kod: Zaznacz cały

int czerwona = 8; // definicja diody emitującej SOS i numeru pinu
int zielona = 7; // definicja diody zielonej
int przycisk = 2; // numer pinu przycisku
unsigned long changeTime;

void setup() {

  pinMode(zielona, OUTPUT); // ustawienie stanu na wyjście
  pinMode(czerwona, OUTPUT); // ustawienie stanu na wyjście
  pinMode(przycisk, INPUT_PULLUP); // ustawienie przycisku bez rezystora podciągającego
}

void loop() {
  digitalWrite(zielona, HIGH);

  int stanprzycisku = digitalRead(przycisk);
  Serial.println(stanprzycisku);

  int state = digitalRead(przycisk);

  if (state == LOW && (millis() - changeTime) > 1000) {

    digitalWrite(zielona, LOW);

	for(int i = 0; i < 2; i++)
	{
          emisjaSOS(350, 150, 500);
	  emisjaSOS(650, 150, 500);
	  emisjaSOS(350, 150, 1000);
	}
	
	digitalWrite(zielona, HIGH);  //nie potrzebne
  }

}

void emisjaSOS(int a, int b, int c) {
  for (int x=0; x<3; x++)
  {
    digitalWrite(czerwona, HIGH);
    delay(a);
    digitalWrite(czerwona, LOW);
    delay(b);
  }

  delay(c);
}

Zaznaczyłem w pierwszej i drugiej opcji jedną linijkę, że jest nie potrzebna, digitalWrite(zielona, HIGH); bo jest to ostatnia rzecz która zostanie wykonana w pętli programu, a potem pierwsza linijka programu jest identyczna, więc nie ma potrzeby żeby to pisać i na początku i na końcu, możesz usunąć i sprawdzić. Robisz 2 razy digitalRead(przycisk) do dwóch różnych zmiennych, nic złego się nie dzieje, ale niepotrzebnie. Coś zacząłeś kombinować z millis(), ale do zmiennej changeTime nie wpisujesz w programie żadnej wartości i tak na prawdę to co jest w ifie nie powoduje niczego w programie. Czy to będzie w tym ifie czy nie, to efekt będzie taki sam.
hubertk
Młodszy majsterkowicz
Posty: 16
Rejestracja: 24 paź 2014, 10:50

Re: Sygnalizator S.O.S. i związane z nim problemy...

Post autor: hubertk » 14 lis 2014, 00:06

Dzięki za pomoc i naukę :)…
hubertk
Młodszy majsterkowicz
Posty: 16
Rejestracja: 24 paź 2014, 10:50

Re: Sygnalizator S.O.S. i związane z nim problemy...

Post autor: hubertk » 14 lis 2014, 10:02

to raz jeszcze ja w tym temacie :)

Nie bardzo rozumiem kod od tego poniższego momentu tzn "for" rozumiem i że zielona HIGH niepotrzebna, ale nie rozumiem reszty tzn definicji emisjaSOS, tych int a, int b, int c no i skąd on wie jaki delay? Wytłumaczysz w kilku słowach, plisss

for(int i = 0; i < 2; i++)
{
emisjaSOS(350, 150, 500);
emisjaSOS(650, 150, 500);
emisjaSOS(350, 150, 1000);
}

digitalWrite(zielona, HIGH); //nie potrzebne
}

}

void emisjaSOS(int a, int b, int c) {
for (int x=0; x<3; x++)
{
digitalWrite(czerwona, HIGH);
delay(a);
digitalWrite(czerwona, LOW);
delay(b);
}

delay(c);
}
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Sygnalizator S.O.S. i związane z nim problemy...

Post autor: stiven » 14 lis 2014, 11:40

Kiedy zapisze się taką deklarację funkcji:

Kod: Zaznacz cały

void emisjaSOS(int a, int b, int c) {

for (int x=0; x<3; x++)
{
digitalWrite(czerwona, HIGH);
delay(a);
digitalWrite(czerwona, LOW);
delay(b);
}

delay(c);
}
i wywoła ją się tak:

Kod: Zaznacz cały

emisjaSOS(350, 150, 500);
no to zmienne int a, b i c mają w tej funkcji takie wartości jak przy wywołaniu, czyli a = 350, b = 150, c = 500. Te wartości jakby się przenoszą do tej funkcji. Kiedy później jest wywołanie:

Kod: Zaznacz cały

emisjaSOS(650, 150, 500);
to a jest równe 650, b = 150, c = 500.



Musisz poczytać o podstawach programowania w języku C.
ODPOWIEDZ

Strony partnerskie: