[ARDUINO] 2 x RGBW na jednym Arduino Mega

Post Reply
KrzysiekW
Posts: 9
Joined: Sat Jan 26, 2019 2:52 pm

Sat Jan 26, 2019 3:10 pm

Witam,

Na wstępie chciałbym Wszystkich powitać. Od niedawna dołączyłem do Supli, to jest mój pierwszy post, więc proszę o wyrozumiałość. Jestem na etapie budowy domu i chciałbym go zautomatyzować przy pomocy Supli. Chciałbym bazować na ARDUINO z uwagi na to iż wszystkie niezbędne obwody elektryczne mam poprowadzone bezpośrednio do rozdzielni (również łączniki).

To tyle tytułem wstępu. Jak dotąd wszystko ładnie zaczyna działać. Chciałbym "wycisnąć" wszystko co się da z każdego zamontowanego arduino w domu i tu napotkałem taki problem.
Próbuję odpalić dwa sterowniki RGB na jednym arduino, jednak jak na razie bezskutecznie :( . Czy któryś z szanownych Kolegów może próbował już coś takiego wykonać?
Oprócz tego jeszcze obsługuję tym samym arduino 9 rolet i 3 lampy.
Poniżej próby moich modyfikacji kodu (przyznam, że trochę na "czuja" to robiłem :roll: ):

Code: Select all

#include <SPI.h>
#include <Ethernet.h>
#include <SuplaDevice.h>


 #define RED_PIN    2
 #define GREEN_PIN  4
 #define BLUE_PIN   5
 #define BRIGHTNESS_PIN        6
 #define COLOR_BRIGHTNESS_PIN  7

 #define RED_PIN_2    44
 #define GREEN_PIN_2  45
 #define BLUE_PIN_2   46
 #define BRIGHTNESS_PIN_2        8
 #define COLOR_BRIGHTNESS_PIN_2  9

 #define BTN_COUNT 3

typedef struct {
  int pin;
  int relay_pin;
  int channel;
  char last_val;
  unsigned long last_time;
} _btn_t;

_btn_t btn[BTN_COUNT];

 unsigned char _red = 0;
 unsigned char _green = 255;
 unsigned char _blue = 0;
 unsigned char _color_brightness = 0;
 unsigned char _brightness = 0;

 unsigned char _red_2 = 0;
 unsigned char _green_2 = 255;
 unsigned char _blue_2 = 0;
 unsigned char _color_brightness_2 = 0;
 unsigned char _brightness_2 = 0;

/*Przełącznik monostabilny*/
/*
void supla_timer() {
  char v;
  unsigned long now = millis();
  
  for(int a=0;a<BTN_COUNT;a++)
    if (btn[a].pin > 0) {
        v = digitalRead(btn[a].pin);
        if (v != btn[a].last_val && now - btn[a].last_time ) {
           btn[a].last_val = v;
           btn[a].last_time = now;
           if (v==0)
             {
                 if ( digitalRead(btn[a].relay_pin) > 0 ) {
                  SuplaDevice.relayOff(btn[a].channel);
                 } else {
                  SuplaDevice.relayOn(btn[a].channel, 0);
                 }        
             }
        }
  
    }
}*/
/*Przełącznik bistbilny*/
void supla_timer() {
  char v;
  unsigned long now = millis();
  
  for(int a=0;a<BTN_COUNT;a++)
    if (btn[a].pin > 0) {
        v = digitalRead(btn[a].pin);
        if (v != btn[a].last_val && now - btn[a].last_time ) {
           btn[a].last_val = v;
           btn[a].last_time = now;
           if (v==0)
             {
                  SuplaDevice.relayOn(btn[a].channel, 0);     
             }
           else
             {
                  SuplaDevice.relayOff(btn[a].channel);
             }
        }
  
    }
}

void supla_btn_init() {
  for(int a=0;a<BTN_COUNT;a++)
    if (btn[a].pin > 0) {
        pinMode(btn[a].pin, INPUT_PULLUP); 
        btn[a].last_val = digitalRead(btn[a].pin);
        btn[a].last_time = millis();
    }
}

void get_rgbw_value(int channelNumber, unsigned char *red, unsigned char *green, unsigned char *blue, unsigned char *color_brightness, unsigned char *brightness) {

if(channelNumber == 9)
  {
    *brightness = _brightness;
    *color_brightness= _color_brightness;

    *red = _red;
    *green = _green;
    *blue = _blue;
  }
else if(channelNumber == 13)
  {   
    *brightness = _brightness_2;
    *color_brightness= _color_brightness_2;

    *red = _red_2;
    *green = _green_2;
    *blue = _blue_2;
  }

}

void set_rgbw() {
    
    analogWrite(BRIGHTNESS_PIN, (_brightness * 255) / 100);
    analogWrite(COLOR_BRIGHTNESS_PIN, (_color_brightness * 255) / 100);
    analogWrite(RED_PIN, _red);
    analogWrite(GREEN_PIN, _green);
    analogWrite(BLUE_PIN, _blue);

    analogWrite(BRIGHTNESS_PIN_2, (_brightness_2 * 255) / 100);
    analogWrite(COLOR_BRIGHTNESS_PIN_2, (_color_brightness_2 * 255) / 100);
    analogWrite(RED_PIN_2, _red_2);
    analogWrite(GREEN_PIN_2, _green_2);
    analogWrite(BLUE_PIN_2, _blue_2);
}


void set_rgbw_value(int channelNumber, unsigned char red, unsigned char green, unsigned char blue, unsigned char color_brightness, unsigned char brightness) {

if(channelNumber = 9)
  {
      _brightness = brightness;
     _color_brightness= color_brightness;
  
     _red = red;
     _green = green;
     _blue = blue;  

    analogWrite(BRIGHTNESS_PIN, (_brightness * 255) / 100);
    analogWrite(COLOR_BRIGHTNESS_PIN, (_color_brightness * 255) / 100);
    analogWrite(RED_PIN, _red);
    analogWrite(GREEN_PIN, _green);
    analogWrite(BLUE_PIN, _blue);


  } 
else if(channelNumber = 13)
  {
  
    _brightness_2 = brightness;
    _color_brightness_2 = color_brightness;
  
    _red_2 = red;
    _green_2 = green;
    _blue_2 = blue;  

    analogWrite(BRIGHTNESS_PIN_2, (_brightness_2 * 255) / 100);
    analogWrite(COLOR_BRIGHTNESS_PIN_2, (_color_brightness_2 * 255) / 100);
    analogWrite(RED_PIN_2, _red_2);
    analogWrite(GREEN_PIN_2, _green_2);
    analogWrite(BLUE_PIN_2, _blue_2);
  }
//     set_rgbw();
}


void supla_rs_SavePosition(int channelNumber, int position) {
    // Save roller shutter position on flash memory.
    // *Arduino EEPROM is not recommended because of write cycle limits.
}

void supla_rs_LoadPosition(int channelNumber, int *position) {
    // Load roller shutter position from flash memory
}

void supla_rs_SaveSettings(int channelNumber, unsigned int full_opening_time, unsigned int full_closing_time) {
    // Save roller shutter settings on flash memory.
    // *Arduino EEPROM is not recommended because of write cycle limits.
}

void supla_rs_LoadSettings(int channelNumber, unsigned int *full_opening_time, unsigned int *full_closing_time) {
    // Load roller shutter settings from flash memory
}

void setup() {

  Serial.begin(9600);
  memset(btn, 0, sizeof(btn));
  btn[0].pin = 42;
  btn[0].relay_pin = 32;
  btn[0].channel = 10;
  btn[1].pin = 43;
  btn[1].relay_pin = 33;
  btn[1].channel = 11;
  btn[2].pin = 47;
  btn[2].relay_pin = 34;
  btn[2].channel = 12;
  supla_btn_init();
  SuplaDevice.setTimerFuncImpl(&supla_timer);

    set_rgbw();

  
    // Set RGBW callbacks
  SuplaDevice.setRGBWCallbacks(&get_rgbw_value, &set_rgbw_value);
 
  // Replace the falowing GUID
  char GUID[SUPLA_GUID_SIZE] = {xx};
  // with GUID that you can retrieve from https://www.supla.org/arduino/get-guid


  // Ethernet MAC address
  uint8_t mac[6] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05};


  /*
   * 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.
   */
    

  // CHANNEL0 - TWO RELAYS (Roller shutter operation)
  SuplaDevice.addRollerShutterRelays(14,     // roleta łazienka - otwieranie 
                                     15);    // roleta łazienka - zamykanie


  SuplaDevice.setRollerShutterButtons(0,    // 0 - Channel Number
                                      56,   // roleta łazienka przycisk otwieranie
                                      57);  // roleta łazienka przycisk zamykanie

    // CHANNEL1 - TWO RELAYS (Roller shutter operation)
  SuplaDevice.addRollerShutterRelays(16,     // roleta kuchnia - otwieranie 
                                     17);     // roleta kuchnia - zamykanie


  SuplaDevice.setRollerShutterButtons(1,    // 1 - Channel Number
                                      58,   // roleta kuchnia przycisk otwieranie
                                      59);  // roleta kuchnia przycisk zamykanie   
                                                                       
    // CHANNEL2 - TWO RELAYS (Roller shutter operation)
  SuplaDevice.addRollerShutterRelays(18,     // roleta jadalnia - otwieranie 
                                     19);    // roleta jadalnia - zamykanie


  SuplaDevice.setRollerShutterButtons(2,    // 2 - Channel Number
                                      60,   // roleta jadalnia przycisk otwieranie
                                      61);  // roleta jadalnia przycisk zamykanie

    // CHANNEL3 - TWO RELAYS (Roller shutter operation)
  SuplaDevice.addRollerShutterRelays(20,     // roleta okno salon - otwieranie 
                                     21);   // roleta okno salon - zamykanie


  SuplaDevice.setRollerShutterButtons(3,    // 3 - Channel Number
                                      62,   // roleta okno salon przycisk otwieranie
                                      63);  // roleta okno salon przycisk zamykanie  

      // CHANNEL4 - TWO RELAYS (Roller shutter operation)
  SuplaDevice.addRollerShutterRelays(26,    // roleta drzwi salon - otwieranie 
                                     24);   // roleta drzwi salon - zamykanie


  SuplaDevice.setRollerShutterButtons(4,    // 4 - Channel Number
                                      64,   // roleta drzwi salon przycisk otwieranie
                                      65);  // roleta drzwi salon przycisk zamykanie

      // CHANNEL5 - TWO RELAYS (Roller shutter operation)
  SuplaDevice.addRollerShutterRelays(25,    // roleta gabinet - otwieranie 
                                     22);   // roleta gabinet - zamykanie


  SuplaDevice.setRollerShutterButtons(5,    // 5 - Channel Number
                                      66,   // roleta gabinet przycisk otwieranie
                                      67);  // roleta gabinet przycisk zamykanie   

      // CHANNEL6 - TWO RELAYS (Roller shutter operation)
  SuplaDevice.addRollerShutterRelays(23,    // roleta łazienka piętro - otwieranie 
                                     27);   // roleta łazienka piętro - zamykanie


  SuplaDevice.setRollerShutterButtons(6,    // 6 - Channel Number
                                      68,   // roleta łazienka piętro przycisk otwieranie
                                      69);  // roleta łazienka piętro przycisk zamykanie   

      // CHANNEL7 - TWO RELAYS (Roller shutter operation)
  SuplaDevice.addRollerShutterRelays(28,    // roleta sypialnia drzwi - otwieranie 
                                     29);   // roleta sypialnia drzwi - zamykanie


  SuplaDevice.setRollerShutterButtons(7,    // 7 - Channel Number
                                      48,   // roleta sypialnia drzwi przycisk otwieranie
                                      49);  // roleta sypialnia drzwi przycisk zamykanie

        // CHANNEL8 - TWO RELAYS (Roller shutter operation)
  SuplaDevice.addRollerShutterRelays(30,    // roleta sypialnia okno - otwieranie 
                                     31);   // roleta sypialnia okno - zamykanie


  SuplaDevice.setRollerShutterButtons(8,    // 8 - Channel Number
                                      40,   // roleta sypialnia okno przycisk otwieranie
                                      41);  // roleta sypialnia okno przycisk zamykanie

                                                                                                                                                                          

  
  SuplaDevice.setRollerShutterFuncImpl(&supla_rs_SavePosition, &supla_rs_LoadPosition, &supla_rs_SaveSettings, &supla_rs_LoadSettings);

    // Set RGBW callbacks
  SuplaDevice.setRGBWCallbacks(&get_rgbw_value, &set_rgbw_value);

// CHANNEL9 - RGB controller and dimmer (RGBW)
  SuplaDevice.addRgbControllerAndDimmer();    

  // CHANNEL10 - RELAY
  SuplaDevice.addRelay(32);           // 32 - Lampy na zewnątrz domu na elewacji z przodu      
                                      
  // CHANNEL11 - RELAY
  SuplaDevice.addRelay(33);           // 33 - Lampa na kalenicy z przodu      


  // CHANNEL12 - RELAY
  SuplaDevice.addRelay(34);           // 34 - Oświetlenie podjazdu - chodnika     
  
  // CHANNEL13 - RGB controller and dimmer (RGBW)
  SuplaDevice.addRgbControllerAndDimmer();   
  
  /*
   * SuplaDevice Initialization.
   * Server address, LocationID and LocationPassword are 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.begin(GUID,              // Global Unique Identifier 
                    mac,               // Ethernet MAC address
                    "svr11.supla.org",  // SUPLA server address
                    xxxx,                // Location ID 
                    "xxxx");           // Location Password
    
}

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