Помогите с разработкой светофора.
- Войдите на сайт для отправки комментариев
Написал следующий код, суть - сделать более менее точную работу светофора с кнопкой для пешеходов и с кнопкой для оператора, который будет переводить светофор в дежурный режим и возвращать обратно, но не получается найти ошибку - в коде ли она или на макетной плате?
int carRed = 12; //Красный для автомобилей
int carYellow = 11; //Желтый для автомобилей
int carGreen = 10; //Зеленый для автомобилий
//-------------------------------------------
int pedRed = 13; //Красный для пешеходов
int pedGreen = 8; //Зеленый для пешеходов
//-------------------------------------------
int soundBlain=9; //Динамик для слепых пешеходов
//-------------------------------------------
int buttonPed = 2; //Контакт кнопки пешехода
int buttonOper = 3; //Контакт кнопки оператора
//-------------------------------------------
int crossTime = 5000; //Время ожидания
unsigned long changeTime; //Время с начала работы программы
int operMode = 0;
void setup() {
//-------------------------------------------
// Контакты на выход
pinMode(carRed, OUTPUT);
pinMode(carYellow, OUTPUT);
pinMode(carGreen, OUTPUT);
pinMode(pedRed, OUTPUT);
pinMode(pedGreen, OUTPUT);
pinMode(soundBlain, OUTPUT);
//-------------------------------------------
//Контакт на вход (кнопка)
pinMode(buttonPed, INPUT);//Кнопка пешехода
pinMode(buttonOper, INPUT);//Кнопка оператора
//-------------------------------------------
digitalWrite(carGreen, HIGH);// Включаем зеленый для автомобилей
digitalWrite(pedRed, HIGH); //Включаем красный для пешеходов
//-------------------------------------------
Serial.begin(9600); // включим COM-порт для проверки кнопок
}
void loop() {
//Нажать кнопку на пешеходном переходе
int state = digitalRead(buttonPed); //Получаем статус кнопки
delay(10);
int state2 = digitalRead(buttonPed);
//Если кнопка нажата и время с начала работы программы минус changeTime больше 5 сек, то
if(state==state2){
if (state == HIGH && (millis() - changeTime) > 5000) {
//1. Действие
digitalWrite(carGreen, LOW); // Выключаем зеленый для автомобилей
digitalWrite(carYellow, HIGH); // Включаем желтый для автомобилей
delay(2000); // Ждем 2 сек
//2. Действие
digitalWrite(carYellow, LOW); // Выключаем желтый для автомобилей
digitalWrite(carRed, HIGH); // Включаем красный для автомобилей
delay(1000); // Ждем 1 сек
//3. Действие
digitalWrite(pedRed, LOW); // Выключаем красный для пешеходов
digitalWrite(pedGreen, HIGH); // Включаем зеленый для пешеходов
delay(crossTime); // Ждем 5 сек
// Мигаем зеленым для пешеходов 10 раз + звуковой сигнал
for (int x=0; x<10; x++) {
digitalWrite(pedGreen, HIGH);
delay(250);
digitalWrite(pedGreen, LOW);
delay(250);
}
//4. Действие
digitalWrite(pedRed, HIGH); // Включаем красный для пешеходов
delay(500); //Ждем 5 сек
//5. Действие
digitalWrite(carYellow, HIGH); // Включаем желтый для автомобилей
digitalWrite(carRed, LOW); // Включаем красный для автомобилей
delay(1000); //Ждем 1 сек
digitalWrite(carGreen, HIGH); //Включаем зеленый для автомобилей
digitalWrite(carYellow, LOW); //Выключаем желтый для автомобилей
changeTime = millis(); //changeTime равно время с начала работы программы
}
}
//Нажать кнопку в дежурном режиме
int stateoper = digitalRead(buttonOper);
delay(10);
int stateoper2 = digitalRead(buttonOper);
if (stateoper==stateoper2){
if(stateoper!=LOW){
if(operMode==0){
operMode=1;
}
else {
if (operMode==1){
operMode=2;
}
else {
if (operMode==2){
operMode=0;
}
}
}
}
}
//Если включен дежурный режим происходит мигание желтого
if (operMode == 1) {
digitalWrite(carGreen, LOW);
digitalWrite(carRed, LOW);
digitalWrite(pedRed, LOW);
digitalWrite(carYellow, HIGH);
delay(1000);
digitalWrite(carYellow, LOW);
delay(500);
}
//Повторное нажатие на кнопку оператором
if (operMode == 2){
digitalWrite(carGreen, HIGH);
digitalWrite(carRed, LOW);
digitalWrite(carYellow, LOW);
digitalWrite(pedRed, HIGH);
digitalWrite(pedGreen, LOW);
}
if (state == HIGH) { //и если там лог.1 (кнопка нажата)
Serial.println("1 on pedestrian"); //печатаем результат в порт
}
else{ //в противном случае
Serial.println("0 on pedestrian"); // напишем в порт ноль
}
delay(500);
if (stateoper == HIGH) {
Serial.println("1 on operator");
}
else{
Serial.println("0 on operator");
}
delay(500);
}
Если необходимо могу выложить вид сборки платы.
>>Если необходимо могу выложить вид сборки платы.<<
Выложите. А еще выложите программу в читаемом виде.
В чем заключается ошибка ?
Я когда то делал светофор для детского автодрома, но он был полностью автоматическим (без ручного управления).
Получается что условие верно когда обе кнопки нажаты или обе не нажаты. Зачем ?
Вы опишите алгоритм. Как должен работать ваш светофор ?
Посмотрите вот эту тему http://arduino.ru/forum/programmirovanie/svetofor особенно посто №48
Спасибо за ответы, доделал, пришлось поменять кнопку, наверное брак, постоянно 1 давала. В общем если кому надо выкладываю код и логику:
Для авто постоянно горит красный, для пешеходов - зеленый. Если пешеход нажимает на светофоре кнопку (как раз двойная проверка - так называемая защита от дурака) и прошло больше 5 сек. с последнего нажатия, то для машин загорается желтый и красный, для пешеходов соответственно зеленый. Когда начинает мигать зеленым пешеходам, то включается динамик для слепых пешеходов.
Кнопка оператора нужна для включения дежурного режима светофора, т.е. для авто моргает желтый, пешеходный не горит.
Надеюсь кому то может пригодиться, по коду старался максимально накидать коментариев.