Arduino.ru
Включение-выключение светодиода одной и той же кнопкой без фиксации.
- Войдите на сайт для отправки комментариев
Вс, 18/09/2011 — 16:09
Зарегистрирован: 18.09.2011
Вобщем программить я толком еще не начал даже наверно 🙂 так, склеиваю куски примеров 🙂
Вопрос такой: Ребят, помогите написать скетч по принципу:
есть 2 светодиода. изначальное состояние — LOW.
pin 2,3 пусть будут кнопки.
при нажатии pin2 загорается диод1, при повторном нажатии диод1 гаснет.
с pin3 и диодом2 картина та же. Работать они должны независимо.
Ну и плюс учесть дребезг контактов. Никак немогу определиться с алгоритмом (точнее просто немогу начать)
Кнопка без фиксации.
- Войдите на сайт для отправки комментариев
Вс, 18/09/2011 — 23:09

Зарегистрирован: 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); >
- Войдите на сайт для отправки комментариев
Вс, 18/09/2011 — 22:06
Зарегистрирован: 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);
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 «);
//digitalWrite(13, LOW);
delay(100);
Код еще не допилен, лишнее не убрано, но схема запустилась.
p.s. работали под пивом 🙂 С Дружбаном на пару )
- Войдите на сайт для отправки комментариев
Вс, 18/09/2011 — 22:07
Зарегистрирован: 18.09.2011
LEVV2006 Ваш код завтра рассмотрю детально. В данный момент уже моск нехочет думать адекватно 🙂
- Войдите на сайт для отправки комментариев
Пнд, 19/09/2011 — 22:49
nestandart

Зарегистрирован: 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" >>
От модератора: Поправил вывод кода. Пожалуйста пользуйтесь кнопкой вставки кода. Вторая кнопка наверху, рядом с кнопкой Источник. Так же легче читать код.
- Войдите на сайт для отправки комментариев
Пнд, 19/09/2011 — 22:21
Зарегистрирован: 18.09.2011
Пасибо, сейчас обязательно просмотрю этот скетч. именно на примерах и приходится учиться, ибо так понятнее )))
- Войдите на сайт для отправки комментариев
Пнд, 19/09/2011 — 22:30

Зарегистрирован: 15.04.2011
Привольно приму к сведению))))
- Войдите на сайт для отправки комментариев
Пнд, 19/09/2011 — 22:43
nestandart

Зарегистрирован: 15.06.2011
Модератору. Читать легче а вот копипастить в IDE нет (приходится в ручную удалять номера строк).
- Войдите на сайт для отправки комментариев
Пнд, 19/09/2011 — 22:50
nestandart

Зарегистрирован: 15.06.2011
Я кое что поправил . в общем могут быть чисто «орфаграфические» ошибки (из — за невнимательности).
- Войдите на сайт для отправки комментариев
Втр, 20/09/2011 — 00:46
Зарегистрирован: 25.04.2010
nestandart пишет:
Модератору. Читать легче а вот копипастить в IDE нет (приходится в ручную удалять номера строк).
Если навести курсор на код, то справа на уровне первых строчек возникнет меню из четырех кнопок, вторая кнопка сохраняет весь код в буфер обмена без номеров строчек — очень удобно.
- Войдите на сайт для отправки комментариев
Втр, 20/09/2011 — 03:23
nestandart

Зарегистрирован: 15.06.2011
Модератору. Спасибо , не знал.
- Войдите на сайт для отправки комментариев
Сб, 10/12/2011 — 21:34
Зарегистрирован: 02.07.2011
Вот нашел в стандартных примерах похожий код.
- Войдите на сайт для отправки комментариев
Втр, 20/12/2011 — 14:30
Зарегистрирован: 03.12.2011
- Войдите на сайт для отправки комментариев
Пт, 03/04/2015 — 10:51
Зарегистрирован: 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); // читать начальное состояние
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); // нагрузка выключается
lightMode = 0; // выключить нагрузку 2
digitalWrite(led2Pin, HIGH); // нагрузка включена
delay(2000); // время до автовыключения
digitalWrite(led2Pin, LOW); // нагрузка выключается
buttonState = val; // сохранить новое значение в нашей переменной
- Войдите на сайт для отправки комментариев
Сб, 04/02/2017 — 01:39
Зарегистрирован: 03.02.2017
Подскажите молодому, а то в глазах рябит.
К ардуино подключен приемник на 433 Мгц. При нажатии 1 раз кнопки на радиопульте — светодиод загорается. При повторном нажатии -светодиод выключается. Этот скетч имеется, тут я понял. Состояние пина инертируется с каждым нажатием. Так вот, если постоянно удерживать кнопку на радиопульте (приемник принимает код с периодичностью наверно 400-450мс) и светодиод постоянно мигает.
Вопрос, как сделать, что бы хоть при однократном нажатии, хоть при удержании любое время кнопки на радиопульте и последующем отпускании — светодиод загорелся, а при повторном нажатии этой же кнопки на радиопульте (либо удержании с последующим отпусканием) -выключился.
#include 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(); > >
- Войдите на сайт для отправки комментариев
Пнд, 06/03/2017 — 19:38
Зарегистрирован: 06.03.2017
Доброго времмени суток! Подскажите пожалуйста,как написать подобный скетч(управлением 2-х реле от 2-х кнопок. каждая кнопка при одном нажатии включает и отключает одно реле,при этом не машает работе другой паре — реле и кнопка! порядок запуска реле должен быть не зависимым друг от друга).
- Войдите на сайт для отправки комментариев
Пнд, 06/03/2017 — 19:45
Зарегистрирован: 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); >
- Войдите на сайт для отправки комментариев
Вс, 13/08/2017 — 11:35
Зарегистрирован: 13.08.2017
Загружаю на ардуино пишет ошибка
Arduino: 1.8.3 (Windows 7), Плата:»Arduino/Genuino Uno»
sketch_aug13c_knopka_2:16: error: invalid digit «8» in octal constant
sketch_aug13c_knopka_2:18: error: invalid digit «9» in octal constant
sketch_aug13c_knopka_2:2: error: expected unqualified-id before numeric constant
sketch_aug13c_knopka_2:4: error: expected unqualified-id before numeric constant
sketch_aug13c_knopka_2:6: error: expected unqualified-id before numeric constant
sketch_aug13c_knopka_2:10: error: expected initializer before numeric constant
sketch_aug13c_knopka_2:24: error: expected unqualified-id before numeric constant
exit status 1
invalid digit «8» in octal constant
Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
«Показать подробный вывод во время компиляции»
в чем проблема?
мне нужно чтобы при замкнутой кнопке включялось реле, при разомкнутой отключялось
Помогите пожалуйста
- Войдите на сайт для отправки комментариев
Вс, 13/08/2017 — 13:14
Зарегистрирован: 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 байт. */
Кнопку подлючать земля вывод, без резистора.
Arduino для начинающих. Урок 2. Подключение кнопки



Продолжаем серию уроков “Arduino для начинающих”. Сегодня подключаем к ардуино кнопку и светодиод (при нажатой кнопке светодиод будет гореть, при отжатой — не гореть). Это одна из базовых схем, которая неоднократно пригодиться вам в будущем и может использоваться для управления роботом на Arduino. В вашем будущем роботе по нажатию кнопки могут происходить самые разные действия.
В посте помимо видео-инструкции приводим листинг программы и схему подключения.
Видео-инструкция сборки модели кнопки на Arduino:
Для сборки модели нам потребуется:
- плата Arduino
- Breadboard
- 5 проводов и/или перемычек «папа-папа»
- светодиод
- кнопка
- резисторы на 10 кОм и 220 Ом.

Что понадобится для подключения кнопки на Arduino?
Схема подключения модели Arduino с кнопкой и светодиодом:

Схема подключения кнопки и светодиода на Arduino
Также вам потребуется программа Arduino IDE, которую можно скачать с сайта Arduino.
Для работы этой модели подойдет следующая программа (программу вы можете просто скопировать в Arduino IDE):
int button = 2;
int led = 8;
void setup() pinMode(led, OUTPUT);
pinMode(button, INPUT);
>
void loop() if (digitalRead(button) == HIGH) digitalWrite(led, HIGH);
>
else digitalWrite(led, LOW);
>
>
Так выглядит собранная модель Arduino кнопки со светодиодом:

Готовая модель с кнопкой и светодиодом на Arduino
На этом второй урок «Arduino для начинающих» закончен. Продолжение следует!

Смотрите также:
Посты по урокам:
- Первый урок: Светодиод
- Второй урок: Кнопка
- Третий урок: Потенциометр
- Четвертый урок: Сервопривод
- Пятый урок: Трехцветный светодиод
- Шестой урок: Пьезоэлемент
- Седьмой урок: Фоторезистор
- Восьмой урок: Датчика движения (PIR) и E-mail
- Девятый урок: Подключение датчика температуры и влажности DHT11 или DHT22
Все посты сайта «Занимательная робототехника» по тегу Arduino.
Наш YouTube канал, где публикуются видео-уроки.
Не знаете, где купить Arduino? Все используемые в уроке комплектующие входят в большинство готовых комплектов Arduino, их также можно приобрести по отдельности. Подробная инструкция по выбору здесь. Низкие цены, спецпредложения и бесплатная доставка на сайтах AliExpress и DealExtreme. Если нет времени ждать посылку из Китая — рекомендуем интернет-магазины Амперка и DESSY. Низкие цены и быструю доставку предлагает интернет-магазин ROBstore. Смотри также список магазинов.
Автор: Александр Гагарин

Читайте также
55 комментариев к статье “Arduino для начинающих. Урок 2. Подключение кнопки”
Сергей
02.11.2014
Мне очень понравилось с фоторезистором. А сделайте пожалуйста навесным монтажом.
Вячеслав
28.02.2015
С +5V провод идет на кнопку и через резистор на землю? Это же почти к.з.?
Александр
02.03.2015
Резистор на 10 ком достаточно ограничивает ток.
Констатин
06.03.2015
Добрый день!
Подскажите пожалуйста уже 100500 раз собирал эту схему у вас в видео светодиод не горит, а после нажатия кнопки горит, у меня он горит всегда только после нажатия кнопки он горит чуть ярче. в чем может быть дело?
Занимательная робототехника
07.03.2015
Добрый день. Если просто соединить выводы кнопки через резистор с пином контроллера и землей, то это не работает. При нажатии кнопки пин соединяется с землей, и digitalRead будет считывать логический 0, но при отпущенной кнопке пин не будет соединен ни с какой линией и будет «висить в воздухе», и программа будет считать с вывода и 0 и 1 случайным образом. Правильное подключение предполагает, что в разомкнутом состоянии пин должен быть соединен через резистор с шиной питания, а в замкнутом — с землей, либо наоборот. Попробуйте и так, и так.
Внутри микроконтроллера есть подтягивающие резисторы. Но они могут быть программно включены или выключены. Попробуйте включить и выключить подтягивающие резисторы программно.
После того, как пин установлен в режим входа, чтобы включить на нем подтягивающий резистор нужно «записать в него 1» с помощью digitalWrite. void setup() pinMode(8, OUTPUT);
pinMode(2, INPUT);
digitalWrite(2, HIGH); //включаем подтягивающий резистор
>
void loop() digitalWrite(8, !digitalRead(2));
>
Макс
24.02.2019
Марина
04.10.2016
Была такая же проблема, долго не понимала в чем дело.
Оказалось, просто не до конца воткнула кнопку 🙂
Михаил
15.05.2015
Что нужно изменить в вашем коде, чтобы было так :
нажал на кнопку один раз — лампочка включилась,
нажал второй раз — выключилась… и так далее.. ?
Денис
19.05.2015
Есть множество вариантов решения данной задачи. Например такой: const int buttonPin = 2;
const int ledPin = 13; void setup() // initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
> void loop() digitalRead(buttonPin);
while(!digitalRead(buttonPin))<>
digitalWrite(ledPin, HIGH);
while(digitalRead(buttonPin))<>
while(!digitalRead(buttonPin))<>
digitalWrite(ledPin, LOW);
while(digitalRead(buttonPin))<> >
Роман
30.05.2015
Здравствуйте, можно ли void loop() построчно комментарий?
Занимательная робототехника
30.05.2015
void loop() <
digitalRead(buttonPin); //считываем значение с кнопки
while(!digitalRead(buttonPin))<> //пока кнопка не нажата ждем
digitalWrite(ledPin, HIGH); //включаем светодиод
while(digitalRead(buttonPin))<> //пока кнопка еще нажата ждем
while(!digitalRead(buttonPin))<>//пока кнопка не нажата ждем
digitalWrite(ledPin, LOW); //выключаем светодиод
while(digitalRead(buttonPin))<> //пока кнопка еще нажата ждем
>
То есть: ждем нажатия кнопки и включаем светодиод, затем ждем отжатия кнопки и повторного нажатия, выключаем светодиод, ждем отжатия кнопки.
Толик
13.10.2016
ошибки выдаёт с воид лупом чёта
Youjinn
21.10.2016
Подскажите что может быть, заюзал ваш код для кноки, все вроде работает но на 5-6 нажатия когда светодиод должен выключаться он горит, или должен гореть — выключаеться. В общем не 100% получаеться связь между кнопкой и светодиодом. Иногда проскакивает
Денис
19.05.2015
или можно запустить образец из digital -> debounce
он делает то же самое
Вячеслав
30.06.2015
Здравствуйте подскажите что нужно добавить в скейч что б алгоритм работы был таков: 2 кнопки Одно нажатие на кнопку 1 светодиод загорается горит 5 сек и затухает,если нажать на вторую то светик сразу гаснет?? /*
intledPin = 12;
int buttonApin = 8;
int buttonBpin = 7;
byte leds = 0;
void setup()
pinMode(ledPin, OUTPUT);
pinMode(buttonApin, INPUT_PULLUP);
pinMode(buttonBpin, INPUT_PULLUP);
>
Void loop()
if (digitalRead(buttonApin) == LOW)
digitalWrite(ledPin, HIGH);
delay(5000);
digitalWrite(12, LOW);
>
if (digitalRead(buttonBpin) == LOW)
digitalWrite(ledPin, LOW);
>
>
Занимательная робототехника
30.06.2015
Ваш скетч не работает, потому что программа выполняет delay(5000), в этот момент ничего больше выполняться не может.
Можно использовать функцию millis(), возвращающую, сколько миллисекунд прошло с начала работы программы. int ledPin = 12;
int buttonApin = 8;
int buttonBpin = 7;
void setup()
pinMode(ledPin, OUTPUT);
pinMode(buttonApin, INPUT_PULLUP);
pinMode(buttonBpin, INPUT_PULLUP);
>
void loop()
unsigned long currentMillis = 0;
if (digitalRead(buttonApin) == LOW)
digitalWrite(ledPin, HIGH);
currentMillis = millis();
>
if (digitalRead(buttonBpin) == LOW || millis()-currentMillis>5000)
digitalWrite(ledPin, LOW);
>
>
Вячеслав
01.07.2015
Спасибо что так быстро ответили но что то не получается( Выдает ошибку!
Занимательная робототехника
03.07.2015
В синтаксисе ошибки нет. Распишите ситуацию подробнее. Какая ошибка выдается?
Антон
08.08.2015
Помогите пожалуйста. 100 раз все проверил — светодиод не загорается. Такое ощущение, что не идет питание 5V с платы. Как можно просто диагностировать эту неисправность?
Денис
10.08.2015
Во-первых, нужно убедиться, что пины правильные. Далее, лучше всего проверить мультиметром.
Еще для простоты можно светодиод воткнуть напрямую к 5в и земле. Если будет гореть (может и взорвется), то питание идет и проблема в подключении.
Чтобы проверить подключение собственно кнопки можно загрузить код
int pushButton = 2; void setup() Serial.begin(9600);
pinMode(pushButton, INPUT);
> void loop() int buttonState = digitalRead(pushButton);
Serial.println(buttonState);
delay(100);
> И зайти в монитор порта. Если выдает при нажатии 1, то кнопка работает.
Михаил
11.08.2015
Почему не удаётся плавно запустить светодиод? //Свет плавно загорается после нажатия кнопки, кнопка нажимается ещё раз, свет моргает и гаснет.
int button = 2;
int led = 9;
int i = 0; void setup() < pinMode(led, OUTPUT); pinMode(button, INPUT); >void loop() digitalRead(button); //считываем значение с кнопки
while(!digitalRead(button))<> //пока кнопка не нажата ждем
do analogWrite(led, i);
i = i+1;
>
while(i==255);//включаем светодиод плавно
digitalWrite(led, HIGH); //включаем светодиод
while(digitalRead(button))<> //пока кнопка еще нажата ждем
while(!digitalRead(button))<>//пока кнопка не нажата ждем
digitalWrite(led, LOW);//моргаем несколько раз
delay(100);
digitalWrite(led, HIGH);
delay(100);
digitalWrite(led, LOW);
delay(100);
digitalWrite(led, HIGH);
delay(100);
digitalWrite(led, LOW);
delay(100);
digitalWrite(led, HIGH);
delay(100);
digitalWrite(led, LOW); //выключаем светодиод
while(digitalRead(button))<> //пока кнопка еще нажата ждем
>
Денис
11.08.2015
Во-первых, неправильный цикл (http://arduino.ru/Reference/DoWhile), во-вторых, после каждого увеличения i нудно поставить delay
Михаил
11.08.2015
Благодарю, Денис! Сейчас въехал, у меня проверка условия была не верна. Сделал вот так, сейчас всё красиво.
//Свет плавно загорается после нажатия кнопки, кнопка нажимается ещё раз, свет моргает и гаснет.
int button = 2;
int led = 9;
int i = 0; void setup() < pinMode(led, OUTPUT); pinMode(button, INPUT); >void loop() digitalRead(button); //считываем значение с кнопки
while(!digitalRead(button))<> //пока кнопка не нажата ждем
do
analogWrite(led, i);
i = i+1;
delay(10);
> while(i <100);//включаем светодиод плавно медленно
do
analogWrite(led, i);
i = i+1;
delay(5);
> while(i <200);//включаем светодиод плавно средне
do
analogWrite(led, i);
i = i+1;
delay(1);
> while(i <255);//включаем светодиод плавно быстро
i = 0;//обнуление счётчика
digitalWrite(led, HIGH); //включаем светодиод
while(digitalRead(button))<> //пока кнопка еще нажата ждем
while(!digitalRead(button))<>//пока кнопка не нажата ждем
digitalWrite(led, LOW);//моргаем несколько раз
delay(100);
digitalWrite(led, HIGH);
delay(100);
digitalWrite(led, LOW);
delay(100);
digitalWrite(led, HIGH);
delay(100);
digitalWrite(led, LOW);
delay(100);
digitalWrite(led, HIGH);
delay(100);
digitalWrite(led, LOW); //выключаем светодиод
while(digitalRead(button))<> //пока кнопка еще нажата ждем
>
Влад
19.10.2015
Объясните пожалуйста неучу=) кнопка соединена с с +5v и с землей через резистор. Зачем вообще нужно соединять с землей кнопку? Может я что то недопонимаю в принципе работы кнопки?
Занимательная робототехника
20.10.2015
Когда кнопка разомкнута, то если не было бы резистора, то на вход могли бы поступать хаотичные сигналы вместо ожидаемого нами отсутствия напряжения. Можно встретить терминологию «оставить вход в «подвешенном» состоянии». Причина — шумы, образующиеся вокруг провода производят электричество из электромагнитных волн среды.
Стягивающий резистор рядом со входом гарантирует отсутствие напряжения при разомкнутой цепи (кнопка не нажата — цепь разомкнута).
sergey
15.11.2015
Подтягивающий резистор всегда ставится к +5в а тут наоборот . Почему? Почему не используется внутренний подтягивающий резистор?
Ренат
29.11.2015
Здравствуйте.Как можно проделать этот алгоритм .По кнопке меняется режим скорости переключения диодов (5с 2c 1c 0.5c)
ЗёБрА
04.12.2015
Подскажите как создать светильник из ARDUINO UNO У меня набор «Матрёшка» НО он выводит ОЩИБКЮ. когда вожу код
Владимир
20.01.2016
Скажите пожалуйста, насколько я понимаю, перед записью нового кода, нужно удалить старый с памяти платы. Как это сделать?
Занимательная робототехника
20.01.2016
Нет, не верно. Просто загружаете новый скетч с помощью Arduino IDE
Александр
28.01.2016
помогите пожалуйста
нужно чтобы при зажатии кнопка тоесть нажал и не отпускаеш
загорелся светодиод и проигрался на mini MP3 1 трек и мр3 выключился а светодиод продолжал гореть если отпустить кнопку то все должно выключится
у меня просто получается что Mp3 гоняет один трек по кругу и я не совсем понимаю как мр3 должен выйти из цикла #include
#include
int switchPin = 9;
int ledPin = 7; void setup()
Serial.begin (9600);
mp3_set_serial (Serial);
mp3_set_volume (5);
delay (100);
pinMode (switchPin, INPUT);
pinMode (ledPin, OUTPUT);
> void loop()
< if (digitalRead(switchPin) == HIGH)
digitalWrite(ledPin, HIGH); >
else
digitalWrite(ledPin, LOW); >
if (digitalRead(switchPin) == HIGH)
delay(500);
mp3_play(1);
delay(5000);
mp3_stop(); >
else
mp3_stop(); >
Денис
30.01.2016
Т.е. проблема в том, что если кнопка зажата то мп3 должен проиграть мелодию и после этого остановиться, а сейчас при зажатии трек повторяется?
Александр
28.01.2016
как мне выйти из цикла только для mp3 не совсем понимаю
ромча
06.03.2016
very very veryveryvery GOOD!
пРЕКРАСНО
Alex
16.03.2016
Почему то малое напряжение если подключать на одну нагрузку несколько управляющих кнопок, светодиод включается но напряжение 1,3 вольта. int led_1 = 2;
int led_2 = 3;
int led_3 = 4;
int led_4 = 5; int button_1 = 6;
int button_2 = 7;
int button_3 = 8;
int button_4 = 9; int button_5 = 10;
int button_6 = 11;
int button_7 = 12;
int button_8 = 13; int button_9 = A0;
int button_10 = A1;
int button_11 = A2;
int button_12 = A3; int button_13 = A4;
int button_14 = A5; void setup()
Serial.begin(9600);
Serial.println(); pinMode(led_1, OUTPUT);
pinMode(led_2, OUTPUT);
pinMode(led_3, OUTPUT);
pinMode(led_4, OUTPUT); pinMode(button_1, INPUT);
pinMode(button_2, INPUT);
pinMode(button_3, INPUT);
pinMode(button_4, INPUT); pinMode(button_5, INPUT);
pinMode(button_6, INPUT);
pinMode(button_7, INPUT);
pinMode(button_8, INPUT); pinMode(button_9, INPUT);
pinMode(button_10, INPUT);
pinMode(button_11, INPUT);
pinMode(button_12, INPUT); pinMode(button_13, INPUT);
pinMode(button_14, INPUT); > void loop() < if (digitalRead(button_1) == HIGH)
digitalWrite(led_1,HIGH);
>
else
digitalWrite(led_1,LOW);
> if (digitalRead(button_2) == HIGH)
digitalWrite(led_2,HIGH);
>
else
digitalWrite(led_2,LOW);
> if (digitalRead(button_3) == HIGH)
digitalWrite(led_3,HIGH);
>
else
digitalWrite(led_3,LOW);
> if (digitalRead(button_4) == HIGH)
digitalWrite(led_4,HIGH);
>
else
digitalWrite(led_4,LOW);
>
//************************************** if (digitalRead(button_5) == HIGH)
digitalWrite(led_1,HIGH);
>
else
digitalWrite(led_1,LOW);
> if (digitalRead(button_6) == HIGH)
digitalWrite(led_2,HIGH);
>
else
digitalWrite(led_2,LOW);
> if (digitalRead (button_7) == HIGH)
digitalWrite(led_3,HIGH);
>
else
digitalWrite(led_3,LOW);
> if (digitalRead (button_8) == HIGH)
digitalWrite(led_4,HIGH);
>
else
digitalWrite(led_4,LOW);
>
//********************************** if (digitalRead (button_9) == HIGH)
digitalWrite(led_1,HIGH);
>
else
digitalWrite(led_1,LOW);
> if (digitalRead (button_10) == HIGH)
digitalWrite(led_2,HIGH);
>
else
digitalWrite(led_2,LOW);
> if (digitalRead (button_11) == HIGH)
digitalWrite(led_3,HIGH);
>
else
digitalWrite(led_3,LOW);
> if (digitalRead (button_12) == HIGH)
digitalWrite(led_4,HIGH);
>
else
digitalWrite(led_4,LOW);
>
//********************************** if (digitalRead (button_13) == HIGH)
digitalWrite(led_1,HIGH);
>
else
digitalWrite(led_1,LOW);
> if (digitalRead (button_14) == HIGH)
digitalWrite(led_3,HIGH);
>
else
digitalWrite(led_3,LOW);
> >
Макс
31.08.2016
Подскажите мне не грамотному, как в уроке № 2, где собирают кнопку+диод, как модифицировать схему, чтобы нажимаешь на кнопку и диод продолжает гореть, еще раз нажимаешь диод гаснет. В исходном решении нажимаешь — горит, отпускаешь гаснет. Спасибо
Игорь
25.10.2016
Посмотри уроки Джереми Блюма. На ютубе есть с нормальным переводом от Амперки
Дмитрий
26.10.2016
Помогите пожалуйста моя идея работы скетча такая : один раз нажмешь на кнопку и все 6 светодиодов приемом бегущего огонька работают все время пока не нажмешь второй раз кнопку. Если второй раз нажать на кнопку то они перестают работать. int button = 10; int led = 2; void setup() <
int pin = 2;
for (pin = 2 ; pin pinMode ( pin , OUTPUT) ;
>
pinMode(led, OUTPUT);
pinMode(button, INPUT);
bool flag = false;
> int delay_len = 20 ; void loop() <
if (button == 1) <
for (pin = 2 ; pin blink (pin);
>
void blink ( int pin ) <
digitalWrite ( pin, HIGH ) ;
delay ( delay_len );
digitalWrite ( pin, LOW ) ;
delay ( delay_len );
>
>
if (digitalRead (button) == HIGH)
if (flag == true ;
if flag == false ;
else
if flag == true) <
digitalWrite(pin, HIGH);
else
digitalWrite(pin, LOW);
delay(500);
>
>
Артем
29.10.2016
Такая же проблема, один в один. Никак не могу понять как комбинировать несколько кодов вместе. По отдельности все работает, а как объединить кнопку и бегущую строку не понимаю.
Дмитрий
30.10.2016
У меня также.Я не знаю как соединить все вместе.
Александр
02.11.2016
Подскажите пожалуйста как добавить кнопку чтобы отключались 6 ть каналов шим ? Вот мой код :
[code]
int buttonPin = 7;
int ledPin = 9;
int potPin = A0;
int led1Pin =3; // Светодиод подключен к выходу 3
int led2Pin =5; // Светодиод подключен к выходу 5
int led3Pin =6; // Светодиод подключен к выходу 6
int led4Pin =9; // Светодиод подключен к выходу 9
int led5Pin =10; // Светодиод подключен к выходу 10
int led6Pin =11; // Светодиод подключен к выходу 11 int analog1Pin = 3; // потенциометр подключен к выходу 3
int analog2Pin = 3; // потенциометр подключен к выходу 3
int analog3Pin = 3; // потенциометр подключен к выходу 3
int analog4Pin = 3; // потенциометр подключен к выходу 3
int analog5Pin = 3; // потенциометр подключен к выходу 3
int analog6Pin = 3; // потенциометр подключен к выходу 3 int val1 = 0; // переменная для хранения значения
int val2 = 0; // переменная для хранения значения
int val3 = 0; // переменная для хранения значения
int val4 = 0; // переменная для хранения значения
int val5 = 0; // переменная для хранения значения
int val6 = 0; // переменная для хранения значения
void setup()
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(led1Pin, OUTPUT); // установка порта на выход
pinMode(led2Pin, OUTPUT); // установка порта на выход
pinMode(led3Pin, OUTPUT); // установка порта на выход
pinMode(led4Pin, OUTPUT); // установка порта на выход
pinMode(led5Pin, OUTPUT); // установка порта на выход
pinMode(led6Pin, OUTPUT); // установка порта на выход
> void loop()
val1 = analogRead(analog1Pin); // считываем значение с порта, подключенному к потенциометру
analogWrite(led1Pin, val1 / 4); // analogRead возвращает значения от 0 до 1023, analogWrite должно быть в диапозоне от 0 до 255
val2 = analogRead(analog2Pin); // считываем значение с порта, подключенному к потенциометру
analogWrite(led2Pin, val2 / 4); // analogRead возвращает значения от 0 до 1023, analogWrite должно быть в диапозоне от 0 до 255
val3 = analogRead(analog3Pin); // считываем значение с порта, подключенному к потенциометру
analogWrite(led3Pin, val3 / 4); // analogRead возвращает значения от 0 до 1023, analogWrite должно быть в диапозоне от 0 до 255
val4 = analogRead(analog4Pin); // считываем значение с порта, подключенному к потенциометру
analogWrite(led4Pin, val4 / 4); // analogRead возвращает значения от 0 до 1023, analogWrite должно быть в диапозоне от 0 до 255
val5 = analogRead(analog5Pin); // считываем значение с порта, подключенному к потенциометру
analogWrite(led5Pin, val5 / 4); // analogRead возвращает значения от 0 до 1023, analogWrite должно быть в диапозоне от 0 до 255
val6 = analogRead(analog6Pin); // считываем значение с порта, подключенному к потенциометру
analogWrite(led6Pin, val6 / 4); // analogRead возвращает значения от 0 до 1023, analogWrite должно быть в диапозоне от 0 до 255
> [/code]
Александр
02.11.2016
Подскажите пожалуйста как добавить кнопку чтобы при однократном нажатии отключало 6 ть каналов шим одновременно а при повторном — включало? Вот мой код :
[code]
int buttonPin = 7;
int ledPin = 9;
int potPin = A0;
int led1Pin =3; // Светодиод подключен к выходу 3
int led2Pin =5; // Светодиод подключен к выходу 5
int led3Pin =6; // Светодиод подключен к выходу 6
int led4Pin =9; // Светодиод подключен к выходу 9
int led5Pin =10; // Светодиод подключен к выходу 10
int led6Pin =11; // Светодиод подключен к выходу 11 int analog1Pin = 3; // потенциометр подключен к выходу 3
int analog2Pin = 3; // потенциометр подключен к выходу 3
int analog3Pin = 3; // потенциометр подключен к выходу 3
int analog4Pin = 3; // потенциометр подключен к выходу 3
int analog5Pin = 3; // потенциометр подключен к выходу 3
int analog6Pin = 3; // потенциометр подключен к выходу 3 int val1 = 0; // переменная для хранения значения
int val2 = 0; // переменная для хранения значения
int val3 = 0; // переменная для хранения значения
int val4 = 0; // переменная для хранения значения
int val5 = 0; // переменная для хранения значения
int val6 = 0; // переменная для хранения значения
void setup()
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(led1Pin, OUTPUT); // установка порта на выход
pinMode(led2Pin, OUTPUT); // установка порта на выход
pinMode(led3Pin, OUTPUT); // установка порта на выход
pinMode(led4Pin, OUTPUT); // установка порта на выход
pinMode(led5Pin, OUTPUT); // установка порта на выход
pinMode(led6Pin, OUTPUT); // установка порта на выход
> void loop()
val1 = analogRead(analog1Pin); // считываем значение с порта, подключенному к потенциометру
analogWrite(led1Pin, val1 / 4); // analogRead возвращает значения от 0 до 1023, analogWrite должно быть в диапозоне от 0 до 255
val2 = analogRead(analog2Pin); // считываем значение с порта, подключенному к потенциометру
analogWrite(led2Pin, val2 / 4); // analogRead возвращает значения от 0 до 1023, analogWrite должно быть в диапозоне от 0 до 255
val3 = analogRead(analog3Pin); // считываем значение с порта, подключенному к потенциометру
analogWrite(led3Pin, val3 / 4); // analogRead возвращает значения от 0 до 1023, analogWrite должно быть в диапозоне от 0 до 255
val4 = analogRead(analog4Pin); // считываем значение с порта, подключенному к потенциометру
analogWrite(led4Pin, val4 / 4); // analogRead возвращает значения от 0 до 1023, analogWrite должно быть в диапозоне от 0 до 255
val5 = analogRead(analog5Pin); // считываем значение с порта, подключенному к потенциометру
analogWrite(led5Pin, val5 / 4); // analogRead возвращает значения от 0 до 1023, analogWrite должно быть в диапозоне от 0 до 255
val6 = analogRead(analog6Pin); // считываем значение с порта, подключенному к потенциометру
analogWrite(led6Pin, val6 / 4); // analogRead возвращает значения от 0 до 1023, analogWrite должно быть в диапозоне от 0 до 255
> [/code]
Николай
30.12.2022
Чтобы реализовать отключение и включение шести каналов PWM с помощью кнопки, вам нужно будет добавить код, который опрашивает состояние кнопки и принимает решение о том, какие каналы PWM нужно включить или отключить. Вот пример такого кода: int buttonState = digitalRead(buttonPin); // считываем состояние кнопки if (buttonState == LOW) < // если кнопка нажата
// отключаем каналы PWM
analogWrite(led1Pin, 0);
analogWrite(led2Pin, 0);
analogWrite(led3Pin, 0);
analogWrite(led4Pin, 0);
analogWrite(led5Pin, 0);
analogWrite(led6Pin, 0);
> else < // иначе (кнопка н
Николай
30.12.2022
Чтобы реализовать однократное включение/выключение светодиодов при нажатии на кнопку, нужно использовать функцию digitalRead() для чтения состояния кнопки, а также использовать переменную, которая будет хранить состояние кнопки (нажата или отжата). Также может понадобиться использовать задержку, чтобы избежать многократного срабатывания кода при нажатии на кнопку. Чтобы реализовать отключение и включение нескольких каналов ШИМ при однократном нажатии на кнопку int buttonPin = 7;
int led1Pin = 3;
int led2Pin = 5;
int led3Pin = 6;
int led4Pin = 9;
int led5Pin = 10;
int led6Pin = 11; bool ledsOn = false; void setup()
pinMode(buttonPin, INPUT);
pinMode(led1Pin, OUTPUT);
pinMode(led2Pin, OUTPUT);
pinMode(led3Pin, OUTPUT);
pinMode(led4Pin, OUTPUT);
pinMode(led5Pin, OUTPUT);
pinMode(led6Pin, OUTPUT);
> void loop()
// читаем состояние кнопки
int buttonState = digitalRead(buttonPin); // если кнопка нажата
if (buttonState == HIGH)
// инвертируем состояние переменной ledsOn
ledsOn = !leds
islam
20.11.2016
int button = 2;
int led = 8;
void setup() pinMode(led, OUTPUT);
pinMode(button, INPUT);
>
void loop() if (digitalRead(button) == HIGH) digitalWrite(led, HIGH);
>
else digitalWrite(led, LOW);
>
>
помогите пожалуйста вместо одной кнопки сделать две кнопки
Adam
27.03.2017
Добрый день,есть кнопка нажимаешь включаешь 1 светодиод 2 паралельно мигает отпускаеш кнопку отключаешь обе светодиода
Ксения
13.04.2017
всем привет, подскажите, пожалуйста! мы сделали модель и код. рабоет так: нажал на кнопку — диод горит, еще раз нажал- потух. сейсам мне надо сделать так: нажал- слабо горит, еще нажал- сильнее горит, еще нажал- сильно горит, нажал еще-потух диод. прежний код выглядит так.
int ledPin = 13;
int switchPin = 8;
boolean lastButton = LOW;
boolean ledOn = false;
boolean currentButton = LOW; void setup()
pinMode(ledPin, OUTPUT);
pinMode(switchPin, INPUT);
> boolean debounce (boolean last)
currentButton = digitalRead (switchPin);
if (last != currentButton)
delay (5);
currentButton = digitalRead (switchPin);
>
return currentButton;
> void loop() currentButton = debounce (lastButton);
if(lastButton == LOW && currentButton == HIGH)
ledOn = !ledOn;
>
lastButton = currentButton; digitalWrite(ledPin, ledOn);
>
Ivan
29.04.2017
Объясните пожалуйста, зачем в землю резистор. Объясните пожалуйста максимально простыми словами, никак не могу понять:(
питер
02.07.2017
Доброго дня . Подскажите пожалуйста зачем нужно резистором тянуть землю на кнопку , если при нажатии кнопка пропускает плюс ?
Владимир
28.11.2017
Здравствуйте. как будет выглядеть скейч на две кнопки и два светодиода которые будут выключается по времени. Например на 1 секунду
полина
13.06.2018
Как прописать код для радуино, чтобы светодиод загорался только при одновременном нажатии на 2 кнопки
Dana
21.09.2018
Включение светодиода с помощью кнопки
Когда на кнопку нажали,включается светодиод
Когда на кнопку не нажали,выключаем светодиод
Глеб
30.12.2022
Для того, чтобы реализовать включение светодиода с помощью кнопки, нужно использовать функцию digitalRead, которая позволяет считывать состояние пина (нажата кнопка или нет). Также нужно использовать функцию digitalWrite, которая позволяет установить состояние пина (высокое или низкое).
Михаил
30.12.2022
Подключение кнопки к плате Arduino является одним из самых простых и базовых элементов работы с электронными устройствами. Чтобы подключить кнопку к плате Arduino, необходимо следующее: Подключить один конец кнопки к одному из пинов платы Arduino (например, к пину 2).
Подключить другой конец кнопки к земле (GND).
Подключить плату Arduino к компьютеру с помощью USB-кабеля.
Открыть программу Arduino IDE и создать новый скетч.
В начале скетча определить номер пина, к которому подключена кнопка: const int buttonPin = 2;
В секции setup инициализировать этот пин как вход: pinMode(buttonPin, INPUT);
В секции loop считывать состояние кнопки с помощью команды digitalRead: int buttonState = digitalRead(buttonPin); В результате состояние кнопки будет сохранено в переменной buttonState — если кнопка нажата, то buttonState будет равно HIGH, если не нажата — равно LOW. Ниже приведен пример кода, который мигает светодиодом, когда кнопка нажата: const int ledPin = 13; // Пин светодиода
const int buttonPin = 2; // Пин кнопки void setup() pinMode(ledPin, OUTPUT); // Инициал Этот код будет проверять состояние кнопки каждый цикл `loop` и включать светодиод, если кнопка нажата, и выключать его, если кнопка не нажата. Однако, часто необходимо, чтобы светодиод мигал регулярно, а не только при нажатии кнопки. Для этого можно использовать функцию `delay` и переменную, которая хранит состояние светодиода (включен/выключен). Ниже приведен код, реализующий мигание светодиода с частотой 1 раз в секунду: const int ledPin = 13; // Пин светодиода
const int buttonPin = 2; // Пин кнопки int ledState = LOW; // Состояние свет Добавить код, отвечающий за мигание светодиода с частотой 1 раз в секунду: void loop() int buttonState = digitalRead(buttonPin); // Считываем состояние кнопки
if (buttonState == HIGH) < // Если кнопка нажата
ledState = !ledState; // Меняем состояние светодиода
digitalWrite(ledPin, ledState); // Включаем/выключаем светодиод
>
delay(1000); // Ждем 1 секунду
> В этом коде мы считываем состояние кнопки, а затем меняем состояние светодиода и включаем/выключаем его, если кнопка нажата. Затем мы ждем 1 секунду с помощью функции delay и возвращаемся в начало цикла. В результате светодиод будет мигать с частотой 1 раз в секунду. Загрузите скетч на плату Arduino с помощью программы Arduino IDE. Сначала нужно выбрать нужную плату в меню «Сервис» -> «Устройство». Затем нажмите на кнопку «Загрузить» или нажмите «Ctrl + U» на клавиатуре. После загрузки скетча вы можете нажать кнопку на плате Arduino и увидеть, как светодиод начинает мигать. Если светодиод не мигает, проверьте, что все провода подключены правильно и что правильно выбрана плата в Arduino IDE.
Михаил
30.12.2022
И вот вы уже умеете подключать кнопку к плате Arduino и реализовывать мигание светодиода с помощью нее. Это только один из примеров того, что можно сделать с помощью Arduino. С ее помощью можно реализовывать различные электронные устройства и роботов, от простых до сложных.
Управление светом в системах освещения на светодиодных лентах
В статье описаны системы управления светом, излучаемым светодиодными лентами. Рассмотрены распространенные схемы подключения, описаны «подводные камни», которые могут возникнуть на пути специалиста, осуществляющего монтаж и эксплуатацию систем управления светом.
Закарнизная подсветка на светодиодных лентах (СДЛ) присутствует почти в каждом современном интерьере, причем вписывается она в любой стиль — будь то классика, ампир или «хайтек». Всей этой красотой часто хочется управлять — к примеру, сделать иногда яркость поменьше, чтобы создать «интим», включить только группу светильников согласно определенному сценарию, или выбрать цвет освещения, подходящий под настроение. Все это позволяют сделать многоцветные RGB СДЛ.
Общие подходы к управлению светом СДЛ
СЛД чаще всего питаются напряжением 12 или 24 В, и процесс управления светом сводится к управлению этим напряжением. Для этого используют специальные контроллеры и диммеры (рис. 1).
Рис. 1. Внешний вид устройства управления СДЛ: а) диммер; б) контроллер
Напомним, что диммеры — это устройства управления, позволяющие регулировать яркость свечения СДЛ, а контроллеры — устройства управления, позволяющие управлять многоцветной СДЛ, с их помощью мы можем выбрать любой цвет и нужную интенсивность свечения, задать какой-либо динамический световой эффект.
Подключение
СДЛ подключаются к устройству управления (контроллер или диммер), которое запитывается от блока питания (БП) постоянного напряжения. Оператор задает управляющую команду при помощи пульта дистанционного управления (ПДУ), кнопок на корпусе контроллера (диммера), при помощи смартфона (если есть управление по Wi-Fi) или при помощи запрограммированных сценариев управления освещением. Важно, чтобы мощность контроллера или диммера была не меньше потребляемой мощности системы СДЛ, а БП по мощности минимум на 20% превышал потребности СДЛ.
Есть ряд проблем, часто встречающихся при подключении диммеров и контроллеров.
При их работе БП зачастую начинает издавать писк, причем это случается даже при использовании дорогих и качественных устройств. Как с этим бороться?
Можно использовать БП в металлическом герметичном корпусе (рис. 2).
Рис. 2. Блок питания ТМ Arlight для СДЛ в герметичном металлическом корпусе
Тогда писк, издаваемый БП, не будет слышен: корпус блока не пропускает звуковую волну в окружающую среду. Эффект защиты от писка можно увеличить, если расположить БП в каком-то небольшом закрытом пространстве — обычно в гипсокартонных конструкциях можно найти такие места. В этом случае гипсокартон выполняет функцию дополнительной звукоизолирующей оболочки. Описанный метод борьбы с шумом достаточно распространен, хотя, на наш взгляд, он далеко нс идеален. Правильно было бы решать эту проблему производителям при изготовлении контроллеров и БП, а не монтажникам — электрикам уже на месте установки. Но, вероятно, экономия на элементной базе и технологических процессах приводит к таким последствиям.
Проблема совместимости оборудования
Иногда разные системы управления, которые совместимы в рамках одного стандарта, работают некорректно. Приведем случай из практики. На объекте были установлены регуляторы какого-то малоизвестного производителя для диммеров по стандарту 1-10 В. Затем этот регулятор подключали к контроллеру ТМ Arlight, к которому были подключены СДЛ. В итоге на минимальном уровне освещения наблюдались заметные глазу пульсации света. Но когда к этому диммеру подключили регулятор (1—10 В) той же торговой марки, то эти пульсации, прекратились. Советуем по возможности использовать оборудование одного производителя, иначе, в случае несовместимости, придется производить его замену. Также советуем, прежде чем монтировать оборудование в стены и потолки, подключить его по схеме на рабочем столе и проверить работу.
Схемы подключения диммеров
На рис. 3 представлена простая схема подключения ленты с мощностью в пределах мощности диммера.
Рис. 3. Простое подключение светодиодной ленты через диммер
Диммер питается от БП постоянным напряжением, на СДЛ от диммера поступает уменьшенное напряжение. Управляющие команды приходят от ПДУ. Вместо ПДУ можно использовать и проводные системы передачи управляющего сигнала. Распространено два метода передачи сигнала по кабелю: с использованием традиционных светорегуляторов, предназначенных для ламп накаливания па симисторах (triac), и с использованием светорегуляторов со стандартом 1-10 В (0-10 В).
Симисторные (triac) регуляторы света используются для диммирования обычных ламп накаливания, схема подключения такого диммера представлена на рис. 4.
Рис. 4. Схема подключения симисторного (triac) диммера
Диммер регулирует яркость подключенной к нему светодиодной ленты от 0 до 100%, получая от симисторного регулятора яркости напряжение в диапазоне 40-220 В АС. Это напряжение, в данном случае, является сигналом управления и не используется для питания СДЛ. Лента получает питание от стабилизированного источника напряжения 12 или 24 В.
Необходимо учитывать, что многие светорегуляторы рассчитаны на работу только с лампами накаливания или галогенными лампами и могут некорректно работать со светодиодным оборудованием. Нужно использовать светорегуляторы, предназначенные для работы с электронными балластами. Перед монтажом рекомендуется проверить совместную работу диммера и светорегулятора.
Достоинство симисторного управления светом состоит в распространенности таких регуляторов, почти каждый производитель электроустановочных изделий их выпускает.
Второй метод передачи управляющего сигнала по кабелю использует так называемый интерфейс 0-10 В (1-10 В). Схема подключения диммеров, работающих с этим стандартом для СДЛ, представлена на рис. 5.
Рис. 5. Схема подключения диммера по стандарту 0-10 В
Данный стандарт специально разработан для управления регулируемыми светотехническими приборами: диммерами, диммируемыми БП (драйверами), электронными пускорегулирующими аппаратами. При изменении управляющего напряжения от 0 до 10 В диммер на выходе меняет питающее СДЛ напряжение в диапазоне 0-100%. При напряжении сигнала ниже 1 В диммер (или диммируемый драйвер) снижает выходную мощность до нуля, а при напряжениях порядка 9,5-10 В выходная мощность максимальна. Для производителей диммеров работа с таким стандартом логична и понятна, но производители электроустановочных изделий выпускают такие регуляторы реже, чем симисторные (triac), и не всегда удается подобрать необходимый по внешнему виду регулятор.
Но данный интерфейс все же достаточно перспективный, он позволяет создавать системы с лучшей плавностью регулирования, и более безопасный, так как используется низкое напряжение.
Если вы собираетесь подключать СДЛ мощностью больше, чем мощность диммера, то следует использовать усилитель. Рассмотрим схему подключения СДЛ с одноканальным усилителем (рис. 6).
Рис. 6. Подключение СДЛ через одноканальный усилитель
БП подает напряжение на усилитель и диммер. Одна часть ленты подключается напрямую к диммеру, а другая — через одноканальный усилитель мощности. В данной схеме усилитель питается от БП, к которому подключен диммер, но можно также усилитель питать от отдельного БП. Лучше всего использовать два усилителя, чтобы вся нагрузка была на усилителях, а диммер был бы без нагрузки, как показано на рис. 7.
Рис. 7. Подключение СДЛ через два одноканальных усилителя
Подключение через два одинаковых усилителя дает более правильную нагрузку, таким образом, исключается вероятность задержки по времени и разницы в яркости между разными участками СДЛ. Желательно использовать электрический кабель одинаковой длины и сечения.
Разумеется, по принципу данной схемы можно подключать и большее количество СДЛ через большее количество усилителей.
Иногда для усиления мощности диммируемой системы используются трехканальные RGB-усилители, которые в первую очередь предназначены для подключения многоцветных СДЛ RGB. Рассмотрим схему подключения СДЛ через многоканальный RGB-усилитель (рис. 8).
Рис. 8. Подключение через многоканальный RGB – усилитель
Сигнал от диммера подается на вход усилителя, при этом «+» от диммера подается на «+» усилителя, а «-» с диммера подается на «-» трех входов усилителя. То есть входные клеммы «-» R (красный), «-» G (зеленый) и «-» Б (синий) замкнуты между собой.
Обращаем ваше внимание, что выходные сигналы ни в коем случае не должны замыкаться между собой, иначе усилитель может выйти из строя. На каждый выход усилителя подключается отдельный участок СДЛ, как показано на рис. 8. Более совершенная схема подключения представлена на рис. 9.

Рис. 9. Оптимальное подключение большого количества светодиодных лент через RGB-усилители
Схемы управления многоцветными СДЛ RGB
Сперва рассмотрим наиболее простую последовательность подключения СДЛ, как показано на рис. 10.
Рис. 10. Простое подключение многоцветной RGB СДЛ
БП постоянным напряжением питает контроллер, который способен получать управляющие команды от ПДУ. RGB СДЛ подключаем к контроллеру.
В случае если мощность RGB-лент больше мощности контроллера и, соответственно, БП, используем усилитель. На схеме (рис. 11) показано подключение через многоканальный усилитель. Один участок СДЛ питается от контроллера, а другой — от усилителя сигнала.
Рис. 11. Схема подключения RGB-ленты через усилитель
Здесь есть важный момент. При выборе определенных цветов свечения СДЛ бывают случаи, когда наблюдается разница цветов участка ленты, подключенного к контроллеру, с участком, подключенным к усилителю. На рис. 12 показан пример различия по оттенку свечения СДЛ.
Рис. 12. Пример различия по оттенку свечения ленты
Также возможно различие во времени срабатывания между этими участками СДЛ при включении системы.
Возникает данное явление из-за различия вольт-амперных выходных параметров контроллера и усилителя. Также влияние может оказать слишком большая разница между длиной проводов от участка, подключенного к контроллеру, с участком подключения через усилитель. Чтобы избежать подобного, нужно производить подключение по схеме, как показано на рис. 13.
Рис. 13. Оптимальная схема подключения RGB-лент через усилители
Использовать нужно кабель питания (от усилителей до СДЛ) приблизительно одинаковой длины.
На схеме показано подключение двух усилителей, которые питаются от одного БП. Благодаря установке усилителя на каждую СДЛ в итоге мы получаем одинаковые цвета и оттенки на всех участках. Еще нужно учесть необходимость применять усилители одного производителя и одной модели.
Если у вас большое количество СДЛ и их мощность превышает мощность БП, следует использовать несколько БП, при этом на каждый усилитель можно подключить свой БП, а контроллер может питаться от любого БП, т. к. в данной схеме он не нагружен и будет потреблять крайне малое количество электроэнергии. На схеме (рис. 14) показано данное подключение.

Рис. 14. Оптимальная схема подключения RGB-лент через усилители с раздельным питанием
Также нужно быть осторожным с проводами, подключенными к СДЛ, избегая их замыкания. Результат такой ошибки проявляется постоянным свечением светодиодов на поврежденном канале, без какой-либо реакции на управляющие команды от ПДУ. Поэтому при сборке и наладке многоцветных RGB-систем надо следить особенно внимательно за тем, чтобы проводники не создавали замыканий даже на короткое время. В RGB-лентах такое замыкание возникает чаще, так как контактные площадки расположены близко друг к другу.
Управление СДЛ по цифровому протоколу SPI
Этот цифровой протокол управления заслуживает отдельного внимания, так как он распространен для СДЛ. Протокол позволяет отдельно управлять каждым светодиодом, появляется возможность получать интересные эффекты, такие как «бегущие огни», «северное сияние», можно даже собрать экран или «бегущую строку».
Система на SPI СДЛ показана на рис. 15. От БП (обычно 5 или 12 В) мы питаем контроллеры и SPI СДЛ.
Рис. 15. Схема подключения SPI СДЛ
Такие СДЛ оснащены микросхемами, которые декодируют цифровой сигнал в аналоговый, пригодный для работы светодиодов.
При выборе управляющих контроллеров важно учесть количество RGB- пикселей: если для SPI-ленты заявлено 300 пикселей, то и контроллер должен поддерживать не менее 300 пикселей. Пиксель — это минимальная многоцветная единица управления, то есть это один или несколько RGB-светодиодов, которые в момент времени способны иметь одинаковыми цвет и интенсивность свечения. Чаще всего 1 пиксель = 1 RGB-светодиод, бывают системы 1 пиксель = 3 RGB-светодиода или 1 пиксель = 6 RGB-светодиодов. Важно понимать, что для создания экрана нужно выбирать СДЛ, где 1 пиксель = 1 RGB СДЛ, иначе на трех или шести диодах изображение будет растянутым. При подключении SPI-лент нужно учитывать направление распространения сигнала, оно обозначено стрелкой на печатной плате (рис. 15, 16).
Рис. 16. Фрагмент SPI СДЛ
Управление СДЛ по цифровому протоколу DMX, DALI
DMX и DALI — цифровые протоколы управления светом, чаще всего используются в театрах, концертных залах, ресторанах и в различных системах интерьерного освещения, в системах «умный дом». Схемы и общие принципы схожи с описанными выше, с одной лишь разницей, что в дополнение к контроллеру используется декодер, который преобразует цифровой сигнал в привычный аналоговый ШИМ (широтно-импульсная модуляция). Схема подключения представлена на рис. 17.
Рис. 17. Система управления светом по цифровому протоколу на примере DMX
В данном случае существует единая система управления, на которой человек способен задать нужную программу (световой сценарий) управления светом, затем этот сценарий преобразуется в цифровой сигнал и передается на декодеры, объединенные в одну сеть (рис. 15).
Преимущества цифровых протоколов для управления освещением
Цифровые протоколы дают возможность управлять каждым источником света, можно проигрывать световые сцены. Это удобно для театров, т. к. светооператор с одного пульта управляет всеми световыми приборами. Также это удобно для больших квартир и офисов, где интересно сформировать различные световые сценарии, например: одной клавишей включить закарнизную подсветку и все остальные осветительные приборы, создав максимально яркое освещение для активной деятельности, а другой клавишей включить закарнизную подсветку на 30% яркости совместно с торшерами без люстр, создав приглушенный свет для спокойной обстановки. Имеется возможность объединения в одну сеть различного светового оборудования: светильники, одноцветные СДЛ, многоцветные СДЛ RGB, прожекторы, лампы — как светодиодные, так и накаливания или люминесцентные.
Еще одно преимущество — возможность передавать сигнал на большие расстояния. Например, если у нас расстояние между различными участками СДЛ 100 м, то в этом случае управляющий сигнал нужно передавать в цифровом формате. Аналоговый придет от контроллера до усилителя ослабленным, традиционные усилители для СДЛ усиливают ток, а не напряжение, поэтому СДЛ будет светить тусклее. Если расстояние контроллер — усилитель значительно больше 30 м, советуем также задуматься об использовании цифровых протоколов управления.
В заключение посоветуем перед созданием управляемой светотехнической системы при покупке оборудования получить консультацию и доверять монтаж квалифицированному персоналу.
Источник
Журнал «Полупроводниковая светотехника» 2017
© «СИТИ Эксклюзив», 2018
«Gorod LED» — крупнейший российский интернет магазин оптовой и розничной торговли электронными компонентами, светотехническим оборудованием и комплектующими на основе светодиодов.
Самый широкий ассортимент продукции ведущих мировых и российских светотехнических компаний в наличии на складах в семи городах миллионниках.
Мы предоставляем полный комплекс услуг по проектированию и монтажу систем освещения.
Работаем на рынке светодиодного оборудования более 10 лет.
Есть вопрос? Мы поможем — +7 (495) 414-23-18
- Помощь покупателю
- Как купить?
- Оплата и доставка
- Гарантия и возврат товара
- Информация для покупателя
- Акции и скидки
- Новости
- Статьи
- Всё о свете
- О компании
- О компании
- Выполненные работы
- Политика безопасности
- Документы
Бесплатные звонки по России тел.: 8-800-234-54-05
Как одной кнопкой включить 30 светодиодов

| Текущее время: Сб мар 16, 2024 01:04:51 |
Часовой пояс: UTC + 3 часа
Запрошенной темы не существует.
Часовой пояс: UTC + 3 часа

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y
Работоспособность сайта проверена в браузерах:
IE8.0, Opera 9.0, Netscape Navigator 7.0, Mozilla Firefox 5.0
Адаптирован для работы при разрешениях экрана от 1280х1024 и выше.
При меньших разрешениях возможно появление горизонтальной прокрутки.
По всем вопросам обращайтесь к Коту: kot@radiokot.ru
©2005-2024