Различия

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

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

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