Простий лічильник на Arduino Nano

Практичне використання GPIO для вводу-виводу

Будуємо лічильник, який при натисканні кнопки збільшує значення на 1 і при досягненні певного значення лічильник скидається на нуль. Для індикації значення використаємо світлодіоди.

Розташуємо плату і світлодіоди на макеті зручним способом:

Живлення схеми буде від плати Arduino, тому з'єднаємо загальні шини живлення з пінами 5V (на "+") i GND (на "-"):

Мінус-шину через резистори 220Ом з'єднуємо з катодами діодів:

Аноди діодів підключаємо до пінів D4, D7, D8 - це прості цифрові піни GPIO, що будуть працювати в режимі виводу:

Тепер з піна D2 відведемо дріт окремо для кнопки. Це також звичайний GPIO пін, який буде працювати в режимі вводу:

В режимі, коли кнопка не натиснута, на вході D2 має бути низький рівень. Для цього з'єднаємо D2 з мінус-шиною через резистор 10кОм. Такий резистор називається pull-down резистором:

Тепер через кнопку під'єднаємо шину "+" так, щоб при натисканні на неї на D2 подавався високий рівень:

Схема готова. Тепер створимо новий проєкт в PlatformIO або Arduino IDE і в файл main.cpp запишемо такий код:

#include <Arduino.h>  //підключаємо бібліотеку Arduino

//визначаємо назви пінів світлодіодів
#define LED1_PIN 4
#define LED2_PIN 7
#define LED3_PIN 8

//пін кнопки
#define BUTTON_PIN 2

int counter; //змінна-лічильник
bool btnLock = false; //змінна блокування кнопки

void display(int num); //функція індикації по значенню лічильника

void setup() { //ця функція викликається 1 раз при запуску
counter = 0; //початкове значення лічильника

pinMode(BUTTON_PIN, INPUT); //переводимо пін кнопки в режим введення

//піни світлодіодів - в режим виведення
  pinMode(LED1_PIN, OUTPUT);
  pinMode(LED2_PIN, OUTPUT);
  pinMode(LED3_PIN, OUTPUT);
}

void loop() { //основний цикл програми
//зчитуємо значення з піну кнопки
//коли кнопка натиснута - 1 (високий рівень), інакше - 0 (низький рівень)

bool btnPressed = digitalRead(BUTTON_PIN);

//якщо кнопка натиснута і ще не заблокована
  if(btnPressed && !btnLock) {
//в першу чергу блокуємо її для запобігання
//повторного спрацьовування якщо кнопка утримується натиснутою

    btnLock = true;

//збільшуємо значення лічильника на одиницю

    counter++;
    
//якщо значення більше 3 скидаємо лічильник до нуля

    if(counter > 3)
      counter = 0;

   display(counter); //відображаємо значення лічильника
  }

//якщо кнопка вже не натиснута і все ще заблокована, розблоковуємо її
  if(btnLock && !btnPressed)
    btnLock = false;

delay(1); //мінімальна затримка 1мс
}

void display(int num) { //функція відображення значення
//вимикаємо всі діоди

  digitalWrite(LED1_PIN, LOW);
  digitalWrite(LED2_PIN, LOW);
  digitalWrite(LED3_PIN, LOW);

//якщо переданий аргумент 1 або більше, вмикаємо перший світлодіод
if(num >= 1)
    digitalWrite(LED1_PIN, HIGH);

//якщо 2 або більше - вмикаємо другий
if(num >= 2)
    digitalWrite(LED2_PIN, HIGH);

//більше 2 - третій
if(num > 2)
    digitalWrite(LED3_PIN, HIGH);
}

Компілюємо код, підключаємо плату Arduino через USB і завантажуємо програму на плату:

Ось такий результат вийшов. Можете погратися з кодом і зробити, наприклад, лічильник від 0 до 7 з виводом у бінарному вигляді. А я побіг - пора годувати котика ;-)