Arduino Polska Forum

Pełna wersja: Pomoc przy kodzir
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam jestem początkujący w tej dziedzinie. Napisałem kod dla schodów wzorując się filmikiem z YouTube ale nie mogę go zamknąć. Co jest nie tak. Zarys jest taki że mam arduino uno dwa czuiniki pir i 16 kanałowy przekaźnik. Ma się to włączać a później gasić czasy jeszcze do ustawienia więc się tym nie sugerowac jaki błąd popełniam w tym kodzie. 

void setup() {

  pinMode(A0, OUTPUT); //dioda jako wyjscie
  pinMode(A1, OUTPUT); //dioda jako wyjscie
  pinMode(A2, OUTPUT); //dioda jako wyjscie
  pinMode(A3, OUTPUT); //dioda jako wyjscie
  pinMode(A4, OUTPUT); //dioda jako wyjscie
  pinMode(A5, OUTPUT); //dioda jako wyjscie
  pinMode(1, OUTPUT); //dioda jako wyjscie
  pinMode(2, OUTPUT); //dioda jako wyjscie
  pinMode(3, OUTPUT); //dioda jako wyjscie
  pinMode(4, OUTPUT); //dioda jako wyjscie
  pinMode(5, OUTPUT); //dioda jako wyjscie
  pinMode(6, OUTPUT); //dioda jako wyjscie
  pinMode(7, OUTPUT); //dioda jako wyjscie
  pinMode(8, OUTPUT); //dioda jako wyjscie
  pinMode(9, OUTPUT); //dioda jako wyjscie

  pinMode(12, INPUT_PULLUP); //wejscie dół
  pinMode(13, INPUT_PULLUP); //wejscie góra
}

void loop() {

  if (digitalRead(12) == HIGH){
    digitalWrite(A0, LOW); //wlacz diode
    Serial.print ("diody wlaczone 12");
    delay (500);
    digitalWrite(A1, LOW); //wlacz diode
    delay (600);
    digitalWrite(A2, LOW); //wlacz diode
    delay (700);
    digitalWrite(A3, LOW); //wlacz diode
    delay (800);
    digitalWrite(A4, LOW); //wlacz diode
    delay (900);
    digitalWrite(A5, LOW); //wlacz diode
    delay (1000);
    digitalWrite(1, LOW); //wlacz diode
    delay (1100);
    digitalWrite(2, LOW); //wlacz diode
    delay (1200);
    digitalWrite(3, LOW); //wlacz diode
    delay (1400);
    digitalWrite(4, LOW); //wlacz diode
    delay (1500);
    digitalWrite(5, LOW); //wlacz diode
    delay (1600);
    digitalWrite(6, LOW); //wlacz diode
    delay (1800);
    digitalWrite(7, LOW); //wlacz diode
    delay (1900);
    digitalWrite(8, LOW); //wlacz diode
    delay (2000);
    digitalWrite(9, LOW); //wlacz diode
    Serial.print ("diody wlaczone 12");
    delay (400);
    digitalWrite(A1, HIGH); //wylacz diode
    delay (500);
    digitalWrite(A2, HIGH); //wylacz diode
    delay (500);
    digitalWrite(A3, HIGH); //wylacz diode
    delay (500);
    digitalWrite(A4, HIGH); //wylacz diode
    delay (500);
    digitalWrite(A5, HIGH); //wylacz diode
    delay (500);
    digitalWrite(1, HIGH); //wylacz diode
    delay (500);
    digitalWrite(2, HIGH); //wylacz diode
    delay (500);
    digitalWrite(3, HIGH); //wylacz diode
    delay (500);
    digitalWrite(4, HIGH); //wylacz diode
    delay (500);
    digitalWrite(5, HIGH); //wylacz diode
    delay (500);
    digitalWrite(6, HIGH); //wylacz diode
    delay (500);
    digitalWrite(7, HIGH); //wylacz diode
    delay (500);
    digitalWrite(8, HIGH); //wylacz diode
    delay (500);
    digitalWrite(9, HIGH); //wylacz diode
    }
    

    if (digitalRead(13) == HIGH){
    digitalWrite(9, LOW); //wlacz diode
    Serial.print ("diody wlaczone 13");
    delay (500);
    digitalWrite(8, LOW); //wlacz diode
    delay (600);
    digitalWrite(7, LOW); //wlacz diode
    delay (700);
    digitalWrite(6, LOW); //wlacz diode
    delay (800);
    digitalWrite(5, LOW); //wlacz diode
    delay (900);
    digitalWrite(4, LOW); //wlacz diode
    delay (1000);
    digitalWrite(3, LOW); //wlacz diode
    delay (1100);
    digitalWrite(2, LOW); //wlacz diode
    delay (1200);
    digitalWrite(1, LOW); //wlacz diode
    delay (1400);
    digitalWrite(A5, LOW); //wlacz diode
    delay (1500);
    digitalWrite(A4, LOW); //wlacz diode
    delay (1600);
    digitalWrite(A3, LOW); //wlacz diode
    delay (1800);
    digitalWrite(A2, LOW); //wlacz diode
    delay (1900);
    digitalWrite(A1, LOW); //wlacz diode
    delay (2000);
    digitalWrite(A0, LOW); //wlacz diode
    Serial.print ("diody wlaczone 13");
    delay (400);
    digitalWrite(9, HIGH); //wylacz diode
    delay (500);
    digitalWrite(8, HIGH); //wylacz diode
    delay (500);
    digitalWrite(7, HIGH); //wylacz diode
    delay (500);
    digitalWrite(6, HIGH); //wylacz diode
    delay (500);
    digitalWrite(5, HIGH); //wylacz diode
    delay (500);
    digitalWrite(4, HIGH); //wylacz diode
    delay (500);
    digitalWrite(3, HIGH); //wylacz diode
    delay (500);
    digitalWrite(2, HIGH); //wylacz diode
    delay (500);
    digitalWrite(1, HIGH); //wylacz diode
    delay (500);
    digitalWrite(A5, HIGH); //wylacz diode
    delay (500);
    digitalWrite(A4, HIGH); //wylacz diode
    delay (500);
    digitalWrite(A3, HIGH); //wylacz diode
    delay (500);
    digitalWrite(A2, HIGH); //wylacz diode
    delay (500);
    digitalWrite(A1, HIGH); //wylacz diode
    delay (500);
    digitalWrite(A0, HIGH); //wylacz diode
    }



Za wszelką pomoc dziękuję 
Zrób kurs Arduino. Używaj millis zamiast delay. Pinów 0 i 1 używaj w ostateczności, one służą do UART0 i wgrywania programu.
Jakikolwiek kurs C/C++ i będziesz klepał mniej kodu. Np. piny led można ułożyć w tablice
Kod:
uint8_t led[]= {2,3,4,5,6,7,8,9,10,14,15,16,17,18,19}; //A0 to 14, itd

void setup() {
  // put your setup code here, to run once:
  for (int i=0;i++;i<15)
  {
   pinMode(led[i], OUTPUT); //dioda jako wyjscie
  }
 
}
Ledy i przyciski w tym przypadku można tak ułożyć, że masz ciąg liczb 4-18 i zrobić to nawet bez tablicy. Piny 2 i 3 są stworzone do przycisków/czujek, to wejścia przerwania zewnętrznego. Możesz uśpić cały uC by nie brał prądu i odpala go sygnał z czujki/przycisku. Wtedy też lepiej użyć innej płytki, np. PRO MINI z wywalonym LED od statusu zasilania.
W Twoim kodzie  brakuje } na końcu by zamknąć loop(), jakbyś miał mniej linii kodu, to klikasz przy nawiasach {} i podświetla się jego druga część do pary, ale jak masz naklepane 50 linii zamiast 5 to ciężko to zauważyć.
Myślałem też żeby użyć cd74hc4067 wtedy zostanie użyte tylko 4 piny na arduino plus 2x czujki. Czy to dobry pomysł czy lepiej zostać przy obecnej konfiguracji
Na tym etapie to nie ma znaczenia. Na pewno warto umieć wykorzystywać takie układy.
int pin[14]={4,5,6,7,8,9,10,11,12,13,14,15,16,17};

int q = 0;
byte s = 0;


void setup() {

Serial.begin(9600);

pinMode( 2 , INPUT);
pinMode( 3 , INPUT);

pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
pinMode(14, OUTPUT);
pinMode(15, OUTPUT);
pinMode(16, OUTPUT);
pinMode(17, OUTPUT);

}

void loop() {

// dół

if (digitalRead(2) == LOW and s == 0){

for( q = 0; q < 13; q++ ){
  digitalWrite( pin[q], HIGH );delay(500);}
 
  s = 1;
 
  }
 
  if (digitalRead(2) == LOW and s == 1 ){

for( q = 13; q >= 0; q-- ){
  digitalWrite( pin[q], LOW );delay(200);}

  s = 0;
 
}

// góra
 
    if (digitalRead(3) == LOW and s == 0){

for( q = 13; q >= 0; q-- ){
  digitalWrite( pin[q], HIGH );delay(500);}
 
  s = 1;
 
  }
 
  if (digitalRead(3) == LOW and s == 1){

for( q = 0; q < 13; q++ ){
  digitalWrite( pin[q], LOW );delay(200);}

  s = 0;

}
}



To stworzyem z pomoca forum, ale zawsze jest ale. Program wyzwala sie samoczynie i wpada w petle chodz czuiniki pir sr501 wogóle nie działają, dołaczyłem diody led do pir by widziec kiedy przekazują sygnał. Jeszcze chciałbym dopisac jeden pin który podczas odpalania pir właczał by zasilanie ledów i działał tak długo by zakonczyc wyłoczenie lub wyłaczenie wszystkich stopni. Ten pin miałyby priorytet jako pierwsszy i ostani.
dziekuje wszytkim za pomoc