Не могу вернутся в исходную точку .

Boom_nick
Offline
Зарегистрирован: 20.02.2015

Как вернутся в начало после срабатывания блока falstart без продолжения основных блоков ?Подскажите пожалуйста , сам новичок еще. 

 int y1Led = 12;             // Порт 12, желтый светодиод первый такт
  int Y2Led = 11;             // Порт 11, желтый светодиод второй такт
  int Y3Led = 10;             // Порт 10, желтый светодиод третий такт
  int GrnLed = 9;             // Порт 9, зеленый светодиод
  int RedLed = 8;             // Порт 8,  красный светодиод
  int inputButon = 7;         // Порт 7 кнопка
  int ik = 6;                 // Порт 6 Сенсор фальстарта
  
  // Переменные
  int start = 0;                
  int Fs=0;
  //Время
  int t = 200;   //основные        
  int Gt = 3000;   // зеленый       
  
      void setup()
{
    //  Выход
  pinMode(y1Led, OUTPUT);   
  pinMode(Y2Led, OUTPUT);
  pinMode(Y3Led, OUTPUT);
  pinMode(GrnLed, OUTPUT);
  pinMode(RedLed, OUTPUT);
      // Вход
  pinMode(inputButon, INPUT);      
  pinMode(ik,INPUT);                
}  
     void falstart ()
{
  Fs = digitalRead(ik); // считываем значения с входа кнопки
  if (Fs == LOW)  // проверяем нажата ли кнопка
  {    
    // Действие
  digitalWrite(RedLed, HIGH);
  digitalWrite(y1Led, LOW);
  digitalWrite(Y2Led,LOW);
  digitalWrite(Y3Led, LOW);  
  digitalWrite(GrnLed, LOW);
  delay(Gt); 
  digitalWrite(RedLed, LOW);
  

}
}
     void loop()
{
  start = digitalRead(inputButon); // считываем значения с входа кнопки
  if (start == LOW)  // проверяем нажата ли кнопка
{
  digitalWrite(y1Led, HIGH); // включение светодиода
    
   // Включаем выключаем 1й желтый светодиод.
  falstart ();
  digitalWrite(y1Led, HIGH);
  falstart ();  
  delay(t); 
  falstart ();
  digitalWrite(y1Led, LOW);
  falstart ();
  delay(t);
  
  // Включаем выключаем 2й желтый светодиод
  falstart ();
  digitalWrite(Y2Led, HIGH);
  falstart ();  
  delay(t);        
  falstart ();  
  digitalWrite(Y2Led, LOW);
  falstart ();
  delay(t);
  
  // Включаем выключаем 3й желтый светодиод
  falstart ();
  digitalWrite(Y3Led, HIGH);  
  falstart ();  
  delay(t);        
  falstart ();  
  digitalWrite(Y3Led, LOW);  
  falstart ();
  delay(t); 
  
  // Включаем выключаем зеленый светодиод 
  falstart ();
  digitalWrite(GrnLed, HIGH);
  delay(Gt);         
  digitalWrite(GrnLed, LOW); 
}
}
  

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

return в нужном месте в loop. Один из вариантов.

Boom_nick
Offline
Зарегистрирован: 20.02.2015

kisoft пишет:
return в нужном месте в loop. Один из вариантов.

Чето я не могу въехать куда . Если не трудно впишите хотя бы примером . falstart может сработать в любой точке loop блока , зависит от условий . Заранее благодарен .

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

falstart сделать функцией а не процедурой и возвращать false или true а в loop все строки falstart(); заменить на if(falstart) return;

Boom_nick
Offline
Зарегистрирован: 20.02.2015

Penni пишет:

falstart сделать функцией а не процедурой и возвращать false или true а в loop все строки falstart(); заменить на if(falstart) return;

Пожалуйста , можно примером ,до меня так быстрее доходит ))) 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

В 28 строке заменить void на boolean

В 41 строке написать return true;

В 43 строке заменить } на }else return false;

В loop все строки falstart(); заменить на if(falstart) return;

nevkon
Offline
Зарегистрирован: 20.01.2015

Можно сделать так:

 int y1Led = 12;             // Порт 12, желтый светодиод первый такт
  int Y2Led = 11;             // Порт 11, желтый светодиод второй такт
  int Y3Led = 10;             // Порт 10, желтый светодиод третий такт
  int GrnLed = 9;             // Порт 9, зеленый светодиод
  int RedLed = 8;             // Порт 8,  красный светодиод
  int inputButon = 7;         // Порт 7 кнопка
  int ik = 6;                 // Порт 6 Сенсор фальстарта
  
  // Переменные
  int start = 0;                
  int Fs=0;
  //Время
  int t = 200;   //основные        
  int Gt = 3000;   // зеленый       
  
      void setup()
{
    //  Выход
  pinMode(y1Led, OUTPUT);   
  pinMode(Y2Led, OUTPUT);
  pinMode(Y3Led, OUTPUT);
  pinMode(GrnLed, OUTPUT);
  pinMode(RedLed, OUTPUT);
      // Вход
  pinMode(inputButon, INPUT);      
  pinMode(ik,INPUT);                
}  
     bool falstart () // делаем не процедуру, а фукцию
{
  Fs = digitalRead(ik); // считываем значения с входа кнопки
  if (Fs == LOW)  // проверяем нажата ли кнопка
  {    
    // Действие
  digitalWrite(RedLed, HIGH);
  digitalWrite(y1Led, LOW);
  digitalWrite(Y2Led,LOW);
  digitalWrite(Y3Led, LOW);  
  digitalWrite(GrnLed, LOW);
  delay(Gt); 
  digitalWrite(RedLed, LOW);
  return true;

} else { return false; }
}
     void loop()
  bool _stop = false;
{
  start = digitalRead(inputButon); // считываем значения с входа кнопки
  if (start == LOW)  // проверяем нажата ли кнопка
{
  digitalWrite(y1Led, HIGH); // включение светодиода
    
   // Включаем выключаем 1й желтый светодиод.
  _stop=falstart ();
  digitalWrite(y1Led, HIGH);
  if (_stop) {break;}  // и так дальше...
  falstart ();  
  delay(t); 
  falstart ();
  digitalWrite(y1Led, LOW);
  falstart ();
  delay(t);
  
  // Включаем выключаем 2й желтый светодиод
  falstart ();
  digitalWrite(Y2Led, HIGH);
  falstart ();  
  delay(t);        
  falstart ();  
  digitalWrite(Y2Led, LOW);
  falstart ();
  delay(t);
  
  // Включаем выключаем 3й желтый светодиод
  falstart ();
  digitalWrite(Y3Led, HIGH);  
  falstart ();  
  delay(t);        
  falstart ();  
  digitalWrite(Y3Led, LOW);  
  falstart ();
  delay(t); 
  
  // Включаем выключаем зеленый светодиод 
  falstart ();
  digitalWrite(GrnLed, HIGH);
  delay(Gt);         
  digitalWrite(GrnLed, LOW); 
}
}
  

Правда это немного извращенный метод.

Boom_nick
Offline
Зарегистрирован: 20.02.2015

Penni пишет:

В 28 строке заменить void на boolean

В 41 строке написать return true;

В 43 строке заменить } на }else return false;

В loop все строки falstart(); заменить на if(falstart) return;

Не работает ((( Буду пробовать далее (( Загорается 1желтый и все , делее бездействует .

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

if (Fs == LOW) в falstar это условие означает что фальстарт?

Boom_nick
Offline
Зарегистрирован: 20.02.2015

Penni пишет:

if (Fs == LOW) в falstar это условие означает что фальстарт?

Да , потом в loop отробатывает при нажатии кнопки .

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Покажите поправленный код, должно работать поидее.

Boom_nick
Offline
Зарегистрирован: 20.02.2015
int y1Led = 12;             // Порт 12, желтый светодиод первый такт
  int Y2Led = 11;             // Порт 11, желтый светодиод второй такт
  int Y3Led = 10;             // Порт 10, желтый светодиод третий такт
  int GrnLed = 9;             // Порт 9, зеленый светодиод
  int RedLed = 8;             // Порт 8,  красный светодиод
  int inputButon = 7;         // Порт 7 кнопка
  int ik = 6;                 // Порт 6 Сенсор фальстарта
  
  // Переменные
  int start = 0;                
  int Fs=0;
  //Время
  int t = 200;   //основные        
  int Gt = 3000;   // зеленый       
  
      void setup()
{
    //  Выход
  pinMode(y1Led, OUTPUT);   
  pinMode(Y2Led, OUTPUT);
  pinMode(Y3Led, OUTPUT);
  pinMode(GrnLed, OUTPUT);
  pinMode(RedLed, OUTPUT);
      // Вход
  pinMode(inputButon, INPUT);      
  pinMode(ik,INPUT);                
}  
     boolean falstart ()
{
  Fs = digitalRead(ik); // считываем значения с входа кнопки
  if (Fs == LOW)  // проверяем нажата ли кнопка
  {    
    // Действие
  digitalWrite(RedLed, HIGH);
  digitalWrite(y1Led, LOW);
  digitalWrite(Y2Led,LOW);
  digitalWrite(Y3Led, LOW);  
  digitalWrite(GrnLed, LOW);
  delay(Gt); 
  digitalWrite(RedLed, LOW);
  return true;

}else return false;
}
     void loop()
{
  start = digitalRead(inputButon); // считываем значения с входа кнопки
  if (start == LOW)  // проверяем нажата ли кнопка
{
  digitalWrite(y1Led, HIGH); // включение светодиода
    
   // Включаем выключаем 1й желтый светодиод.
  if(falstart) return;
  digitalWrite(y1Led, HIGH);
 if(falstart) return; 
  delay(t); 
 if(falstart) return;
  digitalWrite(y1Led, LOW);
  if(falstart) return;
  delay(t);
  
  // Включаем выключаем 2й желтый светодиод
  if(falstart) return;
  digitalWrite(Y2Led, HIGH);
  if(falstart) return; 
  delay(t);        
  if(falstart) return; 
  digitalWrite(Y2Led, LOW);
  if(falstart) return;
  delay(t);
  
  // Включаем выключаем 3й желтый светодиод
  if(falstart) return;
  digitalWrite(Y3Led, HIGH);  
  if(falstart) return;  
  delay(t);        
  if(falstart) return;  
  digitalWrite(Y3Led, LOW);  
  if(falstart) return;
  delay(t); 
  
  // Включаем выключаем зеленый светодиод 
  if(falstart) return;
  digitalWrite(GrnLed, HIGH);
  delay(Gt);         
  digitalWrite(GrnLed, LOW); 
}
}
  

В таком порядке зажигается 1 желтый и все , потом только перегружать .

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Boom_nick пишет:

kisoft пишет:
return в нужном месте в loop. Один из вариантов.

Чето я не могу въехать куда . Если не трудно впишите хотя бы примером . falstart может сработать в любой точке loop блока , зависит от условий . Заранее благодарен .

Я ответил на ваш вопрос именно так, как понял задачу. Значит я не телепат, раз ответ непонятен. Несколько телепатов пусть трудятся, если хотят, но только я не телепат, увы.

ПС Когда человек хочет получить ответ, он описывает задачу, условия переходов, выходов, входов, тогда и ответ быстрый. Где написано, по какому условию нужно прервать цикл? Нигде.

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

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

а ну правильно, надо все if(falstart) return; заменить на if(falstart()) return;

Boom_nick
Offline
Зарегистрирован: 20.02.2015

Penni пишет:

а ну правильно, надо все if(falstart) return; заменить на if(falstart()) return;

Безмерно благодарен , пошло )))) Спасибо огромное . 

inspiritus
Offline
Зарегистрирован: 17.12.2012

Иногда примененный по делу GOTO экономит кучу сил и кода. 

Я обычно использую гоуту для реализации аналога эксклюженов.

vosara52
Offline
Зарегистрирован: 28.11.2014

Не знаю какую Вы ставите задачу, ну вот этот кот в протеусе проверил работает
При нажатии фальш старт горит красный и если нажать старт диоды перемигуют вместе с красным в противном случае при нажатии старт диоды мигают

А в общем от delay нужно отказываться тем более когда у Вас стоит задержка в 3 секунды. В это время не воспринимаются никакие команды и если фальшСтарт не выключатель а кнопка то сигнал может быть пропущен

 int y1Led = 12;             // Порт 12, желтый светодиод первый такт
  int Y2Led = 11;             // Порт 11, желтый светодиод второй такт
  int Y3Led = 10;             // Порт 10, желтый светодиод третий такт
  int GrnLed = 9;             // Порт 9, зеленый светодиод
  int RedLed = 8;             // Порт 8,  красный светодиод
  int inputButon = 7;         // Порт 7 кнопка
  int ik = 6;                 // Порт 6 Сенсор фальстарта
  
  // Переменные
  int start = 0;                
  int Fs=0;
  //Время
  int t = 200;   //основные        
  int Gt = 300;   // зеленый       
  
      void setup()
{
    //  Выход
  pinMode(y1Led, OUTPUT);   
  pinMode(Y2Led, OUTPUT);
  pinMode(Y3Led, OUTPUT);
  pinMode(GrnLed, OUTPUT);
  pinMode(RedLed, OUTPUT);
      // Вход
  pinMode(inputButon, INPUT);      
  pinMode(ik,INPUT);                
}  
     boolean falstart ()
{
	boolean c = 0;
  Fs = digitalRead(ik); // считываем значения с входа кнопки
  if (Fs == LOW)  // проверяем нажата ли кнопка
  {    
  	c=1;
    // Действие
  digitalWrite(RedLed, HIGH);
  digitalWrite(y1Led, LOW);
  digitalWrite(Y2Led,LOW);
  digitalWrite(Y3Led, LOW);  
  digitalWrite(GrnLed, LOW);
  delay(Gt); 
  digitalWrite(RedLed, LOW);
   }
return c;
}
     void loop()
{
	falstart ();
  start = digitalRead(inputButon); // считываем значения с входа кнопки
  if (start == LOW)  // проверяем нажата ли кнопка
{
  digitalWrite(y1Led, HIGH); // включение светодиода
    
   // Включаем выключаем 1й желтый светодиод.
  if (!falstart ());
 {
  digitalWrite(y1Led, HIGH);
    delay(t); 
    digitalWrite(y1Led, LOW);
    delay(t);
  }
  // Включаем выключаем 2й желтый светодиод
  if (!falstart ());
  {
  digitalWrite(Y2Led, HIGH);
    delay(t);        
   digitalWrite(Y2Led, LOW);
    delay(t);
  }
  // Включаем выключаем 3й желтый светодиод
  if (!falstart ());
  {
  digitalWrite(Y3Led, HIGH);  
    delay(t);        
   digitalWrite(Y3Led, LOW);  
    delay(t); 
  }
  // Включаем выключаем зеленый светодиод 
  if (!falstart ());
  {
  digitalWrite(GrnLed, HIGH);
  delay(Gt);         
  digitalWrite(GrnLed, LOW); 
  }
 }
}
  

 

Boom_nick
Offline
Зарегистрирован: 20.02.2015

vosara52 пишет:

Не знаю какую Вы ставите задачу, ну вот этот кот в протеусе проверил работает

Задача стоит такая , в момент пока мигают желтые (вплоть до загорания зеленого ) , если сработает датчик фальстарта он должен остановить весь протокол , потом просто горит красный светодиод . После затухания красного весь протокол встает на исходную точку до нажатия кнопки старт.  Если датчик фальстарта не срабатывает то просто отробатывают 3 желтых потом зеленый .Вот как то так )))

vosara52
Offline
Зарегистрирован: 28.11.2014

Вот этот скетч в протеусе работает так как Вы описали

 int y1Led = 12;             // Порт 12, желтый светодиод первый такт
  int Y2Led = 11;             // Порт 11, желтый светодиод второй такт
  int Y3Led = 10;             // Порт 10, желтый светодиод третий такт
  int GrnLed = 9;             // Порт 9, зеленый светодиод
  int RedLed = 8;             // Порт 8,  красный светодиод
  int inputButon = 7;         // Порт 7 кнопка
  int ik = 6;                 // Порт 6 Сенсор фальстарта
  
  // Переменные
  int start = 0;                
  int Fs=0;
  //Время
  int t = 200;   //основные        
  int Gt = 3000;   // зеленый       
  
      void setup()
{
    //  Выход
  pinMode(y1Led, OUTPUT);   
  pinMode(Y2Led, OUTPUT);
  pinMode(Y3Led, OUTPUT);
  pinMode(GrnLed, OUTPUT);
  pinMode(RedLed, OUTPUT);
      // Вход
  pinMode(inputButon, INPUT);      
  pinMode(ik,INPUT);
  digitalWrite(inputButon, HIGH);
  digitalWrite(ik, HIGH);                
}  
     boolean falstart ()
{
	boolean c = 0;
  Fs = digitalRead(ik); // считываем значения с входа кнопки
  if (Fs == LOW)  // проверяем нажата ли кнопка
  {    
  	c=1;
    // Действие
  digitalWrite(RedLed, HIGH);
  digitalWrite(y1Led, LOW);
  digitalWrite(Y2Led,LOW);
  digitalWrite(Y3Led, LOW);  
  digitalWrite(GrnLed, LOW);
  delay(Gt); 
  digitalWrite(RedLed, LOW);
   }
return c;
}
     void loop()
{
	falstart ();
  start = digitalRead(inputButon); // считываем значения с входа кнопки
  if (start == LOW)  // проверяем нажата ли кнопка
{
  digitalWrite(y1Led, HIGH); // включение светодиода
    
   // Включаем выключаем 1й желтый светодиод.
  if (!falstart ())
 {
  digitalWrite(y1Led, HIGH);
    delay(t); 
    digitalWrite(y1Led, LOW);
    delay(t);
  }
  // Включаем выключаем 2й желтый светодиод
  if (!falstart ())
  {
  digitalWrite(Y2Led, HIGH);
    delay(t);        
   digitalWrite(Y2Led, LOW);
    delay(t);
  }
  // Включаем выключаем 3й желтый светодиод
  if (!falstart ())
  {
  digitalWrite(Y3Led, HIGH);  
    delay(t);        
   digitalWrite(Y3Led, LOW);  
    delay(t); 
  }
  // Включаем выключаем зеленый светодиод 
  if (!falstart ())
  {
  digitalWrite(GrnLed, HIGH);
  delay(Gt);         
  digitalWrite(GrnLed, LOW); 
  }
 }
}
  

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

vosara52 а что произойдет если фальстарт сработает на первом желтом светодиоде и я за 3и секунды нажму снова стартовую педаль (уберу фальстарт) тогда по вашему коду загорится желтый второй третий и зеленый... И даже если я не уберу фальстарт вы еще 3и раза попадёте в falstart в которой задержка как минимум 3и секунды. Т.е. чтобы начать процедуру старта снова с вашим кодом придётся ждать минимум 10 секунд.

Boom_nick
Offline
Зарегистрирован: 20.02.2015

Penni пишет:

vosara52 а что произойдет если фальстарт сработает на первом желтом светодиоде и я за 3и секунды нажму снова стартовую педаль (уберу фальстарт) тогда по вашему коду загорится желтый второй третий и зеленый... И даже если я не уберу фальстарт вы еще 3и раза попадёте в falstart в которой задержка как минимум 3и секунды. Т.е. чтобы начать процедуру старта снова с вашим кодом придётся ждать минимум 10 секунд.

Когда горит красный то ни одна кнопка не реагирует (проверил ) и время увеличил горения красного до 30 с ( надо так по условиям ) Так что сейчас все работает как надо не без Вашей общей помощи , за это еще раз скажу спасибо ))))  Решил всю проблему до конца ))))

vosara52
Offline
Зарегистрирован: 28.11.2014

 

Boom_nick
Offline
Зарегистрирован: 20.02.2015

vosara52

Ваш код работает точно так же как и мой в первом посте . Ну все равно спасибо за беспокойство .

Boom_nick
Offline
Зарегистрирован: 20.02.2015

Возникла еще одна проблемка ( точнее с моими мозгами проблемка :-) ) , не пинайте сильно ))))

есть вот такой скеч 

int ledPin = 4; // задаем номер выхода светодиода
int inputPin = 3; // задаем номер входа, подключенный к кнопке
int inputPin1 = 6; // кнопка сброса 
int val = 0; // переменная для хранения состояния кнопки
void setup() {
pinMode(ledPin, OUTPUT);// инициализируем контакт, подключенный к светодиоду, как выход
pinMode(inputPin, INPUT);//инициализируем контакт, подключенный к кнопке, как вход
pinMode(inputPin1, INPUT);//инициализируем контакт, подключенный к кнопке, как вход
}
void loop(){
val = digitalRead(inputPin); // считываем значения с входа кнопки
if (val == HIGH) { // проверяем нажата ли кнопка
} else {
digitalWrite(ledPin, HIGH); // выключение светодиода
 delay(1000);
digitalWrite(ledPin, LOW); // включение светодиода
 delay(1000);
}}

Алгоритм таков что мне надо получить , все что в loop повторить допустим 3 раза (нужна меняющаяся переменная) и стоп. Принажатии на другую кнопку (inputPin1 = 6; // кнопка сброса) что бы все можно было повторить так же 3 раза и Т.Д.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Это можно и одной кнопкой сделать. Или надо именно двумя? Чтобы по первой три раза светодиод моргал а по второй сброс был и если снова нажать первую опять 3и раза моргаем?

Boom_nick
Offline
Зарегистрирован: 20.02.2015

Penni пишет:

Это можно и одной кнопкой сделать. Или надо именно двумя? Чтобы по первой три раза светодиод моргал а по второй сброс был и если снова нажать первую опять 3и раза моргаем?

Правельно , надо именно двумя кнопками .Точнее я три раза нажал на кнопку , 3 раза светодиод загорелся и потух , потом стоп . И при нажатии на другую кнопку цикл повторился . 

Сейчас работает так нажал на кнопку горит 1 сек потом потух задержка в 1 сек и до бесконечности . 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015
int ledPin = 4; // задаем номер выхода светодиода
int inputPin = 3; // задаем номер входа, подключенный к кнопке
int inputPin1 = 6; // кнопка сброса
byte count = 0;

void setup()
{
  pinMode(ledPin, OUTPUT);// инициализируем контакт, подключенный к светодиоду, как выход
  pinMode(inputPin, INPUT);//инициализируем контакт, подключенный к кнопке, как вход
  pinMode(inputPin1, INPUT);//инициализируем контакт, подключенный к кнопке, как вход
}
void loop()
{
  if (digitalRead(inputPin))
  {
    count = 3;
  }
  else
  {
    if(count >= 1)
    {
      digitalWrite(ledPin, HIGH); // выключение светодиода
      delay(1000);
      digitalWrite(ledPin, LOW); // включение светодиода
      delay(1000);
      count--;
    }
  }
}

С одной кнопкой можно так сделать. По нажатию кнопки задаётся число итераций когда кнопка отжата выполняются эти самые итерации, как тоьлко все выполнили можно снова нажать кнопку и итерации начнутся заново.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Значит поторопился :) Тогда еще уточнение. Нужна возможность сброса если не все итерации еще прошли?

Boom_nick
Offline
Зарегистрирован: 20.02.2015

Penni пишет:

Значит поторопился :) Тогда еще уточнение. Нужна возможность сброса если не все итерации еще прошли?

Просто возврат на исходную с нажатием на кнопку 2 и все .

>>Нужна возможность сброса если не все итерации еще прошли?<<

нет , цикл не должен менятся , даже при других действиях .

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Boom_nick пишет:

Точнее я три раза нажал на кнопку , 3 раза светодиод загорелся и потух , потом стоп.

Т.е. надо считать сколько раз нажали на кнопку и столько раз выполнять? Что-то я запутался :)

Boom_nick
Offline
Зарегистрирован: 20.02.2015

Может я не так объесняю ))) . Вообщем дело обстоит так . Сейчас работает в таком режиме . Нажал на первую кнопку светодиод горит один раз с длительностью в 1 сек. Потом тухнет , пауза 1 сек (не реагирует на кнопку ) и так до бесконечности.

Надо получить что бы этот цикл повторился 3 раза и ушел в режим ожидания до нажатия на кнопку 2 . Кагда исполняется эта цикличность реакции на кнопку 2 быть не должно. Уф долго формулировал мысль )))) В мозгах то крутися что мне надо , а нормально объяснить не могу . ))))

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

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

UPD ну ясно сейчас что-нибудь придумаем с двумя кнопками

Boom_nick
Offline
Зарегистрирован: 20.02.2015

Просто вторая кнопка нужна так как запуск процесса  будет идти с другого канала , но ожидание включения первой кнопки то же обязательно . Вот как то так .

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Ну и еще один контрольный вопрос :) Ушли мы в режим ожидания до нажатия кнопки 2. Нажали кнопку 2. Итерации сразу должны начаться или только когда нажмём кнопку 1?

Boom_nick
Offline
Зарегистрирован: 20.02.2015

Penni пишет:

Ну и еще один контрольный вопрос :) Ушли мы в режим ожидания до нажатия кнопки 2. Нажали кнопку 2. Итерации сразу должны начаться или только когда нажмём кнопку 1?

Ждем 1 кнопку

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015
int ledPin = 4; // задаем номер выхода светодиода
int inputPin = 3; // задаем номер входа, подключенный к кнопке
int inputPin1 = 6; // кнопка сброса
byte count = 0;
boolean cancel = true;

void setup()
{
  pinMode(ledPin, OUTPUT);// инициализируем контакт, подключенный к светодиоду, как выход
  pinMode(inputPin, INPUT);//инициализируем контакт, подключенный к кнопке, как вход
  pinMode(inputPin1, INPUT);//инициализируем контакт, подключенный к кнопке, как вход
}
void loop()
{
  if (digitalRead(input1Pin))
    cancel = true;
  if (digitalRead(inputPin) && cancel)
  {
    count = 3;
  }
  else
  {
    while(count >= 1)
    {
      digitalWrite(ledPin, HIGH); // выключение светодиода
      delay(1000);
      digitalWrite(ledPin, LOW); // включение светодиода
      delay(1000);
      count--;
      cancel = false;
    }
  }
}

Можно так, я бы вместо while применил if но если будут delay то while вполне нормально. к тому же Вы сказали что цикл прерывать нельзя.

UPD всё поправил

Boom_nick
Offline
Зарегистрирован: 20.02.2015

Чет матюкается ((( Ща поищу на что .

Boom_nick
Offline
Зарегистрирован: 20.02.2015

Нашел )))

if (digitalRead(input1Pin))

А надо if (digitalRead(inputPin1)) еденица не там .

Почти то да маленько не то , надо при кажном нажатии на кнопку 1 что бы просто сработал свето диод и ждал когда еще раз нажмут 1 кнопку и так 3 раза .Попробую объяснить что мне надо. 

Сейчас при каждом нажатии на кнопку 1 , горит и тухнит (с задержками ) светодиод и так до бесконечности нажал горит , не жмешь ждет. Надо то же самое но с циклом в 3 раза , потом ждет активации цикла от кнопки 2 , Когда кнопка 2 нажалась ,ждет нажатия кнопки 1. Опять повторяет 3 раза и ждет опять кнопки 2 и т.д. Вроде так ))))

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

А вот оно что, ну сейчас глянем

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Тогда вроде что-то типа такого получается

int ledPin = 4; // задаем номер выхода светодиода
int inputPin = 3; // задаем номер входа, подключенный к кнопке
int inputPin1 = 6; // кнопка сброса
byte count = 3;
boolean cancel = true;

void setup()
{
  pinMode(ledPin, OUTPUT);// инициализируем контакт, подключенный к светодиоду, как выход
  pinMode(inputPin, INPUT);//инициализируем контакт, подключенный к кнопке, как вход
  pinMode(inputPin1, INPUT);//инициализируем контакт, подключенный к кнопке, как вход
}
void loop()
{
  if (digitalRead(inputPin1))
    cancel = true;  
  if (digitalRead(inputPin) && cancel)
  {
    if(count >= 1)
    {
      digitalWrite(ledPin, HIGH); // выключение светодиода
      delay(1000);
      digitalWrite(ledPin, LOW); // включение светодиода
      delay(1000);
      if(--count==0)
      {
        cancel = false;
        count = 3;
      }
    }
  }
}

UPD поправил вроде попробуйте :)

Boom_nick
Offline
Зарегистрирован: 20.02.2015

Свето диод просто мигает с тактом в 1 сек , а при нажатии и удержании на любую кнопку тухнит и молчит , отпускаеш опять мигает с тактом в 1 сек. (((

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

А 25 строку так if(--count==0) или с ! написали

Boom_nick
Offline
Зарегистрирован: 20.02.2015

Penni пишет:

А 25 строку так if(--count==0) или с ! написали

То же самое ((( Чесно , понимаю что задолбал уже :-) 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Специально собрал сейчас на макетке, всё работает как описано... Странно но вчера у человека тоже не работало то что у меня работает. Как-то подозрительно... у меня мега2560 и IDE 1.6 уж не знаю что такое. Тут то кода кот наклакал, что тут может не работать. Кнопки притянуты как положено?

Boom_nick
Offline
Зарегистрирован: 20.02.2015

Penni пишет:

Специально собрал сейчас на макетке, всё работает как описано... Странно но вчера у человека тоже не работало то что у меня работает. Как-то подозрительно... у меня мега2560 и IDE 1.6 уж не знаю что такое. Тут то кода кот наклакал, что тут может не работать. Кнопки притянуты как положено?

Через резистор на + , то же мега 2560, IDE 1.0.5 . Кнопка то в том режиме работает. Тогда то же не въеду (((

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Раз на + значит ясно. Притяните на -. У вас должен один конец кнопки + быть, второй конец идти к пину на ардуине и этот же пин должен быть к земле притянут через резистор. А Вы притянули к + и кнопка на + у вас получается всегда нажатая кнопка независимо от самой кнопки...

Boom_nick
Offline
Зарегистрирован: 20.02.2015

Уряяяя , пошло ))) Ларчик просто открывался ))) Спасибо наиогромнейшое !!! Говорил что то у меня с мозгами не то , надо срочно отдохнуть ))))