Включение-выключение светодиода одной и той же кнопкой без фиксации.

accente
Offline
Зарегистрирован: 18.09.2011

 Вобщем программить я толком еще не начал даже наверно :-) так, склеиваю куски примеров :-)

Вопрос такой: Ребят, помогите написать скетч по принципу:

есть 2 светодиода. изначальное состояние - LOW.

pin 2,3 пусть будут кнопки.

при нажатии pin2 загорается диод1, при повторном нажатии диод1 гаснет.

с pin3 и диодом2 картина та же. Работать они должны независимо.

Ну и плюс учесть дребезг контактов. Никак немогу определиться с алгоритмом (точнее просто немогу начать)

Кнопка без фиксации.

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

Первое что пришло в голову.

Возможно можно и уменьшить код или сделать его более красивым.
Если так то напишите. И мне интересно!
 

int ledPin1 = 13;                // сетодиод1
int btnPin1 = 3;  // кнопка1
int ledPin2 = 12;                // сетодиод2
int btnPin2 = 2;                 // кнопка2
int val=0;
int na=0;
int sw=0;
int codduble;
int val2=0;
int na2=0;
int sw2=0;
int codduble2;
int button[] = {
  btnPin1, btnPin2};
int Led[] = {
  ledPin1, ledPin2};
void setup()                     
{
  pinMode(ledPin1, OUTPUT);    
  pinMode(btnPin1, INPUT);      
  pinMode(ledPin2, OUTPUT);    
  pinMode(btnPin2, INPUT); 
  Serial.begin(9600);  
}


void loop()                      
{

  val = digitalRead(btnPin1);    
  val2 = digitalRead(btnPin2);    
  if(val==HIGH&&na==0)                
  {
    if(sw==0)
    {
      sw=1;
      codduble=val;
      na=1;
      digitalWrite(ledPin1, HIGH);
    }
    else
    {
      sw=0;
      codduble=val;
      na=1;
      digitalWrite(ledPin1, LOW); 
    }
  }
  
  if(val2==HIGH&&na2==0)                
  {
    if(sw2==0)
    {
      sw2=1;
      codduble2=val2;
      na2=1;
      digitalWrite(ledPin2, HIGH);
    }
    else
    {
      sw2=0;
      codduble2=val2;
      na2=1;
      digitalWrite(ledPin2, LOW); 
    }
  }
  
  if (codduble==val)
  {
    na=1;
  }
  else
    na=0;

  if (codduble2==val2)
  {
    na2=1;
  }
  else
    na2=0;
delay(10);
}

 

accente
Offline
Зарегистрирован: 18.09.2011

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

int i = 0;
int k = 0;
int val = 0;
int k1 = 0;
int val1 = 0;
int state = 0;
int old_val = 0;
int state1 = 0;
int old_val1 = 0;

void setup() {
Serial.begin(9600);
pinMode(9, OUTPUT);
pinMode(13, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(6, OUTPUT);
pinMode(8, INPUT);
pinMode(7, INPUT);
}

void loop(){
//digitalWrite(13, HIGH);

val = digitalRead(7);
val1 = digitalRead(8);

if ((val == HIGH) && (old_val == LOW)){
state = 1 - state;
k++;
delay(10);
}

if ((val1 == HIGH) && (old_val1 == LOW)){
state1 = 1 - state1;
k1++;
delay(10);
}

old_val = val; // val is now old, let's store it
old_val1 = val1; // val is now old, let's store it

if (state == 1) {
digitalWrite(6, HIGH); // turn LED ON
} else {
digitalWrite(6, LOW);
}

if (state1 == 1) {
digitalWrite(6, HIGH); // turn LED ON
} else {
digitalWrite(6, LOW);
}

//здесь все выполняеться корректно

switch (k) {
case 0:
digitalWrite(10, LOW);
break;
case 1:
digitalWrite(10, HIGH);
break;
delay(50);
digitalWrite(10, LOW);
break;
default:
k=0;
break;
}

switch (k1) {
case 0:
digitalWrite(9, LOW);
break;
case 1:
digitalWrite(9, HIGH);
break;
delay(50);
digitalWrite(9, LOW);
break;
default:
k1=0;
break;
}

// все бы хорошо.. но когда выполняеться 1 раз, все шикарно. Но когда по второму кругу идет то не смотря на то что в case 0 все пины выключены. горит аналогично case 1. case 2 выполняесться уже нормально.
// Serial.print("Knopka1= " );
// Serial.print(k);
// Serial.println("");

// Serial.print("Knopka2= " );
// Serial.print(k1);
// Serial.println("");

//digitalWrite(13, LOW);
delay(100);

}

Код еще не допилен, лишнее не убрано, но схема запустилась.

p.s. работали под пивом :-) С Дружбаном на пару )

accente
Offline
Зарегистрирован: 18.09.2011

 LEVV2006 Ваш код завтра рассмотрю детально. В данный момент уже моск нехочет думать адекватно :-)

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Это что у вас такое ?

Это зачем ?

Вот рабочая программа (на вскидку набросал).

Поймите общие принцыпы , они вам в будещем очень пригодяться.

int knopka=0;
int knopka2=0;

void setup ()
{
pinMode(13,OUTPUT);
pinMode(12,OUTPUT);
pinMode(9,INPUT);
pinMode(8,INPUT);

}

void loop ()
{//***************КНОПКА 1********************************//


if(digitalRead(8)==HIGH&&knopka==0)//если кнопка нажата
// и перемення "knopka" равна 0 , то ...
{
delay(50);//защита от дребезга
knopka++;//пишем 1 в переменную кнопка
//это нужно для того что бы с каждым нажатием кнопки
//происходило только одно действие

digitalWrite(13, !digitalRead(13));//меняем значение порта на противоположное

}

  if(digitalRead(8)==LOW&&knopka==1)//если кнопка НЕ нажата
//и переменная knopka равна - 1 ,то ...
{

knopka=0;//обнуляем переменную "knopka"
}


//***********************КНОПКА 2*****************************//


if(digitalRead(9)==HIGH&&knopka2==0)//если кнопка нажата
// и перемення "knopka2" равна 0 , то ...
{
  delay(50);
  knopka2++;//пишем 1 в переменную кнопка
//это нужно для того что бы с каждым нажатием кнопки
//происходило только одно действие
 
    digitalWrite(12,!digitalRead(12));  
}

if(digitalRead(9)==LOW&&knopka2==1)//если кнопка НЕ нажата
//и переменная knopka2 равна - 1 ,то ...
{
    knopka2=0;//обнуляем переменную "knopka2"
}

} 

 

От модератора: Поправил вывод кода. Пожалуйста пользуйтесь кнопкой вставки кода. Вторая кнопка наверху, рядом с кнопкой Источник. Так же легче читать код.

accente
Offline
Зарегистрирован: 18.09.2011

 Пасибо, сейчас обязательно просмотрю этот скетч. именно на примерах и приходится учиться, ибо так понятнее )))

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

Привольно приму к сведению))))  

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Модератору. Читать легче а вот копипастить в IDE нет (приходится в ручную удалять номера строк). 

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Я кое что поправил ...  в общем могут быть чисто "орфаграфические" ошибки (из - за невнимательности).

Alexander
Онлайн
Зарегистрирован: 25.04.2010

nestandart пишет:

Модератору. Читать легче а вот копипастить в IDE нет (приходится в ручную удалять номера строк).

Если навести курсор на код, то справа на уровне первых строчек возникнет меню из четырех кнопок, вторая кнопка сохраняет весь код в буфер обмена без номеров строчек - очень удобно.

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Модератору. Спасибо , не знал. 

famoso
Offline
Зарегистрирован: 02.07.2011

 Вот нашел в стандартных примерах похожий код!!!!

http://witharduino.blogspot.com/2011/12/button-state-change.html

Mastino
Offline
Зарегистрирован: 03.12.2011
CMEXIRK
Offline
Зарегистрирован: 03.04.2015

http://youtu.be/wezPs_jxPQg вот мой принцып отыграл на протеусе работу скейча, одна кнопка и два светодиода , в скейче придусмотрен дребезг кнопки на ложное срабатывание , Порядок такой  нажимаем кнопку загорается светодиод 1  и через заданное время он гаснет, нажимаем ещё раз - загорается второй светодио и гаснет через заданное время , всё прекрасно работает 

/*
 *  Включение одной кнопкой 2х нагрузок по переменки с автовыключением
 */
 
int switchPin = 2;              // замыкание кнопки на минус через резист pin 2
int led1Pin = 12;               // нагрузка 1
int led2Pin = 11;               // нагрузка 2
 
 
int val;                        // Переменная для чтения статуса контактный
int val2;                       // Переменная для чтения с задержкой / подавлением дребезга контактов статус
int buttonState;                // Переменная провести состояния кнопки
 
int lightMode = 0;              // Есть свет включен или выключен?
 
void setup() {
  pinMode(switchPin, INPUT);    // Установите пин в качестве входных данных
 
  pinMode(led1Pin, OUTPUT);     // Установите пин в качестве выходных данных
  pinMode(led2Pin, OUTPUT);     // Установите пин в качестве выходных данных
 
  
  Serial.begin(9600);                // Установите последовательную связь в 9600
  buttonState = digitalRead(switchPin);   // читать начальное состояние
}
 
void loop(){
  val = digitalRead(switchPin);      // читать входное значение и сохранить его в Val
  delay(10);                         // 10 миллисекунд хорошее количество времени
  val2 = digitalRead(switchPin);     // читать ввод снова, чтобы проверить отскоков
  if (val == val2) {                 // убедиться, что мы получили 2 показания последовательны!
    if (val != buttonState) {          // состояние кнопки изменилось!
      if (val == LOW) {                // проверить, если нажата кнопка
        if (lightMode == 0) {          // эта нагрузка включена?
          lightMode = 1;               // включить нагрузку 1
          digitalWrite(led1Pin, HIGH); // нагрузка включена
          delay(2000);                 // время до автовыключения
          digitalWrite(led1Pin, LOW);  // нагрузка выключается
 
        } else {
          lightMode = 0;               // выключить нагрузку 2
          digitalWrite(led2Pin, HIGH); // нагрузка включена
          delay(2000);                 // время до автовыключения
          digitalWrite(led2Pin, LOW);  // нагрузка выключается
 
        }
      }
    }
    buttonState = val;                 // сохранить новое значение в нашей переменной
  }
}
Pahan
Offline
Зарегистрирован: 03.02.2017

Подскажите молодому, а то в глазах рябит.

К ардуино подключен приемник на 433 Мгц.  При нажатии 1 раз кнопки на радиопульте - светодиод загорается. При повторном нажатии -светодиод выключается. Этот скетч имеется, тут я понял. Состояние пина инертируется с каждым нажатием. Так вот, если постоянно удерживать кнопку на радиопульте (приемник принимает код с периодичностью наверно 400-450мс) и светодиод постоянно мигает.

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

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();
int led  = 12;

void setup()
{
  pinMode(12, OUTPUT);
  
  mySwitch.enableReceive(0);  // Receiver on inerrupt 0 => that is pin #2
}

void loop()
{
  if (mySwitch.available())
  {
    unsigned long value = mySwitch.getReceivedValue();
    Serial.print(value);
    switch (value) {
    case 0:
    Serial.println(" - Unknown encoding");
    break;
    case 2276802:
    digitalWrite(led, !digitalRead(led));
    break;
    default:
    Serial.println(" - EROR");
         }
         mySwitch.resetAvailable();
       }
    }




 

maks_452
Offline
Зарегистрирован: 06.03.2017

Доброго времмени суток! Подскажите пожалуйста,как написать подобный скетч(управлением 2-х реле от 2-х кнопок... каждая кнопка при одном нажатии включает и отключает одно реле,при этом не машает работе другой паре - реле и кнопка! порядок запуска реле должен быть не зависимым друг от друга).

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

maks_452 Ну где-то так. Полный скетч здесь https://yadi.sk/d/Kzqip-WK3Eoc7h

Головной файл посмотреть 

/* class_module_Led.ino  
  #1 светодиод ->13
  #2 кнопка 1 -> 2 вкл светодиод
  #3 кнопка 2 -> 3 светодиод мигает
  #4 кнопка 3 -> 4 выкл светодиод
*/
// #1 светодиод
#include "Cl_module_led.h"
const byte led1_pin = 13;
Cl_module_led Led1(led1_pin); // создать
// #2 кнопка
#include "Cl_module_do_btn.h"
const byte btn1_pin = 2;
Cl_module_do_btn Btm1(btn1_pin); // создать
void Do_Btm1() {
  Led1.ON();
}
// #3 кнопка
const byte btn2_pin = 3;
Cl_module_do_btn Btm2(btn2_pin); // создать
void Do_Btm2() {
  Led1.OFF();
}
// #4 кнопка
const byte btn3_pin = 4;
Cl_module_do_btn Btm3(btn3_pin); // создать
void Do_Btm3() {
  Led1.blink();
}
void setup() {
  //#1 светодиод
  Led1.T_blink = 500; // частота мигания
  Led1.logic = 1;// зажигать светодиод если на выводе 0
  Led1.setup();
  //#2 кнопка 1
  Btm1.setup();
  //#3 кнопка 2
  Btm2.setup();
  //#4 кнопка 3
  Btm3.setup();
}

void loop() {
  // #1 светодиод
  Led1.loop();
  // #2 кнопка 1
  Btm1.loop(& Do_Btm1);
  // #3 кнопка 2
  Btm2.loop(& Do_Btm2);
  // #4 кнопка 3
  Btm3.loop(& Do_Btm3);
}

 

IK10
Offline
Зарегистрирован: 13.08.2017

Загружаю на ардуино пишет ошибка

Arduino: 1.8.3 (Windows 7), Плата:"Arduino/Genuino Uno"
 
sketch_aug13c_knopka_2:16: error: invalid digit "8" in octal constant
 
 08
 
 ^
 
sketch_aug13c_knopka_2:18: error: invalid digit "9" in octal constant
 
 09
 
 ^
 
sketch_aug13c_knopka_2:2: error: expected unqualified-id before numeric constant
 
 01
 
 ^
 
sketch_aug13c_knopka_2:4: error: expected unqualified-id before numeric constant
 
 02
 
 ^
 
sketch_aug13c_knopka_2:6: error: expected unqualified-id before numeric constant
 
 03
 
 ^
 
sketch_aug13c_knopka_2:10: error: expected initializer before numeric constant
 
 05
 
 ^
 
sketch_aug13c_knopka_2:24: error: expected unqualified-id before numeric constant
 
 12
 
 ^
 
exit status 1
invalid digit "8" in octal constant
 
Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"
 
в чем проблема?
мне нужно чтобы при замкнутой кнопке включялось реле, при разомкнутой отключялось
Помогите пожалуйста

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

IK10 пишет:

в чем проблема?

мне нужно чтобы при замкнутой кнопке включялось реле, при разомкнутой отключялось

Помогите пожалуйста
 
1 вы неправильно скопировали код  сайта
2- в даном случае надо качать с яндекс диска
3- этот код отличается от вашей хотелки.
 Вот ваш код 
/**/
uint32_t mill;// переменная под millis()
//---------Cl_Led----------------------------------
//класс светодиод
class Cl_Led {
    uint8_t bit ;  // номер бита в виде 00010000,1 находится там где выход
    volatile uint8_t *reg; // указатель на регистр настройки порта
    volatile uint8_t *out; // указатель на регистр входа порта
    bool inv;// состояние бита инверсии выхода
    bool stat;// 1 мигать / 0 нет
    unsigned long past, time;
  public:
    /*
      конструктор Cl_Led
      Описание создает класс
      Ввод     pin: подключение к ноге
             inv: бит инвертирования 0 нет / 1 инверсия
      Вывод    нет
    */
    Cl_Led   (uint8_t pin, uint8_t _inv = 0): inv(_inv) {
      bit  = digitalPinToBitMask(pin);
      uint8_t port = digitalPinToPort(pin); // получить номер порта
      reg  = portModeRegister(port);
      out  = portOutputRegister(port);
    }
    /*
      Функция  setup
      Описание иницирование класса
      Ввод     нет
      Вывод    нет
    */
    void setup() {
      uint8_t oldSREG = SREG;
      cli();
      *reg |= bit;
      if (inv) *out &= ~bit;
      else *out |= bit;
      SREG = oldSREG;
      stat = 0;
    }
    /*
      Функция  OFF
      Описание выключить светодиод
      Ввод     нет
      Вывод    нет
    */
    void OFF() {
      uint8_t oldSREG = SREG;
      cli();
      if (inv) *out &= ~bit;
      else *out |= bit;
      SREG = oldSREG;
      stat = 0;
    }
    /*
      Функция  ON
      Описание включить светодиод
      Ввод     нет
      Вывод    нет
    */
    void ON() {
      uint8_t oldSREG = SREG;
      cli();
      if (inv) *out |= bit;
      else *out &= ~bit;
      SREG = oldSREG;
      stat = 0;
    }
    /*
      Функция  blink
      Описание мигать светодиодои
      Ввод     _time  - полупериод мигания
      Вывод    нет
    */
    void blink(unsigned long _time = 500) {
      time = _time;
      stat = 1;
      past = mill;
      uint8_t oldSREG = SREG;
      cli();
      *out ^= bit;
      SREG = oldSREG;
    }
    /*
      Функция  loop
      Описание для нормальной работе разместить в loop программы
      Ввод     нет
      Вывод    нет
    */
    void loop() {
      if (!stat) return;
      if (mill - past >= time) {
        past = mill;
        uint8_t oldSREG = SREG;
        cli();
        *out ^= bit;
        SREG = oldSREG;
      }
    }
};
//------Cl_Btn------------------------------------------
// класс кнопка c програмной подтяжкой
class Cl_Btn {
    uint8_t bit ;  // номер бита в виде 00010000,1 находится там где выход
    volatile uint8_t *reg; // указатель на регистр настройки порта
    volatile uint8_t *out; // указатель на регистр выхода порта
    uint8_t port; // номер порта на выводе
    const byte pin;
    void (*Do1)(), (*Do2)();
    bool btn, btn_old, btn_new;
    bool bounce = 0; // антидребезговый флаг
    uint32_t past = 0 ;
  public:
    /*
      конструктор Cl_Btn
      Описание создает класс
      Ввод     pin: подключение к ноге
             _Do1: фунция обработчик нажатия кнопки
             _Do2: фунция обработчик отжатия кнопки
      Вывод    нет
    */
    Cl_Btn(byte pin, void (*_Do1)(), void (*_Do2)()):  Do1(_Do1), Do2(_Do2) {
      bit  = digitalPinToBitMask(pin);
      port = digitalPinToPort(pin); // получить номер порта
      reg  = portModeRegister(port);
      out  = portOutputRegister(port);
    }
    /*
      Функция  setup
      Описание иницирование класса
      Ввод     нет
      Вывод    нет
    */
    void setup() {
      uint8_t oldSREG = SREG;
      cli();
      *reg &= ~bit; //INPUT
      *out |= bit; //PULLUP
      SREG = oldSREG;
      btn_old = (*portInputRegister(port) & bit) == 0;
    }
    /*
      Функция  loop
      Описание для нормальной работе разместить в loop программы
      Ввод     нет
      Вывод    нет
    */
    void loop() {
      btn_new = (*portInputRegister(port) & bit) == 0;
      if (! bounce && btn != btn_new) { // если прошел фронт изм на выводн
        bounce = 1;                              // выставить флаг
        past = mill;                         // сделать временую засветку
      }
      else if ( bounce && mill - past >= 5 ) { // если прошло антидребезговое время
        bounce = 0;                                // то снять флаг
        btn_old = btn ;
        btn = btn_new ;  // прочитать реальное значение на выводе
        if (btn_old && ! btn)(*Do1)();
        if (!btn_old && btn)(*Do2)();
      }
    }
};
//-------------компоновка-----------------------------------
Cl_Led Led1(/*пин*/13,/*инв*/1);
void Do1_Btn1() {
  Led1.ON();
}
void Do2_Btn1() {
  Led1.OFF();
}
Cl_Btn Btn1(/*пин*/2,/*обраб наж*/Do1_Btn1,/*обраб отж*/Do2_Btn1);
//-------------main()-----------------------------------
void setup() {
  Led1.setup();
  Btn1.setup();
}

void loop() {
  mill = millis();
  Led1.loop();
  Btn1.loop();
}
/*Скетч использует 1308 байт (4%) памяти устройства. Всего доступно 32256 байт.
  Глобальные переменные используют 47 байт (2%) динамической памяти, оставляя 2001 байт для локальных переменных. Максимум: 2048 байт.
*/

Кнопку подлючать земля вывод, без резистора.

 

IK10
Offline
Зарегистрирован: 13.08.2017

Спасибо огромное

IK10
Offline
Зарегистрирован: 13.08.2017
/* Блокировка ворот
   Включяется реле (вывод 4) при нажатии кнопки (вывод 2) 
   Включяется реле (вывод 8) при нажатии кнопки (вывод 7)*/
  
boolean buttonState;   // создаем глобальную переменную buttonState
    
 void setup() {
  pinMode(4, OUTPUT);        // определяем вывод 4 (Реле 1) как выход
  pinMode(2, INPUT_PULLUP);  // определяем вывод 2 (кнопка) как вход
  pinMode(8, OUTPUT);        // определяем вывод 8 (Реле 2) как выход
  pinMode(7, INPUT_PULLUP);  // определяем вывод 7 (кнопка) как вход
}
 
//  бесконечный цикл
void loop() {
  buttonState = digitalRead(2);  // считываем состояние 2 входа (кнопки) и записываем в buttonState
  buttonState = ! buttonState;    // инверсия переменной buttonState 
  digitalWrite(4, buttonState);  // записываем состояние из buttonState на выход 4 (Реле 1)
  buttonState = digitalRead(7);  // считываем состояние 7 входа (кнопки) и записываем в buttonState
  buttonState = ! buttonState;    // инверсия переменной buttonState 
  digitalWrite(8, buttonState);  // записываем состояние из buttonState на выход 8 (Реле 2)
}
вот что получилось
работает
еще раз спасибо
qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну скорее всего так надо 

/* Блокировка ворот
   Включяется реле (вывод 4) при нажатии кнопки (вывод 2)
   Включяется реле (вывод 8) при нажатии кнопки (вывод 7)
*/
//--------------------------------------------------------
//----------------Компановка----------------------------------------
const byte relay1Pin =/*пин реле1*/   4;
const byte relay2Pin =/*пин реле2*/   8;
const byte btn1Pin   =/*пин кнопка1*/ 2;
const byte btn2Pin   =/*пин кнопка2*/ 7;
//------------------main--------------------------------------
void setup() {
  pinMode(relay1Pin, OUTPUT);  
  pinMode(btn1Pin, INPUT_PULLUP);
  pinMode(relay2Pin, OUTPUT);     
  pinMode(btn2Pin, INPUT_PULLUP);  
}
void loop() {
  digitalWrite(relay1Pin, !digitalRead(btn1Pin));
  digitalWrite(relay2Pin, !digitalRead(btn2Pin));
}
/*Скетч использует 986 байт (3%) памяти устройства. Всего доступно 32256 байт.
  Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2039 байт для локальных переменных. Максимум: 2048 байт.
*/

 

Warn
Offline
Зарегистрирован: 13.01.2012

qwone пишет:

Ну скорее всего так надо 

/* Блокировка ворот
   Включяется реле (вывод 4) при нажатии кнопки (вывод 2)
   Включяется реле (вывод 8) при нажатии кнопки (вывод 7)
*/
//--------------------------------------------------------
//----------------Компановка----------------------------------------
const byte relay1Pin =/*пин реле1*/   4;
const byte relay2Pin =/*пин реле2*/   8;
const byte btn1Pin   =/*пин кнопка1*/ 2;
const byte btn2Pin   =/*пин кнопка2*/ 7;
//------------------main--------------------------------------
void setup() {
  pinMode(relay1Pin, OUTPUT);  
  pinMode(btn1Pin, INPUT_PULLUP);
  pinMode(relay2Pin, OUTPUT);     
  pinMode(btn2Pin, INPUT_PULLUP);  
}
void loop() {
  digitalWrite(relay1Pin, !digitalRead(btn1Pin));
  digitalWrite(relay2Pin, !digitalRead(btn2Pin));
}
/*Скетч использует 986 байт (3%) памяти устройства. Всего доступно 32256 байт.
  Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2039 байт для локальных переменных. Максимум: 2048 байт.
*/

 

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