Моргание светодиодом

penoplast
Offline
Зарегистрирован: 22.09.2011

 

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

Ну , раз очень нужно ...

 Вот такая программа получилась.

Включаем питание - светодиод не горит.

Нажимаем кнопку - светодиод мигает с промежутком в одну секунду.

Нажимаем второй раз - мигает с промежутком 0.5 секунды.

Нажимаем третий раз - мигает с промежутком в 0.1 секунды.

Нажимаем четвертый раз - гаснет (цикл режимов начинается с начала).

 

l

long previousMillis = 0;//переменная для хранения значений таймера
int val=0;//переменная для определения режимов мигания
int val2=0;//переменная для хранения длинны мигиния
int knopka=0;//переменная для хранения состояний кнопки

void setup()

{
  

  pinMode(10,INPUT);
   pinMode(13,OUTPUT);
  
}


void loop()
{
  

 
    if (digitalRead(10)==HIGH&&knopka==0) //если кнопка нажата и 
    //переменная "knopka" равна 0 то ...
 {  
  
   val++;// переменная вал плюс 1
  
    knopka++;//переменная кнопка плюс 1
    
 
 }
   if(digitalRead(10)==LOW&&knopka==1)//если кнопка НЕ нажата и 
   //переменная "knopka" равна 1 то ...
  {
     knopka=0;//обнуляем переменную "knopka"
  }
  
    if(val==1)//если val равно 1 то ... 
  {
    val2=1000; //val2 равно 1000
  }
  
      if(val==2)//если val равно 2 то ... 
  {
    val2=500;  //val2 равно 500
  }
  
       if(val==3)//если val равно 3 то .
  {
    val2=100;  //val2 равно 100
  }
  
       if(val==4)//если val равно 4 то .
  { 
   
    
    val=0; //обнуляем переменную val для возврата в начало цикла 
    //режимов мигания
    }
  
  
  
  if (millis() -previousMillis >val2) //запускаем таймер мигания светодиодом
 {  
   previousMillis = millis();  
   digitalWrite(13, !digitalRead(13));
   if(val==0)//если val равно 0 то ...
   {
    digitalWrite(13,LOW); //выключаем светодиод
   }
 }


}

 

 

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

Откоментирую позже. 

penoplast
Offline
Зарегистрирован: 22.09.2011

огромное спасибо!) 

Mogalkov
Offline
Зарегистрирован: 23.06.2011

А посему не через switch case? или -?

penoplast
Offline
Зарегистрирован: 22.09.2011

через switch, case было бы круче для меня) 

penoplast
Offline
Зарегистрирован: 22.09.2011

еще вопрос, зачем выход 12? 

bakemono
bakemono аватар
Offline
Зарегистрирован: 11.08.2011

 а разве таким образом значение val будет увеличиваться на единицу каждую миллисекунду ?

void loop() {
	if (digitalRead(10)==HIGH&&knopka==0) {
		val++;
}

 

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

"а разве таким образом значение val будет увеличиваться на единицу каждую миллисекунду ?
код

расечатать
?1 void loop() {
2 if (digitalRead(10)==HIGH&&knopka==0) {
3 val++;
4 }"
 

 

Ничего не понял , причем тут милисекунды и почему val должно увеличиваться ?

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

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

И , кстати bakemono вы где взяли этот кусок кода ? 

Это не мое.

Mogalkov
Offline
Зарегистрирован: 23.06.2011

bakemono пишет:

 а разве таким образом значение val будет увеличиваться на единицу каждую миллисекунду ?

void loop() {
	if (digitalRead(10)==HIGH&&knopka==0) {
		val++;
}

 

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

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

Вы где взяли этот кусок кода ? 

Если вы внимательно посмотрите , то у меня вот так.

Это огромная разница.

if (digitalRead(10)==HIGH&&knopka==0)
   {  
    
   val++;
  
   knopka++;
  
    
   }

Переменная val не увеличиться пока не обнулиться переменная knopka.

Видать придется полностью коментировать.

 

bakemono
bakemono аватар
Offline
Зарегистрирован: 11.08.2011

 nestandart

писал ночью не увидел) сейчас разглядел)

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