• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Jak poprawić kod
#1
Witam potrzebuję program taki żeby migał 2 diodami naprzemiennie ale bez użycia "delay" bo ona zamraża cały program znalazłem kod z użyciem "millis" i wszystko ok ale nie potrafię go zmusić do tego żeby diody migały naprzemiennie mógłby ktoś mi to poprawić z góry dzięki 
Kod:
int stan2 = LOW;
int stan3 = LOW;

unsigned long miganie2 = 1000;
unsigned long miganie3 = 2000;

unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzas2 = 0;
unsigned long zapamietanyCzas3 = 0;

void setup(){
  Serial.begin(9600);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
}

void loop(){
  //Pobierz liczbe milisekund od startu
  aktualnyCzas = millis();
 
  //Jeśli różnica wynosi ponad miganie2
  if (aktualnyCzas - zapamietanyCzas2 >= miganie2) {
    //Zapamietaj aktualny czas
    zapamietanyCzas2 = aktualnyCzas;
    //Zmieniamy stan diody na przeciwny
    stan2 = !stan2;
    //ustawiamy nowy stan na diodzie
    digitalWrite(2, stan2);
  }

    //Jeśli różnica wynosi ponad miganie3
  if (aktualnyCzas - zapamietanyCzas3 >= miganie3) {
    //Zapamietaj aktualny czas
    zapamietanyCzas3 = aktualnyCzas;
    //Zmieniamy stan diody na przeciwny
    stan3 = !stan3;
    //ustawiamy nowy stan na diodzie
    digitalWrite(3, stan3);
  }
}
 
Odpowiedź
#2
Jak mogą migać naprzemiennie gdy mają różne czasy?
Czasy różnią się 2 razy, więc jedna świeci, w tym samym czasie druga przez połowę świecenia led 1 świeci, przez druga połowę nie. Gdy led 1 zgaśnie proces się powtarza. Wygląda to mniej więcej tak:
L1 L2
- -
- +
+ -
+ +
itd.
Jak w takim przypadku może coś dziać się naprzemiennie?

Jeśli faktycznie ma być naprzemiennie to dla jednej z diod ustawiaj stan wysoki dla drugiej niski. W kolejnym wykonaniu operacji na led ustawiaj na odwrót:
L1 L2
- +
+ -
idt.
 
Odpowiedź
#3
A może autor chce, aby jedna świeciła 1 sekundę a potem druga 2 sekundy itd, ale musi to wyraźnie powiedzieć.
 
Odpowiedź
#4
Ta trochę przekombinowałem z tymi diodami dodając ten drugi czas faktycznie w jednej funkcji to można zrobić teraz to wiedzę a chodzi mi dokładnie o to żeby świeci 1 gaśnie 2 gaśnie 1 świeci 2 itd. Marny ze mnie programista nawet nie pomyślałem tylko na pałę próbując coś gotowego zaadaptować.
 
Odpowiedź
#5
@grzesio.px, nie przesadzaj z tą samokrytyką, program który napisałeś można bardzo łatwo poprawić. Skoro chcesz, żeby diody migały z taką samą częstotliwością na początek musisz ustawić im taki sam czas, np.:

Kod:
unsigned long miganie2 = 1000;
unsigned long miganie3 = 1000;

Warto program przetestować - powinny obie migać jednocześnie. Skoro miały naprzemiennie, to można zmienić im stan początkowy:

Kod:
int stan2 = LOW;
int stan3 = HIGH;

Teraz już powinno działać jak chciałeś.
 
Odpowiedź
#6
Smile 
Ok ogarnąłem tak jak mówię trochę pomyśleć i będzie git tak to wygląda. Dzięki za zainteresowanie
Kod:
int stan2 = LOW;
int stan3 = HIGH;

unsigned long miganie2 = 1000;

unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzas2 = 0;

void setup(){
  Serial.begin(9600);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
}

void loop(){
  //Pobierz liczbe milisekund od startu
  aktualnyCzas = millis();
 
  //Jeśli różnica wynosi ponad miganie2
  if (aktualnyCzas - zapamietanyCzas2 >= miganie2) {
    //Zapamietaj aktualny czas
    zapamietanyCzas2 = aktualnyCzas;
    //Zmieniamy stan diody na przeciwny
    stan2 = !stan2;
    stan3 = !stan3;
    //ustawiamy nowy stan na diodzie
    digitalWrite(2, stan2);
    digitalWrite(3, stan3);
  }


}
 
Odpowiedź
#7
Kod:
bool stan2 = LOW;

unsigned long miganie2 = 1000;

unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzas2 = 0;

void setup(){
  Serial.begin(9600);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
}

void loop(){
  //Pobierz liczbe milisekund od startu
  aktualnyCzas = millis();

  //Jeśli różnica wynosi ponad miganie2
  if (aktualnyCzas - zapamietanyCzas2 >= miganie2) {
    //Zapamietaj aktualny czas
    zapamietanyCzas2 = aktualnyCzas;
    //Zmieniamy stan diody na przeciwny
    stan2 = !stan2;

    if(stan2){
      digitalWrite(2, HIGH);
      digitalWrite(3,LOW);
     }else{
      digitalWrite(3, HIGH);
      digitalWrite(2,LOW);
     }
  }


}

Mozna tez w takiej postaci
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#8
(05-01-2020, 10:56)Jarewa0606 napisał(a):
Kod:
bool stan2 = LOW;

unsigned long miganie2 = 1000;

unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzas2 = 0;

void setup(){
  Serial.begin(9600);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
}

void loop(){
  //Pobierz liczbe milisekund od startu
  aktualnyCzas = millis();

  //Jeśli różnica wynosi ponad miganie2
  if (aktualnyCzas - zapamietanyCzas2 >= miganie2) {
    //Zapamietaj aktualny czas
    zapamietanyCzas2 = aktualnyCzas;
    //Zmieniamy stan diody na przeciwny
    stan2 = !stan2;

    if(stan2){
      digitalWrite(2, HIGH);
      digitalWrite(3,LOW);
     }else{
      digitalWrite(3, HIGH);
      digitalWrite(2,LOW);
     }
  }


}

Mozna tez w takiej postaci
 
Odpowiedź
#9
Wracam z nowym problemem tzn ciąg dalszy starego miganie diod to było tylko po to że lepiej widać wynik działania to naprzemienne miganie diod potrzebne mi jest do sterownika silnika bo on potrzebuje 1 raz na jednym wejściu raz na drugim do małej huśtawki co mi się udało zrobić ale nie przewidziałem jednego że ona nie jest ustawiona dokładnie w połowie bo się nie da i teraz dobija mi jedna strona wymyśliłem że jeśli skrócę jeden czas i to będzie ok  i tu mam prośbę
jak przerobić ten kod z pierwszego postu żeby była jakoby blokada tzn jeśli świeci 1 dioda to druga może się zaświecić dopiero kiedy zgaśnie 1 i na odwrót
 
Odpowiedź
#10
Program tak działa, twój problem to brak czujnika pozycji.
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości