помогите разобраться в проекте №5 по учебнику Бокселла "Изучаем Ардуино,65 проектов своими руками". Нужно собрать светофор.

CrusherHead
Offline
Зарегистрирован: 21.02.2019

Помогите разобраться в чем проблема.Согласно проекту №5,по учебнику Бокселла, я начал собирать светофор с управляемым движением. Ниже предоставляю код проекта как в учебнике.

 
/*Вначале мы определим назначение контактов для светодиодов и кнопок*/
#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() 
{
  Serial.begin(9600); 
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)//продолжать только если движение меняется на противоположное
{Serial.println (15);
  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); // на зеленый 
      }
    }
}        
 
Наша цель — установить трехцветные светофоры на обоих концах моста. Светофоры должны разрешать движение по мосту только в одном направлении в каждый конкретный момент времени. Когда датчики на одном конце моста обнаруживают автомобиль, ожидающий включения зеленого сигнала, светофоры должны переключиться и разрешить движение. Алгоритм Для имитации датчиков обнаружения автомобилей на обоих концах моста мы используем две кнопки. Светофор с каждой стороны будет состоять из светодиодов красного, желтого и зеленого цвета. Первоначально система разрешает движение с запада на восток, поэтому на светофоре, обращенном на запад, должен гореть зеленый свет, а на светофоре, обращенном на восток, — красный. Когда к мосту приближается автомобиль (моделируется нажатием кнопки) и на светофоре горит красный свет, система должна переключить свет на противоположном конце с зеленого на желтый, а затем на красный. После этого она должна выждать некоторое время, чтобы позволить автомобилям, уже находящимся на мосту, завершить его пересечение. Далее, на стороне с ожидающим автомобилем должен включиться желтый мигающий свет, означающий «приготовиться к движению», и затем желтый свет должен смениться зеленым. Зеленый свет должен гореть, пока на противоположной стороне не появится автомобиль, после чего процесс должен повториться в обратном направлении.
 
Я собрал соответствующую схему, залил вышепреведенний код.
 
У меня пока что первый вопрос: почему огни светафора не реагируют на кнопку и живут своей жизнью - мигают как хотят и когда хотят? почему я определяю пин 2 и пин 1 , имеют значение LOW, а на плате они тупо светяться?  
 
Я не могу найти проблему ? это сама ардуино, это плата , это код? где я накосячил? что я упустил? с чего начать поиски проблемы?
mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Уважаемый, уважайте тех, кого спросили и вставьте программу правильно. Кроме того неплохо бы вставить и собранную Вами схему.

CrusherHead
Offline
Зарегистрирован: 21.02.2019

Миннутку,сейчас разберусь и вставлю.

CrusherHead
Offline
Зарегистрирован: 21.02.2019
/*Вначале мы определим назначение контактов для светодиодов и кнопок*/
#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() 
{
  Serial.begin(9600); 
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)//продолжать только если движение меняется на противоположное
{Serial.println (15);
  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); // на зеленый 
      }
    }
}        

 

bwn
Offline
Зарегистрирован: 25.08.2014

CrusherHead пишет:

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

Убрать 380В с платы.))))

kalapanga
Offline
Зарегистрирован: 23.10.2016

Для начала пины 0 и 1 не занимайте, т.к. у Вас Serial задействован. Поменяйте, а дальше поточнее опишите, что происходит. Ну например правильно ли устанавливается и остаётся неизменным начальное состояние светодиодов (то, что устанавливаете в setup строки 33-38) до нажатий на кнопки?

CrusherHead
Offline
Зарегистрирован: 21.02.2019

не пойму, что вы имеете ввиду?какие 380 В ?

kalapanga
Offline
Зарегистрирован: 23.10.2016

CrusherHead пишет:

не пойму, что вы имеете ввиду?какие 380 В ?

То шутка была. Светятся светодиоды. А уж если у Вас "пины светятся на плате"... :)

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

ага, а кнопочки у Вас точно к +5 подключены?

Кроме того, кнопка должна быть замкнута все время, пока не прошел цикл светофора.

CrusherHead
Offline
Зарегистрирован: 21.02.2019

Смотрите, Serial я задействовал, для того, что бы кнопки проверить.  Я начинающий, проект огромный,  я его слабо понимаю. Пины 1 и 0, были указаны в учебнике. 

Итак, что происходит :

33) digitalWrite(westRed, LOW); - очень слабо горит

34) digitalWrite(westYellow, LOW); - 5 раз мигает, выключается вместе с 33

35) digitalWrite(westGreen, HIGH); - не горит, но после того как 34 помигал 5 раз включается, а 34 - выключается. Проходит 10 сек., 5 раз мигает 34, загорается 33, все остальные гаснут.

Но это не точно, потому что порядок работы разный. Если бы вы дали мне свою почту я бы вам фото и видео прислал.

Что касается строчек 36,37 и 38, то ярко светиться 36) digitalWrite(eastRed, HIGH); - постоянно, и   иногда на секунду включается 37.

Что то вроде этого. На кнопки как я уже сказал реакции - ноль.

CrusherHead
Offline
Зарегистрирован: 21.02.2019

Кнопки точно подключены к 5 В.

 

Что вы имеете ввиду на счет кнопки? Если вы имеете ввиду что бы она была нажата, то как я уже говорил, светодиоды не реагируют на кнопки вообще. Ни в каком режиме. Как будто бы их и нет вовсе. 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Либо выкинте из скетча всё про сериал, либо не используйте пины 0 и 1 (лучше - не использовать 0 и 1). Сделайте это, проверьте работу. После этого дальше можно обсуждать. Если проблемы остались - приведите исправленный скетч.

CrusherHead
Offline
Зарегистрирован: 21.02.2019

Хорошо, спасиббо, когда все сделаю как ві сказали отпишусь с результатами.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

В строках 5 и 6 поменяйте 0 на 4, 1 на 5. В схеме перекиньте пины соответственно. Попробуйте, потом пишите.

kalapanga
Offline
Зарегистрирован: 23.10.2016

CrusherHead пишет:

Хорошо, спасиббо, когда все сделаю как ві сказали отпишусь с результатами.

Должны уйти всякие "левые" свечения. А там может окажется, что всё и работает. В скетче-то вроде всё похоже на дело написано, тем более, что он из учебника.

CrusherHead
Offline
Зарегистрирован: 21.02.2019

Я поменял 0 на 4 и 1 на 5. Сериал убрал. Результат - ноль эмоций. Как все было так и соталось. Все то же самое подключил к второй плате ардуино уно, поменял мантажную доску(на другой контакты лучше) - результат : 0 эмоций. Как все было так и соталось.

SLKH
Offline
Зарегистрирован: 17.08.2015

CrusherHead пишет:

Кнопки точно подключены к 5 В.

Принципиальную схему подключения кнопок вставьте.

при ненажатых кнопках входы к чему подключены?

SLKH
Offline
Зарегистрирован: 17.08.2015

CrusherHead пишет:

 Сериал убрал. 

зря.

kalapanga
Offline
Зарегистрирован: 23.10.2016

Раз пины поменяли, зачем сериал-то убирать? Я ж почему написал, что лучше поменять пины - чтобы сериал и дальше можно было для отладки использовать. Но если у Вас какая-то мистика творится, то больше всего на некачественную или вовсе неправильную сборку похоже. Нужно глядеть схему, реальное качественное фото устройства. Чтобы понять, соответствует ли одно другому и насколько надёжно выглядит сборка.

Ну и ещё простой тест - выкиньте всё из loop, пустой его оставьте, чтобы ничего не смущало. Как я понимаю должен гореть с одной стороны красный, с другой зелёный и никаких там миганий. В строках 33-38 поменяйте туда-сюда HIGH на LOW. Убедитесь, что нужные светодиоды чётко горят или не горят. Если уже на этом этапе что-то не так - точно надо косяки в схеме искать.

Если пока всё нормально, можно к кнопкам переходить.

gfx125
Offline
Зарегистрирован: 27.05.2017

kalapanga пишет:

В скетче-то вроде всё похоже на дело написано, тем более, что он из учебника.

В скетче есть ошибки. Или автор специально сделал чтобы изучающие сами разобрались или переводчики/издатели накопипастили не то что нужно. Например, во втором условии везде west и ни одного east.

вот например явный косяк

digitalWrite(westRed, LOW); //сменить сигнал на восточной стороне с красного
 digitalWrite(westGreen, HIGH); // на зеленый 

Ну и судя по всему кнопки должны быть или с фиксацией или нужно удерживать ее нажатой пока не призойдет переключение

 

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

gfx125 пишет:

В скетче есть ошибки. Или автор специально сделал чтобы изучающие сами разобрались или переводчики/издатели накопипастили не то что нужно. Например, во втором условии везде west и ни одного east.

вот например явный косяк

digitalWrite(westRed, LOW); //сменить сигнал на восточной стороне с красного
 digitalWrite(westGreen, HIGH); // на зеленый 

Ну и судя по всему кнопки должны быть или с фиксацией или нужно удерживать ее нажатой пока не призойдет переключение

Похоже что так. У Вас 2 варианта - найти эту книгу на английском и проверить косяки или попытаться самому разобраться с алгоритмом работы светофора. А по поводу кнопки - логично. Машина подъехала, перегородила, например, ИК датчик, светофоры закончили предыдущий цикл и пропустили ее.

gfx125
Offline
Зарегистрирован: 27.05.2017

mykaida пишет:

У Вас 2 варианта - найти эту книгу на английском и проверить косяки или попытаться самому разобраться с алгоритмом работы светофора.

Это пусть ТС ищет если ему еще интересно разобраться. Мне не надо

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Признаюсь честно, я только первую ветку бегло глянул. Вроде логика на описание похожа. Во второй действительно где-то с середины запады-востоки попутаны. Кусочки ведь тупо зеркальны должны вроде здесь быть - где в одном запад, там в другом восток.

А про фиксацию кнопок не понял. Зачем она тут? Подъехал автомобиль (нажали кнопку). Если уже разрешен трафик с его стороны (проверяется trafficWest), то просто ничего не произойдёт, ему и так горит зелёный, пусть едет. Если ему трафик запрещён, тогда и сработает переключение светофоров по описанному алгоритму. Изменится переменная trafficWest и в таком состоянии сигналы и останутся. Вроде всё так.

Но это потом. Смысл сильно в код вникать, если у товарища там моргает всё как-то само без нажатия кнопок. Пусть сначала с этим разберётся.

gfx125
Offline
Зарегистрирован: 27.05.2017

Согласен, тоже особо не вникал и слона (trafficWest) незаметил.

 

 

CrusherHead
Offline
Зарегистрирован: 21.02.2019

Друзья, большое вам всем спасибо, но похоже этот проект еще слишком сложен для меня, я  все ваши коментарии учел и очень вам благодарен. Я взял проект поменьше, и там есть серьезные вопросы, я хотел бы , что вы на него посмотрели. И этот проект гараздо проще. 

 

Еще раз спасибо вам. 

Green
Offline
Зарегистрирован: 01.10.2015

CrusherHead пишет:

... похоже этот проект еще слишком сложен для меня...


Что может быть проще светофора!)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Green пишет:
Что может быть проще светофора!)

А вы попробуйте его собрать, 1- непользуясь своими знаниями , 2- по книге автора когда он пытается запутать читателя.

Green
Offline
Зарегистрирован: 01.10.2015

Зачем усложнять себе жизнь.) Можно же и своей логикой воспользоваться. И своими минимальными знаниями. Недостаточно знаний - почерпнуть.) Сначала минимум, допустим 3 светодиода, затем усложнить. Я со своей девкой (9 лет) так писал.)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну да. Какой русский читает инструкции. Особенно если пишет другой русский для другого , который не читает эти инструкции.
ПС: А еще светофор надо писать регулярно. И тогда видно насколько подросли(или деградировали) свои навыки.

Green
Offline
Зарегистрирован: 01.10.2015

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

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

А теперь будем считать что это не некий отдельный светофор, на перекрестке в вакууме. Пусть это реальные светофоры в реальном городе, и там надо организовывать зеленую волну для снижения загазованости города, а так же менять режимы работы день, ночь, час пик. И управлять ими через радиосеть, и борьба с помехами.  Так что я думаю еще проблема светофоров будет окончательно не решена.