Включение-выключение светодиода одной и той же кнопкой без фиксации.
- Войдите на сайт для отправки комментариев
Вс, 18/09/2011 - 16:09
Вобщем программить я толком еще не начал даже наверно :-) так, склеиваю куски примеров :-)
Вопрос такой: Ребят, помогите написать скетч по принципу:
есть 2 светодиода. изначальное состояние - LOW.
pin 2,3 пусть будут кнопки.
при нажатии pin2 загорается диод1, при повторном нажатии диод1 гаснет.
с pin3 и диодом2 картина та же. Работать они должны независимо.
Ну и плюс учесть дребезг контактов. Никак немогу определиться с алгоритмом (точнее просто немогу начать)
Кнопка без фиксации.
Первое что пришло в голову.
Возможно можно и уменьшить код или сделать его более красивым.
Если так то напишите. И мне интересно!
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); }
Взяли готовый код из соседней ветки, малость его перелопатили, взяли отдельно 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. работали под пивом :-) С Дружбаном на пару )
LEVV2006 Ваш код завтра рассмотрю детально. В данный момент уже моск нехочет думать адекватно :-)
Это что у вас такое ?
Это зачем ?
Вот рабочая программа (на вскидку набросал).
Поймите общие принцыпы , они вам в будещем очень пригодяться.
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" } }От модератора: Поправил вывод кода. Пожалуйста пользуйтесь кнопкой вставки кода. Вторая кнопка наверху, рядом с кнопкой Источник. Так же легче читать код.
Пасибо, сейчас обязательно просмотрю этот скетч. именно на примерах и приходится учиться, ибо так понятнее )))
Привольно приму к сведению))))
Модератору. Читать легче а вот копипастить в IDE нет (приходится в ручную удалять номера строк).
Я кое что поправил ... в общем могут быть чисто "орфаграфические" ошибки (из - за невнимательности).
Модератору. Читать легче а вот копипастить в IDE нет (приходится в ручную удалять номера строк).
Если навести курсор на код, то справа на уровне первых строчек возникнет меню из четырех кнопок, вторая кнопка сохраняет весь код в буфер обмена без номеров строчек - очень удобно.
Модератору. Спасибо , не знал.
Вот нашел в стандартных примерах похожий код!!!!
http://witharduino.blogspot.com/2011/12/button-state-change.html
http://www.ladyada.net/learn/arduino/lesson5.html
http://youtu.be/wezPs_jxPQg вот мой принцып отыграл на протеусе работу скейча, одна кнопка и два светодиода , в скейче придусмотрен дребезг кнопки на ложное срабатывание , Порядок такой нажимаем кнопку загорается светодиод 1 и через заданное время он гаснет, нажимаем ещё раз - загорается второй светодио и гаснет через заданное время , всё прекрасно работает
Подскажите молодому, а то в глазах рябит.
К ардуино подключен приемник на 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(); } }Доброго времмени суток! Подскажите пожалуйста,как написать подобный скетч(управлением 2-х реле от 2-х кнопок... каждая кнопка при одном нажатии включает и отключает одно реле,при этом не машает работе другой паре - реле и кнопка! порядок запуска реле должен быть не зависимым друг от друга).
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); }Загружаю на ардуино пишет ошибка
в чем проблема?
мне нужно чтобы при замкнутой кнопке включялось реле, при разомкнутой отключялось
/**/ 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 байт. */Кнопку подлючать земля вывод, без резистора.
Спасибо огромное
Ну скорее всего так надо
/* Блокировка ворот Включяется реле (вывод 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 байт. */Ну скорее всего так надо
/* Блокировка ворот Включяется реле (вывод 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 байт. */в предыдущем примере так-же, только у вас короче :) Вот только можно же напрямую с кнопки тогда включить нагрузку, без ардуино.
bool _bounseInputD3S = 0; bool _bounseInputD3O = 0; unsigned long _bounseInputD3P = 0UL; bool _trgt1 = 0; bool _trgt1I = 0; bool _trgt2 = 0; bool _trgt2I = 0; bool _bounseInputD2S = 0; bool _bounseInputD2O = 0; unsigned long _bounseInputD2P = 0UL; void setup() { pinMode(2, INPUT); pinMode(3, INPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); _bounseInputD2O = digitalRead(2); _bounseInputD3O = digitalRead(3); } void loop() { bool _bounceInputTmpD2 = (digitalRead (2)); if (_bounseInputD2S) { if (millis() >= (_bounseInputD2P + 40)) {_bounseInputD2O= _bounceInputTmpD2; _bounseInputD2S=0;} } else { if (_bounceInputTmpD2 != _bounseInputD2O ) {_bounseInputD2S=1; _bounseInputD2P = millis();} } bool _bounceInputTmpD3 = (digitalRead (3)); if (_bounseInputD3S) { if (millis() >= (_bounseInputD3P + 40)) {_bounseInputD3O= _bounceInputTmpD3; _bounseInputD3S=0;} } else { if (_bounceInputTmpD3 != _bounseInputD3O ) {_bounseInputD3S=1; _bounseInputD3P = millis();} } //Плата:1 bool _tmp1 = _bounseInputD2O; if (_tmp1) { if (! _trgt1I) _trgt1 = ! _trgt1; } _trgt1I = _tmp1; digitalWrite(4, _trgt1); bool _tmp2 = _bounseInputD3O; if (_tmp2) { if (! _trgt2I) _trgt2 = ! _trgt2; } _trgt2I = _tmp2; digitalWrite(5, _trgt2); }Как то так, стягивающий резистор на землю, для каждой кнопки свой
Надо задание сделать
шел бы ты отсюда... учиться. Тут тебе не обломится.
Какой ты добрый
Задание может и тебе сделают, но за то ты потом учителю не сдашь. Первый вопрос и посыпишься, как песочный замок. #7
Есть 3 кнопки и 3 диода.условие включения для красного светодиода одновременно включены 1 и 3 тумблер.условия включения желтого светодиода одновременно включен 2 и 3 тумблер.условия включения зеленого светодиода одновременно выключен 1 и 2 тумблер а также включен 3 тумблер..кнопки подключены на плате 8,7,6, а диоды 13,12,11.мне просто не понятно где писать setup или в loop
Код в setup выполняется один раз при старте, а код в loop выполняется постоянно (зациклено). Решай сам, где тебе писать.
Как примерно написать ?
Примерно как в этой теме выше.
Напиши пару строк как писать
void setup() {} void loop() {}Что писать в setup a что в loop
В сетуп пишется инициализация переферии, в луп алгоритм поведения переферии описаной в сетуп.
Все равно не понял
Вам в другой раздел: Ищу исполнителя
15 тыс рублей
boolean flag1=0;
boolean flag2=0;
boolean diod1=0;
boolean diod2=0;
#define knopka1 3
#define knopka2 4
void setup(){
pinMode(knopka1,INPUT_PULLUP);
pinMode(knopka2,INPUT_PULLUP);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
}
void loop(){
if(knopka1==0&&flag1==0){diod1=!diod1;flag1=1;}
if(knopka1==1){flag1=0;}
digitalWrite(5,diod1);
if(knopka2==0&&flag2==0){diod2=!diod2;flag2=1;}
if(knopka2==1){flag2=0;}
digitalWrite(6,diod2);
}
Kakmyc - и к чему вы это написали?
Во-первых, не соответствует ТЗ, во-вторых - код достаточно бредовый, работать (разумно) не будет.
Идите учитесь дальше.