Arduino Polska Forum
Jak poprawić kod - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Piaskownica (https://forum.arduinopolska.pl/dzial-piaskownica)
+--- Wątek: Jak poprawić kod (/watek-jak-poprawi%C4%87-kod)

Strony: 1 2


Jak poprawić kod - grzesio.px - 04-01-2020

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);
  }
}



RE: Jak poprawić kod - semi - 04-01-2020

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.


RE: Jak poprawić kod - Agregacik - 05-01-2020

A może autor chce, aby jedna świeciła 1 sekundę a potem druga 2 sekundy itd, ale musi to wyraźnie powiedzieć.


RE: Jak poprawić kod - grzesio.px - 05-01-2020

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ć.


RE: Jak poprawić kod - elvis - 05-01-2020

@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ś.


RE: Jak poprawić kod - grzesio.px - 05-01-2020

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);
  }


}



RE: Jak poprawić kod - Jarewa0606 - 05-01-2020

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


RE: Jak poprawić kod - grzesio.px - 05-01-2020

(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



RE: Jak poprawić kod - grzesio.px - 05-01-2020

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


RE: Jak poprawić kod - Jarewa0606 - 05-01-2020

Program tak działa, twój problem to brak czujnika pozycji.