Курс Arduino - Час і Random

Час і рандом. Реакція

Цього разу ми дізнаємося, що таке «Випадкові» значення, а також навчимося працювати з часом.

Нам знадобляться:

  • Кнопка тактова
  • Пищалка
  • З'єднувальні проводи «ПАПА- ПАПА»

Реакція

Наша задача на сьогодні – зібрати схему, яка дозволяє дізнатися швидкість нашої реакції.

При натисканні на ліву кнопку, звучить сигнал через «випадковий» час. А при натисканні на праву, фіксується, скільки часу пройшло з писка до натискання на праву кнопку.

Хто вміє – пробує сам, а ми дивимося на схему.

Код

#define BUZ 8
#define START 9
#define STOP 7

int time; //Змінна для синхронізації

void setup() 
{
Serial. begin(9600);

pinMode(START, INPUT_PULLUP);
pinMode(STOP, INPUT_PULLUP);
pinMode(BUZ, OUTPUT);
}

void loop() 
{
 if(digitalRead(START) == 0) // При натисканні на Кнопку СТАРТ..
 {
  int start_time = millis();// Запам'ятаємо час натискання
  time = start_time;        //Запишемо його в глобальну змінну.

  int Rand =  random(0, 4000); //Сгенеруємо "випадкову" затримку
  time = time + Rand;         //Додамо час затримки
  delay(Rand);                //Почекаємо
  tone(BUZ, 3000, 500);     //Пищимо!
 }
 if(digitalRead(STOP) == 0 && digitalRead(START) == 1)// При натисканні на кнопку СТОП...
 {
  int stop_time = millis(); //Запам'ятаємо час зупинки.
  time =  stop_time - time; // Визначимо різницю у часі.
  Serial.println("Time: "); // Виведемо час у Серіал.
  Serial.println(time);  
  delay(1000);
 }
}

//Перед другою спробою натискай на кнопку СТАРТ знову.

Пояснення

int time;  Змінним(не всім), при їх позначенні, не обов'язково задавати якесь значення. Цю змінну ми використовували для того, щоб зв'язати два оператори if.

В C++ змінні, оголошені всередині циклу, не будуть доступні в інших циклах, так як вони діють тільки всередині цього циклу. Це робиться для того, щоб запобігти помилкам у програмуванні. Коли код програми розростеться, ти зрозумієш, про що я говорю.

Щоб змінна була доступна для кількох операторів, потрібно зробити її глобальною. Тобто, оголосити змінну поза функціями.

millis(); Повертає кількість мілісекунд, що пройшли з запуску програми.

Нам вона потрібна для того, щоб вимірювати кількість часу, що минуло від подачі сигналу до натискання на кнопку.

random(min, max); Це генератор «випадкових» чисел. Приймає два значення. Він генерує число в діапазоні від min  до max.

«Випадкові» числа тому, що це певна послідовність значень. Дуже довга, але одна і та ж. Для того щоб отримувати різні послідовності, варто скористатися Random Seed();

Вона, функція, ініціалізує генератор. А якщо задати параметром випадковий, то ми будемо отримувати потрібні нам послідовності. Однакова послідовність буде, якщо параметр буде фіксованим.

Висновок

Тепер ти можеш тренувати свою реакцію за допомогою власноруч зробленого пристрою. А можеш продовжувати займатися далі.

Список радіоелементів

Позначення Тип Номінал Кількість Примітка
Плата Arduino
Arduino Uno
1
Макетна плата Breadboard-half 1
П'єзоелемент Пасивний 1
Кнопка тактова Без фіксатора 2
З'єднувальні провода "Папа-Папа" 1

Прикреплені файли:

Top