Skocz do zawartości

Arduino przełącznik on/off


Pomocna odpowiedź

49 minut temu, ethanak napisał:

A przede wszystkim mówisz o on-off czy on-off-on?

Tu muszę sprostować bo mówiąc o dwupozycyjnym miałem na myśli trzypozycyjny czyli on-off-on, ale to nic nie zmienia bo dalej mogę tu użyć jednego pinu😁hehe

Przed chwilą, ethanak napisał:

 Jeśli tak to schemat i kod poproszę.

Kod to akurat latwizna, ale fakt..jeśli chce odczytywać dwa stany na tym pinie to mogę zapomnieć o podciąganiu rezystorów, a wiadomo co się może stać na takim pinie😢

Dodam że na dwupozycyjnym (trzy piny) już można by bez problemu zrobić to na jednym pinie (on-off/ +-S-(-)) no ale wtedy jeden stan byłby ciągle ustalony a tego nie wiem czy autorowi by odpowiadalo

4 minuty temu, ethanak napisał:

Czyli nie łatwizna i przyznaj się do błędu 😉

Oczywiście że przyznaje się do błędu 😁 zapomniałem o tym co się dzieje na pinie input bez podciągania...

(edytowany)
4 minuty temu, dominik.andreck napisał:

Chodzi o przelacznik 2 pozycyjny albo on albo off (2 Piny) 

Ok więc się wyjaśniło 😉 a powiedz jeszcze łaskawie, czy gdy sekwencja kodu1 się wykona to ma się wykonać po przerwie kod2?? Bo tak zrozumiałem z twojego opisu..("po upływie 1s.......")

Edytowano przez farmaceuta
(edytowany)
7 minut temu, dominik.andreck napisał:

Przycisk on - ma wykonać kod1

Czekać na zmianę stanu

I drugą wersję kodu

E to latwizna..😉 napewno sobie poradzisz 👍😁

 

Edit...świrowałem😜 wiem jak to jest jak człowiek chce coś zrobić a nie potrafi..na spokojnie coś się napiszę, cierpliwości😉

Edytowano przez farmaceuta
(edytowany)
23 godziny temu, farmaceuta napisał:

Kod to akurat latwizna, ale fakt..jeśli chce odczytywać dwa stany na tym pinie to mogę zapomnieć o podciąganiu rezystorów, a wiadomo co się może stać na takim pinie😢

A jak zachowa się pin bez wewnętrznych podciągnięć i zewnętrznym dzielnikiem na wartość "zakazaną" - wyższe od GND, niższe od VCC? Nie wiem, pytam się, może głupio, może mądrze. Można spróbować taką implementację dwóch stanów na jednym pinie. Zarówno wejście, jak i wyjście, tylko wtedy jak układ odbierający taki sygnał się zachowa 😄

Edytowano przez matsobdev

A po co tak, jeśli wystarczy pull* i podłączenie pinu do gnd/vcc?

A w stanie "zakazanym" na pinie będzie stan CWJ 1)

Takie numery mozna robić z pinami analogowymi.

Oczywiście można wykryć kilka różmych napięć na pinie cyfrowym robiąc najprostszą namiastkę adc, ale chyba nie o to chodziło

---

1) Czort Wie Jaki

(edytowany)
#define PRZEKAZNIK1_PIN 2 // pin przekaznika 1
#define PRZEKAZNIK2_PIN 3 // pin przekaznika 2
#define LED_PIN 4 // pin leda
#define INTERWAL 500 // czas "mrygania" led w ms
#define INTERWAL_2 5000 // czas dlugiego wlaczenia led w ms
#define SW_PIN 5   //pin przelacznika 
#define ILOSC_MIGNIEC 10   // ilosc migniec led * 2 (5 migniec = 10)

bool flaga_s1 = 1;
bool flaga_s2 = 1;
bool stan_led = 0;

void setup() {
   pinMode(PRZEKAZNIK1_PIN, OUTPUT);
   pinMode(PRZEKAZNIK2_PIN, OUTPUT);
   pinMode(LED_PIN, OUTPUT);
   pinMode(SW_PIN, INPUT_PULLUP);

}

void loop() {
    if (digitalRead(SW_PIN) == HIGH && flaga_s1 == true) {
      fun(PRZEKAZNIK1_PIN, LED_PIN,INTERWAL,INTERWAL_2);
      flaga_s1 = false;
      flaga_s2 = true;
   }
    if (digitalRead(SW_PIN) == LOW && flaga_s2 == true) {
      fun(PRZEKAZNIK2_PIN, LED_PIN, INTERWAL, INTERWAL_2);
      flaga_s2 = false;
      flaga_s1 = true;
   }

    
}

void fun(byte relay, byte led_pin, int interwal, int interwal_2) {

    digitalWrite(relay, HIGH);
   
  for (byte i = 0; i < ILOSC_MIGNIEC; i++) {
    digitalWrite(led_pin, !stan_led);
    delay(interwal);
  
}
     digitalWrite(relay, LOW);
     digitalWrite(LED_PIN, HIGH);
     delay(interwal_2);
     digitalWrite(LED_PIN, LOW);

}

Tylko tak..podczas uruchomienia wykona się sekwencja 1 lub 2 w zależności od pozycji SW..druga sprawa to to że jak zacznie się wykonywać sekwencja to nie można jej przerwać (musi się skończyć)...sprawdź czy o to Ci chodziło

Edytowano przez farmaceuta
16 godzin temu, farmaceuta napisał:
#define PRZEKAZNIK1_PIN 2 // pin przekaznika 1
#define PRZEKAZNIK2_PIN 3 // pin przekaznika 2
#define LED_PIN 4 // pin leda
#define INTERWAL 500 // czas "mrygania" led w ms
#define INTERWAL_2 5000 // czas dlugiego wlaczenia led w ms
#define SW_PIN 5   //pin przelacznika 
#define ILOSC_MIGNIEC 10   // ilosc migniec led * 2 (5 migniec = 10)

bool flaga_s1 = 1;
bool flaga_s2 = 1;
bool stan_led = 0;

void setup() {
   pinMode(PRZEKAZNIK1_PIN, OUTPUT);
   pinMode(PRZEKAZNIK2_PIN, OUTPUT);
   pinMode(LED_PIN, OUTPUT);
   pinMode(SW_PIN, INPUT_PULLUP);

}

void loop() {
    if (digitalRead(SW_PIN) == HIGH && flaga_s1 == true) {
      fun(PRZEKAZNIK1_PIN, LED_PIN,INTERWAL,INTERWAL_2);
      flaga_s1 = false;
      flaga_s2 = true;
   }
    if (digitalRead(SW_PIN) == LOW && flaga_s2 == true) {
      fun(PRZEKAZNIK2_PIN, LED_PIN, INTERWAL, INTERWAL_2);
      flaga_s2 = false;
      flaga_s1 = true;
   }

    
}

void fun(byte relay, byte led_pin, int interwal, int interwal_2) {

    digitalWrite(relay, HIGH);
   
  for (byte i = 0; i < ILOSC_MIGNIEC; i++) {
    digitalWrite(led_pin, !stan_led);
    delay(interwal);
  
}
     digitalWrite(relay, LOW);
     digitalWrite(LED_PIN, HIGH);
     delay(interwal_2);
     digitalWrite(LED_PIN, LOW);

}

Tylko tak..podczas uruchomienia wykona się sekwencja 1 lub 2 w zależności od pozycji SW..druga sprawa to to że jak zacznie się wykonywać sekwencja to nie można jej przerwać (musi się skończyć)...sprawdź czy o to Ci chodziło

Dziękuje za niego, tylko nie do końca działa
Musiałem dodać 
stan_led = !stan_led; - i dopiero mruga (co prawda na czas kiedy "coś" dzieje się z przekaźnikiem ale okej 😄 )

Tylko nie mogę sobie poradzić z przekaźnikiem oraz dioda
- W stanie wysokim potrzebowałbym aby ona została włączona (a gaśnie)
- A w przekaźniki cały czas są "włączone", jak już zauważyłem działają one przez GND (nie wiem czy są różne rodzaje)
 Raczej słabo aby były cały czas włączone?

 

#define PRZEKAZNIK1_PIN 6 // pin przekaznika 1  - 2
#define PRZEKAZNIK2_PIN 3 // pin przekaznika 2  - 3
#define LED_PIN 13 // pin leda - był 4
#define INTERWAL 250 // czas "mrygania" led w ms
#define INTERWAL_2 1000 // czas dlugiego wlaczenia led w ms
#define SW_PIN 7   //pin przelacznika //5
#define ILOSC_MIGNIEC 15   // ilosc migniec led * 2 (5 migniec = 10)


bool flaga_s1 = 1;
bool flaga_s2 = 1;
bool stan_led = 0;

void setup() {
   pinMode(PRZEKAZNIK1_PIN, OUTPUT);
   pinMode(PRZEKAZNIK2_PIN, OUTPUT);
   pinMode(LED_PIN, OUTPUT);
   pinMode(SW_PIN, INPUT_PULLUP);

}

void loop() {
    if (digitalRead(SW_PIN) == HIGH && flaga_s1 == true) {
      fun(PRZEKAZNIK1_PIN, LED_PIN,INTERWAL,INTERWAL_2);
      flaga_s1 = false;
      flaga_s2 = true;
   }
    if (digitalRead(SW_PIN) == LOW && flaga_s2 == true) {
      fun(PRZEKAZNIK2_PIN, LED_PIN, INTERWAL, INTERWAL_2);
      flaga_s2 = false;
      flaga_s1 = true;
   }

    
}

void fun(byte relay, byte led_pin, int interwal, int interwal_2) {

    digitalWrite(relay, HIGH);
   
  for (byte i = 0; i < ILOSC_MIGNIEC; i++) {
    stan_led = !stan_led; //nie było - nie "mruga" wtedy
    digitalWrite(led_pin, !stan_led);
    delay(interwal); // interwal
    

  
}
     digitalWrite(relay, LOW); //LOW
     digitalWrite(LED_PIN, HIGH);
     delay(interwal); //interwal_2
     digitalWrite(LED_PIN, LOW); //bez tej linijki dioda cały czas jest włączona niezależnie od stanu

}

 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...