Всем привет!
Помогите, пожалуйста, разобраться, почему не работает код!
Задача: подключить к ардуино нано 6 выключателей, которые будут управлять двумя реле (первые три выключателя одним реле, вторые три - вторым реле)
Скетч который управляет одним реле с трех выключателей РАБОТАЕТ как надо:
bool lamp1;
uint8_t pin345;
uint8_t temp_pin1;
void setup() {
pinMode(3, INPUT); // сюда подключаем выключатель №1
pinMode(4, INPUT); // сюда подключаем выключатель №2
pinMode(5, INPUT); // сюда подключаем выключатель №3
pinMode(9, OUTPUT); // сюда я подключил реле размыкающее цепь освещения 1
}
void loop() {
pin345 = PIND & 0x38;
if (pin345 != temp_pin1)
{
lamp1 = !lamp1;
temp_pin1 = pin345;
}
if (lamp1 == 0) {digitalWrite(9, HIGH);}
if (lamp1 == 1) {digitalWrite(9, LOW);}
delay (30);
}
Еще три кнопки я подключил так:
bool lamp1;
uint8_t pin345;
uint8_t temp_pin1;
bool lamp2;
uint8_t pin678;
uint8_t temp_pin2;
void setup() {
pinMode(3, INPUT); // сюда подключаем переключатель №1
pinMode(4, INPUT); // сюда подключаем переключатель №2
pinMode(5, INPUT); // сюда подключаем переключатель №3
pinMode(9, OUTPUT); // сюда я подключил реле размыкающее цепь освещения
pinMode(6, INPUT); // сюда подключаем переключатель №1
pinMode(7, INPUT); // сюда подключаем переключатель №2
pinMode(8, INPUT); // сюда подключаем переключатель №3
pinMode(11, OUTPUT); // сюда я подключил реле размыкающее цепь освещения
}
void loop() {
pin345 = PIND & 0x38;
if (pin345 != temp_pin1)
{
lamp1 = !lamp1;
temp_pin1 = pin345;
}
if (lamp1 == 0) {digitalWrite(9, HIGH);}
if (lamp1 == 1) {digitalWrite(9, LOW);}
delay (30);
//переключаем реле
pin678 = PIND & 0x1C0;
if (pin678 != temp_pin2)
{
lamp2 = !lamp2;
temp_pin2 = pin678;
}
if (lamp2 == 0) {digitalWrite(11, HIGH);}
if (lamp2 == 1) {digitalWrite(11, LOW);}
delay (30);
}
Вроде все логично и просто.
При этом если включить первое и второе реле, то они вместе не включаются, а мигают и сразу гаснут как стробоскопы примерно раз в секунду.
Что я делаю не так?
Выключатели должны работать как проходные.
Продаются выключатели без фиксации, по сути та же кнопка. Да и обычный выключатель превращается в кнопку добавлением пружины. На некоторых выключателях для этого даже посадочные места продуманы
Для пятивольтовых МК достаточно убрать R10, а R9 чуть увеличить в номинале. И хоть десять кнопок вешайте - нажатие на любую будет приводить к одному результату.
ЗЫ: возможны нюансы, если у вас предполагается длинная линия, но они и в вашем варианте будут
Убрать лишние кнопки и просто читать пины. Если LOW - кнопка нажата, иначе отжата. Только кнопки притягивать к VCC, и режим объявлять не INPUT, а INPUT_PULLUP
```cpp
//PD0, PD1, PD2; ///кнопки первой группы(input_pullup)
// PD3, PD4, PD5; ///кнопки второй группы(input_pullup)
// PD6;//релюха 1 группы
// PD7;//релюха 2 группы
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
if(!(PIND & 1 && PIND &(1<<1) && PIND &(1<<2)))//провераем включение кнопок 1 группы
{
if(!PIND & (1<<6))PORTD|=(1<<6);//включаем, если выключено
}
else {
if(PIND & (1<<6))PORTD&=~(1<<6);//выключаем, если включено
}
if(!(PIND & (1<<3 )&& PIND &(1<<4) && PIND &(1<<5)))//провераем включение кнопок 1 группы
{
if(!PIND & (1<<7))PORTD|=(1<<7);//включаем, если выключено
}
else {
if(PIND & (1<<7))PORTD&=~(1<<7);//выключаем, если включено
}
}