• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Przekaźniki, prośba o pomoc
#1
Witam wszystkich
Od paru dni jak tylko mam czas siedzę przy problemie który pojawił się w związku z chęcią zamiany instalacji oświetleniowej na taką bardziej inteligentnąWink
Mój problem (dla większości przebywających tu osób  pewnie błahy) na którym się zatrzymałem polega na tym, że nie potrafię dodać do kodu więcej jak 10 przekaźników sterowanych przez Mega2560.. ale po kolei:
Mam Mega2560 (klon) do tego 3x plytki z 8 przekaźnikami takimi jak w tym linku https://botland.com.pl/pl/przekazniki/29...ieski.html
Arduino zasilane zasilaczem 12V a przekaźniki przetwornicą na 5V. Komplet ma być użyty do sterowania światłem w domu przez łączniki "dzwonkowe" na ścianach oraz przez np tablet dzięki  RPi3B+ z domoticzem. Problem polega na tym, że mam do podpięcia 24 przekaźniki z czego 12 ma być sterowane, także przez przyciski dzwonkowe. 
Kod, który metodą prób i błędów przerobiłem dzięki informacją w Internecie niestety kończy się na pinie 13 Sad Chciałbym wykorzystać resztę dostępnych pinów ale nie potrafię zrobić tego tak aby działały Sad  Będę wdzięczny za podpowiedzi jak mam do tego się dalej zabrać, chciałbym rozwiązać problem i przy okazji się czegoś nauczyć na przyszłość.

Szkic:

Kod:
// Enable debug prints to serial monitor
#define MY_DEBUG


// Enable and select radio type attached
//#define MY_RADIO_NRF24
//#define MY_RADIO_RFM69

// Set LOW transmit power level as default, if you have an amplified NRF-module and
// power your radio separately with a good regulator you can turn up PA level.
//#define MY_RF24_PA_LEVEL RF24_PA_LOW

// Enable serial gateway
#define MY_GATEWAY_SERIAL

// Define a lower baud rate for Arduino's running on 8 MHz (Arduino Pro Mini 3.3V & SenseBender)
#if F_CPU == 8000000L
#define MY_BAUD_RATE 38400
#endif

// Flash leds on rx/tx/err
// #define MY_LEDS_BLINKING_FEATURE
// Set blinking period
// #define MY_DEFAULT_LED_BLINK_PERIOD 300

// Inverses the behavior of leds
// #define MY_WITH_LEDS_BLINKING_INVERSE

// Enable inclusion mode
#define MY_INCLUSION_MODE_FEATURE
// Enable Inclusion mode button on gateway
#define MY_INCLUSION_BUTTON_FEATURE

// Inverses behavior of inclusion button (if using external pullup)
//#define MY_INCLUSION_BUTTON_EXTERNAL_PULLUP

// Set inclusion mode duration (in seconds)
#define MY_INCLUSION_MODE_DURATION 60
// Digital pin used for inclusion mode button
#define MY_INCLUSION_MODE_BUTTON_PIN  3

// Uncomment to override default HW configurations
//#define MY_DEFAULT_ERR_LED_PIN 4  // Error led pin
//#define MY_DEFAULT_RX_LED_PIN  6  // Receive led pin
//#define MY_DEFAULT_TX_LED_PIN  5  // the PCB, on board LED

#include <SPI.h>
#include <MySensors.h> 
#include <Bounce2.h>

// Enable repeater functionality for this node
#define MY_REPEATER_FEATURE


#define RELAY_1  4  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
#define RELAY_2  5
#define RELAY_3  6
#define RELAY_4  7
#define RELAY_5  8
#define RELAY_6  9
#define RELAY_7  10
#define RELAY_8  11
#define RELAY_9  12
#define RELAY_10  13

#define NUMBER_OF_RELAYS 10 // Total number of attached relays
#define RELAY_ON 1  // GPIO value to write to turn on attached relay
#define RELAY_OFF 0 // GPIO value to write to turn off attached relay

#define BUTTON_PIN A1
#define BUTTON2_PIN A2
#define BUTTON3_PIN A3
#define BUTTON4_PIN A4
#define BUTTON5_PIN A5
#define BUTTON6_PIN A6
#define BUTTON7_PIN A7
#define BUTTON8_PIN A8
#define BUTTON9_PIN A9
#define BUTTON10_PIN A10


void before() {
  for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) {
    // Then set relay pins in output mode
    pinMode(pin, OUTPUT);  
    // Set relay to last known state (using eeprom storage)
    digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF);
  }
}
Bounce debouncer = Bounce();
Bounce debouncer2 = Bounce();
Bounce debouncer3 = Bounce();
Bounce debouncer4 = Bounce();
Bounce debouncer5 = Bounce();
Bounce debouncer6 = Bounce();
Bounce debouncer7 = Bounce();
Bounce debouncer8 = Bounce();
Bounce debouncer9 = Bounce();
Bounce debouncer10 = Bounce();


void setup() {
  // Setup locally attached sensors
  delay(10000);
   // Setup the button.
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  pinMode(BUTTON2_PIN, INPUT_PULLUP);
  pinMode(BUTTON3_PIN, INPUT_PULLUP);
  pinMode(BUTTON4_PIN, INPUT_PULLUP);
  pinMode(BUTTON5_PIN, INPUT_PULLUP);
  pinMode(BUTTON6_PIN, INPUT_PULLUP);
  pinMode(BUTTON7_PIN, INPUT_PULLUP);
  pinMode(BUTTON8_PIN, INPUT_PULLUP);
  pinMode(BUTTON9_PIN, INPUT_PULLUP);
  pinMode(BUTTON10_PIN, INPUT_PULLUP);

  // After setting up the button, setup debouncer.
  debouncer.attach(BUTTON_PIN);
  debouncer.interval(5);
  debouncer2.attach(BUTTON2_PIN);
  debouncer2.interval(5);
  debouncer3.attach(BUTTON3_PIN);
  debouncer3.interval(5);
  debouncer4.attach(BUTTON4_PIN);
  debouncer4.interval(5);
  debouncer5.attach(BUTTON5_PIN);
  debouncer5.interval(5);
  debouncer6.attach(BUTTON6_PIN);
  debouncer6.interval(5);
  debouncer7.attach(BUTTON7_PIN);
  debouncer7.interval(5);
  debouncer8.attach(BUTTON8_PIN);
  debouncer8.interval(5);
  debouncer9.attach(BUTTON9_PIN);
  debouncer9.interval(5);
  debouncer10.attach(BUTTON10_PIN);
  debouncer10.interval(5);
 

  //presentation();
}
void presentation() 
{  
  // Send the sketch version information to the gateway and Controller
  sendSketchInfo("Relay", "1.0");

  for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) {
    // Register all sensors to gw (they will be created as child devices)
    present(sensor, S_LIGHT);
  }
}

MyMessage msg(1, V_LIGHT);
MyMessage msg2(2, V_LIGHT);
MyMessage msg3(3, V_LIGHT);
MyMessage msg4(4, V_LIGHT);
MyMessage msg5(5, V_LIGHT);
MyMessage msg6(6, V_LIGHT);
MyMessage msg7(7, V_LIGHT);
MyMessage msg8(8, V_LIGHT);
MyMessage msg9(9, V_LIGHT);
MyMessage msg10(10, V_LIGHT);



void loop() {
  // Send locally attached sensor data here
  if (debouncer.update()) {
    // Get the update value.
    int value = debouncer.read();
    // Send in the new value.
    if(value == LOW){
         saveState(1, !loadState(1));
         digitalWrite(RELAY_1, loadState(1)?RELAY_ON:RELAY_OFF);
         send(msg.set(loadState(1)));
         }
  }
  if (debouncer2.update()) {
      int value2 = debouncer2.read();
    if(value2 == LOW){
         saveState(2, !loadState(2));
         digitalWrite(RELAY_2, loadState(2)?RELAY_ON:RELAY_OFF);
         send(msg2.set(loadState(2)));
         }
  }
  if (debouncer3.update()) {
      int value3 = debouncer3.read();
    if(value3 == LOW){
         saveState(3, !loadState(3));
         digitalWrite(RELAY_3, loadState(3)?RELAY_ON:RELAY_OFF);
         send(msg3.set(loadState(3)));
         }
   }
  if (debouncer4.update()) {
      int value4 = debouncer4.read();
    if(value4 == LOW){
         saveState(4, !loadState(4));
         digitalWrite(RELAY_4, loadState(4)?RELAY_ON:RELAY_OFF);
         send(msg4.set(loadState(4)));
         }
   }
  if (debouncer5.update()) {
      int value5 = debouncer5.read();
    if(value5 == LOW){
         saveState(5, !loadState(5));
         digitalWrite(RELAY_5, loadState(5)?RELAY_ON:RELAY_OFF);
         send(msg5.set(loadState(5)));
         }
   }
  if (debouncer6.update()) {
      int value6 = debouncer6.read();
    if(value6 == LOW){
         saveState(6, !loadState(6));
         digitalWrite(RELAY_6, loadState(6)?RELAY_ON:RELAY_OFF);
         send(msg6.set(loadState(6)));
         }
   }
  if (debouncer7.update()) {
      int value7 = debouncer7.read();
    if(value7 == LOW){
         saveState(7, !loadState(7));
         digitalWrite(RELAY_7, loadState(7)?RELAY_ON:RELAY_OFF);
         send(msg7.set(loadState(7)));
         }
   }
  if (debouncer8.update()) {
      int value8 = debouncer8.read();
    if(value8 == LOW){
         saveState(8, !loadState(8));
         digitalWrite(RELAY_8, loadState(8)?RELAY_ON:RELAY_OFF);
         send(msg8.set(loadState(8)));
         }
   }
  if (debouncer9.update()) {
      int value9 = debouncer9.read();
    if(value9 == LOW){
         saveState(9, !loadState(9));
         digitalWrite(RELAY_9, loadState(9)?RELAY_ON:RELAY_OFF);
         send(msg9.set(loadState(9)));
         } 
      }
  if (debouncer10.update()) {
      int value10 = debouncer10.read();
    if(value10 == LOW){
         saveState(10, !loadState(10));
         digitalWrite(RELAY_10, loadState(10)?RELAY_ON:RELAY_OFF);
         send(msg10.set(loadState(10)));
         } 
  }
}


void receive(const MyMessage &message) {
  // We only expect one type of message from controller. But we better check anyway.
  if (message.type==V_LIGHT) {
     // Change relay state
     digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF);
     // Store state in eeprom
     saveState(message.sensor, message.getBool());
     // Write some debug info
     Serial.print("Incoming change for sensor:");
     Serial.print(message.sensor);
     Serial.print(", New status: ");
     Serial.println(message.getBool());
   }
}
 
#2
Tak zapytam z ciekawości, czy w Twoim rozwiązaniu, przy uszkodzeniu arduino, będzie możliwość sterowania oświetleniem ręcznie, przyciskami "dzwonkowymi"?
 
#3
(18-02-2020, 18:27)Agregacik napisał(a): Tak zapytam z ciekawości, czy w Twoim rozwiązaniu, przy uszkodzeniu arduino, będzie możliwość sterowania oświetleniem ręcznie, przyciskami "dzwonkowymi"?
Na uszkodzenie Arduino nic nie poradzę więc zapasowe będzie czekać. Arduino ma z zasady działać i na wypadek awarii RPi oświetlenie ma działać właśnie  tylko na Arduino.
 
#4
Czy nie lepiej w takim przypadku zastosować kilka "arduino" np 3 i sterować osobno grupą 8 przekaźników. Psikus jednego nie pozbawi Cię sterowania innymi obwodami a do tego można sterowanie "wymieszać", aby z jednego "arduino" nie sterować wszystkimi lampami w jednym pomieszczeniu jak jest ich kilka.

Innym rozwiązaniem może być zastosowanie instalacyjnych przekaźników bistabilnych do sterowania oświetleniem. Arduino czy RPI sterowałoby tymi przekaźnikami tak samo jak przyciski "dzwonkowe".
Jedynym minusem jest brak informacji czy przekaźnik jest załączony czy wyłączony. Można wykonać czujniki załączenia poszczególnych obwodów na transoptorach. To rozwiązanie wydaje mi się i eleganckie i bezpieczne. Jak Cibie braknie w danej chwili a coś się stanie, to pozostali domownicy ani żaden inny majster nie poradzi sobie z usterką. Zastosowanie instalacyjnych przekaźników bistabilnych czyni Twoją instalację mniej zawodną. Przemyśl to.
 
#5
(19-02-2020, 10:28)Agregacik napisał(a):
Cytat:Czy nie lepiej w takim przypadku zastosować kilka "arduino" np 3  i sterować osobno grupą 8 przekaźników. Psikus jednego nie pozbawi Cię sterowania innymi obwodami a do tego można sterowanie "wymieszać", aby z jednego "arduino" nie sterować wszystkimi lampami w jednym pomieszczeniu jak jest ich kilka.
Owszem, masz racje takie rozwiązanie biorę pod uwagę jeżeli nie uda mi się wykorzystać kolejnych pinów na Mega 2650. Ten konkretny obwód będzie odpowiadał za sterowanie oświetleniem i paroma gniazdkami na piętrze. Na parter dam kolejne Arduino aby właśnie nie uzależnić całego oświetlenia od jednej płytki Smile Jednak co do piętra chciałbym zostać przy jednym Arduino Mega (oczywiście w zapasie w razie awarii będzie gotowa do wstawienia zapasowa sztuka.



Cytat:Innym rozwiązaniem może być zastosowanie instalacyjnych przekaźników bistabilnych do sterowania oświetleniem.  Arduino czy RPI sterowałoby tymi przekaźnikami tak samo jak przyciski "dzwonkowe".
Jedynym minusem jest brak informacji czy przekaźnik jest załączony czy wyłączony. Można wykonać czujniki załączenia poszczególnych obwodów na transoptorach. To rozwiązanie wydaje mi się i eleganckie i bezpieczne. 
To jest też dobry pomysł ale zależy mi właśnie na raportowaniu stanów do domoticza. W ten sposób to działa bardzo dobrze i pod takie rozwiązanie przygotowałem instalacje włącznie z przyciskami Smile
Cytat:Jak Cibie braknie w danej chwili a coś się stanie, to pozostali domownicy ani żaden inny majster nie poradzi sobie z usterką. Zastosowanie instalacyjnych przekaźników bistabilnych czyni Twoją instalację mniej zawodną.
Dla elektryka "starszej daty" zastosowanie samego Arduino czy RPi to już będzie problem Smile Na chwilę obecną instalacja wydaje się być prosta. Na upartego można odłączyć Arduino i zostawić same przekaźniki i też będzie działać ale bez opcji sterowania np przez sieć.
 
#6
Pamiętaj, że budując sterownik czy to na "arduino" czy PRI jest to rozwiązanie "made in Twoje". Nikt poza Tobą tego nie jest w stanie naprawić nie mając dokumentacji, a nawet jak ją będzie miał to i tak ewentualna naprawa, jak się jej podejmie, może trwać dłuższy czas.
Inteligentny dom nie powinien mnie uzależniać od swojej "inteligencji" szczególnie jak nawali.
 
#7
(19-02-2020, 18:23)Agregacik napisał(a): Pamiętaj, że budując sterownik czy to na "arduino" czy PRI jest to rozwiązanie "made in Twoje". Nikt poza Tobą tego nie jest w stanie naprawić nie mając dokumentacji, a nawet jak ją będzie miał to i tak ewentualna naprawa, jak się jej podejmie, może trwać dłuższy czas.
Inteligentny dom nie powinien mnie uzależniać od swojej "inteligencji" szczególnie jak nawali.
Oczywiście.. ale taka jest cena tych rozwiązań
 
#8
Temat po kolejnych kilkunastu godzinach przy szkicu rozwiązany.
Temat do zamknięcia.
 
  


Skocz do:


Przeglądający: 1 gości