Skocz do zawartości

Uniwersalny przełącznik IR


Pomocna odpowiedź

Pomysł
Projekt powstał w celu ułatwienia sobie życia 🙂. A mianowicie nie mam podświetlenia ambient light w TV, więc postanowiłem zamienić sobie lampkę stojącą obok TV na ładne podświetlenie za pomocą paska LED, które będzie wł./wył. za pomocą pilota IR. Jako że na pilocie mam przyciski, których nie używam przy standardowym oglądaniu (REC, REV, PLAY itp.) postanowiłem użyć pilota od TV a nie dodawać do kolekcji kolejnego urządzenia obsługującego tylko pasek LED.

Wykonanie
Projekt powstał tak naprawdę trochę na kolanie z tych części co akurat miałem. Całość oparta jest na ARDUINO NANO. Za pomocą DIODY IR (ja użyłem ze starego tunera DVB-T) ARDUINO odbiera kody z pilota IR i następnie decyduje czy ma przełączyć PRZEKAŹNIK sterujący metrowym PASKIEM LED czy nie. Całość zasilana jest z ZASILACZA 12V. Arduino na stałe pośrednio przez PRZETWORNICĘ DC-DC 5V, a pasek LED przez przekaźnik. Dodatkowo zamontowany jest przycisk w postaci KRAŃCÓWKI do przełączania manualnego (taki „back door” żeby nie trzeba było szukać pilota w razie czego) oraz przechodzenia w tryb programowania. Całość zamknięta w obudowie i zamontowana na plecach TV.

Schemat

1673640938_IRSwitch_bb_12V.thumb.jpg.357043a4e13e4428229149f483099bd5.jpg

Działanie
Po złożeniu wszystkiego podłączamy zasilacz 12V do ~230V i zasilamy układ. Przytrzymujemy przycisk na 10s. układ wchodzi w tryb programowania (2x mrugnięcie dioda LED na arduino), jeżeli przekaźnik był włączony zostanie on wyłączony. Kierujemy pilota na diodę IR i wciskamy pierwszy przycisk służący do włączania (ON), przekaźnik zostanie przełączony, następnie wciskamy kolejny przycisk służący do wyłączania (OFF), przekaźnik zostanie wyłączony. Po udanym programowaniu przekaźnik zostanie ponownie włączony – można już używać pilota. Oczywiście można również zaprogramować ten sam przycisk do ON i OFF. Jeśli chcemy zmienić przyciski do obsługi ponownie wchodzimy w tryb programowania przytrzymując przycisk na obudowie.

OPCJA 2 dla zaawansowanych.
Układ ten również może być wykorzystany do przełączania dowolnego urządzenia ~230V – jedynym ograniczeniem jest zastosowany przekaźnik. W innym projekcie zamiast przetwornicy DC-DC zastosowałem wnętrze ze starej ładowarki 5V (wskazane jest żeby była markowa i izolowana – posiadała transformator). Doprowadzamy do obudowy ~230V rozgałęziamy L. Jeden przewód idzie na przekaźnik drugi do zasilania układu z ładowarki. Rozgałęziamy N. Jeden do Zasilania ładowarki, a drugi do naszego odbiornika. W takim wypadku mamy zasilanie Arduino z ~230V (przez ładowarkę), które może sterować przekaźnikiem. Przekaźnik przełącza napięcie ~230V.

Schemat

367314518_IRSwitch_bb_230V.thumb.jpg.8a06a355048815d3c1f6f5ab5fd93fa9.jpg

KOD


#include <EEPROM.h>
#include <IRremote.h>
#define irPin 11
#define Relay A0
#define Button 12
#define LED 13

IRrecv irrecv(irPin);
decode_results results;

unsigned long Odczyt;
unsigned long Switch_ON;
unsigned long Switch_OFF;

unsigned long Time_1 = 0;
unsigned long Time_2 = 0;
unsigned long Time_3 = 0;

bool buttonState1 = 0;
bool state1 = 0;
bool Program = 0;
bool RelayState = 0;
int Button_Prog = 1;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();

  pinMode(LED, OUTPUT); //Dioda jako wyjście
  pinMode(Relay, OUTPUT); //Dioda jako wyjście

  digitalWrite(LED, LOW); //Wyłączenie diody
  digitalWrite(Relay, HIGH); //Wyłączenie diody

  pinMode(Button, INPUT_PULLUP); //Przycisk jako wejście

  Switch_ON = EEPROMReadlong(1);
  Switch_OFF = EEPROMReadlong(5);

}

void loop() {

  Push();
  Receive();

}

void Receive()
{
  if (irrecv.decode(&results)) {
    Serial.println(Switch_ON);
    Serial.println(Switch_OFF);

    Odczyt = results.value;
    Serial.print("0x");
    Serial.println(Odczyt);
    delay(250);
    irrecv.resume();

    if (Switch_ON == Switch_OFF)
    {
      if ((Odczyt == Switch_ON) || (Odczyt == Switch_OFF))
      {
        RelaySwitch();
       }
    }

    if (Switch_ON != Switch_OFF)
    {
      if (Odczyt == Switch_ON && RelayState == 0)
      {
        RelaySwitchON();
      }
      if (Odczyt == Switch_OFF && RelayState == 1 )
      {
        RelaySwitchOFF();
      }
    }
    irrecv.resume();
  }
}


void Programing()
{
  Button_Prog = 1;
  digitalWrite(Relay, HIGH);
  //Serial.println(Button_Prog);
  Serial.println("---------------");
  Serial.println("Press button ON");
  while (Button_Prog < 3) {
    if (irrecv.decode(&results)) {

      switch (Button_Prog) {
        case 1:
          Odczyt = results.value;
          Serial.print("Recive: ");
          Serial.println(Odczyt);
          Switch_ON = Odczyt;
          Serial.print("Button ON: ");
          Serial.println(Switch_ON);
          EEPROMWritelong(1, Switch_ON);

          delay(1000);
          Serial.println("Relay_ON");
          digitalWrite(LED, HIGH );
          digitalWrite(Relay, LOW);
          RelayState = 1;
          irrecv.resume();
          Button_Prog = 2;
          Serial.println("----------------");
          Serial.println("Press button OFF");
          break;
        case 2:
          Odczyt = results.value;
          Serial.print("Recive: ");
          Serial.println(Odczyt);
          Switch_OFF = Odczyt;
          Serial.print("Button OFF: ");
          Serial.println(Switch_OFF);
          EEPROMWritelong(5, Switch_OFF);
          delay(1000);
          Serial.println("Relay_OFF");
          digitalWrite(LED, LOW );
          digitalWrite(Relay, HIGH);
          RelayState = 0;
          irrecv.resume();
          Button_Prog = 3;
          Program = 0;
          Serial.println("----------------");
          Serial.println("Programing mode OFF");
          Serial.println("*******************");
          delay(1000);
          break;
      }

    }

  }
}

void Push() {

  buttonState1 = digitalRead(Button);

  Time_1 = millis();

  if (buttonState1 == LOW && Program == 0) {
    if (state1 == 0)
    {
      Time_2 = Time_1;
      // Serial.println("Time_1");
      // Serial.println(Time_1);
    }
    state1 = 1;

    //Serial.println("Time_2");
    //Serial.println(Time_2);
    Time_3 = Time_1 - Time_2;
    if (Time_3 >= 3000)
    {
      Serial.println("*******************");
      Serial.println("Programing mode ON");
      digitalWrite(LED, HIGH );
      delay(200);
      digitalWrite(LED, LOW );
      delay(200);
      digitalWrite(LED, HIGH );
      delay(200);
      digitalWrite(LED, LOW );
      Program = 1;
      Programing();
    }
  }

  if (buttonState1 == HIGH) {
    if (state1 == 1)
    {
      //Serial.println("Time_3");
      //Serial.println(Time_3);
      if (Time_3 >= 100 && Program != 1)
      {

        switch (RelayState)
        {
          case 0:
            RelaySwitchON();
            break;
          case 1:
            RelaySwitchOFF();
            break;
        }
      }
      Time_2 = 0;
    }
    state1 = 0;
  }
}

void RelaySwitchON()
{

  Serial.println("Relay_ON");
  digitalWrite(LED, HIGH );
  digitalWrite(Relay, LOW);
  RelayState = 1;
  // Serial.println("RelayState:");
  // Serial.println(RelayState);
  delay(200);
  Time_3 = 0;

}
void RelaySwitchOFF()
{


  Serial.println("Relay_OFF");
  digitalWrite(LED, LOW );
  digitalWrite(Relay, HIGH);
  RelayState = 0;
  //Serial.println("RelayState:");
  //Serial.println(RelayState);
  delay(200);
  Time_3 = 0;

}
void RelaySwitch()
{

  switch (RelayState)
  {
    case 0:
      Serial.println("Relay_ON");
      digitalWrite(LED, HIGH );
      digitalWrite(Relay, LOW);
      RelayState = 1;
      // Serial.println("RelayState:");
      // Serial.println(RelayState);
      delay(200);
      Time_3 = 0;
      break;

    case 1:
      Serial.println("Relay_OFF");
      digitalWrite(LED, LOW );
      digitalWrite(Relay, HIGH);
      RelayState = 0;
      //Serial.println("RelayState:");
      //Serial.println(RelayState);
      delay(200);
      Time_3 = 0;
      break;
  }

}
void EEPROMWritelong(int address, long value)
{
  //Decomposition from a long to 4 bytes by using bitshift.
  //One = Most significant -> Four = Least significant byte
  byte four = (value & 0xFF);
  byte three = ((value >> 8) & 0xFF);
  byte two = ((value >> 16) & 0xFF);
  byte one = ((value >> 24) & 0xFF);

  //Write the 4 bytes into the eeprom memory.
  EEPROM.write(address, four);
  EEPROM.write(address + 1, three);
  EEPROM.write(address + 2, two);
  EEPROM.write(address + 3, one);
}
long EEPROMReadlong(long address)
{
  //Read the 4 bytes from the eeprom memory.
  long four = EEPROM.read(address);
  long three = EEPROM.read(address + 1);
  long two = EEPROM.read(address + 2);
  long one = EEPROM.read(address + 3);

  //Return the recomposed long by using bitshift.
  return ((four << 0) & 0xFF) + ((three << 8) & 0xFFFF) + ((two << 16) & 0xFFFFFF) + ((one << 24) & 0xFFFFFFFF);
}

DEBUG

Dodałem również możliwość prostego debagu. Na porcie USB wystawiam w którym miejscu znajdujemy się w programie, czy i jaki numer kodu odebraliśmy z pilota, czy przekaźnik został przełączony.

Debug.thumb.jpg.d719070bdfbf5ce485000496b3e537e0.jpg

UWAGA
Jeżeli w pomieszczeniu występują świetlówki lub inne mrugające oświetlenie proces programowania należy przeprowadzić w innym miejscu, lub przy zgaszonym świetle. Mruganie przez świetlówki odbierane jest jako użycie kodu. Po zaprogramowaniu moduł można używać przy włączonym świetle.

Zdjęcia gotowego układu.

IMG_20190125_085408.thumb.jpg.700ebf1e1f1b406cb04a6117fa27f4d6.jpgIMG_20190125_091651.thumb.jpg.2c3fd6ac611ff8bcb222f6052967017f.jpgIMG_20190125_092744.jpg

IMG_20190125_092734.thumb.jpg.c73bf8169a1a6143d065f31e33a71072.jpg

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

Podoba Ci się ten projekt? Zostaw pozytywny komentarz i daj znać autorowi, że zbudował coś fajnego!

Masz uwagi? Napisz kulturalnie co warto zmienić. Doceń pracę autora nad konstrukcją oraz opisem.

@skyguy, właśnie zaakceptowałem opis. Dziękuję za przedstawienie ciekawego projektu, zachęcam do prezentowania kolejnych DIY oraz aktywności na naszym forum 😉

Link to post
Share on other sites

Witam. Czy można pominąć tutaj opcje programowania, Dodać moduł NRF24l01 ? Chciałbym zrobić załączanie i rozłączanie pieca CO ale z pokoju i z kotłowni. Przy rozpalaniu załączam piec oczywiście z kotłowni przyciskiem który załącza przekaźnik 230 V (załacza się zasilanie sterownika pieca CO). Mierzę temperaturę i wysyłam ją do odbiornika który mam w pokoju. Gdy zauważę że w piecu się już wypala (żeby nie schodzić do kotłowni) chciałbym móc wyłączyć piec (przekaźnik) z pokoju. W razie gdyby nie działał odbiornik w pokoju chciałbym mieć możliwość załączania i rozłączania pieca równiez z kotłowni. Robił ktoś coś takiego na 2 arduino ?

 

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.