Управление семисегментным индикатором с помощью кнопок
- Войдите на сайт для отправки комментариев
Чт, 02/02/2017 - 13:46
Всем доброго времени суток!
Подскажите пожалуйста как можно реализовать следующую задачу.
Есть шесть кнопок и семисегментный индикатор с ОК. При включении (UNO) на индикаторе загорается цифра "0".
При нажатии на кнопку №1 загорается цифра 2, при нажатии на кнопку №2 загорается цифра 2 и т.д.
ну как управлять семисегментным индикатором тут тем и примеров хватает
далее берешь либу титановый велосипед для кнопки и на каждую кнопку задаешь свое событие: зажечь нужную цифру
начти с правильного подключения (через резисторы) к ардуине индикатора и кнопок. попробуй сам сделать, если уж сам не сможешь и приложишь код который работает не так как надо поможем, если просто скопируешь чей то код и спросишь как его переделать для тебя то врядли тебе кто то поможет
При нажатии на кнопку №1 загорается цифра 2, при нажатии на кнопку №2 загорается цифра 2 и т.д.
Как "т.д."? При нажатии на любую кнопку загорается двойка? А азчем тогда разные кнопки?
И т.д. - при нажатии на кнопку №3 загорается цифра 3, при нажатии на кнопку №4 загорается цифра 4
Т.е. первая кнопка - исключение? Или это была опечатка? Объясните толком.
семисегментный индикатор с ОК
шозанах "ОК"?
Есть шесть кнопок и один индикатор.
При подачи питания на плату (у меня UNO) на индикаторе должен загореться 0.
Нажимаем кнопку№1 загорается цифра 1
Нажимаем кнопку№2 загорается цифра 2
Общий катод на индикаторе
Понятно, значит, в первом сообщении опечатка про первую кнопку. Так бы сразу и сказали.
Ну, давайте целиком Ваш скетч (только по правилам) и схему подключения.
Есть шесть кнопок и один индикатор.
При подачи питания на плату (у меня UNO) на индикаторе должен загореться 0.
Нажимаем кнопку№1 загорается цифра 1
Нажимаем кнопку№2 загорается цифра 2
да шо за дурь?
void setup() { загореться 0.; // При подачи питания на плату (у меня UNO) на индикаторе должен загореться 0. } void loop() { // Как-то так. if (Нажимаем кнопку№1 == 1) {загорается цифра 1;} if (Нажимаем кнопку№2 == 1) {загорается цифра 2;} if (Нажимаем кнопку№3 == 1) {загорается цифра 3;} if (Нажимаем кнопку№4 == 1) {загорается цифра 4;} if (Нажимаем кнопку№5 == 1) {загорается цифра 5;} if (Нажимаем кнопку№6 == 1) {загорается цифра 6;} }/// список выводов Arduino для подключения к разрядам a-g // семисегментного индикатора //int pins[7]={2,3,4,5,6,7,8}; int button1 = 9; int button2 = 10; int button3 = 11; // значения для вывода цифр 0-9 /*byte digitArray[10] = { B11111100, B01100000, B11011010, B11110010, B01100110, B10110110, B10111110, B11100000, B11111110, B11100110}; */ byte digitArray[11][7] = { { 1,1,1,1,1,1,0 }, // = 0 { 0,1,1,0,0,0,0 }, // = 1 { 1,1,0,1,1,0,1 }, // = 2 { 1,1,1,1,0,0,1 }, // = 3 { 0,1,1,0,0,1,1 }, // = 4 { 1,0,1,1,0,1,1 }, // = 5 { 1,0,1,1,1,1,1 }, // = 6 { 1,1,1,0,0,0,0 }, // = 7 { 1,1,1,1,1,1,1 }, // = 8 { 1,1,1,0,0,1,1 }, // = 9 { 0,0,0,0,0,0,0 } // = off }; // переменная для хранения значения текущей цифры int number=0; void setup() { // Сконфигурировать контакты как выходы /*for(int i=0;i<7;i++) pinMode(pins[i],OUTPUT); */ pinMode(2, OUTPUT); // kingbrigth - a pinMode(3, OUTPUT); // kingbrigth - b pinMode(4, OUTPUT); // kingbrigth - c pinMode(5, OUTPUT); // kingbrigth - d pinMode(6, OUTPUT); // kingbrigth - e pinMode(7, OUTPUT); // kingbrigth - f pinMode(8, OUTPUT); // kingbrigth - g //pinMode(9, OUTPUT); // kingbrigth - dot pinMode(9, INPUT_PULLUP); // kingbrigth - f pinMode(10, INPUT_PULLUP); // kingbrigth - g pinMode(119, INPUT_PULLUP); // kingbrigth - dot } // функция вывода цифры на семисегментный индикатор void setDigit(byte digit) { byte pin=2; for (byte i = 0; i < 7; ++i) { digitalWrite(pin, digitArray[digit][i]); ++pin; } } void loop() { if(digitalRead(button1) == HIGH){ //number = 1; setDigit(1); } if(digitalRead(button2) == HIGH){ //number = 1; setDigit(2); } if(digitalRead(button3) == HIGH){ //number = 1; setDigit(3); } else{ //number = 0; setDigit(0); }Подключение кнопок стандартное, через резистор "на землю" 10 КОм
Индикатор: на входы индикатора резисторы 220 Ом, общий катод
Питание +5 от ардуино
))) в коде подтяжка к плюса встроенная в мк, а снаружи резистором на землю))) это зачем?
Что за пин 119 в строке 44?
Что делает else в строке 75? При таком else у Вас ноль будет загораться всегда, когда не нажата кнопка 3 и плевать на остальные кнопки. Нужно или добавлять else в строки 66 и 71, или как-то по-другому это решать.
Так, я не знаю насколько стандартное или нет подключение кнопок. Вам коллега про некую странность уже написал.
Опять же неясно куда Вы общий катод подключили. У Вас индиктор то один вообще - на одну цифру?
В общем, я Вам написал, давайте схему. Если Вам лень (или жалко времени) её рисовать, то мне тоже лень (жалко времени) разбираться в Вашей проблеме.
[code] int e = 6; int d = 5; int c = 4; int b = 3; int a = 2; int f = 7; int g = 8; int PinOut = 9; // пин-выход int PinIn[4] {11, 10, 13, 12}; // пины входа void setup() { pinMode(e, OUTPUT); pinMode(d, OUTPUT); pinMode(c, OUTPUT); pinMode(b, OUTPUT); pinMode(a, OUTPUT); pinMode(f, OUTPUT); pinMode(g, OUTPUT); pinMode (10, INPUT); digitalWrite(10, HIGH); pinMode (11, INPUT); digitalWrite(11, HIGH); pinMode (12, INPUT); digitalWrite(12, HIGH); pinMode (13, INPUT); digitalWrite(13, HIGH); //установить выходной пин на вывод pinMode (PinOut, OUTPUT); //установить входные пины на ввод и подать на них ток for (int i = 0; i < 4; i++) { pinMode (PinIn[i], INPUT_PULLUP); digitalWrite(PinIn[i], HIGH); } displayDigit(0); } void displayDigit(int digit) { if (digit == 0) { digitalWrite(e, HIGH); digitalWrite(d, HIGH); digitalWrite(c, HIGH); digitalWrite(b, HIGH); digitalWrite(a, HIGH); digitalWrite(f, HIGH); } else if (digit == 1) { digitalWrite(b, HIGH); digitalWrite(c, HIGH); } else if (digit == 2) { digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(g, HIGH); digitalWrite(e, HIGH); digitalWrite(d, HIGH); } else if (digit == 3) { digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(g, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); } else if (digit == 4) { digitalWrite(f, HIGH); digitalWrite(g, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); } else if (digit == 5) { digitalWrite(a, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); } else if (digit == 6) { digitalWrite(a, HIGH); digitalWrite(f, HIGH); digitalWrite(e, HIGH); digitalWrite(d, HIGH); digitalWrite(c, HIGH); digitalWrite(g, HIGH); } else if (digit == 7) { digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); } else if (digit == 8) { digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); } else if (digit == 9) { digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); } } void turnOff() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); } void loop() { digitalWrite(PinOut, LOW); //подать 0 на выходной пин for (int i = 1; i <= 4; i++) // обойти цикл по кнопкам (колнкам кнопок) { if (digitalRead(PinIn[0]) == LOW) { turnOff(); displayDigit(1); } if (digitalRead(PinIn[1]) == LOW) { turnOff(); displayDigit(2); } if (digitalRead(PinIn[2]) == LOW) { turnOff(); displayDigit(3); } if (digitalRead(PinIn[3]) == LOW) { turnOff(); displayDigit(4); } } digitalWrite(PinOut, HIGH); //вернуть ток на выходной пин } [/code]Подскажите пожалуйсто как можно этот код сделать более компактным.
Написать библиотеку на C и использовать в Ардуино вызовом функции.