Не могу вызвать функцию кнопкой
- Войдите на сайт для отправки комментариев
Чт, 12/11/2015 - 13:07
Приветствую. Я не программист, просто увлёкся идеей.
Написал простой и туповатый скетч для управления светофором.
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;
}
}
А кнопка как подключена, ты когда ее нажимаешь, на 13 ноге появляется высокий уровень (Vcc) ?
int road1(), int road2(), int ped().
А return где?
У тебя там делаев на полминуты. Как подобрать момент нажатия кнопки в этом случае?
От delay надо избавиться. Кнопка работает, но когда вы ее считаете? Подержите кнопку пару минут и поймете про что я.
Можно кнопку на прерывание повесить. И лучше кнопку на 13 пин не вешать (хотя и допустимо).
зы. слегка опередили:)
А кнопка как подключена, ты когда ее нажимаешь, на 13 ноге появляется высокий уровень (Vcc) ?
да, появляется
А return где?
Полагал, что для loop не нужен return, ведь и так по кругу выполняется
От delay надо избавиться. Кнопка работает, но когда вы ее считаете? Подержите кнопку пару минут и поймете про что я.
Можно кнопку на прерывание повесить. И лучше кнопку на 13 пин не вешать (хотя и допустимо).
Значит будем избавляться, про "когда считаете" - не понимаю.
На 13 пин специально повесил, чтоб убедиться в работе кнопки
return нужен не loop, а функциям котрые ты объявил с возвратом int. Например
introad2() {}Delay блокирует программу. Иначе говоря посчитайте сколько у вас проходит цикл по delay - это будет период опроса кнопки. Судя по коду он будет исчисляться минимум секундами.