Sterowanie oparte na Arduino Mega + W5100

WinstonW
Posty: 19
Rejestracja: pt lip 10, 2020 3:50 pm

Poniżej umieszczam projekt centrali opartej na Arduino Mega wraz z EthernetShield W5100 , która z powodzeniem jest wykorzystywana w moim domu.Kod oraz rozwiązania są oparte na podstawie zasłużonego oraz bardzo pomocnego użytkownika o nicku :Klew ;)
Z uwagi na brak dostępnych pinów w Arduino ,nie jestem w stanie przetestować czy Arduino Mega jest w stanie obsłużyc jeszcze większość urządzeń

Ważne:przy ostatniej konfiguracji napotkałem na problem że niektóre biblioteki supladevice z githuba Klew ograniczały możliwość rejestracji arduino do supla-wynikało to z ograniczeń danych przekaźników lub przycisków na jednej z bibliotek supla łączyła sie przy ograniczeniu np 16 przekaźników , natomiast inna z bibliotek rejestrowała sie bez problemu (obecnie tak jak wynika to z kodu działają 23 przekaźniki , 3 sesnory oraz 19 przycisków)

Poniżej Kod

Kod: Zaznacz cały


#include <SuplaDevice.h>
#include <supla/control/relay.h>
#include <supla/control/button.h>
#include <supla/sensor/binary.h>

// Choose where Supla should store counter data in persistant memory
// We recommend to use external FRAM memory 
#define STORAGE_OFFSET 100
#include <supla/storage/eeprom.h>
Supla::Eeprom eeprom(STORAGE_OFFSET);
// #include <supla/storage/fram_spi.h>
// Supla::FramSpi fram(STORAGE_OFFSET);

// Choose proper network interface for your card:
#ifdef ARDUINO_ARCH_AVR
  // Arduino Mega with EthernetShield W5100:
  #include <supla/network/ethernet_shield.h>
  // Ethernet MAC address
  uint8_t mac[6] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05};
  Supla::EthernetShield ethernet(mac);
#endif
void setup() {

  Serial.begin(9600);

  // Replace the falowing GUID with value that you can retrieve from https://www.supla.org/arduino/get-guid
  char GUID[SUPLA_GUID_SIZE] = {xxxxxxxxxxxxxxxxxxxxxxxx};

  // Replace the following AUTHKEY with value that you can retrieve from: https://www.supla.org/arduino/get-authkey
  char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {xxxxxxxxxxxxxxxxxxxxx};

  /*
   * Having your device already registered at cloud.supla.org,
   * you want to change CHANNEL sequence or remove any of them,
   * then you must also remove the device itself from cloud.supla.org.
   * Otherwise you will get "Channel conflict!" error.
   */
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                              //  INSTRUKCJA PRZEKAŹNIKÓW (https://forum.supla.org/viewtopic.php?f=61&t=7263)
//auto r1 = new Supla::Control::Relay(x); // sterowany stanem wysokim -bez true, false -stan niskim
//r1->setDefaultStateOn();                // po uruchomieniu urządzenia, przekaźnik będzie włączony
//r1->setDefaultStateOff();               // po uruchomieniu urządzenia, przekażnik będzie wyłączony (domyślne ustawienie)
//r1->setDefaultStateRestore();           // po uruchomieniu urządzenia, przekaźnik wróci do stanu sprzed 
                                          // wyłączenia zasilania urządzenia (wymaga Storage)
//r1->keepTurnOnDuration();               // przekaźnik zapamięta czas wysłany ostatnio przez serwer i będzie używał go przy 
                                          // włączeniu przekaźnika z lokalnego przycisku, lub z kodu. Aby urządzenie 
                                          // zapamiętał czas włączenia, wymagany jest Storage. Bez Storage, czas 
                                          // będzie zapamiętany tylko do resetu.
//r1->turnOn();                           // włącza przekaźnik. Jeśli mamy ustawione "keepTurnOnDuration", to zostanie użyty zapisany wcześniej czas włączenia
//r1->turnOn(czas_w_milisekundach);       // włącza przekaźnik na określony czas
//r1->turnOff();                          // wyłącza przekaźnik
//r1->toggle();                           // przeałącza przekaźnik
//r1->isOn();                             // zwraca true/false w zależności od tego czy przekaźnik jest włączony czy nie

                              // INSTRUKCJA BUTTON (https://forum.supla.org/viewtopic.php?f=61&t=7512)

//auto bx = new Supla::Control::Button (x, true ); //true dla pulldown
//bx->setHoldTime(1000);                           // po 1 s od przytrzymania przycisku zostanie wywołane zdarzenie ON_HOLD
//bx->setMulticlickTime(400 );                     // program zlicza kliknięcia i po upływie 400 ms od puszczenia przycisku, wywoła odpowiednią akcję ON_CLICK_1 do ON_CLICK_9

      //dla przekaźnika bistabilnego (włącz-wyłącz)
//bx->addAction(Supla::TOGGLE, r1, Supla::ON_PRESS); 

      //dla wielokliku (klik-włącza relay1,klik-przytrzymanie włącza relay1+realy2 ,kolejne przytrzymanie wyłacza relay1+realy2 )
//bx->addAction(Supla::TOGGLE, r1, Supla::ON_PRESS);
//bx->addAction(Supla::TOGGLE, r2, Supla::ON_HOLD);

      //dla wielokliku (klik 1-włącza relay1, klik 2-włącza realy2)
//bx->addAction(Supla::TOGGLE, r1, Supla::ON_CLICK_1);  
//bx->addAction(Supla::TOGGLE, r2, Supla::ON_HOLD);

      //nie przezuca relay1 oraz ralay2 , po przytrzymaniu przezuca realy2 i relay1
//bx->addAction(Supla::TOGGLE, r1, Supla::ON_HOLD);
//bx->addAction(Supla::TOGGLE, r2, Supla::ON_HOLD);

                                  //INSTRUKCJA OPISU PINÓW MEGA
//  D0 i D1 - to uart dla połączenia USB - pojawiają się tam różne stany przy starcie więc lepiej ich nie używać.
//  D13 - to niebieska dioda na płytce i sygnalizuje różne stany więc też odpada (chyba taki odpowiednik led config w ESP)
//  D10 - pin wykorzystywany przez ethernet scheld (SS)
//  D50,D51,D52- interfejs SPI wykorzystywany przec ethernet scheld i pamięć FRAM ( MISO,MOSI,SCK.)
//  D53 - pin wykorzystywany standatdowo dla pamięci FRAM z interfejsem SPI (SS) - pozostałe piny magistrali wspólne z etchernet scheld.
                                  //INSTRUKCJA OPISU SENSORÓW
// Zalaczenie sensora nastepuje podczas zwarcia (3v3 poprzez 4,7k + D1 ) z GND
// lub (5V poprzez 10k + D1 ) z GND
// bez true- Zalaczenie sensora nastepuje podczas zwarcia (3v3 poprzez 4,7k + D1 ) z GND lub (5V poprzez 10k + D1 ) z GND
// z true - zwarcie pinu D7 + GND (D8,D0 nie działa d3 działa ale musi miec 0 na starcie))
                   //SERIAL PIN
 //Serial ports: Serial1 on pins 19 (RX) and 18 (TX), Serial2 on pins 17 (RX) and 16 (TX), Serial3 on pins 15 (RX) and 14 (TX
///////////////////////////////////////////////////////////////
//SEKCJA PRZEKAŹNIKÓW 230V
///////////////////////////////////////////////////////////////                          
auto r0 = new Supla::Control::Relay(26); //oswietlenie garaz 
auto r1 = new Supla::Control::Relay(27); //oswietlenie korytarz salon 
auto r2 = new Supla::Control::Relay(28); //oswietlenie schody parter boki 
auto r3 = new Supla::Control::Relay(29); //oswietlenie schody pietro boki
auto r4 = new Supla::Control::Relay(30); //oswietlenie sufit salon LED 
auto r5 = new Supla::Control::Relay(31); //włączenie choinki
auto r6 = new Supla::Control::Relay(32); // oswietlenie światła bramy garażowej
auto r7 = new Supla::Control::Relay(33); // nieprzypisany 1

///////////////////////////////////////////////////////////////
//SEKCJA PRZEKAZNIKÓW 12V
///////////////////////////////////////////////////////////////
auto r8 = new Supla::Control::Relay(34); //oswietlenie korytarz sypialnia 
auto r9 = new Supla::Control::Relay(35); //oswietlenie klatka parter sciana 
auto r10 = new Supla::Control::Relay(36); //oswietlenie klatka pietro sciana
auto r11 = new Supla::Control::Relay(37); //Oświetlenie telewizora

///////////////////////////////////////////////////////////////
//SEKCJA STEROWANIA PRZEKAZNIKAMI BRAM (puszka przy schodach)
///////////////////////////////////////////////////////////////
auto r12 = new Supla::Control::Relay(38); //przekaźnik otwarcia jednym przyciskiem
r12->setDefaultStateOff(); 
r12->keepTurnOnDuration();
r12->turnOn(1500);
auto r13 = new Supla::Control::Relay(39); //przekaznik otwierania bramy wjazdowej 1000ms=1s
r13->setDefaultStateOff(); 
r13->keepTurnOnDuration();
r13->turnOn(1500);
auto r14 = new Supla::Control::Relay(40); //przekaznik otwierania bramy garazowej
r14->setDefaultStateOff(); 
r14->keepTurnOnDuration();
r14->turnOn(1500);
auto r15 = new Supla::Control::Relay(41); //przekaznik otwierania furtki
r15->setDefaultStateOff(); 
r15->keepTurnOnDuration();
r15->turnOn(5000);

///////////////////////////////////////////////////////////////
//SEKCJA PRZEKAZNIKÓW W PUSZKACH SALON
///////////////////////////////////////////////////////////////
auto r16 = new Supla::Control::Relay(42, false); //oswietlenie nad naroznikiem
auto r17 = new Supla::Control::Relay(43, false); //oswietlenie salon sufit

///////////////////////////////////////////////////////////////
//SEKCJA PRZEKAZNIKÓW W PUSZCE SYPIALNIA
///////////////////////////////////////////////////////////////
auto r18 = new Supla::Control::Relay(44, false); //oświetlenie sypialnia lampa sufit
auto r19 = new Supla::Control::Relay(45, false); //oświetlenie sypialnia Led
auto r20 = new Supla::Control::Relay(46); //oświetlenie sypialnia garderoba
r20->setDefaultStateOff(); 
r20->keepTurnOnDuration();
r20->turnOn(50000);
auto r21 = new Supla::Control::Relay(47, false); //nieprzypisany
auto r22 = new Supla::Control::Relay(48, false); //nieprzypisany

///////////////////////////////////////////////////////////////
//SEKCJA SENSORÓW
///////////////////////////////////////////////////////////////
new Supla::Sensor::Binary(11, true); //kontaktron bramy wjazdowej -brama zamknięta
                                     //false-zalaczenie sensora nastepuje podczas zwarcia (3v3 poprzez 4,7k + D1 ) z GND lub (5V poprzez 10k + D1 ) z GND
                                     //true -zwarcie D1 z GND
new Supla::Sensor::Binary(12, true); //kontaktron bramy wjazdowej -brama otwarta
new Supla::Sensor::Binary(2, false); //kontaktron bramy garażowej pull down

///////////////////////////////////////////////////////////////
//SEKCJA BUTTONÓW
///////////////////////////////////////////////////////////////
auto b0 = new Supla::Control::Button(24, false ); //oswietlenie garaz 
b0->setHoldTime(1000);// po 2 s od przytrzymania przycisku zostanie wywołane zdarzenie ON_HOLD
b0->addAction(Supla::TOGGLE, r0, Supla::ON_PRESS); //przerzuca oś.garaz właczy-wyłacz
b0->addAction(Supla::TOGGLE, r6, Supla::ON_HOLD); //po przytrzymaniu przerzuca oś.światła garaz brama

auto b1 = new Supla::Control::Button(23, false ); //oswietlenie korytarz salon
b1->addAction(Supla::TOGGLE, r1, Supla::ON_PRESS);

auto b2 = new Supla::Control::Button(20, false ); //oswietlenie schody parter boki
b2->addAction(Supla::TOGGLE, r2, Supla::ON_PRESS);

auto b3 = new Supla::Control::Button(17, true ); //oswietlenie schody pietro boki 
b3->setHoldTime(1000);// po 2 s od przytrzymania przycisku zostanie wywołane zdarzenie ON_HOLD
b3->addAction(Supla::TOGGLE, r3, Supla::ON_PRESS);//przerzuca oś. schody pietro właczy-wyłacz
b3->addAction(Supla::TOGGLE, r10, Supla::ON_HOLD);//po przytrzymaniu przerzuca oś.lampa piętro

auto b4 = new Supla::Control::Button(21, false ); //oswietlenie sufit salon LED
b4->addAction(Supla::TOGGLE, r4, Supla::ON_PRESS);

auto b5 = new Supla::Control::Button(25, false ); //włączenie choinki
b5->addAction(Supla::TOGGLE, r5, Supla::ON_PRESS);

auto b6 = new Supla::Control::Button(22, false ); //oswietlenie sypialnia 
b6->setHoldTime(1000);// po 2 s od przytrzymania przycisku zostanie wywołane zdarzenie ON_HOLD
b6->addAction(Supla::TOGGLE, r19, Supla::ON_PRESS);//;przerzuca oś.sypialni LED właczy-wyłacz
b6->addAction(Supla::TOGGLE, r18, Supla::ON_HOLD);//po przytrzymaniu przerzuca oś.sypialni Lampy

auto b7 = new Supla::Control::Button(19, false ); //nieprzypisany
b7->addAction(Supla::TOGGLE, r7, Supla::ON_PRESS);

auto b8 = new Supla::Control::Button(16, false ); //oswietlenie korytarz sypialnia
b8->addAction(Supla::TOGGLE, r8, Supla::ON_PRESS);

auto b9 = new Supla::Control::Button(15, false ); //oswietlenie klatka parter sciana
b9->addAction(Supla::TOGGLE, r9, Supla::ON_PRESS);

auto b10 = new Supla::Control::Button(14, false ); //oswietlenie garderoba sypialni
b10->addAction(Supla::TOGGLE, r20, Supla::ON_PRESS);

auto b11 = new Supla::Control::Button(9, false ); //oświetlenie telewizora
b11->addAction(Supla::TOGGLE, r11, Supla::ON_PRESS);

auto b12 = new Supla::Control::Button(8, false ); //otwarcia jednym przyciskiem
b12->addAction(Supla::TOGGLE, r12, Supla::ON_PRESS);

auto b13 = new Supla::Control::Button(7, false ); //otwierania bramy wjazdowej 
b13->addAction(Supla::TOGGLE, r13, Supla::ON_PRESS);

auto b14 = new Supla::Control::Button(6, false ); //otwierania bramy garazowej
b14->addAction(Supla::TOGGLE, r14, Supla::ON_PRESS);

auto b15 = new Supla::Control::Button(5, false ); //przekaznik otwierania furtki
b15->addAction(Supla::TOGGLE, r15, Supla::ON_PRESS);

auto b16 = new Supla::Control::Button(4, false ); //oswietlenie nad naroznikiem
b16->addAction(Supla::TOGGLE, r16, Supla::ON_PRESS);

auto b17 = new Supla::Control::Button(3, false ); //oswietlenie salon sufit
b17->addAction(Supla::TOGGLE, r17, Supla::ON_PRESS);

auto b18 = new Supla::Control::Button(49, true ); //nieprzypisany
b18->addAction(Supla::TOGGLE, r18, Supla::ON_PRESS); //nieprzypisany


 

  /*
   * Server address is available at https://cloud.supla.org 
   * If you do not have an account, you can create it at https://cloud.supla.org/account/create
   * SUPLA and SUPLA CLOUD are free of charge
   */

 SuplaDevice.setName("xxxxxxxxxxxxxxxxx");
 SuplaDevice.begin(GUID, // Global Unique Identifier
                    "xxxxxxxx", // SUPLA server address
                    "xxxxxxxxxxxx@gmail.com", // Email address used to login to Supla Cloud
                    AUTHKEY); // Authorization key
    
}

void loop() {
  SuplaDevice.iterate();
}



ODPOWIEDZ

Wróć do „Projekty użytkowników”