Не могу вызвать функцию кнопкой

vecher
Offline
Зарегистрирован: 12.11.2015

Приветствую. Я не программист, просто увлёкся идеей.

Написал простой и туповатый скетч для управления светофором.

https://123d.circuits.io/circuits/1213078-test-my-functions

Не могу вызвать функцию ped() нажатием кнопки (и не понимаю в чем проблема). Если подскажите, буду безмерно благодарен и продолжу ваять...

    int red1 = 2;
	int yellow1 = 3;
	int green1 = 4;
	int red2 = 5;
	int yellow2 = 6;
	int green2 = 7;
    int redP = 8;
    int greenP = 9;
    int button = 13;
    int traffic1; // движение по направлению 1
    int traffic2; // движение по направлению 2
    int traffic3; // движение пешеходов
    int flag = 0; //кнопка

void setup() {
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode (13, INPUT);

}

int road2() {
  digitalWrite (red1, HIGH);
  digitalWrite (green2, HIGH);
  digitalWrite (red2, LOW);
  digitalWrite (redP, HIGH); //пешеходам красный
  digitalWrite (greenP, LOW);  //пешеходам гасим зеленый
  delay (4000);
  // зеленый 2 мигает 3 раза
	  for (int i=0; i<3; i=i+1)
	  {
	  digitalWrite (green2, LOW);
	  delay (900);
	  digitalWrite (green2, HIGH);
	  delay (500);
	  }
	   	  	  
	  // выключаем зеленый 2, включаем желтый 2
	 
	  digitalWrite (yellow2, HIGH);
	  digitalWrite (green2, LOW);
	  delay (2000);
	  
	  // выключаем желтый  2, красный 1,
	  	  
	  
	  digitalWrite (yellow2, LOW);
	  digitalWrite (red1, LOW);
}

int road1() {
      digitalWrite (red2, HIGH);
	  digitalWrite (green1, HIGH);
      digitalWrite (red1, LOW);
      digitalWrite (redP, HIGH); //пешеходам красный
      digitalWrite (greenP, LOW);  //пешеходам гасим зеленый
	  delay (4000);
	  // зеленый 1 мигает 3 раз
	  for (int i=0; i<3; i=i+1)
	  {
	  digitalWrite (green1, LOW);
	  delay (900);
	  digitalWrite (green1, HIGH);
	  delay (500);
	  }
	  // выключаем зеленый 1, включаем желтый 1
	  digitalWrite (yellow1, HIGH);
	 
	  digitalWrite (green1, LOW);
	  delay (2000);
	  
	  // выключаем желтый 1 и красный 2,
	  	  
	  digitalWrite (yellow1, LOW);
	  
	  digitalWrite (red2, LOW);
}

int ped() {
  digitalWrite (red2, HIGH);
  digitalWrite (red1, HIGH);
  digitalWrite (redP, LOW);
  digitalWrite (green1, LOW);
  digitalWrite (green2, LOW);
  digitalWrite (greenP, HIGH);
  delay (4000);
   // зеленый П мигает 3 раз
	  for (int i=0; i<3; i=i+1)
	  {
	  digitalWrite (greenP, LOW);
	  delay (500);
	  digitalWrite (greenP, HIGH);
	  delay (300);
	  }
  
}

void loop() {
  
  traffic1 = road2();
  traffic2 = road1();
  traffic3 = ped();
  
  if (digitalRead(13)==HIGH&&flag==0)
  {
    ped();
    flag=1;
    delay (4000);
  }
  if (digitalRead(11)==LOW&&flag==1)
  {
       flag=0;
  }
   
}

 

alexvs
Offline
Зарегистрирован: 22.07.2014

А кнопка как подключена, ты когда ее нажимаешь, на 13 ноге появляется высокий уровень (Vcc) ?

Radjah
Offline
Зарегистрирован: 06.08.2014

int road1(), int road2(), int ped().

А return где?

У тебя там делаев на полминуты. Как подобрать момент нажатия кнопки в этом случае?

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

От delay надо избавиться. Кнопка работает, но когда вы ее считаете? Подержите кнопку пару минут и поймете про что я.

Можно кнопку на прерывание повесить. И лучше кнопку на 13 пин не вешать (хотя и допустимо).

зы. слегка опередили:)

vecher
Offline
Зарегистрирован: 12.11.2015

alexvs пишет:

А кнопка как подключена, ты когда ее нажимаешь, на 13 ноге появляется высокий уровень (Vcc) ?

да, появляется

Radjah пишет:

А return где?

Полагал, что для loop не нужен return, ведь и так по кругу выполняется

nevkon пишет:

От delay надо избавиться. Кнопка работает, но когда вы ее считаете? Подержите кнопку пару минут и поймете про что я.

Можно кнопку на прерывание повесить. И лучше кнопку на 13 пин не вешать (хотя и допустимо).

Значит будем избавляться, про "когда считаете" - не понимаю.

На 13 пин специально повесил, чтоб убедиться в работе кнопки

 

alexvs
Offline
Зарегистрирован: 22.07.2014

return нужен не loop, а функциям котрые ты объявил с возвратом int. Например int road2() {}

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

Delay блокирует программу. Иначе говоря посчитайте сколько у вас проходит цикл по delay - это будет период опроса кнопки. Судя по коду он будет исчисляться минимум секундами.