Различия

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

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

Следующая версия
Предыдущая версия
products:aruno:exp15 [2020/06/12 14:24] – создано alexnikproducts:aruno:exp15 [2020/07/02 14:24] (текущий) alexnik
Строка 1: Строка 1:
 ===== Эксперимент 15. Счетчик ===== ===== Эксперимент 15. Счетчик =====
  
-В прошлом эксперименте мы научились выводить данные на LED - индикатор. Усовершенствуем немного схему и программу, что бы получить простейший секундомер, который отсчитывает и отображает секунды и будет  кнопкой.+Используя схему предыдущего эксперимента можно сделать еще одно устройство - Счетчик нажатий на кнопку
  
 ==== Схема эксперимента ==== ==== Схема эксперимента ====
-{{ :products:ardu:exp14_shema_tk.png?nolink |}} +{{ :products:ardu:exp14_shema_tk.png?nolink&400 |}} 
-{{ :products:ardu:exp13_sch.png?nolink |}}+{{ :products:ardu:exp13_sch.png?nolink&400 |}}
 //Рисунок 1. Электрическая принципиальная схема эксперимента// //Рисунок 1. Электрическая принципиальная схема эксперимента//
  
Строка 14: Строка 14:
 ==== Программный код эксперимента ==== ==== Программный код эксперимента ====
  
-<file cpp Exp14[enable_line_numbers="2", start_line_numbers_at="1"]>+<file cpp Exp15[enable_line_numbers="2", start_line_numbers_at="1"]>
 int a = 8;  int a = 8; 
 int b = 9; int b = 9;
Строка 22: Строка 22:
 int f = 7; int f = 7;
 int g = 6; int g = 6;
-int dp = 10;+int = 10;
 int keyPin = 12; int keyPin = 12;
 +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}};
  
-// Цифра "Один" +void displ (int);
-void display1(void) {  +
-    digitalWrite(b,HIGH); +
-    digitalWrite(c,HIGH); +
-   }  +
-// Цифра "Два" +
-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=4;i<=11;i++) 
-    for(i=4;i<=11;i++) +
         pinMode(i,OUTPUT);         pinMode(i,OUTPUT);
     pinMode(keyPin,INPUT);     pinMode(keyPin,INPUT);
-    display0();+    displ(11);
    
  
 int x = -1;   int x = -1;  
-int switchState 0;  +int button_old 1;
-int oldSwitchState = 0;  +
-boolean lightsOn = false;+
 void loop() {  void loop() { 
-   switchState = digitalRead(keyPin);  +   if((digitalRead(keyPin) == LOW)&&(button_old == 1)) {
-   if (switchState !oldSwitchState+
-      oldSwitchState = switchState; +
-      if (switchState == HIGH+
-        lightsOn = !lightsOn; +
-      } +
-    } +
-   if(lightsOn) {+
       x = x + 1;       x = x + 1;
     }     }
-   if (x == 0) {clearDisplay(); display0(); delay(100); } +   displ(11); 
-   if (x == 1) {clearDisplay(); display1(); delay(100); } +   displ(x);
-   if (x == 2) {clearDisplay(); display2(); delay(100); } +
-   if (x == 3) {clearDisplay(); display3(); delay(100); } +
-   if (x == 4) {clearDisplay(); display4(); delay(100); } +
-   if (x == 5) {clearDisplay(); display5(); delay(100); } +
-   if (x == 6) {clearDisplay(); display6(); delay(100); } +
-   if (x == 7) {clearDisplay(); display7(); delay(100); } +
-   if (x == 8) {clearDisplay(); display8(); delay(100); } +
-   if (x == 9) {clearDisplay(); display9(); delay(100); }+
    if (x > 9) {x = 0;}    if (x > 9) {x = 0;}
 +   
 +   button_old = digitalRead(keyPin);
 +   delay(20);
  }  }
 +
 +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> </file>
-На первый взгляд программа может показаться очень сложной, но не стоит пугаться, давайте присмотримся повнимательнее.\\ + 
-В начале программы мы инициализируем переменные соответствующие номерам пинов к которым подключен LED - индикатор и кнопка.\\ +В основном цикле программы мы обрабатываем нажатие кнопки и считаем количество нажатий, при чем счетчик нажатий увеличивается при условии что кнопка уже отпущена (с пина считывается сигнал "LOW"), но была нажата (в переменную **button_old** записана 1, что соответствует сигналу "HIGH" считанному с пина кнопки).\\ 
-Далее следуют одиннадцать функций очень похожих друг на друга. При выполнении функций ''display0()...display9()'' на LED - индикаторе зажигаются цифры от 0 до 9, а при выполнении функции ''clearDisplay()'' все сегменты индикатора гаснут.\\ +Для отображения символа используется пользовательская функция ''displ()'', которая в качестве аргумента принимает номер зашифрованного в массиве символа (0..9), где "1" означает, что будет подаваться сигнал "HIGH", а "0" означает, что будет подаваться сигнал "LOW"
-В функции ''setup()'' настраиваем пины контроллера и запускаем на выполнение функцию ''display0()'', что-бы на индикаторе при запуске сразу загорелся **"0"**.\\ +
-В функции ''loop()'' прописан обработчик кнопки, который запускает или останавливает смену цифр на LED - индикаторе.\\ +
-Благодаря тому, что мы отображение цифр вынесли в отдельные функции, основной цикл программы более прост и легче читаем. Кроме того при допущении ошибки ее легче найти и исправить.+
  
 ==== Дополнительное задание ==== ==== Дополнительное задание ====
Строка 163: Строка 81:
 </WRAP> </WRAP>
  
-=== Задание повышенной сложности === 
-<WRAP center round tip 60%> 
-Напиши программу с аналогичным результатом используя массивы  
-</WRAP>