Ви не увійшли.
Тут все прекрасне, і питання на яке так ніхто і не відповів, і відповідь яку ніхто не чекав.
Який сенс у ШІ-помийній відповіді на питання семирічної давнини?
Начну с самого вероятного: у вас не одна ошибка, а сразу несколько типичных для этого проекта — плавающие входы кнопок, использование пинов 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, плавающих кнопках и ошибке в коде восточного направления.
/*Вначале мы определим назначение контактов для светодиодов и кнопок*/
#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, а на плате они тупо светяться?
Я не могу найти проблему ? это сама ардуино, это плата , это код? где я накосячил? что я упустил? с чего начать поиски проблемы?