Кнопка светодиод

ренат330
Offline
Зарегистрирован: 24.03.2019

ВСЕМ ПРИВЕТ!!! 

нужнана небольшая помощь в доработке )))

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

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

очень надо)) помогите пожалуйста

зарание спасибо

const int
button1Pin = 2;
const int button2Pin = 3;
const int led1Pin = 8;
const int led2Pin = 7;
void setup() 
{
 pinMode(led1Pin, OUTPUT);
 pinMode(led2Pin, OUTPUT);
 pinMode(button1Pin,INPUT);
 pinMode(button2Pin,INPUT);
}                 
void loop()
{
 if
 (digitalRead(button1Pin) == HIGH) 
 {
  digitalWrite(led1Pin,HIGH);
  delay(3000);
  digitalWrite(led1Pin,LOW);
 } 
 if(digitalRead(button2Pin) == HIGH) 
 {
  digitalWrite(led2Pin,HIGH);
  delay(3000);
  digitalWrite(led2Pin,LOW);
 }
}

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

А если не вмешиваться в процесс ... так и должно остаться? Загараются при нажатии кнопки на 3 секунды.

Попробуй решить заменой Delay на millis.

Я так думаю ... Модератор переместит эту тему в другой раздел форума. 

 

ренат330
Offline
Зарегистрирован: 24.03.2019

блин все уже облазил и примеры смотрел и уроки смотрел 

целый день уже со вчерашнего вечера, хотя для познания ардуино это мгновение )))

но я ни как не могу грамотно заменить на millis 

 может хоть наведёте на мыслю )

а то как то и не удобно людей отлекать и просить о большем  )

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Тута посмотрите - может навеит чего. Ругани там много, но и здравые мысли есть.

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018
GVS
GVS аватар
Offline
Зарегистрирован: 26.04.2018

Причина в том, что delay вешает работу основного цикла на время указанное в нем и в этот промежуток времени ардуинка тупо отдыхает, ни чего не опрашивает, ни чего не меняет и т.п. Если вы хотите что бы контроль нажатия кнопок был постоянно - delay использовать не вариант...  Для меня самый понятный пример по использованнию millis опубликован на главной странице http://arduino.ru/Reference а именно "Мигаем светодиодом без delay" - почитайте, код придется переписать, но за то получите, то что хотели...

ренат330
Offline
Зарегистрирован: 24.03.2019

Пацаны, вы крассавчики, с этим не поспоришь

я написал с помощью millis  и всё получилось опупенно, слов нет, даже жену разбудил на радости, но не об этом 

позже я понял что можно было использовать функцию switch/case но узнал поздно, да и изучать это поку не к чему 

 вот мой текст с millis

тут все работает как мне надо за одним исключением 

Вот смотрите: я нажал тактовую кнопку и загорелся светодиод на 3 сек. и погас, если держу три сек. и отпускаю то он горит три сек. т. е. в сумме 6 сек. (с этим думаю понятно), а мне для идеальности надо реализовать так: не важно, нажал я кнопку один раз или держу её минуту, светодиод должен гореть три секунды и потухнуть даже если я кнопку не отпутил  

я изучил команды ардуино и не нашел ни чего подходящего 

Такое вообще вариант реализовать?

const int
button1Pin = 2;
const int
button2Pin = 3;
const int
led1Pin = 7;
const int
led2Pin = 8;
unsigned long
led1OnTime;
unsigned long led2OnTime;
bool led1On;
bool led2On;
void setup() 
{
 pinMode(led1Pin,OUTPUT);
 pinMode(led2Pin,OUTPUT);
 pinMode(button1Pin,INPUT);
 pinMode(button2Pin,INPUT);
 led1On = false;
 led2On = false;
}
void loop()
{
 if (digitalRead(button1Pin)== HIGH) 
 {
  digitalWrite(led1Pin,HIGH);
  digitalWrite(led2Pin,LOW);
  led1On = true;
  led1OnTime = millis();
 }
 if(digitalRead(button2Pin) == HIGH) 
 {
  digitalWrite(led2Pin,HIGH);
  digitalWrite(led1Pin,LOW);
  led2On = true;
  led2OnTime = millis();
 }
 if(led1On)
 if(millis() -led1OnTime > 3000) 
 {
  digitalWrite(led1Pin,LOW); 
  led1On = false;
 }
 if(led2On)
 if(millis() -led2OnTime > 3000)
 {
  digitalWrite(led2Pin,LOW);
  led2On = false;
 }
}

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016
ренат330
Offline
Зарегистрирован: 24.03.2019

тысяча извинений и все разные )))

sadman41
Offline
Зарегистрирован: 19.10.2016

Например: cтрока 25 инструктирует засекать момент включения каждый проход loop(), при котором будет обнаружено активное состояние кнопки. Надо же сделать так, чтобы этот момент засекался один раз. Применяйте флажок button1NotPressed по аналогии с led1On.

Только учтите, что возвращать его состояние нужно тогда, когда кнопка перешла обратно в LOW. Т.е. добавить ещё по одному if()-у на кнопку.

GVS
GVS аватар
Offline
Зарегистрирован: 26.04.2018

ренат330 пишет:

нажал я кнопку один раз или держу её минуту, светодиод должен гореть три секунды и потухнуть даже если я кнопку не отпутил  

В таком случае вам нужно отслеживать фронт изменения уровня на входе ;-) это направление для действия...

ренат330
Offline
Зарегистрирован: 24.03.2019

бошка уже устала, если можно немножко подробней, если я добовлю по одному if()  на каждую кнопку

так, че то при дописании дополнительного if()  ругаться начинает 

я получается на каждую кнопку после 30 и 37 строки 

или туплю ? 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ренат330 пишет:

я изучил команды ардуино и не нашел ни чего подходящего 

Команды Ардуино здесь вообще ни при чем.

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

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

GVS
GVS аватар
Offline
Зарегистрирован: 26.04.2018

Ну вот как бы моя логика, на железе не проверял, но кажется должна работать адекватно )))

const int button1Pin = 2, button2Pin = 3, led1Pin = 7, led2Pin = 8;
long led1OnTime, led2OnTime, currentMillis;
bool but1On, but2On, led1On, led2On;
void setup() 
{
 pinMode(led1Pin,OUTPUT);
 pinMode(led2Pin,OUTPUT);
 pinMode(button1Pin,INPUT);
 pinMode(button2Pin,INPUT);
 but1On = false;                                                    // устанавливаес состояние кнопки1 ВЫКЛ
 but2On = false;
 led1On = false;                                                    // устанавливаес состояние светодиода1 ВЫКЛ
 led2On = false;
}
void loop()
{
 currentMillis = millis; 
 if (digitalRead(button1Pin) == HIGH && !but1On && !led1On)         // "Нажали кнопку1", на входе кнопки1 появилась "1", а до этого был "0" и светодиод не горел
 {
  digitalWrite(led1Pin,HIGH);                                       // поджигаем светодиод1
  led1On = !led1On;                                                 // меняем состояние светодиода1 на ВКЛ
  digitalWrite(led2Pin,LOW);                                        // тушим светодиод2
  led2On = false;                                                   // сбрасываем состояние светодиода2 
  but1On = !but1On;                                                 // меняем состояние кнопки1 на ВКЛ
  led1OnTime = millis();                                            // запоминаем время когда произошло включение светодиода1
 }
 if (led1On && currentMillis - led1OnTime > 3000) {                 // если с момента включениея светодиода1 прошло больше 3с 
    digitalWrite(led2Pin,LOW);                                      // тушим светодиод1
    led1On = !led1On;                                               // меняем состояние светодиода1 на ВЫКЛ
 }
 if (digitalRead(button2Pin) == HIGH && !but2On && !led2On) 
 {
  digitalWrite(led2Pin,HIGH);
  led2On = !led2On;
  digitalWrite(led1Pin,LOW);
  led1On = false;
  but2On = !but2On;
  led2OnTime = millis();
 }
 if (led1On && currentMillis - led1OnTime > 3000) {
    digitalWrite(led2Pin,LOW);
    led1On = !led1On;
 }    
 if (digitalRead(button1Pin) == LOW && but1On)                      // "Отпустили кнопку1", на входе кнопки1 появился "0", а до этого была "1" 
    but1On = !but1On;                                               // меняем состояние кнопки1 на ВЫКЛ
 if (digitalRead(button2Pin) == LOW && but2On) 
    but1On = !but2On;   
 }