Код Arduino для управления 4 светодиодами с 4 кнопок

Это мой самый первый скетч Arduino, и он вызывает у меня головную боль. Звучит так просто, на самом деле все, что я хочу, чтобы скетч делал, это цифровое считывание с одного из 4 цифровых входных контактов, а затем, по сути, цифровая запись на один из 4 выходных контактов. Таким образом, при нажатии кнопки 1 загорается светодиод 1, при нажатии кнопки 2 загорается светодиод 2 и так далее. Я добавил последовательную запись, чтобы проверить, действительно ли кнопки работают при нажатии.

Код, который я написал:

const int buttonPin1 = 7; // номер кнопки 1 пин
int buttonState1 = НИЗКИЙ; // устанавливаем значение переменной по умолчанию для статуса pushbutton1
const int ledPin1 = 6; // номер светодиода 1 пин
const int buttonPin2 = 8; // номер кнопки 2 пин
int buttonState2 = НИЗКИЙ; // устанавливаем значение переменной по умолчанию для статуса pushbutton2
const int ledPin2 = 9; // номер вывода светодиода 2
const int buttonPin3 = 4; // номер кнопки 3 пин
int buttonState3 = НИЗКИЙ; // устанавливаем значение переменной по умолчанию для состояния pushbutton3
const int ledPin3 = 5; // номер светодиода 3 пин
const int buttonPin4 = 2; // номер кнопки 4 пин
int buttonState4 = НИЗКИЙ; // устанавливаем значение переменной по умолчанию для статуса pushbutton4
const int ledPin4 = 3; // номер светодиода 4 контакта

void setup() { // Установить выводы на выходы или входы pinMode(кнопкаPin1, ВХОД); // инициализируем контакты кнопок как входы: pinMode(ledPin1, ВЫХОД); // инициализируем выводы светодиода как выходы: pinMode(кнопкаPin2, ВХОД); // инициализируем контакты кнопок как входы: pinMode(ledPin2, ВЫХОД); // инициализируем выводы светодиода как выходы: pinMode(кнопкаPin3, ВХОД); // инициализируем контакты кнопок как входы: pinMode(ledPin3, ВЫХОД); // инициализируем выводы светодиода как выходы: pinMode(кнопкаPin4, ВХОД); // инициализируем контакты кнопок как входы: pinMode(ledPin4, ВЫХОД); // инициализируем выводы светодиода как выходы: Серийный.начать(9600); // инициализируем последовательную связь на скорости 9600 бод

void loop() {

buttonState1 = digitalRead(buttonPin1); // прочитать текущие состояния значения кнопки: buttonState2 = цифровое чтение (кнопкаPin2); // прочитать текущие состояния значения кнопки: buttonState3 = цифровое чтение (кнопкаPin3); // прочитать текущие состояния значения кнопки: buttonState4 = digitalRead (buttonPin4); // чтение текущих состояний значения кнопки:

// проверяем, нажата ли кнопка buttonState# == HIGH/LOW // при нажатии изменить buttonState == HIGH, чтобы включить ledPin# // иначе, если buttonState == LOW, то digitalWrite(ledPin#, LOW) не выключает светодиод.

if (buttonState1 == HIGH) { //проверить состояние кнопки digitalWrite(ledPin1, ВЫСОКИЙ); //если HIGH включить светодиод: } еще { digitalWrite(ledPin1, НИЗКИЙ); // выключаем светодиод: } Serial.println(buttonState1); //Печать состояния кнопки в последовательный порт if (buttonState2 == HIGH) { //проверить состояние кнопки digitalWrite(ledPin2, ВЫСОКИЙ); //если HIGH включить светодиод: } еще { digitalWrite(ledPin2, НИЗКИЙ); // выключаем светодиод: задержка (10); } Serial.println(buttonState2); //Печать состояния кнопки в последовательный порт if (buttonState3 == HIGH) { //проверить состояние кнопки digitalWrite(ledPin3, ВЫСОКИЙ); //если HIGH включить светодиод: } еще { digitalWrite(ledPin3, НИЗКИЙ); // выключаем светодиод: задержка (10); Serial.println(buttonState3); //Печать состояния кнопки в последовательный порт } if (buttonState4 == HIGH) { //проверить состояние кнопки digitalWrite(ledPin4, ВЫСОКИЙ); //если HIGH включить светодиод: } еще { цифровая запись (ledPin4, НИЗКИЙ); // выключаем светодиод: задержка (10); Serial.println(buttonState4); //Печать состояния кнопки в последовательный порт }

Все светодиоды имеют общее заземление, а все кнопки имеют общее заземление. Кнопки подключены к +5V & Введите номер контакта, чтобы на один терминал было два провода, Светодиоды подключаются к цифровым выходным контактам, затем к резистору и напрямую к GND. Что происходит, так это то, что ВСЕ светодиоды загораются при нажатии любой из 4 кнопок.

Я попытался отредактировать часть кода в примерах скетчей, чтобы все заработало.

Может ли кто-нибудь подсказать, что я делаю неправильно? Или исправьте код sp, чтобы я мог видеть, где я ошибаюсь.

, 👍0

Обсуждение

То, как вы подключили кнопки, вероятно, неправильно. Для них также требуются резисторы, иначе цифровой вход будет разомкнут, когда кнопка не нажата. Открытый вход может делать что угодно, он может даже работать с соседним выводом., @Jot


3 ответа


Лучший ответ:

1

Вероятно, вы неправильно подключили коммутаторы. Обычно люди используют переключатели с однократным опросом (SPST), подключенные к 5 вольтам и входному контакту Arduino. Это потянет входной контакт до 5 вольт, когда переключатель замкнут. Затем, чтобы соединить входной контакт с землей, когда переключатель разомкнут, люди добавляют большой резистор между землей и тем же контактом процессора.

Здесь подойдет почти любой большой резистор. Рассмотрите возможность использования сопротивления 10 кОм (10 000 Ом) или около того.

Конечно, если вы используете Arduino на 3 В, не подключайте коммутатор к источнику на 5 В. Вместо этого подключите его к источнику 3 В.

В качестве альтернативы можно активировать подтягивающий резистор внутри процессора, если он имеется. Посмотрите на эту веб-страницу arduino.cc. В этом примере кода показано, как активировать подтягивание процессором вывода номер 2:

pinMode(2,INPUT_PULLUP);

Поскольку не все процессоры имеют функцию "подтягивания" на всех входных контактах & поскольку диапазон внутренних подтягивающих сопротивлений процессора может варьироваться (например, от 50 000 до 150 000 Ом), более полезным и универсальным может быть использование внешнего подтягивающего резистора.

,

Очевидно, проблема в том, что резистор, который я использую на коммутаторах, недостаточно велик. Они подключены точно так же, как указано выше, за исключением того, что я не использую резистор 10 кОм. Это меньшего значения. не взламывая мультиметр, я не могу вспомнить, какой рейтинг я использовал. Хотя код выглядит нормально? Я разбил его на логические шаги и составил блок-схему, чтобы проработать логику. Так что надеялся, что с кодом все в порядке....., @ArDweNOme

Явных проблем с кодом не заметил. Но вы всегда должны начинать с чего-то простого, что работает, а затем строить дальше. Задержки в 10 мс не будут иметь большого значения. Вероятно, распечатка серийных данных займет больше времени., @st2000

Использование меньшего резистора также должно работать. Но это будет бесполезно увеличивать текущий розыгрыш. Возможно, вы использовали такой маленький резистор, что вы превысили токовую мощность вашего источника питания или батарей. В таком случае напряжение упадет и приведет к неожиданным результатам. В крайних случаях можно нанести ущерб., @st2000

«Обычно люди используют однопозиционные однопозиционные переключатели (SPST), подключенные к 5 вольтам и входному контакту Arduino». Нет, обычно используется внутренний подтягивающий резистор, а кнопка только соединяет контакт с Gnd., @CrossRoads


1

Избавьтесь от внешних резисторов, используйте внутренний подтягивающий резистор.

В настройке():

pinMode (pinX, INPUT_PULLUP);

Подключите кнопку между входным контактом pinX и Gnd, затем проверьте НИЗКИЙ уровень, чтобы увидеть, нажата ли кнопка в цикле():

if (digitalRead (pinX) == LOW){ // кнопка нажата

// делаем что-то

else { // кнопка не нажата

// делаем что-то еще

,

0

Я бы посоветовал убрать резистор(ы) с переключателей, чтобы кнопка подключалась к цифровым входам линии 3В/5В. Затем используйте резисторы 470 Ом для светодиодов (для ограничения тока) на цифровых выходах.

,