Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
products:aruno:exp17 [2020/07/02 18:47] alexnikproducts:aruno:exp17 [2020/07/06 14:13] (текущий) alexnik
Строка 1: Строка 1:
 ===== Эксперимент 17. Светофор ===== ===== Эксперимент 17. Светофор =====
 +
 +Используя модуль "Светофор", соберем имитацию дорожного светофора, работающего по нажатию кнопки и отсчитывающий секунды.
 +
 +==== Схема эксперимента ====
 +{{ :products:ardu:swetofor_sch17.png?nolink&400 |}}
 +{{ :products:ardu:exp14_shema_tk.png?nolink&400 |}}
 +{{ :products:ardu:exp13_sch.png?nolink&400 |}}
 +//Рисунок 1. Электрическая принципиальная схема эксперимента//
 +
 +{{ :products:ardu:exp17.png?direct&600 |}}
 +//Рисунок 2. Монтажная схема эксперимента//
 +
 +
 +==== Программный код эксперимента ====
 +
 +<file cpp Exp17[enable_line_numbers="2", start_line_numbers_at="1"]>
 +const int a = 6; 
 +const int b = 7;
 +const int c = 9;
 +const int d = 3;
 +const int e = 2;
 +const int f = 5;
 +const int g = 4;
 +const int h = 8;
 +const int keyPin = 10;
 +int data [11][8] = {{1,1,1,1,1,1,0,1},
 +                    {0,1,1,0,0,0,0,1},
 +                    {1,1,0,1,1,0,1,1},
 +                    {1,1,1,1,0,0,1,1},
 +                    {0,1,1,0,0,1,1,1},
 +                    {1,0,1,1,0,1,1,1},
 +                    {1,0,1,1,1,1,1,1},
 +                    {1,1,1,0,0,0,0,1},
 +                    {1,1,1,1,1,1,1,1},
 +                    {1,1,1,1,0,1,1,1},
 +                    {0,0,0,0,0,0,0,0}};
 +
 +const int pinRed = 13;
 +const int pinYellow = 12;
 +const int pinGreen = 11;
 +void displ(int);
 +
 +void setup () {
 +    for(int i = 2; i <= 13; i++) 
 +        pinMode(i,OUTPUT);
 +    pinMode(keyPin,INPUT);
 +    digitalWrite(pinRed,HIGH);
 +    displ(0);
 + }
 +
 +int x = 0;
 +int button_old = 0;
 +boolean btnStatus = false;
 +void loop() {
 +     int mTime = 1000;
 +      if(x == 0) {
 +       digitalWrite(pinRed, HIGH);
 +       digitalWrite(pinYellow, LOW);
 +       digitalWrite(pinGreen, LOW);
 +       displ(x);  
 +       mTime = 20;
 +       btnStatus = true;
 +      }
 +      if((x <= 3) and (x > 0)) {
 +       digitalWrite(pinGreen, LOW);
 +       delay(500);
 +       digitalWrite(pinGreen, HIGH);
 +       mTime = 500;
 +       x--;
 +      }
 +      if((x <= 10) and (x >= 4)) {
 +       digitalWrite(pinRed, LOW);
 +       digitalWrite(pinYellow, LOW);
 +       digitalWrite(pinGreen, HIGH);
 +       x--;
 +      }
 +     if((x <= 15) and (x >= 11)) {
 +       digitalWrite(pinYellow, HIGH);
 +       x--;
 +      }
 +     if((x <= 20) and (x >= 16)) {  
 +       x--;
 +      }
 +     if((digitalRead(keyPin) == LOW)&&(button_old == 1)&&(btnStatus == true)) {
 +       x = 20;
 +       btnStatus = false;
 +      }
 +      if(x >= 10)
 +        displ(x-10);
 +       else
 +        displ(x);
 +   button_old = digitalRead(keyPin);
 +   delay(mTime);
 + }
 +
 +void displ(int num) {
 +  int j = 0;
 +  digitalWrite(a, data[num][j]); j = j + 1;
 +  digitalWrite(b, data[num][j]); j = j + 1; 
 +  digitalWrite(c, data[num][j]); j = j + 1; 
 +  digitalWrite(d, data[num][j]); j = j + 1; 
 +  digitalWrite(e, data[num][j]); j = j + 1; 
 +  digitalWrite(f, data[num][j]); j = j + 1; 
 +  digitalWrite(g, data[num][j]); j = j + 1; 
 +  digitalWrite(h, data[num][j]); j = j + 1; 
 + }
 +</file>
 +
 +В программе при нажатии кнопки устанавливаем переменную счетчика в 20 сек, и при каждом цикле начинаем ее уменьшать на единицу, условные блоки проверяют состояние счетчика и соответственно выполняют заложенные в них инструкции.
 +
 +==== Дополнительное задание ====
 +<WRAP center round tip 60%>
 +Создайте свой вариант светофора, например добавьте к схеме светодиоды для пешеходного светофора.
 +</WRAP>