Skocz do zawartości

Problem z załaczeniem przekażników


Pomocna odpowiedź

Witam serdecznie wszystkich. Jest to mój pierwszy post na tym forum, po rozpoczęciu Waszego kursu na Forbocie o programowaniu Arduino postanowiłem spróbować swoich sił w napisaniu jakiegoś prostego programu , który chcę wykorzystać przyszłościowo. Napisałem program uwzględniając potrzebne komentarze, jednak po skompilowaniu i wgraniu programu do Arduino Uno, program nie działa według mojego założenia. Poradźcie mi proszę gdzie popełniam błędy i co muszę zmienić abym nie zszedł na zawał🙀😫. Siedzę już trzeci wieczór i dalej klops... Nie mam już pomysłów. Na dzień dzisiejszy program po uruchomieniu załącza przekaźniki w takim samym cyklu, samoczynnie bez wciskania jakiegokolwiek przycisku.. co jest nie tak?

Program

//test nr1


void setup() {      

  pinMode(6, INPUT_PULLUP);//przełacznik typu krańcówka /test palcem
  pinMode(8, OUTPUT); //moduł płytki 1 przekażnika załączany stanem wysokim
  pinMode(9, OUTPUT); //moduł płytki 2 przekażnika załączany stanem wysokim
  pinMode(7, INPUT_PULLUP);  //5V z modułu czujnika

  digitalWrite(6, LOW); //ustawienie portów po włączeniu zasilania
  digitalWrite(8, LOW);//   ---------------||----------------------
  digitalWrite(9, LOW);//   ---------------||----------------------
  digitalWrite(7, LOW); // ---------------||----------------------
}

void loop()
{  if (digitalRead(6) == HIGH)     //jeśli przycisk wciśnięty
      {digitalWrite(8, HIGH);     //Włącz przekaźnik2
      delay(1000);                //utrzymaj włączony 1 sekundę
      {digitalWrite(8, LOW);      //wyłącz przekaźnik 2
      delay(1000);}               //odczekaj 1 sekundę
      {digitalWrite(9, HIGH);     //włącz przekaźnik 1
      delay(5000);}               //utrzymaj włączony 5 sekund
      }else {                     //Jeśli warunek nie został spełniony (przycisk nie jest wciśnięty)
      digitalWrite(9, LOW);       //wyłacz przekaźnik 1
      digitalWrite(8, LOW);}      //wyłacz przekaźnik 2
   
if (digitalRead(9) == HIGH && digitalRead(7) == HIGH)     //Jeśli na pinie 9 jest stan wysoki oraz na wejsciu pin 7 jest stan wysoki to
      {digitalWrite(9, LOW);      //odłącz przekaźnik 1
      digitalWrite(8, LOW);}      //odłącz przekaźnik 2
      else {                      //Jeśli warunek nie został spełniony (przycisk nie jest wciśnięty, brak stanu wyskoiego pin 7)
      digitalWrite(9, LOW);       //wyłacz przekaźnik 2
      digitalWrite(8, LOW);       //wyłacz przekaźnik 1

}

}

 

Edytowano przez marcinpaj
Link to post
Share on other sites
(edytowany)
3 godziny temu, farmaceuta napisał:

Pozbadz sie tych nawiasow klamrowych za pierwszym if'em...takich rzeczy sie nie praktykuje ..i powinno dzialac...

A sprawdzałeś te nawiasy? Są one poprawnie wstawione i nie wpływają na działanie programu...

Poza tym się praktykuje jak chcesz mieć porządek w kodzie 😉 Ostatnio przy robieniu AI dość często klamrowałem konkretne sekcje kodu, by łatwiej się czytało.

Tutaj jest większy problem w postaci tego drugiego if'a, który nie wiadomo co robi... Poza tym samoczynne załączanie wynika z tego, że użyłeś INPUT_PULLUP dla przycisków, więc zawsze będą miały stan wysoki, o ile nie doprowadzisz ich do masy.

void setup() {

  pinMode(6, INPUT_PULLUP);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(7, INPUT_PULLUP);

  digitalWrite(6, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(7, LOW);
}

void loop() {
    if (digitalRead(6) == LOW) { // Input_pullup zawsze daje stan wysoki, krańcówka sprawdza go do masy więc musimy weryfikować czy stan jest niski
        digitalWrite(8, HIGH);
        delay(1000);
        digitalWrite(8, LOW);
        delay(1000);
        digitalWrite(9, HIGH);
        delay(5000);
    } else {
        digitalWrite(9, LOW);
        digitalWrite(8, LOW);
    }

    // Ten if zarówno w IF-ie jak i w else miał takie same komendy...
    digitalWrite(9, LOW);
    digitalWrite(8, LOW);
}

Pisane na kolanie o 3 w nocy, ale powinno działać...

Edytowano przez H1M4W4R1
  • Lubię! 1
Link to post
Share on other sites

@marcinpaj Nie wyłączasz przekaźnika 1 po pięciu sekundach tak jak to robisz powyżej dla przekaźnika 2 (pierwszy if). Czy tak ma być?

W komentarzach nie powtarzaj się

	if (digitalRead(9) == HIGH && digitalRead(7) == HIGH)     //Jeśli na pinie 9 jest stan wysoki oraz na wejsciu pin 7 jest stan wysoki to

to co napisałeś w komentarzu widać z kodu. Ponadto deklarujesz pin 9 jako OUTPUT a z niego czytasz. Chodzi Ci o stan przekaźnika?

Pozdrawiam

                     Bogusław

PS Moim zdaniem, to dodatkowe grupowanie instrukcji w bloki wewnątrz pierwszego if nie powinny mieć znaczenia.

Link to post
Share on other sites
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

(edytowany)

@H1M4W4R1 Wyprzedziłeś mnie, w dodatku zrobiłeś to lepiej. Też nie możesz spać? 😉

      Pozdrawiam!

               Bogusław

Edytowano przez bjrk
Link to post
Share on other sites
5 godzin temu, H1M4W4R1 napisał:

Poza tym się praktykuje jak chcesz mieć porządek w kodzie 😉 Ostatnio przy robieniu AI dość często klamrowałem konkretne sekcje kodu, by łatwiej się czytało.


void setup() {

  pinMode(6, INPUT_PULLUP);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(7, INPUT_PULLUP);

  digitalWrite(6, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(7, LOW);
}

void loop() {
    if (digitalRead(6) == LOW) { // Input_pullup zawsze daje stan wysoki, krańcówka sprawdza go do masy więc musimy weryfikować czy stan jest niski
        digitalWrite(8, HIGH);
        delay(1000);
        digitalWrite(8, LOW);
        delay(1000);
        digitalWrite(9, HIGH);
        delay(5000);
    } else {
        digitalWrite(9, LOW);
        digitalWrite(8, LOW);
    }

    // Ten if zarówno w IF-ie jak i w else miał takie same komendy...
    digitalWrite(9, LOW);
    digitalWrite(8, LOW);
}

 

Wiem ze mozna sobie dzielic na bloki, no ale w takim kodzie to chyba bezuzyteczne...

Faktycznie chyba pozno bylo i nie zauwazylem ze stany byly problemem...takie proste a czlowiek wciaz moze nie zauwazyc ..he😉

Link to post
Share on other sites
4 minuty temu, farmaceuta napisał:

w takim kodzie to chyba bezuzyteczne

Teoretycznie poprawia czytelność - ale w tym przypadku połączenie tego kodu ze słowem czytelność to oksymoron.

  • Lubię! 1
Link to post
Share on other sites

@marcinpaj A tak z ciekawości. Ta krańcówka jest normalnie zwarta, czy normalnie rozwarta? Podpiąłeś ją czy na razie zastąpiłeś zwykłym przyciskiem (normalnie rozwarty)? Przy okazji: Jakie są Twoje założenia i jak wg Ciebie ten program ma działać?

Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.