Всем доброго времени суток. Решил сделать для дома контроллер управления освещением. Нарисовал схему в EasyEDA и заказал плату. Мозгом всей схемы является две Arduino pro mini. Одна ардуина master, вторая ардуино slav. связь между платами I2C. Собственно код :
Master
Slave
Код писал в меру своего понимания. В щиток с автоматами приходят все провода квартиры (каждая розетка, каждая лампочка).
Плата Master принимает информацию от выключателей ---> формирует эту информацию в бинарный вид (2 байта) -----> передаёт в Slave.
Плата Slave принимает по очереди 2 байта --------> разделяет информацию и присваевает её ряду переменных -------> дёргает ногами --------> ноги в свою очередь управляют маломощными реле, которые в свою очередь ----------> управляют импульсным реле

которое управляет своей лампой. При входе в квартиру находится кнопка авто выключения света который остался гореть в квартире. Всё работает но не так как хочется. Проблема 1: Если быстро переключать выключатель, то иногда есть неопределённость положения клавиши выключателя. Выключатель остаётся выключенным, но свет горит. Возможно это задержка в скорости переключения контакта реле RIO. Проблема 2 : В некоторых случаях при нажатии других клавиш по квартире бывает пролетает наводка по проводам которые подключены к другим выключателям (свет включается произвольно сам, и скорее всего наводки). Нужно сделать фильтр типа дребезга контактов. На данный момент моих знаний пока не хватает.
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();
}
}
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 байта --------> разделяет информацию и присваевает её ряду переменных -------> дёргает ногами --------> ноги в свою очередь управляют маломощными реле, которые в свою очередь ----------> управляют импульсным реле


которое управляет своей лампой. При входе в квартиру находится кнопка авто выключения света который остался гореть в квартире. Всё работает но не так как хочется. Проблема 1: Если быстро переключать выключатель, то иногда есть неопределённость положения клавиши выключателя. Выключатель остаётся выключенным, но свет горит. Возможно это задержка в скорости переключения контакта реле RIO. Проблема 2 : В некоторых случаях при нажатии других клавиш по квартире бывает пролетает наводка по проводам которые подключены к другим выключателям (свет включается произвольно сам, и скорее всего наводки). Нужно сделать фильтр типа дребезга контактов. На данный момент моих знаний пока не хватает.