Управление семисегментным индикатором с помощью кнопок

OOM
Offline
Зарегистрирован: 07.01.2017

Всем доброго времени суток!

Подскажите пожалуйста как можно реализовать следующую задачу.

Есть шесть кнопок и семисегментный индикатор с ОК. При включении (UNO) на индикаторе загорается цифра "0".

При нажатии на кнопку №1 загорается цифра 2, при нажатии на кнопку №2 загорается цифра 2 и т.д.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну как управлять семисегментным индикатором тут тем и примеров хватает

далее берешь либу титановый велосипед для кнопки и на каждую кнопку задаешь свое событие: зажечь нужную цифру

начти с правильного подключения (через резисторы) к ардуине индикатора и кнопок. попробуй сам сделать, если уж сам не сможешь и приложишь код который работает не так как надо поможем, если просто скопируешь чей то код и спросишь как его переделать для тебя то врядли тебе кто то поможет

OOM
Offline
Зарегистрирован: 07.01.2017
if(digitalRead(button1) == HIGH){
     //number = 1;
     setDigit(1);
    }
     
     else{
   
    //number = 0;
   setDigit(0);
   }  
 
Когда подключена кнопка1 (butto1) при не нажатой кнопке горит "0", нажимаеш горит"1", то что нужно, подключаешь по аналогии button2, горит "0" , нажимаеш кнопку 1 горит одновремннно 0 и 1, нажимаеш кнопку, горит одновременно 0и 2, почему так не могу понять.
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

OOM пишет:

При нажатии на кнопку №1 загорается цифра 2, при нажатии на кнопку №2 загорается цифра 2 и т.д.

Как "т.д."? При нажатии на любую кнопку загорается двойка? А азчем тогда разные кнопки?

OOM
Offline
Зарегистрирован: 07.01.2017

И т.д. - при нажатии на кнопку №3 загорается цифра 3, при нажатии на кнопку №4 загорается цифра 4

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Т.е. первая кнопка - исключение? Или это была опечатка? Объясните толком.

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

OOM пишет:

семисегментный индикатор с ОК

шозанах "ОК"?

OOM
Offline
Зарегистрирован: 07.01.2017

Есть шесть кнопок и один индикатор.

При подачи питания на плату (у меня UNO) на индикаторе должен загореться 0.

Нажимаем кнопку№1 загорается цифра 1

Нажимаем кнопку№2 загорается цифра 2

Нажимаем кнопку№3 загорается цифра 3
Нажимаем кнопку№4 загорается цифра 4
Нажимаем кнопку№5 загорается цифра 5
Нажимаем кнопку№6 загорается цифра 6
Как-то так.
OOM
Offline
Зарегистрирован: 07.01.2017

Общий катод на индикаторе

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Понятно, значит, в первом сообщении опечатка про первую кнопку. Так бы сразу и сказали.

Ну, давайте целиком Ваш скетч (только по правилам) и схему подключения.

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

OOM пишет:

Есть шесть кнопок и один индикатор.

При подачи питания на плату (у меня UNO) на индикаторе должен загореться 0.

Нажимаем кнопку№1 загорается цифра 1

Нажимаем кнопку№2 загорается цифра 2

Нажимаем кнопку№3 загорается цифра 3
Нажимаем кнопку№4 загорается цифра 4
Нажимаем кнопку№5 загорается цифра 5
Нажимаем кнопку№6 загорается цифра 6
Как-то так.

да шо за дурь?

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;}
}

 

OOM
Offline
Зарегистрирован: 07.01.2017
/// список выводов 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 от ардуино

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

))) в коде подтяжка к плюса встроенная в мк, а снаружи резистором на землю))) это зачем?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Что за пин 119 в строке 44?

Что делает else в строке 75? При таком else у Вас ноль будет загораться всегда, когда не нажата кнопка 3 и плевать на остальные кнопки. Нужно или добавлять else в строки 66 и 71, или как-то по-другому это решать.

Так, я не знаю насколько стандартное или нет подключение кнопок. Вам коллега про некую странность уже написал.

Опять же неясно куда Вы общий катод подключили. У Вас индиктор то один вообще - на одну цифру?

В общем, я Вам написал, давайте схему. Если Вам лень (или жалко времени) её рисовать, то мне тоже лень (жалко времени) разбираться в Вашей проблеме.

OOM
Offline
Зарегистрирован: 07.01.2017
[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]

Подскажите пожалуйсто как можно этот код сделать более компактным.

AlexeySh
Offline
Зарегистрирован: 16.01.2017

Написать библиотеку на C и использовать в Ардуино вызовом функции.