7-сегнментный индикатор 4х разряда прямое подключение без обвязки

DezmontDeXa
Offline
Зарегистрирован: 09.02.2016

Может кому пригодится для обучения.
/* * ///////////////////////////////////////////////////////////////////////////////////
 * Название: Скетч для 7-сегментного 4х разрядного индикатора с минимальной обвязкой
 * Автор: DezmontDeXa
 * e-mail: flatron2800@gmail.com
 * 24.03.2016
 * ////////////////////////////////////////////////////////////////////////////////////
 * Скетч для управления 7-сегментным 4 разрядным индикатором с общим Анодом
 * с минимальной обвязкой напряжение 3v3
 * Для подключения без драйверв и сдвиговых регистров. Аноды следует подключать через резисторы в 220 Ом
 * Скетч сделан именно под 4 разряда
 * Настройте Настраиваемые переменные под свое подключение
 * Для вывода числа на индикатор используется монитор порта
 * необходим закрывающий символ '\n' - внизу окна нужно выбрать из списка: "Новая строка"
 * введите число и нажмите Enter
 * Выводит числа не длиннее 4х знаков
 * Отбрасывает нули в начале
 *
 * Не умеет писать числа со знаком
 * Не умеет ставить плавующую точку
 * Если допишите эти функции или и вовсе засунете все в библиотеку, пожалуйста,
 * скиньте результат мне на мыло
*/////////////////////////////////////////////////////////////////////////////////////

/* * ///////////////////////////////////////////////////////////////////////////////////
 * Название: Скетч для 7-сегментного 4х разрядного индикатора с минимальной обвязкой
 * Автор: DezmontDeXa
 * e-mail: flatron2800@gmail.com
 * 24.03.2016
 * ////////////////////////////////////////////////////////////////////////////////////
 * Скетч для управления 7-сегментным 4 разрядным индикатором с общим Анодом
 * с минимальной обвязкой напряжение 3v3
 * Для подключения без драйверв и сдвиговых регистров. Аноды следует подключать через резисторы в 220 Ом
 * Скетч сделан именно под 4 разряда
 * Настройте Настраиваемые переменные под свое подключение
 * Для вывода числа на индикатор используется монитор порта
 * необходим закрывающий символ '\n' - внизу окна нужно выбрать из списка: "Новая строка"
 * введите число и нажмите Enter
 * Выводит числа не длиннее 4х знаков
 * Отбрасывает нули в начале
 * 
 * Не умеет писать числа со знаком
 * Не умеет ставить плавующую точку
 * Если допишите эти функции или и вовсе засунете все в библиотеку, пожалуйста, 
 * скиньте результат мне на мыло
*/////////////////////////////////////////////////////////////////////////////////////
//Настройте переменные под ваше подключение///////////////////////////////////////////
int pSegments[8] = {30, 31, 32, 33, 34, 35, 36, 37};// a, b, c, d, e, f, g, .
int pDigits[4] = {2, 3, 4, 5}; // Разряды справа налево
//////////////////////////////////////////////////////////////////////////////////////

byte bSymbols[10] = {B00111111, B00000110, B01011011, B01001111, B01100110, //0, 1, 2, 3, 4
                     B01101101, B01111101, B00000111, B01111111, B01101111 //5, 6, 7, 8, 9
                    };
String inString = "";


void setup() {
  Serial.begin(9600);

  for (int i = 0; i < 8; i++)
  {
    pinMode(pSegments[i], OUTPUT);
    analogWrite(pSegments[i], 153);
  };
  for (int i = 0; i < 4; i++)
  {
    pinMode(pDigits[i], OUTPUT);
    analogWrite(pDigits[i], 0);
  };
}

void loop() {
  // Read serial input:
  while (Serial.available() > 0) {
    int inChar = Serial.read();
    if (isDigit(inChar)) {
      // convert the incoming byte to a char
      // and add it to the string:
      inString += (char)inChar;
    }
    // if you get a newline, print the string,
    // then the string's value:
    if (inChar == '\n') {
      if (inString.length() < 5) {
        Serial.println(inString);
        writeNumber(inString.toInt());
        // clear the string for new input:
        inString = "";
      } else {
        inString = "";
      }
    }
  }
}

bool writeNumber(int iNum) {
  int Number[4] = {0, 0, 0, 0};
  if (iNum > 9999) {
    return 0;
  }

  Number[3] = iNum / 1000;
  iNum -= (Number[3] * 1000);
  Number[2] = iNum / 100;
  iNum -= (Number[2] * 100);
  Number[1] = iNum / 10;
  iNum -= (Number[1] * 10);
  Number[0] = iNum;

  int s = 0;
  for (int a = 3; a >= 1; a--) {
    if (Number[a] == 0) {
      s++;
    } else {
      break;
    }
  }


  while (!Serial.available()) {


    for (int i = 0; i < 4 - s; i++)
    {
      _writeNumeral(Number[i], i);
      delay(5);
    }


  }
  _clearAll();
  return 1;
}
bool _writeNumeral(int Symbol, int Digit) {
  if ((Symbol < 0) && (Symbol > 9) && (Digit < 0) && (Digit > 3)) {
    return 0;
  }

  _clearAll();
  _selectDigit(Digit);
  _selectSymbol(Symbol);
  return 1;
}
bool _selectSymbol(int iSymbol) {
  for (int i = 0; i < 8; i++) {
    if (bitRead(bSymbols[iSymbol], i))
    {
      analogWrite(pSegments[i], 0);
    };
  };
}
bool _selectDigit(int Digit) {
  analogWrite(pDigits[Digit], 153);
}
void _clearAll() {
  for (int i = 0; i < 8; i++) {
    analogWrite(pSegments[i], 153);
  };

  for (int i = 0; i < 4; i++)
  {
    analogWrite(pDigits[i], 0);
  };
}

 

Olm
Offline
Зарегистрирован: 09.10.2014

Динамическую индикацию на таймере удобнее делать по моему. Можно и яркость регулировать так - по переполнению таймера зажигаем сегмент,  а по совпадению гасим .

fanzone
Offline
Зарегистрирован: 31.03.2017

можно ли на мини подключить напрямую 7-ми сегментник на 4 цифры + пару кнопок и реализовать часы с коррекцией времени без ds-ок? если можно,то скетч и схему подключения киньте начинающему-просьба не пинать за нубство.

 

asam
Offline
Зарегистрирован: 12.12.2018

При подключени "без обвязки" и использования динамической индикации "посимвольно" (те зажигаем по очереди каждый символ целиком) получаем существенную разницу в яркости символов. Чем больше сегментов включено, тем меньше яркость. В итоге, скажем, цифра 8 получается существенно тусклее чем 1.

Что бы избежать такого эффекта, надо делать "посегментную" динамическую индикацию. То есть в каждый момент времени горит только один сегмент.

fanzone
Offline
Зарегистрирован: 31.03.2017

резисторы в обвязке будут

fanzone
Offline
Зарегистрирован: 31.03.2017

https://www.youtube.com/watch?v=F_ml0VGdDSk

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

fanzone
Offline
Зарегистрирован: 31.03.2017

вместо светодиодного индикатора буду использовать низковольтные лампы-делал же так с pic16f628

fanzone
Offline
Зарегистрирован: 31.03.2017

набросай схемку как ты это вишь.

 

Green
Offline
Зарегистрирован: 01.10.2015

asam пишет:

Чем больше сегментов включено, тем меньше яркость. В итоге, скажем, цифра 8 получается существенно тусклее чем 1.

В зависимости от кол-ва сегментов меняем длительность свечения.