niedziela, 6 kwietnia 2014

Arduino - sterowanie przekaźnikiem za pomocą przełącznika lub przez sieć

poprzednim wpisie opisałem mój pomysł na stosunkowo wygodne podłączenie do arduino przekaźników oraz przełączników. Tym razem pokażę jak takie połączenie można wykorzystać w praktyce. Jak pewnie zauważyliście na zdjęciach, dołączyłem do mojego arduino ethernet shield dzięki któremu będzie możliwe sterowanie urządzeniami za pośrednictwem sieci ethernet.

Przykład który pokażę pozwala na załączenie lub wyłączenie przekaźnika za pomocą przycisku dzwonkowego, lub za pomocą pakietu TCP o odpowiedniej treści.
Jeśli będziemy potrafili załączyć przekaźnik pakietem TCP, będziemy mogli sterować nim z poziomu dowolnego urządzenia - z komputera, telefonu, tabletu...

Przypuśćmy że chcemy sterować przekaźnikiem załączającym oświetlenie LED w salonie.

Program sterujący dla przejrzystości podzieliłem na 3 pliki:

1. _01_homeController.ino
Jest to główny plik zawierający funkcję inicjującą oraz pętlę główną
2.  _02_salon_led.ino
W tym pliku zawarta jest obsługa przycisku oraz przekaźnika
3. _03_network.ino
W tym pliku zawarta jest obsługa połączenia sieciowego
Wydaje mi się że kod jest dość przejrzysty i czytelny. Nie będę zatem opisywał go linia po linii.

Zwróćcie uwagę na nazewnictwo plików które zastosowałem. Arduino IDE sortuje zakładki w projekcie w sposób alfabetyczny. Na początku nazwałem pliki

salon_led.ino
network.ino

zakładka z plikiem network.ino ustawiła się przed zakładką salon_led.ino

otrzymywałem wtedy błąd "SALON_LED_REMOTE_COMMAND was not declared in this scope" w linii 55'tej pliku network.ino.
Nie pomaga tutaj żadne include'owanie plików. Jedyne co pomogło to przeorganizowanie zakładek. Dziwne... Ale tak jest :).
Podłączony układ wygląda następująco:

Działanie całego układu najlepiej zobrazuje poniższy film:

Komunikację sieciową z Arduino trochę ławiej byłoby zrobić za pomocą pakietów UDP, chciałem jednak żeby ten wpis był wstępem do sterowania urządzeniami poprzez OpenHab a niestety natrafiłem na problemy z połączeniem OpenHab i Arduino za pośrednictwem UDP.

15 komentarzy:

  1. Swietny blog.
    Leci do zakladek ;)

    OdpowiedzUsuń
  2. Jak połączył Pan te 3 pliki ?

    OdpowiedzUsuń
  3. Witam, wygrzebałem projekt z googla. Czy mogę dostać cały kod? Ewentualnie jak połączyć te 3 pliki?
    Jestem kompletnie zielony w arduino, a to było pierwsze co mi przyszło do głowy (inteligentnt dom).

    OdpowiedzUsuń
  4. Dodajecie zakładkę w programie arduino IDE, nazywacie ją _02_salon_led i wklejacie zawartość drugiego programu. Przy weryfikacji i ładowaniu zakładki zostaną sklejone ze sobą w jeden większy program. To samo tyczy się zakładki nr 3 i programu nr 3.

    OdpowiedzUsuń
  5. Autorze, działa Ci kod z drugiej Zakładki ? U mnie przekaźnik sobie mrugał bo wykonywał funkcję toggle następnie czekał 0,5s i znów wykonywał toggle. Rozwiązanie uzyskane dzięki pomocy grupy Arduino na FB:

    String SALON_LED_REMOTE_COMMAND("salonled#");
    const int SALON_LED_BUTTON_PIN = 8; // zmieniłem bo prototypy testuje na UNO
    const int SALON_LED_RELAY_PIN = 9; // zmieniłem bo prototypy testuje na UNO

    const int SALON_LED_AFTER_CHANGE_DELAY = 500;

    int salonLedButtonState;
    int salonLedState = LOW;

    void initializeSalonLed() {
    pinMode(SALON_LED_BUTTON_PIN, INPUT_PULLUP);
    pinMode(SALON_LED_RELAY_PIN, OUTPUT);
    setSalonLedState(LOW);
    }

    void checkSalonLed() {
    salonLedButtonState = digitalRead(SALON_LED_BUTTON_PIN);
    if (salonLedButtonState == LOW) {
    toogleSalonLed();
    delay(SALON_LED_AFTER_CHANGE_DELAY);
    }
    }

    void setSalonLedState(int state) {
    digitalWrite(SALON_LED_RELAY_PIN, state);
    salonLedState = state;
    }

    void toogleSalonLed() {
    if (salonLedState == HIGH) {
    setSalonLedState(LOW);
    } else {
    setSalonLedState(HIGH);
    }
    }

    OdpowiedzUsuń
  6. Witam
    Ratunku koledzy podajcie jaki kod trzeba wgrać żeby uzyskać sterowanie przekaźnikiem podaję plus załączył podaję ponownie plus wyłączył jak w tym filmie https://www.youtube.com/watch?v=_2Bcd2FYU3M

    OdpowiedzUsuń
  7. Zapomniałem dopisać typ Arduino Mega 2560

    OdpowiedzUsuń
  8. zrobić prostą funkcję toggle (przełącz stan) i tyle. przejrzyj przykłady na necie bo to nie jest skomplikowane.

    OdpowiedzUsuń
  9. Witaj
    No dzięki za ""radę i pomoc baaardzo mi pomogłeś"" jedyne co działa z tych wszystkich skryptów to wyjścia analog mogę sobie pykać przekaźnikiem zał/wył w automacie jak kierunkowskazy w samochodzie do tego mogę zrobić sobie przerzutnik albo kupić przerywacz od jakiegoś samochodu
    Chyba cały net przejrzałem próbowałem nawet twoje wgrać Błąd kopiowania Błąd kompilacji
    THX pozdro

    OdpowiedzUsuń
  10. Szkoda że nie można edytować znalazłem skrypt w samym programie ale może tu uzyskam pomoc jak połączyć skrypty żeby wpisać następne wyjścia .Mam taki i działa i mogę zmieniać porty ale jak dołożyć następne porty?
    Ten działa
    http://www.arduino.cc/en/Tutorial/Debounce
    */

    // constants won't change. They're used here to
    // set pin numbers:
    const int buttonPin = 47; // the number of the pushbutton pin
    const int ledPin = 49; // the number of the LED pin

    // Variables will change:
    int ledState = HIGH; // the current state of the output pin
    int buttonState; // the current reading from the input pin
    int lastButtonState = LOW; // the previous reading from the input pin

    // the following variables are long's because the time, measured in miliseconds,
    // will quickly become a bigger number than can be stored in an int.
    long lastDebounceTime = 0; // the last time the output pin was toggled
    long debounceDelay = 50; // the debounce time; increase if the output flickers

    void setup() {
    pinMode(buttonPin, INPUT);
    pinMode(ledPin, OUTPUT);

    // set initial LED state
    digitalWrite(ledPin, ledState);
    }

    void loop() {
    // read the state of the switch into a local variable:
    int reading = digitalRead(buttonPin);

    // check to see if you just pressed the button
    // (i.e. the input went from LOW to HIGH), and you've waited
    // long enough since the last press to ignore any noise:

    // If the switch changed, due to noise or pressing:
    if (reading != lastButtonState) {
    // reset the debouncing timer
    lastDebounceTime = millis();
    }

    if ((millis() - lastDebounceTime) > debounceDelay) {
    // whatever the reading is at, it's been there for longer
    // than the debounce delay, so take it as the actual current state:

    // if the button state has changed:
    if (reading != buttonState) {
    buttonState = reading;

    // only toggle the LED if the new button state is HIGH
    if (buttonState == HIGH) {
    ledState = !ledState;
    }
    }
    }

    // set the LED:
    digitalWrite(ledPin, ledState);

    // save the reading. Next time through the loop,
    // it'll be the lastButtonState:
    lastButtonState = reading;
    }

    Jeżeli skopiuję to do tego samego pliku zmieniając porty czyli mam jak by dwa wisy błąd kopiowania Błąd kompilacj Co robię źle?

    OdpowiedzUsuń
  11. Czy mógłby mi ktoś podać kod bez obsługi przycisku, ponieważ korzystam z arduino NG i kod się nie mieści.

    OdpowiedzUsuń
  12. Hej, w jaki sposób z serwera wysyłana jest paczka danych, którą odbiera arduino? Stworzyłem serwer php i nie wiem jak wysłać daną do arduino. Pozdrawiam :)

    OdpowiedzUsuń
  13. A jest możliwość rozbudowy tego projektu do możliwości prostego okienka logowania się i podawania hasła oraz czy jest możliwość podejrzenia stanu oświetlenia czy jest załączone czy zgaszone? Chciałbym coś takiego podłączyć do oświetlenia korytarzowego. Przekaźnik symulowałby działanie włącznika krzyżowego, żeby równolegle można zmieniać jego stan przez sieć i na miejscu.
    Pozdrawiam fajny projekt
    Rafał

    OdpowiedzUsuń
  14. Co trzeba zrobić żeby to działało z Domoticzem ?

    OdpowiedzUsuń