Шесть кнопок и два реле

Всем привет!
Помогите, пожалуйста, разобраться, почему не работает код!
Задача: подключить к ардуино нано 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);
}

Вроде все логично и просто.
При этом если включить первое и второе реле, то они вместе не включаются, а мигают и сразу гаснут как стробоскопы примерно раз в секунду.
Что я делаю не так?
Выключатели должны работать как проходные.

А зачем три кнопки каждая на своем пине на одно реле? Чем не устраивают три кнопки, подключенные параллельно к одному пину?

Потому что это не кнопки, а выключатели. Типа проходных

Продаются выключатели без фиксации, по сути та же кнопка. Да и обычный выключатель превращается в кнопку добавлением пружины. На некоторых выключателях для этого даже посадочные места продуманы

Вот так я делал для esp8266

002

Для пятивольтовых МК достаточно убрать R10, а R9 чуть увеличить в номинале. И хоть десять кнопок вешайте - нажатие на любую будет приводить к одному результату.

ЗЫ: возможны нюансы, если у вас предполагается длинная линия, но они и в вашем варианте будут

Понял, спасибо! Если не получится через код, то наверное так и сделаю.

Да и код под это дело можно делать. Просто не будет лишних сущностей ))

Вот с кодом-то и хочу разобраться. Не понимаю, что не так, волосы на голове рву. Не может же быть какой-то мистики в работе ардуинки.

Убрать лишние кнопки и просто читать пины. Если LOW - кнопка нажата, иначе отжата. Только кнопки притягивать к VCC, и режим объявлять не INPUT, а INPUT_PULLUP

Вот эта конструкция что по Вашему мнению должна делать?

А вообще, если уж задаете вопрос, постарайтесь конкретизировать, что именно Вы подразумеваете под словом “управлять”.

Особенно строка №29. Что там за константа? Что она означает? Это точно то, чего Вы хотели?

А мне тема нравится. Типа, “карты, деньги и 2 ствола”)

1 лайк

Кто тут звал специалиста по лишним сущностям?)))

Это как так? 0х1с0=448. Ни разу не 1 байт.
Вообще подобные битовые вещи удобней писать так:

Наглядно видно какие биты включены. Без магических чисел.


```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);//выключаем, если включено
}
}

Только не 0b, а B11101! Ага? Устал повторять.(

это почемуета?

Потамучто в Си нету таких букв.

Только мне кажется, что здесь с логикой что-то не то?

2ТС: Огласи, что подразумевает управление, а то тут скоро все варианты этого управления начнут перебирать.

Есть. Кодю в Микрочип студии,до этого в авр студии 4.19. Там “0b” работает

Пофигу где кодите. Читайте стандарт.