7-сегнментный индикатор 4х разряда прямое подключение без обвязки
- Войдите на сайт для отправки комментариев
Может кому пригодится для обучения.
/* * ///////////////////////////////////////////////////////////////////////////////////
* Название: Скетч для 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); }; }
Динамическую индикацию на таймере удобнее делать по моему. Можно и яркость регулировать так - по переполнению таймера зажигаем сегмент, а по совпадению гасим .
можно ли на мини подключить напрямую 7-ми сегментник на 4 цифры + пару кнопок и реализовать часы с коррекцией времени без ds-ок? если можно,то скетч и схему подключения киньте начинающему-просьба не пинать за нубство.
При подключени "без обвязки" и использования динамической индикации "посимвольно" (те зажигаем по очереди каждый символ целиком) получаем существенную разницу в яркости символов. Чем больше сегментов включено, тем меньше яркость. В итоге, скажем, цифра 8 получается существенно тусклее чем 1.
Что бы избежать такого эффекта, надо делать "посегментную" динамическую индикацию. То есть в каждый момент времени горит только один сегмент.
резисторы в обвязке будут
https://www.youtube.com/watch?v=F_ml0VGdDSk
типа такого только с кнопками и коррекцией хода,кнопки для управления настройкой времени
вместо светодиодного индикатора буду использовать низковольтные лампы-делал же так с pic16f628
набросай схемку как ты это вишь.
Чем больше сегментов включено, тем меньше яркость. В итоге, скажем, цифра 8 получается существенно тусклее чем 1.
В зависимости от кол-ва сегментов меняем длительность свечения.