Добавить в корзинуПозвонить
Найти в Дзене
KNL Games

Листинг кода к видео Arduino № 9 - Биполярный транзистор. Логический тестер.

const int pinVT = 12;         // Пин, к которому подключен транзистор const int buttonPin = 2;      // Пин, к которому подключена кнопка bool isLedOn = false;         // Текущее состояние светодиода (в режиме мигания) bool buttonState;             // Текущее состояние кнопки (LOW = нажата) bool lastButtonState = HIGH;  // Предыдущее состояние кнопки unsigned long lastDebounceTime = 0; // Таймер для антидребезга кнопки unsigned long debounceDelay = 50;   // Задержка для антидребезга (мс) bool isBlinking = true;       // Флаг, управляющий миганием (true = мигает, false = не мигает) void setup() { pinMode(pinVT, OUTPUT); pinMode(buttonPin, INPUT_PULLUP); // Используем внутренний подтягивающий резистор // Начальное состояние - светодиод выключен digitalWrite(pinVT, LOW); } void loop() { // --- Чтение состояния кнопки с антидребезгом --- int reading = digitalRead(buttonPin); // Если состояние кнопки изменилось (дребезг или реальное нажатие) if (reading != lastButtonState) { lastDebounceTime

const int pinVT = 12;         // Пин, к которому подключен транзистор

const int buttonPin = 2;      // Пин, к которому подключена кнопка

bool isLedOn = false;         // Текущее состояние светодиода (в режиме мигания)

bool buttonState;             // Текущее состояние кнопки (LOW = нажата)

bool lastButtonState = HIGH;  // Предыдущее состояние кнопки

unsigned long lastDebounceTime = 0; // Таймер для антидребезга кнопки

unsigned long debounceDelay = 50;   // Задержка для антидребезга (мс)

bool isBlinking = true;       // Флаг, управляющий миганием (true = мигает, false = не мигает)

void setup() {

pinMode(pinVT, OUTPUT);

pinMode(buttonPin, INPUT_PULLUP); // Используем внутренний подтягивающий резистор

// Начальное состояние - светодиод выключен

digitalWrite(pinVT, LOW);

}

void loop() {

// --- Чтение состояния кнопки с антидребезгом ---

int reading = digitalRead(buttonPin);

// Если состояние кнопки изменилось (дребезг или реальное нажатие)

if (reading != lastButtonState) {

lastDebounceTime = millis(); // Сбросить таймер

}

// Если прошло достаточно времени с момента последнего изменения состояния

if ((millis() - lastDebounceTime) > debounceDelay) {

// Если состояние кнопки действительно изменилось

if (reading != buttonState) {

buttonState = reading;

// Проверяем, было ли нажатие (переход из HIGH в LOW)

if (buttonState == LOW) {

// Кнопка была нажата!

isBlinking = !isBlinking; // Инвертируем режим мигания (включаем/выключаем)

// --- Обработка нового состояния ---

if (isBlinking) {

// Если мы перешли в режим мигания, нужно сделать один "такт" мигания сразу,

// чтобы светодиод не оставался в последнем состоянии бездействия.

// Иначе, если последнее состояние было HIGH, он останется гореть,

// а мы хотим, чтобы он начал мигать.

// Простейший способ: установить начальное состояние мигания.

// Предположим, что мигание начинается с включенного состояния.

isLedOn = HIGH; // Начальное состояние мигания

digitalWrite(pinVT, isLedOn);

} else {

// Если мы вышли из режима мигания,

// светодиод должен остаться в последнем состоянии,

// которое было перед выключением мигания.

// isLedOn хранит последнее состояние перед тем, как isBlinking стал false.

// Поэтому просто записываем его.

digitalWrite(pinVT, isLedOn);

}

}

}

}

// Сохраняем текущее состояние кнопки для следующей итерации

lastButtonState = reading;

// --- Логика мигания ---

if (isBlinking) {

// Переключаем состояние светодиода только если режим мигания активен

isLedOn = !isLedOn;

digitalWrite(pinVT, isLedOn);

delay(20); // Маленькая задержка для быстрого мигания

} else {

// Если мигание остановлено, ничего не делаем.

// Состояние светодиода фиксируется переменной `isLedOn`

// или значением, которое было записано в `digitalWrite(pinVT, isLedOn);`

// последний раз перед тем, как `isBlinking` стал `false`.

// Для того, чтобы состояние не "прыгало" при каждом проходе loop(),

// мы можем добавить дополнительную задержку, чтобы не нагружать процессор.

delay(100); // Небольшая задержка, чтобы цикл не выполнялся слишком часто, когда мигание отключено

}

}