ARDUINO Контроллер освещением дома (реле комфорта)

ddoberman985

✩✩✩✩✩✩✩
28 Ноя 2020
5
0
Всем доброго времени суток. Решил сделать для дома контроллер управления освещением. Нарисовал схему в EasyEDA и заказал плату. Мозгом всей схемы является две Arduino pro mini. Одна ардуина master, вторая ардуино slav. связь между платами I2C. Собственно код :
Master

C++:
#include <Wire.h>
#define sw1 2
#define sw2 3
#define sw3 4
#define sw4 5
#define sw5 6
#define sw6 7
#define sw7 8
#define sw8 9
#define sw9 10
#define sw10 11
#define sw11 12
#define sw12 13
unsigned char tr = 0;
unsigned char s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13;
unsigned char f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14 = 0;
unsigned char p = 100;
unsigned char b = 0b00000000;
unsigned char c = 0b00000001;

void setup()
{

  pinMode(sw1,INPUT_PULLUP);
  pinMode(sw2,INPUT_PULLUP);
  pinMode(sw3,INPUT_PULLUP);
  pinMode(sw4,INPUT_PULLUP);
  pinMode(sw5,INPUT_PULLUP);
  pinMode(sw6,INPUT_PULLUP);
  pinMode(sw7,INPUT_PULLUP);
  pinMode(sw8,INPUT_PULLUP);
  pinMode(sw9,INPUT_PULLUP);
  pinMode(sw10,INPUT_PULLUP);
  pinMode(sw11,INPUT_PULLUP);
  pinMode(sw12,INPUT_PULLUP);

  Serial.begin(9600);
  Wire.begin();

}
void send1()
{

Wire.beginTransmission(1);        // Цифра 1 - адрес ведомой платы
Wire.write(b);                    // Передает значение
Wire.endTransmission();
}


void send2()
{

Wire.beginTransmission(1);        // Цифра 1 - адрес ведомой платы
Wire.write(c);                    // Передает значение
Wire.endTransmission();
}



void loop()
{
  tr = 0;
  s1 = digitalRead(sw1);
  s2 = digitalRead(sw2);
  s3 = digitalRead(sw3);
  s4 = digitalRead(sw4);
  s5 = digitalRead(sw5);
  s6 = digitalRead(sw6);
  s7 = digitalRead(sw7);
  s8 = digitalRead(sw8);
  s9 = digitalRead(sw9);
  s10 = digitalRead(sw10);
  s11 = digitalRead(sw11);
  s12 = digitalRead(sw12);
  s13 = analogRead(0);


//--------------------------------------------------------------------SW1 send1
  if(s1 == 0 && f1 == 0)
        {
        bitSet(b, 1);
        f1 = 1;
        send1();
        delay(p);
        }
       
  if(s1 == 1 && f1 == 1)
  {
   bitClear(b, 1);
   f1 = 0;
   send1();
   delay(p);
  }

//-------------------------------------------------------------------SW2 send1
if(s2 == 0 && f2 == 0)
  {
   bitSet(b, 2);
   f2 = 1;
   send1();
   delay(p);
  }
  if(s2 == 1 && f2 == 1)
  {
   bitClear(b, 2);
   f2 = 0;
   send1();
   delay(p);
  }
//-------------------------------------------------------------------SW3 send1
if(s3 == 0 && f3 == 0)
  {
   bitSet(b, 3);
   f3 = 1;
   send1();
  }
  if(s3 == 1 && f3 == 1)
  {
   bitClear(b, 3);
   f3 = 0;
   send1();  
  }

//-------------------------------------------------------------------SW4 send1
if(s4 == 0 && f4 == 0)
  {
 
   bitSet(b, 4);
   f4 = 1;
   send1();  
  }
  if(s4 == 1 && f4 == 1)
  {
 
   bitClear(b, 4);
   f4 = 0;
   send1();
  }

//-------------------------------------------------------------------SW5 send1
if(s5 == 0 && f5 == 0)
  {
 
   bitSet(b, 5);
   f5 = 1;
   send1();  
  }
  if(s5 == 1 && f5 == 1)
  {
 
   bitClear(b, 5);
   f5 = 0;
   send1();
  }
   
//-------------------------------------------------------------------SW6 send1
if(s6 == 0 && f6 == 0)
  {
 
   bitSet(b, 6);
   f6 = 1;
   send1();  
  }
  if(s6 == 1 && f6 == 1)
  {
 
   bitClear(b, 6);
   f6 = 0;
   send1();
  }
//-------------------------------------------------------------------SW7 send2
if(s7 == 0 && f7 == 0)
  {
 
   bitSet(c, 1);
   f7 = 1;
   send2();  
  }
  if(s7 == 1 && f7 == 1)
  {
 
   bitClear(c, 1);
   f7 = 0;
   send2();
  }
//-------------------------------------------------------------------SW8 send2
if(s8 == 0 && f8 == 0)
  {
 
   bitSet(c, 2);
   f8 = 1;
   send2();  
  }
  if(s8 == 1 && f8 == 1)
  {
 
   bitClear(c, 2);
   f8 = 0;
   send2();
  }
//-------------------------------------------------------------------SW9 send2
if(s9 == 0 && f9 == 0)
  {
 
   bitSet(c, 3);
   f9 = 1;
   send2();  
  }
  if(s9 == 1 && f9 == 1)
  {
 
   bitClear(c, 3);
   f9 = 0;
   send2();
  }
//-------------------------------------------------------------------SW10 send2
if(s10 == 0 && f10 == 0)
  {
 
   bitSet(c, 4);
   f10 = 1;
   send2();  
  }
  if(s10 == 1 && f10 == 1)
  {
 
   bitClear(c, 4);
   f10 = 0;
   send2();
  }
//-------------------------------------------------------------------SW11 send2
if(s11 == 0 && f11 == 0)
  {
 
   bitSet(c, 5);
   f11 = 1;
   send2();  
  }
  if(s11 == 1 && f11 == 1)
  {
 
   bitClear(c, 5);
   f11 = 0;
   send2();
  }
//-------------------------------------------------------------------SW12 send2
if(s12 == 0 && f12 == 0)
  {
 
   bitSet(c, 6);
   f12 = 1;
   send2();  
  }
  if(s12 == 1 && f12 == 1)
  {
 
   bitClear(c, 6);
   f12 = 0;
   send2();
  }

  //-------------------------------------------------------------------SW13 send2

if(s13 <= 100 && f13 == 0)
  {
 
   bitSet(c, 7);
   f13 = 1;
   send2();  
  }
  if(s13 > 100 && f13 == 1)
  {
 
   bitClear(c, 7);
   f13 = 0;
   send2();
  }

}
Slave

C++:
#include <Wire.h>
#define sw1 2
#define sw2 3
#define sw3 4
#define sw4 5
#define sw5 6
#define sw6 7
#define sw7 8
#define sw8 9
#define sw9 10
#define sw10 11
#define sw11 12
#define sw12 13
#define t 200
int tr = 0;
unsigned char b,c,s = 0;
unsigned char sv1,sv2,sv3,sv4,sv5,sv6,sv7,sv8,sv9,sv10,sv11,sv12,sv13 = 0;
unsigned char svv1,svv2,svv3,svv4,svv5,svv6,svv7,svv8,svv9,svv10,svv11,svv12 = 0;
unsigned char f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13 = 0;
unsigned char fg1,fg2,fg3,fg4,fg5,fg6,fg7,fg8,fg9,fg10,fg11,fg12 = 0;
void setup()
{
  pinMode(sw1,OUTPUT);
  pinMode(sw2,OUTPUT);
  pinMode(sw3,OUTPUT);
  pinMode(sw4,OUTPUT);
  pinMode(sw5,OUTPUT);
  pinMode(sw6,OUTPUT);
  pinMode(sw7,OUTPUT);
  pinMode(sw8,OUTPUT);
  pinMode(sw9,OUTPUT);
  pinMode(sw10,OUTPUT);
  pinMode(sw11,OUTPUT);
  pinMode(sw12,OUTPUT);
  digitalWrite(sw12,HIGH);
  delay(100);
  digitalWrite(sw12,LOW);

  Wire.begin(1);
  Wire.onReceive(receiveEvent);
  Serial.begin(9600);
}


void receiveEvent(int bytes)
{
  tr = Wire.read(); // Получаем значения tr от основной платы

  s = tr & 0b00000001; //Следим за флагом (старший/младший байт)

  if(s == 0)
  {
  b = tr;  // Если 0 то бинарная инфа присваевается переменной b
  }

  if(s == 1)
  {
  c = tr;  //Если 1 то бинарная инфа присваевается переменной s
  }
  sv1 = b & 0b00000010; //2
  sv2 = b & 0b00000100; //4
  sv3 = b & 0b00001000; //8
  sv4 = b & 0b00010000; //16
  sv5 = b & 0b00100000; //32
  sv6 = b & 0b01000000; //64
  sv7 = c & 0b00000010; //2
  sv8 = c & 0b00000100; //4
  sv9 = c & 0b00001000; //8
  sv10 = c & 0b00010000; //16
  sv11 = c & 0b00100000; //32
  sv12 = c & 0b01000000; //64
  sv13 = c & 0b10000000; //128

}





void loop()
{

if(sv1 == 2 && f1 == 0)
  {
   digitalWrite(sw1,HIGH);
   delay(100);
   digitalWrite(sw1,LOW);
   f1 = 1;
  }
  if(sv1 == 0 && f1 == 1 && fg1 == 0)
  {
   digitalWrite(sw1,HIGH);
   delay(100);
   digitalWrite(sw1,LOW);
   f1 = 0;
  }
//____________________________________________________________________________

  if(sv2 == 4 && f2 == 0)
  {
   digitalWrite(sw2,HIGH);
   delay(100);
   digitalWrite(sw2,LOW);
   f2 = 1;
  }
  if(sv2 == 0 && f2 == 1 && fg2 == 0)
  {
   digitalWrite(sw2,HIGH);
   delay(100);
   digitalWrite(sw2,LOW);
   f2 = 0;
  }
//______________________________________________________________________________

  if(sv3 == 8 && f3 == 0)
  {
   digitalWrite(sw3,HIGH);
   delay(100);
   digitalWrite(sw3,LOW);

   digitalWrite(sw3,HIGH);
   delay(100);
   digitalWrite(sw3,LOW);
   f3 = 1;
  }
  if(sv3 == 0 && f3 == 1 && fg3 == 0)
  {
   digitalWrite(sw3,HIGH);
   delay(100);
   digitalWrite(sw3,LOW);
 
   digitalWrite(sw3,HIGH);
   delay(100);
   digitalWrite(sw3,LOW);
   f3 = 0;
  }

  //______________________________________________________________________________

  if(sv4 == 16 && f4 == 0)
  {
   digitalWrite(sw4,HIGH);
   delay(100);
   digitalWrite(sw4,LOW);
   f4 = 1;
  }
  if(sv4 == 0 && f4 == 1 && fg4 == 0)
  {
   digitalWrite(sw4,HIGH);
   delay(100);
   digitalWrite(sw4,LOW);
   f4 = 0;
  }

  //______________________________________________________________________________

  if(sv5 == 32 && f5 == 0)
  {
   digitalWrite(sw5,HIGH);
   delay(100);
   digitalWrite(sw5,LOW);
   f5 = 1;
  }
  if(sv5 == 0 && f5 == 1 && fg5 == 0)
  {
   digitalWrite(sw5,HIGH);
   delay(100);
   digitalWrite(sw5,LOW);
   f5 = 0;
  }

   //______________________________________________________________________________

  if(sv6 == 64 && f6 == 0)
  {
   digitalWrite(sw6,HIGH);
   delay(100);
   digitalWrite(sw6,LOW);
   f6 = 1;
  }
  if(sv6 == 0 && f6 == 1 && fg6 == 0)
  {
   digitalWrite(sw6,HIGH);
   delay(100);
   digitalWrite(sw6,LOW);
   f6 = 0;
  }

  //______________________________________________________________________________

  if(sv7 == 2 && f7 == 0)
  {
   digitalWrite(sw7,HIGH);
   delay(100);
   digitalWrite(sw7,LOW);
   f7 = 1;
  }
  if(sv7 == 0 && f7 == 1 && fg7 == 0)
  {
   digitalWrite(sw7,HIGH);
   delay(100);
   digitalWrite(sw7,LOW);
   f7 = 0;
  }

  //______________________________________________________________________________

  if(sv8 == 4 && f8 == 0)
  {
   digitalWrite(sw8,HIGH);
   delay(100);
   digitalWrite(sw8,LOW);
   f8 = 1;
  }
  if(sv8 == 0 && f8 == 1 && fg8 == 0)
  {
   digitalWrite(sw8,HIGH);
   delay(100);
   digitalWrite(sw8,LOW);
   f8 = 0;
  }

  //______________________________________________________________________________

  if(sv9 == 8 && f9 == 0)
  {
   digitalWrite(sw9,HIGH);
   delay(100);
   digitalWrite(sw9,LOW);
   f9 = 1;
  }
  if(sv9 == 0 && f9 == 1)
  {
   digitalWrite(sw9,HIGH);
   delay(100);
   digitalWrite(sw9,LOW);
   f9 = 0;
  }

  //______________________________________________________________________________

  if(sv10 == 16 && f10 == 0)
  {
   digitalWrite(sw10,HIGH);
   delay(100);
   digitalWrite(sw10,LOW);
   f10 = 1;
  }
  if(sv10 == 0 && f10 == 1 && fg10 == 0)
  {
   digitalWrite(sw10,HIGH);
   delay(100);
   digitalWrite(sw10,LOW);
   f10 = 0;
  }

  //______________________________________________________________________________

  if(sv11 == 32 && f11 == 0)
  {
   digitalWrite(sw11,HIGH);
   delay(100);
   digitalWrite(sw11,LOW);
   f11 = 1;
  }
  if(sv11 == 0 && f11 == 1 && fg11 == 0)
  {
   digitalWrite(sw11,HIGH);
   delay(100);
   digitalWrite(sw11,LOW);
   f11 = 0;
  }

  //______________________________________________________________________________

  if(sv12 == 64 && f12 == 0)
  {
   digitalWrite(sw12,HIGH);
   delay(100);
   digitalWrite(sw12,LOW);
   f12 = 1;
  }
  if(sv12 == 0 && f12 == 1 && fg12 == 0)
  {
   digitalWrite(sw12,HIGH);
   delay(100);
   digitalWrite(sw12,LOW);
   f12 = 0;
  }

  //______________________________________________________________________________

  if(sv13 == 128 && f13 == 0)
  {
  svv1 = b & 0b00000010;
  svv2 = b & 0b00000100;
  svv3 = b & 0b00001000;
  svv4 = b & 0b00010000;
  svv5 = b & 0b00100000;
  svv6 = b & 0b01000000;
  svv7 = c & 0b00000010;
  svv8 = c & 0b00000100;
  svv9 = c & 0b00001000;
  svv10 = c & 0b00010000;
  svv11 = c & 0b00100000;
  svv12 = c & 0b01000000;

  if(svv1 == 2 && fg1 == 0)
  {
    digitalWrite(sw1,HIGH);
    delay(100);
    digitalWrite(sw1,LOW);
    fg1 = 1;
  }

  if(svv2 == 4 && fg2 == 0)
  {
    digitalWrite(sw2,HIGH);
    delay(100);
    digitalWrite(sw2,LOW);
    fg2 = 1;
  }

  if(svv3 == 8 && fg3 == 0)
  {
    digitalWrite(sw3,HIGH);
    delay(100);
    digitalWrite(sw3,LOW);
    fg3 = 1;
  }

  if(svv4 == 16 && fg4 == 0)
  {
    digitalWrite(sw4,HIGH);
    delay(100);
    digitalWrite(sw4,LOW);
    fg4 = 1;
  }

  if(svv5 == 32 && fg5 == 0)
  {
    digitalWrite(sw5,HIGH);
    delay(100);
    digitalWrite(sw5,LOW);
    fg5 = 1;
  }

  if(svv6 == 64 && fg6 == 0)
  {
    digitalWrite(sw6,HIGH);
    delay(100);
    digitalWrite(sw6,LOW);
    fg6 = 1;
  }

  if(svv7 == 2 && fg7 == 0)
  {
    digitalWrite(sw7,HIGH);
    delay(100);
    digitalWrite(sw7,LOW);
    fg7 = 1;
  }

  if(svv8 == 4 && fg8 == 0)
  {
    digitalWrite(sw8,HIGH);
    delay(100);
    digitalWrite(sw8,LOW);
    fg8 = 1;
  }

  if(svv9 == 8 && fg9 == 0)
  {
    digitalWrite(sw9,HIGH);
    delay(100);
    digitalWrite(sw9,LOW);
    fg9 = 1;
  }

  if(svv10 == 16 && fg10 == 0)
  {
    digitalWrite(sw10,HIGH);
    delay(100);
    digitalWrite(sw10,LOW);
    fg10 = 1;
  }

  if(svv11 == 32 && fg11 == 0)
  {
    digitalWrite(sw11,HIGH);
    delay(100);
    digitalWrite(sw11,LOW);
    fg11 = 1;
  }

  if(svv12 == 64 && fg12 == 0)
  {
    digitalWrite(sw12,HIGH);
    delay(100);
    digitalWrite(sw12,LOW);
    fg12 = 1;
  }
 
   f13 = 1;
  }



  if(sv13 == 0 && f13 == 1)
  {
 
   f13 = 0;
  }
//______________________________________________________________

  if(sv1 == 0 && fg1 == 1)
  {
    f1 = 0;
    fg1 = 0;
  }
  if(sv2 == 0 && fg2 == 1)
  {
    f2 = 0;
    fg2 = 0;
  }
  if(sv3 == 1 && fg3 == 1)
  {
    //f3 = 0;
    fg3 = 0;
  }
  if(sv4 == 1 && fg4 == 1)
  {
    //f4 = 0;
    fg4 = 0;
  }
  if(sv5 == 1 && fg5 == 1)
  {
    f5 = 0;
    fg5 = 0;
  }
  if(sv6 == 1 && fg6 == 1)
  {
    f6 = 0;
    fg6 = 0;
  }
  if(sv7 == 1 && fg7 == 1)
  {
    f7 = 0;
    fg7 = 0;
  }
  if(sv8 == 1 && fg8 == 1)
  {
    f8 = 0;
    fg8 = 0;
  }
  if(sv9 == 1 && fg9 == 1)
  {
    f9 = 0;
    fg9 = 0;
  }
  if(sv10 == 1 && fg10 == 1)
  {
    f10 = 0;
    fg10 = 0;
  }
  if(sv11 == 1 && fg11 == 1)
  {
    f11 = 0;
    fg11 = 0;
  }
  if(sv12 == 1 && fg12 == 1)
  {
    f12 = 0;
    fg12 = 0;
  }                            
   
}
Код писал в меру своего понимания. В щиток с автоматами приходят все провода квартиры (каждая розетка, каждая лампочка).
Плата Master принимает информацию от выключателей ---> формирует эту информацию в бинарный вид (2 байта) -----> передаёт в Slave.
Плата Slave принимает по очереди 2 байта --------> разделяет информацию и присваевает её ряду переменных -------> дёргает ногами --------> ноги в свою очередь управляют маломощными реле, которые в свою очередь ----------> управляют импульсным реле
9A25A366E9AE82BAE8BCB0323328DB9D.jpg 1.png
которое управляет своей лампой. При входе в квартиру находится кнопка авто выключения света который остался гореть в квартире. Всё работает но не так как хочется. Проблема 1: Если быстро переключать выключатель, то иногда есть неопределённость положения клавиши выключателя. Выключатель остаётся выключенным, но свет горит. Возможно это задержка в скорости переключения контакта реле RIO. Проблема 2 : В некоторых случаях при нажатии других клавиш по квартире бывает пролетает наводка по проводам которые подключены к другим выключателям (свет включается произвольно сам, и скорее всего наводки). Нужно сделать фильтр типа дребезга контактов. На данный момент моих знаний пока не хватает.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
А теперь рассказывайте по каким линиям связи идут сигналы от выключателей (или иных органов управления) до первой ардуино? Много импульсных реле пришлось купить? Ещё не заколебали щёлканья реле при включении выключении света? Или только собираешься и ещё ничего не брал?
 

ddoberman985

✩✩✩✩✩✩✩
28 Ноя 2020
5
0
Кабели от выключателей до первой ардуины идут ВВГнг 3х1,5. Импульсных реле 12. Нет не надоело щёлканье. Это происходит не так часто и всё это стоит в шкафу и в своём отдельном ящике. Контроллер уже установлен.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Да я ж не просто так спрашиваю, меня просто достают эти реле понемнеогу. В понедельник забираю платы с почты, буду делать 8 канальный SSR, управляемый по i2c, на дин рейку... Я как понимаю у тебя 12 цифровых входов, то есть по факту 12 выключателей одноклавишных, скорее всего кнопочные (без фиксации, судя по коду) , тот модуль, который ты используешь между импульсными реле и второй ардуиной вполне можно запускать через i2c PCF8574, правда их надо 2 штуки. в этом случае вторая ардуинка не нужна. (Если же нет, то возможно найти модули на 8-16 реле управлением по i2c) Модули можно купить где угодно. Если чуточку поменять схему включения можно зацепить 36 кнопок вместо 12.... Только не подумайте, я не критикую, у меня 32 реле и 81 кнопка, плюс есть возможность отрабатывать разные нажатия (Up Down fastClick longClick). Я переписываю код, подключаю экран, энкодер для настройки, планирую через пару недель выложить в другую ветку, там я уже получил пачку критики, она мне прям очень не помешала!
 

ddoberman985

✩✩✩✩✩✩✩
28 Ноя 2020
5
0
Ничего не имею против. Вы задали вопросы я на них отвечаю. Реле стоят свои SRD-12VDC-SL-A, развязка управления сделана через транзистор S9013, установлены обычные выключатели, в коде написано так что при нажатии клавиши выключателя в нужную переменную записывается бинарная единица
C++:
if(s1 == 0 && f1 == 0)
        {
        bitSet(b, 1);  // Запись бинарной 1 в переменную b (во второй байт 0b00000010)
        f1 = 1;
        send1();
        delay(p);
        }
      
if(s1 == 1 && f1 == 1)
        {
        bitClear(b, 1); // Запись бинарного 0 в переменную b (во второй байт 0b00000000)
        f1 = 0;
        send1();
        delay(p);
        }
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
А позвольте узнать, у вас 12 импульсных реле, подходящий кабель (в смысле не слаботочка), а зачем здесь 2 ардуино + реле и плюс транзисторы. Я немного не понимаю... разве нельзя было сделать это прямо на самих реле?

ПС:Кажется догнал, это для возможности общего отключения всех реле с одной кнопки? Так?
 
Изменено:

ddoberman985

✩✩✩✩✩✩✩
28 Ноя 2020
5
0
Так точно. Только из за одной удобной кнопки.

Думаю как написать правильно в коде


C++:
if(sv1 == 2 && f1 == 0)

{

digitalWrite(sw1,HIGH);

delay(100);

digitalWrite(sw1,LOW);

f1 = 1;

}

if(sv1 == 0 && f1 == 1 && fg1 == 0)

{

digitalWrite(sw1,HIGH);

delay(100);

digitalWrite(sw1,LOW);

f1 = 0;

}
задержки delay, через micros() что бы не тормозил код.

Так выглядит релейная часть схемы.

Вложения
  • 1.png
    1.png

    41.2 KBПросмотры: 3

Всё правильно?
 
Изменено:

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Подумайте, если через millis, то на каждое условие надо свою переменную на время, а это 12 переменных unsigned long. Надо код уменьшить в 12 раз, там будет проще. Но в любом случае боюсь что на каждый контакт надо будет отдельную переменную для хранения времени.

Если честно, то по мне все Ваши реле можно было бы поменять на moc3083 и один 2-3 резистора...
Если так сделаете, то всю вашу схему можно будет запитывать от 5 вольт

Я пока не очень догоняю, зачем 2 байта? 1 байт= 8бит, 8 бит, это 2^8=256 значений, при 12 реле, пусть даже 16, этого больше чем достаточно
 
Изменено:

ddoberman985

✩✩✩✩✩✩✩
28 Ноя 2020
5
0
Если честно, то по мне все Ваши реле можно было бы поменять на moc3083 и один 2-3 резистора...
Можно вот только плата сделана а реле интегрированы в один блок с остальной объвязкой.
2.png

Если так сделаете, то всю вашу схему можно будет запитывать от 5 вольт
Уже стоит импульсный источник питания на 12 вольт. Работает, по питанию нареканий нет.

Я пока не очень догоняю, зачем 2 байта? 1 байт= 8бит, 8 бит, это 2^8=256 значений, при 12 реле, пусть даже 16, этого больше чем достаточно
По шине I2C передаётся бинарная информация которая на второй стороне дешифруется и остаётся неизменной для кода второй стороны. Если я буду передавать конкретные цифры то я думаю получится дольше в передаче.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Да, теперь главный вопрос. На сколько восприимчивы к критике и будете ли переделывать, если критика окажется адекватной? Или работает, да пусть работает? Я прям тут вижу избавление от одной из ардуин, одновременно с этим можно избавится от реле. Самый простой способ, это расширители, можно i2c, то есть пару расширителей, при этом с 12ти входов/выходов можно снимать 36 разных кнопок. У меня есть несколько схем, но я их ещё не выкладывал в другой ветке, на макетке работает, соберу модуль, скину его схему. А по кнопкам у меня уже код выложен и схема. Если интересует, скину в личку.

По шине I2C передаётся бинарная информация которая на второй стороне дешифруется и остаётся неизменной для кода второй стороны. Если я буду передавать конкретные цифры то я думаю получится дольше в передаче.
Я думаю тут Вы не правы. гонять на 1 бит меньше, инфу перед отправкой вообще не надо будет кодировать, на принимающей стороне сразу станет понятно какое реле щёлкать и даже не придётся декодировать инфу.
 
Изменено: