• 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
z pętlą zgubiłem się w czasie
#21
tak daje dodatnią ale nie bierzesz pod uwagę jeżeli jest UL to np 30-600 nie da ci zera lub ujemna ale 4,294,966,725


i znowu w kodzie popełnił błąd mimo ze miał na "tacy" zrobił to po swojemu i powiela ciągle te same błędy
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#22
Panowie spokojnie tu jest piaskownica. Już pisałem, że trzeba do tego problemu podejść inaczej. Zapewne jest kilka sposobów, aby osiągnąć cel. Ja nie znam wszystkich zwłaszcza, że autor nie podał jasno celu, ale pomału może uda się coś zrobić.
 
Odpowiedź
#23
podał jasno cel w pierwszym poście,  chodzi o to ze wszystkie ify wykonują sie w jednym czasie a nie synchronicznie jak to ustawił w

Kod:
unsigned long memczask1 = +100;
unsigned long memczask2 = +200;
unsigned long memczask3 = +300;
unsigned long memczask4 = +400;
unsigned long memczask5 = +500;
unsigned long memczask6 = +600;
unsigned long memczask7 = +700;
unsigned long memczask8 = +800;
unsigned long memczask9 = -100;
unsigned long memczask10 = -200;
unsigned long memczask11 = -300;
unsigned long memczask12 = -400;
unsigned long memczask13 = -500;
unsigned long memczask14 = -600;
unsigned long memczask15 = -700;
unsigned long memczask16 = -800;


Cytat:Problemem jest to że sekwencja sama w sobie działa prawidłowo czyli poszczególne wyjścia załączają się zgodnie z zaplanowanymi częstotliwościami, ale dodanie jakiegokolwiek warunku (nawet prostego guzika) powoduje że wszystkie zaczynają działać synchronicznie i reagują tylko na jedną zmienną (w moim przypadku tempo), tak jakby zmienna "memczask.." nie była rozpoznawana.


i nie będzie wałkujemy to juz 3 strony ze 

Kod:
if (aczas - memczask1 >= migk1) {        //załączanie przekaźnika 1
    memczask1 = aczas;
    sk1 = !sk1;
    digitalWrite(k1, sk1);
  }

memczassk1 zawsze po spełnieniu warunku bedzie zwracac millis()..

dałem mu rozwiązanie 

Kod:
if(czas- ostatniczas >= interval){
ostatniczas=czas+50;
}
if(czas- ostatniczas >= interval){
ostatni czas=czas+100;

a co on zrobił??

Kod:
if (guzik == LOW && stat == 0){
    stat = 1;
    StartCzas = millis();
    memczask1 = StartCzas + 100;
    memczask2 = StartCzas + 200;
    memczask3 = StartCzas + 300;
    memczask4 = StartCzas + 400;
    memczask5 = StartCzas + 500;
    memczask6 = StartCzas + 600;
    memczask7 = StartCzas + 700;
    memczask8 = StartCzas + 800;
    memczask9 = StartCzas + 100;
    memczask10 = StartCzas + 200;
    memczask11 = StartCzas + 300;
    memczask12 = StartCzas + 400;
    memczask13 = StartCzas + 500;
    memczask14 = StartCzas + 600;
    memczask15 = StartCzas + 700;
    memczask16 = StartCzas + 800;
  }


nie wiem co mu to dało..... bo ja o czymś innym pisałem
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#24
Sprawdziłem i to co napisałem wcześniej nie działa przynajmniej na konsoli.
Proponuję sprawdzić czy to działa:
Kod:
  // przypisanie nazw do pinów
#define trigPin 3 // podłączenie czujnika ultradźwiękowego
#define echoPin 2 // podłączenie czujnika ultradźwiękowego
#define ldgr 52 // dioda zielona odtwarzania sekwencji
#define ldrd 53 // dioda czerwona zatrzymania sekwencji
#define fr 11 // wejscie z fotorezystora
#define sw 12 // dodatkowy przycisk wyzwalania
#define k1 22  // przekaźnik 1
#define k2 23  // przekaźnik 2
#define k3 24  // przekaźnik 3
#define k4 25  // przekaźnik 4
#define k5 26  // przekaźnik 5
#define k6 27  // przekaźnik 6
#define k7 28  // przekaźnik 7
#define k8 29  // przekaźnik 8
#define k9 30  // przekaźnik 9
#define k10 31 // przekaźnik 10
#define k11 32 // przekaźnik 11
#define k12 33 // przekaźnik 12
#define k13 34 // przekaźnik 13
#define k14 35 // przekaźnik 14
#define k15 36 // przekaźnik 15
#define k16 37 // przekaźnik 16

// przypisanie stanów do pinów
int l = 1; // licznik zdarzeń
int sk1 = HIGH; // włączone
int sk2 = HIGH; // włączone
int sk3 = HIGH; // włączone
int sk4 = HIGH; // włączone
int sk5 = HIGH; // włączone
int sk6 = HIGH; // włączone
int sk7 = HIGH; // włączone
int sk8 = HIGH; // włączone
int sk9 = HIGH; // włączone
int sk10 = HIGH; // włączone
int sk11 = HIGH; // włączone
int sk12 = HIGH; // włączone
int sk13 = HIGH; // włączone
int sk14 = HIGH; // włączone
int sk15 = HIGH; // włączone
int sk16 = HIGH; // włączone
int sk = HIGH;





int czastrwania = 15;  // przypisanie wartości do czasu trwania sekwencji
int tempo = 8000;  // określenie tempa załączania

// przypisanie wartośki częstotliwości załąćzania

unsigned long migk1 = tempo;
unsigned long migk2 = tempo;
unsigned long migk3 = tempo;
unsigned long migk4 = tempo;
unsigned long migk5 = tempo;
unsigned long migk6 = tempo;
unsigned long migk7 = tempo;
unsigned long migk8 = tempo;
unsigned long migk9 = tempo;
unsigned long migk10 = tempo;
unsigned long migk11 = tempo;
unsigned long migk12 = tempo;
unsigned long migk13 = tempo;
unsigned long migk14 = tempo;
unsigned long migk15 = tempo;
unsigned long migk16 = tempo;

// przypisanie wartości przesunięcia w czasie załączenia
unsigned long memczask1 ;
unsigned long memczask2 ;
unsigned long memczask3 ;
unsigned long memczask4 ;
unsigned long memczask5 ;
unsigned long memczask6 ;
unsigned long memczask7 ;
unsigned long memczask8 ;
unsigned long memczask9 ;
unsigned long memczask10 ;
unsigned long memczask11 ;
unsigned long memczask12 ;
unsigned long memczask13 ;
unsigned long memczask14 ;
unsigned long memczask15 ;
unsigned long memczask16 ;
unsigned long czasstart=0;
unsigned long aczas = 0;
unsigned long StartCzas ;
byte stat = 0;

void setup() {

  Serial.begin(9600);
  pinMode(k1, OUTPUT);
  pinMode(k2, OUTPUT);
  pinMode(k3, OUTPUT);
  pinMode(k4, OUTPUT);
  pinMode(k5, OUTPUT);
  pinMode(k6, OUTPUT);
  pinMode(k7, OUTPUT);
  pinMode(k8, OUTPUT);
  pinMode(k9, OUTPUT);
  pinMode(k10, OUTPUT);
  pinMode(k11, OUTPUT);
  pinMode(k12, OUTPUT);
  pinMode(k13, OUTPUT);
  pinMode(k14, OUTPUT);
  pinMode(k15, OUTPUT);
  pinMode(k16, OUTPUT);
  pinMode (sw, INPUT_PULLUP);
}




void loop()
{
  if (digitalRead(sw) == HIGH )
  {
    stat = 0;
    // tu trzeba dopisać sekwencję stop
  }
  if (digitalRead(sw) == LOW && stat == 0){
    stat = 1;
    StartCzas = millis();
    memczask1 = StartCzas - 1000;
    memczask2 = StartCzas - 2000;
    memczask3 = StartCzas - 3000;
    memczask4 = StartCzas - 4000;
    memczask5 = StartCzas - 5000;
    memczask6 = StartCzas - 6000;
    memczask7 = StartCzas - 7000;
    memczask8 = StartCzas - 8000;
    memczask9 = StartCzas - 1000;
    memczask10 = StartCzas - 2000;
    memczask11 = StartCzas - 3000;
    memczask12 = StartCzas - 4000;
    memczask13 = StartCzas - 5000;
    memczask14 = StartCzas - 6000;
    memczask15 = StartCzas - 7000;
    memczask16 = StartCzas - 8000;
  }
 
  if (digitalRead(sw) == LOW && stat == 1){
    aczas = millis();
    if ( aczas - memczask1 >= migk1) {        //załączanie przekaźnika 1
      memczask1 = aczas;
      sk1 = !sk1;
      digitalWrite(k1, sk1); Serial.print(" 1,");
    }
    if (aczas - memczask2 >= migk2) {        //załączanie przekaźnika 2
      memczask2 = aczas;
      sk2 = !sk2;
      digitalWrite(k2, sk2); Serial.print(" 2,");
    }
    if (aczas - memczask3 >= migk3) {       //załączanie przekaźnika 3
      memczask3 = aczas;
      sk3 = !sk3;
      digitalWrite(k3, sk3); Serial.print(" 3,");
    }
    if (aczas - memczask4 >= migk4) {      //załączanie przekaźnika 4
      memczask4 = aczas;
      sk4 = !sk4;
      digitalWrite(k4, sk4); Serial.print(" 4,");
    }
    if (aczas - memczask5 >= migk5) {      //załączanie przekaźnika 5
      memczask5 = aczas;
      sk5 = !sk5;
      digitalWrite(k5, sk5); Serial.print(" 5,");
    }
    if (aczas - memczask6 >= migk6) {      //załączanie przekaźnika 6
      memczask6 = aczas;
      sk6 = !sk6;
      digitalWrite(k6, sk6); Serial.print(" 6,");
    }
    if (aczas - memczask7 >= migk7) {      //załączanie przekaźnika 7
      memczask7 = aczas;
      sk7 = !sk7;
      digitalWrite(k7, sk7); Serial.print(" 7,");
    }
    if (aczas - memczask8 >= migk8) {      //załączanie przekaźnika 8
      memczask8 = aczas;
      sk8 = !sk8;
      digitalWrite(k8, sk8); Serial.print(" 8,");
    }
    if (aczas - memczask9 >= migk9) {      //załączanie przekaźnika 9
      memczask9 = aczas;
      sk9 = !sk9;
      digitalWrite(k9, sk9); Serial.println(" 9,");
    }
    if (aczas - memczask10 >= migk10) {    //załączanie przekaźnika 10
      memczask10 = aczas;
      sk10 = !sk10;
      digitalWrite(k10, sk10); Serial.print(" 10,");
    }
    if (aczas - memczask11 >= migk11) {    //załączanie przekaźnika 11
      memczask11 = aczas;
      sk11 = !sk11;
      digitalWrite(k11, sk11); Serial.print(" 11,");
    }
    if (aczas - memczask12 >= migk12) {    //załączanie przekaźnika 12
      memczask12 = aczas;
      sk12 = !sk12;
      digitalWrite(k12, sk12); Serial.print(" 12,");
    }
    if (aczas - memczask13 >= migk13) {    //załączanie przekaźnika 13
      memczask13 = aczas;
      sk13 = !sk13;
      digitalWrite(k13, sk13); Serial.print(" 13,");
    }
    if (aczas - memczask14 >= migk13) {    //załączanie przekaźnika 14
      memczask14 = aczas;
      sk14 = !sk14;
      digitalWrite(k14, sk14); Serial.print(" 14,");
    }
    if (aczas - memczask15 >= migk15) {      //załączanie przekaźnika 15
      memczask15 = aczas;
      sk15 = !sk15;
      digitalWrite(k15, sk15); Serial.print(" 15,");
    }
    if (aczas - memczask16 >= migk16) {      //załączanie przekaźnika 16
      memczask16 = aczas;
      sk16 = !sk16;
      digitalWrite(k16, sk16); Serial.print(" 16,");
    }
  }

}
Wykorzystałem przycisk sw na 12 porcie.
Jak nacisnę to sekwencja leci jak puszczę to się zatrzymuje i rusza po naciśnięciu przycisku od początku.
Czas zwiększyłem 10 razy, aby było łatwiej obserwować.
 
Odpowiedź
#25
@Jarewa0606
to poniżej to ja zaproponowałem, ale się pomyliłem tam powinny być nie plusy ale minusy

if (guzik == LOW && stat == 0){
stat = 1;
StartCzas = millis();
memczask1 = StartCzas + 100;
memczask2 = StartCzas + 200;
memczask3 = StartCzas + 300;
memczask4 = StartCzas + 400;
memczask5 = StartCzas + 500;
memczask6 = StartCzas + 600;
memczask7 = StartCzas + 700;
memczask8 = StartCzas + 800;
memczask9 = StartCzas + 100;
memczask10 = StartCzas + 200;
memczask11 = StartCzas + 300;
memczask12 = StartCzas + 400;
memczask13 = StartCzas + 500;
memczask14 = StartCzas + 600;
memczask15 = StartCzas + 700;
memczask16 = StartCzas + 800;
}
Poprawny kod, tak mi się wydaje, podałem powyżej.
 
Odpowiedź
#26
dałem mu rozwiązanie 

Kod:
if(czas- ostatniczas >= interval){
ostatniczas=czas+50;
}
if(czas- ostatniczas >= interval){
ostatni czas=czas+100;

a co on zrobił??...


Gdyby to rozwiązanie zadziałało to już dawno byłoby po sprawie....
 
Odpowiedź
#27
"Sprawdziłem i to co napisałem wcześniej nie działa przynajmniej na konsoli.
Proponuję sprawdzić czy to działa:"

szanowny Panie Agregaciku już prawie jest dobrze ale za drugim czy trzecim uruchomieniem coś się rozjeżdża i tak jakby sekwencja nie startowała od początku tylko z dowolnego swojego miejsca i czasami co niektóre gubią rytm.
 
Odpowiedź
#28
(06-12-2019, 20:17)Agregacik napisał(a): Sprawdziłem i to co napisałem wcześniej nie działa przynajmniej na konsoli.
Proponuję sprawdzić czy to działa:
Kod:
  // przypisanie nazw do pinów
#define trigPin 3 // podłączenie czujnika ultradźwiękowego
#define echoPin 2 // podłączenie czujnika ultradźwiękowego
#define ldgr 52 // dioda zielona odtwarzania sekwencji
#define ldrd 53 // dioda czerwona zatrzymania sekwencji
#define fr 11 // wejscie z fotorezystora
#define sw 12 // dodatkowy przycisk wyzwalania
#define k1 22  // przekaźnik 1
#define k2 23  // przekaźnik 2
#define k3 24  // przekaźnik 3
#define k4 25  // przekaźnik 4
#define k5 26  // przekaźnik 5
#define k6 27  // przekaźnik 6
#define k7 28  // przekaźnik 7
#define k8 29  // przekaźnik 8
#define k9 30  // przekaźnik 9
#define k10 31 // przekaźnik 10
#define k11 32 // przekaźnik 11
#define k12 33 // przekaźnik 12
#define k13 34 // przekaźnik 13
#define k14 35 // przekaźnik 14
#define k15 36 // przekaźnik 15
#define k16 37 // przekaźnik 16

// przypisanie stanów do pinów
int l = 1; // licznik zdarzeń
int sk1 = HIGH; // włączone
int sk2 = HIGH; // włączone
int sk3 = HIGH; // włączone
int sk4 = HIGH; // włączone
int sk5 = HIGH; // włączone
int sk6 = HIGH; // włączone
int sk7 = HIGH; // włączone
int sk8 = HIGH; // włączone
int sk9 = HIGH; // włączone
int sk10 = HIGH; // włączone
int sk11 = HIGH; // włączone
int sk12 = HIGH; // włączone
int sk13 = HIGH; // włączone
int sk14 = HIGH; // włączone
int sk15 = HIGH; // włączone
int sk16 = HIGH; // włączone
int sk = HIGH;





int czastrwania = 15;  // przypisanie wartości do czasu trwania sekwencji
int tempo = 8000;  // określenie tempa załączania

// przypisanie wartośki częstotliwości załąćzania

unsigned long migk1 = tempo;
unsigned long migk2 = tempo;
unsigned long migk3 = tempo;
unsigned long migk4 = tempo;
unsigned long migk5 = tempo;
unsigned long migk6 = tempo;
unsigned long migk7 = tempo;
unsigned long migk8 = tempo;
unsigned long migk9 = tempo;
unsigned long migk10 = tempo;
unsigned long migk11 = tempo;
unsigned long migk12 = tempo;
unsigned long migk13 = tempo;
unsigned long migk14 = tempo;
unsigned long migk15 = tempo;
unsigned long migk16 = tempo;

// przypisanie wartości przesunięcia w czasie załączenia
unsigned long memczask1 ;
unsigned long memczask2 ;
unsigned long memczask3 ;
unsigned long memczask4 ;
unsigned long memczask5 ;
unsigned long memczask6 ;
unsigned long memczask7 ;
unsigned long memczask8 ;
unsigned long memczask9 ;
unsigned long memczask10 ;
unsigned long memczask11 ;
unsigned long memczask12 ;
unsigned long memczask13 ;
unsigned long memczask14 ;
unsigned long memczask15 ;
unsigned long memczask16 ;
unsigned long czasstart=0;
unsigned long aczas = 0;
unsigned long StartCzas ;
byte stat = 0;

void setup() {

  Serial.begin(9600);
  pinMode(k1, OUTPUT);
  pinMode(k2, OUTPUT);
  pinMode(k3, OUTPUT);
  pinMode(k4, OUTPUT);
  pinMode(k5, OUTPUT);
  pinMode(k6, OUTPUT);
  pinMode(k7, OUTPUT);
  pinMode(k8, OUTPUT);
  pinMode(k9, OUTPUT);
  pinMode(k10, OUTPUT);
  pinMode(k11, OUTPUT);
  pinMode(k12, OUTPUT);
  pinMode(k13, OUTPUT);
  pinMode(k14, OUTPUT);
  pinMode(k15, OUTPUT);
  pinMode(k16, OUTPUT);
  pinMode (sw, INPUT_PULLUP);
}




void loop()
{
  if (digitalRead(sw) == HIGH )
  {
    stat = 0;
    // tu trzeba dopisać sekwencję stop
  }
  if (digitalRead(sw) == LOW && stat == 0){
    stat = 1;
    StartCzas = millis();
    memczask1 = StartCzas - 1000;
    memczask2 = StartCzas - 2000;
    memczask3 = StartCzas - 3000;
    memczask4 = StartCzas - 4000;
    memczask5 = StartCzas - 5000;
    memczask6 = StartCzas - 6000;
    memczask7 = StartCzas - 7000;
    memczask8 = StartCzas - 8000;
    memczask9 = StartCzas - 1000;
    memczask10 = StartCzas - 2000;
    memczask11 = StartCzas - 3000;
    memczask12 = StartCzas - 4000;
    memczask13 = StartCzas - 5000;
    memczask14 = StartCzas - 6000;
    memczask15 = StartCzas - 7000;
    memczask16 = StartCzas - 8000;
  }
 
  if (digitalRead(sw) == LOW && stat == 1){
    aczas = millis();
    if ( aczas - memczask1 >= migk1) {        //załączanie przekaźnika 1
      memczask1 = aczas;
      sk1 = !sk1;
      digitalWrite(k1, sk1); Serial.print(" 1,");
    }
    if (aczas - memczask2 >= migk2) {        //załączanie przekaźnika 2
      memczask2 = aczas;
      sk2 = !sk2;
      digitalWrite(k2, sk2); Serial.print(" 2,");
    }
    if (aczas - memczask3 >= migk3) {       //załączanie przekaźnika 3
      memczask3 = aczas;
      sk3 = !sk3;
      digitalWrite(k3, sk3); Serial.print(" 3,");
    }
    if (aczas - memczask4 >= migk4) {      //załączanie przekaźnika 4
      memczask4 = aczas;
      sk4 = !sk4;
      digitalWrite(k4, sk4); Serial.print(" 4,");
    }
    if (aczas - memczask5 >= migk5) {      //załączanie przekaźnika 5
      memczask5 = aczas;
      sk5 = !sk5;
      digitalWrite(k5, sk5); Serial.print(" 5,");
    }
    if (aczas - memczask6 >= migk6) {      //załączanie przekaźnika 6
      memczask6 = aczas;
      sk6 = !sk6;
      digitalWrite(k6, sk6); Serial.print(" 6,");
    }
    if (aczas - memczask7 >= migk7) {      //załączanie przekaźnika 7
      memczask7 = aczas;
      sk7 = !sk7;
      digitalWrite(k7, sk7); Serial.print(" 7,");
    }
    if (aczas - memczask8 >= migk8) {      //załączanie przekaźnika 8
      memczask8 = aczas;
      sk8 = !sk8;
      digitalWrite(k8, sk8); Serial.print(" 8,");
    }
    if (aczas - memczask9 >= migk9) {      //załączanie przekaźnika 9
      memczask9 = aczas;
      sk9 = !sk9;
      digitalWrite(k9, sk9); Serial.println(" 9,");
    }
    if (aczas - memczask10 >= migk10) {    //załączanie przekaźnika 10
      memczask10 = aczas;
      sk10 = !sk10;
      digitalWrite(k10, sk10); Serial.print(" 10,");
    }
    if (aczas - memczask11 >= migk11) {    //załączanie przekaźnika 11
      memczask11 = aczas;
      sk11 = !sk11;
      digitalWrite(k11, sk11); Serial.print(" 11,");
    }
    if (aczas - memczask12 >= migk12) {    //załączanie przekaźnika 12
      memczask12 = aczas;
      sk12 = !sk12;
      digitalWrite(k12, sk12); Serial.print(" 12,");
    }
    if (aczas - memczask13 >= migk13) {    //załączanie przekaźnika 13
      memczask13 = aczas;
      sk13 = !sk13;
      digitalWrite(k13, sk13); Serial.print(" 13,");
    }
    if (aczas - memczask14 >= migk13) {    //załączanie przekaźnika 14
      memczask14 = aczas;
      sk14 = !sk14;
      digitalWrite(k14, sk14); Serial.print(" 14,");
    }
    if (aczas - memczask15 >= migk15) {      //załączanie przekaźnika 15
      memczask15 = aczas;
      sk15 = !sk15;
      digitalWrite(k15, sk15); Serial.print(" 15,");
    }
    if (aczas - memczask16 >= migk16) {      //załączanie przekaźnika 16
      memczask16 = aczas;
      sk16 = !sk16;
      digitalWrite(k16, sk16); Serial.print(" 16,");
    }
  }

}
Wykorzystałem przycisk sw na 12 porcie.
Jak nacisnę to sekwencja leci jak puszczę to się zatrzymuje i rusza po naciśnięciu przycisku od początku.
Czas zwiększyłem 10 razy, aby było łatwiej obserwować.
Patrzę na kod i zastanawiam się dlaczego sobie utrudniacie życie? Czy zamiast
Kod:
  pinMode(k1, OUTPUT);
  pinMode(k2, OUTPUT);
  pinMode(k3, OUTPUT);
  pinMode(k4, OUTPUT);
  pinMode(k5, OUTPUT);
  pinMode(k6, OUTPUT);
  pinMode(k7, OUTPUT);
  pinMode(k8, OUTPUT);
  pinMode(k9, OUTPUT);
  pinMode(k10, OUTPUT);
  pinMode(k11, OUTPUT);
  pinMode(k12, OUTPUT);
  pinMode(k13, OUTPUT);
  pinMode(k14, OUTPUT);
  pinMode(k15, OUTPUT);
  pinMode(k16, OUTPUT);

nie prościej dać
Kod:
for(byte x=1; x<17;x++) pinMode( x, OUTPUT );
?
Ze względu na to, że k1...k16 to nie nr GPIO, tu też potrzebna tablica.
Kod:
k[16] = {22, 23...37};

wtedy ustawianie wyjść będzie wyglądać tak
Kod:
for(byte x=1; x<17;x++) pinMode( k[x-1], OUTPUT );

Czy zmienne
Kod:
unsigned long migk1;
...
unsigned long migk16;
unsigned long memczask1 ;
...
unsigned long memczask16 ;
nie powinny być tablicami?
Kod będzie czytelniejszy i krótszy.

Nawet to
Kod:
memczask1 = StartCzas + 100;
memczask2 = StartCzas + 200;
memczask3 = StartCzas + 300;
memczask4 = StartCzas + 400;
memczask5 = StartCzas + 500;
memczask6 = StartCzas + 600;
memczask7 = StartCzas + 700;
memczask8 = StartCzas + 800;
memczask9 = StartCzas + 100;
memczask10 = StartCzas + 200;
memczask11 = StartCzas + 300;
memczask12 = StartCzas + 400;
memczask13 = StartCzas + 500;
memczask14 = StartCzas + 600;
memczask15 = StartCzas + 700;
memczask16 = StartCzas + 800;
można zastąpić tym
Kod:
for(byte x=1; x<17;x++) memczask[x-1] = StartCzas + x * 100;
jak już zrobi się tablice.

Gwarantuję, że w takim kodzie łatwiej znaleźć błąd i wprowadzić poprawki.
 
Odpowiedź
#29
Co racja to racja, w tym kodzie dużo łatwiej znaleźć błąd - tablice są w C indeksowane od zera, więc błąd widać od razu. Tylko że wcześniej tego błędu nie było...
 
Odpowiedź
#30
Po zmianach program wygląda tak:
Kod:
#define fr 11 // wejscie z fotorezystora
#define sw 12 // dodatkowy przycisk wyzwalania
#define k1 22  // przekaźnik 1
// Czemu przekaźniuki nazwywają się k1..k16? "k" od czego? "pk", bym rozumiał, "r" lub "rel" też, ale "k"?
Ze względu na to, ze wyjścia sa kolejno 22..37 nie trzeba definiować wszystkich w tablicy.
#define    LICZBA_PK        16

// przypisanie stanów do pinów
int l = 1; // licznik zdarzeń
int sk = HIGH;
/*
int sk1 = HIGH; // włączone  ....int sk16 = HIGH; // włączone
*/
// Czemu typ int? Za szybki jest AVR i ma za dużo FLASH? AVR to nie ARM, w którym operacje na int wykonują się szybciej niż na 8-bit.
//Nie mozna tak:
uint8_t sk[LICZBA_PK];
//?

int czastrwania = 15;  // przypisanie wartości do czasu trwania sekwencji
int tempo = 8000;  // określenie tempa załączania

// przypisanie wartośki częstotliwości załąćzania
unsigned long migk[LICZBA_PK];


// przypisanie wartości przesunięcia w czasie załączenia
unsigned long memczask[LICZBA_PK] ;
unsigned long czasstart=0;
unsigned long aczas = 0;
unsigned long StartCzas ;
byte stat = 0;

void setup() {
  Serial.begin(9600);
  for(uint8_t x=0; x<LICZBA_PK ; x++) migk[x] = tempo;
  for(uint8_t x=0; x<LICZBA_PK ; x++) pinMode( k1+x, OUTPUT);
  for(uint8_t x=0; x<LICZBA_PK ; x++) sk[LICZBA_PK] = HIGH;
  pinMode (sw, INPUT_PULLUP);
}

void loop()
{
  if (digitalRead(sw) == HIGH )
  {
    stat = 0;
    // tu trzeba dopisać sekwencję stop
  }
  if (digitalRead(sw) == LOW && stat == 0){
    stat = 1;
    StartCzas = millis();
    for(uint8_t x=0; x<LICZBA_PK; x++) memczask1 = StartCzas - x * 1000;
  }

  if (digitalRead(sw) == LOW && stat == 1){
    aczas = millis();

    for(uint8_t x=0; x<LICZBA_PK; x++) {
        if ( aczas - memczask[x] >= migk[x]) {        //załączanie przekaźnika 1
        memczask1 = aczas;
        sk[x] = !sk[x];
        digitalWrite(k[x], sk[x]); Serial.print(" 1,");
        }
    }
  }

}
Czytelniejszy? Łatwiej wprowadzać zmiany? Zmieniam jedno wyrażenie a zmiana dotyczy wszystkich 16 przekaźników. Proste i wygodne?

PS
Pisałem "z palca" więc może są błędy ale forum nie jest po to aby dawać gotowce (ryby) ale nakierować na rozwiązanie problemu (dać wędkę).
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości