#1 2019-02-21 12:44:17

Crusherhead
Учасник
Зареєстрований: 2019-02-09
Повідомлень: 26

Помогите собрать светофор

/*Вначале мы определим назначение контактов для светодиодов и кнопок*/
#define westButton 3
#define eastButton 13
#define westRed 2
#define westYellow 1
#define westGreen 0
#define eastRed 12
#define eastYellow 11
#define eastGreen 10
#define yellowBlinkTime 500 // периодмигания желтого света 0.5 секунды

boolean trafficWest = true; // запад = true, восток = false
int flowTime = 10000; // период ожидания что бы пропустить автомобили уже находящиеся на мосту
int changeDelay = 2000; // задержка перед сменой цвета


// далее, настроим цифровые входы\выходы

void setup() 
{ 
pinMode(westButton, INPUT);  
pinMode(eastButton, INPUT);
pinMode(westRed, OUTPUT);
pinMode(westYellow, OUTPUT);
pinMode(westGreen, OUTPUT);
pinMode(eastRed, OUTPUT);
pinMode(eastYellow, OUTPUT);
pinMode(eastGreen, OUTPUT);

// определим начальное состояние светодиодов - зеленый на западной стороне
 
digitalWrite(westRed, LOW);
digitalWrite(westYellow, LOW);
digitalWrite(westGreen, HIGH);
digitalWrite(eastRed, HIGH);
digitalWrite(eastYellow, LOW);
digitalWrite(eastGreen, LOW);

}

void loop() 
{
// запрошено движение с запада на восток?
if(digitalRead(westButton) == HIGH)//продолжать только если движение меняется на противоположное
{
  if(trafficWest != true )
     {
      trafficWest = true; // изменить флаг направления запад-восток
      delay(flowTime); // дать автомобилям время пересеч мост
      digitalWrite(eastGreen, LOW); // на восточной стороне погасить
      digitalWrite(eastYellow, HIGH); // зеленый сигнал, зажеч желтый
      delay(changeDelay); // и затем красный
      digitalWrite(eastYellow, LOW);
      digitalWrite(eastRed, HIGH);
      delay(changeDelay);
      for(int a = 0; a < 5; a ++)// воспроизвести мигающий желтый
        {digitalWrite(westYellow, LOW);
         delay(yellowBlinkTime);
         digitalWrite(westYellow,HIGH);
         delay(yellowBlinkTime);}
      digitalWrite(westYellow, LOW);
      digitalWrite(westRed, LOW); //сменить сигнал на западной стороне с красного
      digitalWrite(westGreen, HIGH); // на зеленый  
      }
     }
// запрошено движение с запада на восток?
if(digitalRead(eastButton) == HIGH)// продолжать только если двиение меняется на противоположное
{
  if(trafficWest == true)
     {
      trafficWest = false;// изменить флаг направления восток - запад
      delay(flowTime); //дать автомобилям время пересеч мост
      digitalWrite(westGreen, LOW);
      //  на восточной стороне сменить зеленый сигнал на желтый и затем на красный
      digitalWrite(westYellow, HIGH);
      delay(changeDelay);
      digitalWrite(westYellow, LOW);
      digitalWrite(westRed, HIGH);
      delay(changeDelay);
      for(int a = 0; a <5; a ++) // воспроизвести мигающий желтый
        {digitalWrite(westYellow, LOW);
         delay(yellowBlinkTime);
         digitalWrite(westYellow,HIGH);
         delay(yellowBlinkTime);}
      digitalWrite(westYellow, LOW);
      digitalWrite(westRed, LOW); //сменить сигнал на восточной стороне с красного
      digitalWrite(westGreen, HIGH); // на зеленый 
      }
    }
}        

По учебнику Бокселла собираю проект №5 - Управление Движением. Проект не работает. Отзовитесь кто нибудь, кто может помочь разобраться почему у меня ничего не работает, я замучился. Не могу найти в чем ошибка или проблема.




Наша цель — установить трехцветные светофоры на обоих концах моста. Светофоры должны разрешать движение по мосту только в одном направлении в каждый конкретный момент времени. Когда датчики на одном конце моста обнаруживают автомобиль, ожидающий включения зеленого сигнала, светофоры должны переключиться и разрешить движение. Алгоритм Для имитации датчиков обнаружения автомобилей на обоих концах моста мы используем две кнопки. Светофор с каждой стороны будет состоять из светодиодов красного, желтого и зеленого цвета. Первоначально система разрешает движение с запада на восток, поэтому на светофоре, обращенном на запад, должен гореть зеленый свет, а на светофоре, обращенном на восток, — красный. Когда к мосту приближается автомобиль (моделируется нажатием кнопки) и на светофоре горит красный свет, система должна переключить свет на противоположном конце с зеленого на желтый, а затем на красный. После этого она должна выждать некоторое время, чтобы позволить автомобилям, уже находящимся на мосту, завершить его пересечение. Далее, на стороне с ожидающим автомобилем должен включиться желтый мигающий свет, означающий «приготовиться к движению», и затем желтый свет должен смениться зеленым. Зеленый свет должен гореть, пока на противоположной стороне не появится автомобиль, после чего процесс должен повториться в обратном направлении.

Я собрал соответствующую схему, залил вышепреведенний код.

У меня пока что первый вопрос: почему огни светафора не реагируют на кнопку и живут своей жизнью - мигают как хотят и когда хотят? почему я определяю пин 2 и пин 1 , имеют значение LOW, а на плате они тупо светяться?

Я не могу найти проблему ? это сама ардуино, это плата , это код? где я накосячил? что я упустил? с чего начать поиски проблемы?

Остання редакція Crusherhead (2019-02-21 15:00:07)

Неактивний

#2 Сьогодні 09:55:52

Arthur
Гість

Re: Помогите собрать светофор

Начну с самого вероятного: у вас не одна ошибка, а сразу несколько типичных для этого проекта — плавающие входы кнопок, использование пинов 0/1 и ошибка в логике переключения восточного светофора.

Думал на протяжении 4s

Главные причины:

Пины 0 и 1 нельзя использовать для светодиодов
На Arduino Uno пины 0 = RX и 1 = TX используются для загрузки скетча и Serial.
Поэтому светодиоды на пинах 0 и 1 могут светиться “сами”. Это не мистика — эти линии активны при работе платы.
Кнопки подключены как INPUT, но без подтяжки
Если нет внешнего резистора, вход “висит в воздухе” и Arduino видит случайные HIGH/LOW.
Поэтому светофор реагирует сам по себе.
В коде ошибка во второй части
При запросе с востока вы снова мигаете и включаете westYellow / westGreen, хотя надо включать eastYellow / eastGreen.

Лучше переделать пины так:
#define westButton 3
#define eastButton 4

#define westRed 5
#define westYellow 6
#define westGreen 7

#define eastRed 8
#define eastYellow 9
#define eastGreen 10

#define yellowBlinkTime 500

bool trafficWest = true;

int flowTime = 10000;
int changeDelay = 2000;

void setup() {
  pinMode(westButton, INPUT_PULLUP);
  pinMode(eastButton, INPUT_PULLUP);

  pinMode(westRed, OUTPUT);
  pinMode(westYellow, OUTPUT);
  pinMode(westGreen, OUTPUT);

  pinMode(eastRed, OUTPUT);
  pinMode(eastYellow, OUTPUT);
  pinMode(eastGreen, OUTPUT);

  digitalWrite(westRed, LOW);
  digitalWrite(westYellow, LOW);
  digitalWrite(westGreen, HIGH);

  digitalWrite(eastRed, HIGH);
  digitalWrite(eastYellow, LOW);
  digitalWrite(eastGreen, LOW);
}

void loop() {
  // Кнопки с INPUT_PULLUP работают наоборот:
  // нажата = LOW, отпущена = HIGH

  if (digitalRead(westButton) == LOW) {
    if (trafficWest == false) {
      trafficWest = true;

      delay(flowTime);

      digitalWrite(eastGreen, LOW);
      digitalWrite(eastYellow, HIGH);
      delay(changeDelay);

      digitalWrite(eastYellow, LOW);
      digitalWrite(eastRed, HIGH);
      delay(changeDelay);

      for (int a = 0; a < 5; a++) {
        digitalWrite(westYellow, HIGH);
        delay(yellowBlinkTime);
        digitalWrite(westYellow, LOW);
        delay(yellowBlinkTime);
      }

      digitalWrite(westRed, LOW);
      digitalWrite(westGreen, HIGH);
    }
  }

  if (digitalRead(eastButton) == LOW) {
    if (trafficWest == true) {
      trafficWest = false;

      delay(flowTime);

      digitalWrite(westGreen, LOW);
      digitalWrite(westYellow, HIGH);
      delay(changeDelay);

      digitalWrite(westYellow, LOW);
      digitalWrite(westRed, HIGH);
      delay(changeDelay);

      for (int a = 0; a < 5; a++) {
        digitalWrite(eastYellow, HIGH);
        delay(yellowBlinkTime);
        digitalWrite(eastYellow, LOW);
        delay(yellowBlinkTime);
      }

      digitalWrite(eastRed, LOW);
      digitalWrite(eastGreen, HIGH);
    }
  }
}
Подключение кнопок теперь такое:

Кнопка west: один контакт к пину 3, второй к GND
Кнопка east: один контакт к пину 4, второй к GND

Резисторы для кнопок в этом варианте не нужны, потому что включен INPUT_PULLUP.

Итого: плата скорее всего исправна. Проблема почти наверняка в пинах 0/1, плавающих кнопках и ошибке в коде восточного направления.

#3 Сьогодні 10:08:20

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 838

Re: Помогите собрать светофор

Який сенс у ШІ-помийній відповіді на питання семирічної давнини?

Активний

#4 Сьогодні 10:38:05

jokeer
Гість

Re: Помогите собрать светофор

Тут все прекрасне, і питання на яке так ніхто і не відповів, і відповідь яку ніхто не чекав.

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму