Различия

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

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

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
products:aruno:exp17 [2020/06/12 19:24] alexnikproducts:aruno:exp17 [2020/07/06 14:13] (текущий) alexnik
Строка 1: Строка 1:
-===== Эксперимент 17. Счетчик (Версия 3.0) =====+===== Эксперимент 17. Светофор =====
  
-Используя схему предыдущего эксперимента можно сделать еще одно устройство - Счетчик нажатий на кнопку. +Используя модуль "Светофор", соберем имитацию дорожного светофора, работающего по нажатию кнопки и отсчитывающий секунды.
  
 ==== Схема эксперимента ==== ==== Схема эксперимента ====
-{{ :products:ardu:exp14_shema_tk.png?nolink |}} +{{ :products:ardu:swetofor_sch17.png?nolink&400 |}} 
-{{ :products:ardu:exp13_sch.png?nolink |}}+{{ :products:ardu:exp14_shema_tk.png?nolink&400 |}} 
 +{{ :products:ardu:exp13_sch.png?nolink&400 |}}
 //Рисунок 1. Электрическая принципиальная схема эксперимента// //Рисунок 1. Электрическая принципиальная схема эксперимента//
  
-{{ :products:ardu:exp14.png?direct&600 |}}+{{ :products:ardu:exp17.png?direct&600 |}}
 //Рисунок 2. Монтажная схема эксперимента// //Рисунок 2. Монтажная схема эксперимента//
  
Строка 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 dp 10+const int 8
-int keyPin = 12;+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
-void display1(void) {  +const int pinYellow = 12
-    digitalWrite(b,HIGH)+const int pinGreen = 11
-    digitalWrite(c,HIGH)+void displ(int);
-   }  +
-// Цифра "Два" +
-void display2(void) { +
-    digitalWrite(a,HIGH); +
-    digitalWrite(b,HIGH); +
-    digitalWrite(g,HIGH); +
-    digitalWrite(e,HIGH); +
-    digitalWrite(d,HIGH); +
-   }  +
-// Цифра "Три" +
-void display3(void) {  +
-    digitalWrite(a,HIGH); +
-    digitalWrite(b,HIGH); +
-    digitalWrite(c,HIGH); +
-    digitalWrite(d,HIGH); +
-    digitalWrite(g,HIGH); +
-   }  +
-// Цифра "Четыре" +
-void display4(void) {  +
-    digitalWrite(f,HIGH); +
-    digitalWrite(b,HIGH); +
-    digitalWrite(g,HIGH); +
-    digitalWrite(c,HIGH); +
-   }  +
-// Цифра "Пять" +
-void display5(void) {  +
-    digitalWrite(a,HIGH); +
-    digitalWrite(f,HIGH); +
-    digitalWrite(g,HIGH); +
-    digitalWrite(c,HIGH); +
-    digitalWrite(d,HIGH); +
-   }  +
-// Цифра "Шесть" +
-void display6(void) {  +
-    digitalWrite(a,HIGH); +
-    digitalWrite(f,HIGH); +
-    digitalWrite(g,HIGH); +
-    digitalWrite(c,HIGH); +
-    digitalWrite(d,HIGH);   +
-    digitalWrite(e,HIGH);   +
-   }  +
-// Цифра "Семь" +
-void display7(void) {    +
-    digitalWrite(a,HIGH); +
-    digitalWrite(b,HIGH); +
-    digitalWrite(c,HIGH); +
-   }  +
-// Цифра "Восемь" +
-void display8(void) {  +
-    digitalWrite(a,HIGH); +
-    digitalWrite(b,HIGH); +
-    digitalWrite(g,HIGH); +
-    digitalWrite(c,HIGH); +
-    digitalWrite(d,HIGH);   +
-    digitalWrite(e,HIGH);   +
-    digitalWrite(f,HIGH);   +
-   }  +
-// Цифра "Девять" +
-void display9(void) {  +
-    digitalWrite(a,HIGH); +
-    digitalWrite(b,HIGH); +
-    digitalWrite(g,HIGH); +
-    digitalWrite(c,HIGH); +
-    digitalWrite(d,HIGH);   +
-    digitalWrite(f,HIGH);   +
-   }  +
-// Цифра "Нуль" +
-void display0(void) {  +
-    digitalWrite(a,HIGH); +
-    digitalWrite(b,HIGH); +
-    digitalWrite(c,HIGH); +
-    digitalWrite(d,HIGH);   +
-    digitalWrite(e,HIGH);   +
-    digitalWrite(f,HIGH);   +
-   } +
-//Очистка дисплея  +
-void clearDisplay(void) {  +
-    digitalWrite(a,LOW); +
-    digitalWrite(b,LOW); +
-    digitalWrite(g,LOW); +
-    digitalWrite(c,LOW); +
-    digitalWrite(d,LOW);   +
-    digitalWrite(e,LOW);   +
-    digitalWrite(f,LOW);   +
-   +
  
-void setup() {  +void setup () { 
-    int i; +    for(int i = 2; i <= 13; i++) 
-    for(i=4;i<=11;i++) +
         pinMode(i,OUTPUT);         pinMode(i,OUTPUT);
     pinMode(keyPin,INPUT);     pinMode(keyPin,INPUT);
-    display0(); +    digitalWrite(pinRed,HIGH); 
- +    displ(0); 
 + }
  
-int x = -1;  +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 loop() {  +void displ(int num) { 
-   if(digitalRead(keyPin) == HIGH ) { +  int j = 0; 
-     x = x + 1; +  digitalWrite(a, data[num][j]); j + 1; 
-    } +  digitalWrite(b, data[num][j]); j + 1;  
-   if (x == 0) {clearDisplay(); display0();+  digitalWrite(c, data[num][j]); j + 1 
-   if (x == 1) {clearDisplay()display1();+  digitalWrite(d, data[num][j]); j + 1 
-   if (x == 2) {clearDisplay()display2();+  digitalWrite(e, data[num][j]); j + 1;  
-   if (x == 3) {clearDisplay()display3();+  digitalWrite(f, data[num][j]); j + 1;  
-   if (x == 4) {clearDisplay()display4();} +  digitalWrite(g, data[num][j]); j + 1;  
-   if (x == 5) {clearDisplay(); display5();+  digitalWrite(h, data[num][j]); j + 1
-   if (x == 6) {clearDisplay()display6();} +
-   if (x == 7) {clearDisplay(); display7();+
-   if (x == 8) {clearDisplay()display8();} +
-   if (x == 9) {clearDisplay(); display9();+
-   if (x > 9) {x 0;}+
  }  }
 </file> </file>
  
 +В программе при нажатии кнопки устанавливаем переменную счетчика в 20 сек, и при каждом цикле начинаем ее уменьшать на единицу, условные блоки проверяют состояние счетчика и соответственно выполняют заложенные в них инструкции.
  
 ==== Дополнительное задание ==== ==== Дополнительное задание ====
 <WRAP center round tip 60%> <WRAP center round tip 60%>
-Добавь к цифрам 0..9 еще буквы A, b, C d E F, чтобы секундомер переключал символы от 0 до F+Создайте свой вариант светофора, например добавьте к схеме светодиоды для пешеходного светофора.
 </WRAP> </WRAP>