сигментный дисплей вывод числа помогите

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

я новичек

есть ардуино и 8 разрядный 7 сигментный экран

подлючил - демо выводит

в ручную разобрался как выводит по 1 символу в нужный сигмент

но столкнулся с вроде бы простым, но для меня сложным моментом

как вывести большое число разом???

скажем есть d = 81726354

ну никак не могу понять как передать его экрану чтобы оно отобразилось....

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

а да, забыл - подключил через "LedControl.h"

sadman41
Онлайн
Зарегистрирован: 19.10.2016

А вы что больше любите - математику или литературу?

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

???

при чем тут это?

или вы знаете готовую библиотеку которая делает то, что мне надо?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Я знаю два способа, которыми вы можете это сделать - математический и филологический. 

Хотя, может и библиотеки есть. За ними в гугл.

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

гугл уже 2й день ничего толком не дает - всё сводится к матрицам 8*8, но они мне не нужны

какой математический вы знаете?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Математический - разбить число на разряды. Последовательным делением на 10^N...10^0, например. При этом вы получаете цифирь, которую можете вывести на соответсвующую позицию индикатора.

UPD Или вот, например:
https://stackoverflow.com/questions/9994742/want-to-convert-integer-to-s...

ищите void getDecStr(..)

Если в цикле не будете делать + '0', то в переменной, которую будете использовать вместо str[len-iпоследовательно получите цифири, которые останется закинуть последовательно в позиции индикатора.

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

это выходит посимвольно

void getDecStr (uint8_t* str, uint8_t len, uint32_t val)
{
  uint8_t i;

  for(i=1; i<=len; i++)
  {
    str[len-i] = (uint8_t) ((val % 10UL) + '0');
    val/=10;
  }

  str[i-1] = '\0';
}

но   str[i-1] = '\0'; ведь конец строви вроде? - он выходит мне не нужен

и еще, как быть с точкой? 87654.321 например? тут же точка пропадет....

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Про точку речь не шла.

В таком случае вам проще на данный момент пойти филологическим путем: создать массив char, скормить его вместе с числом функции dtostrf(), получить в массиве ASCII-коды цифирей. Потом бежите по нему с начала (в цикле) поячеечно и вычитаете '0' (символ) из значения ячейки, если там не '-' и не '.'. Ну и запихиваете полученное значение тудыть, в свой индикатор. Номер ячейки, положим, равен индексу текущей ячейки.

UPD. В вашей библиотеке, оказывается, можно прямо char совать на вход setChar(), так что даже не надо вычитать. Просто бежать и вызывать эту функцию с текущим символом из ячейки массива.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

ELITE пишет:

гугл уже 2й день ничего толком не дает - всё сводится к матрицам 8*8, но они мне не нужны

какой математический вы знаете?

 

Если надо - завтра могу скинуть готовый проект часы /барометр /термометр + уличный градусник

http://arduino.ru/forum/programmirovanie/attiny13a-101-primenenie?page=2...

b707
Offline
Зарегистрирован: 26.05.2017

andycat пишет:

Если надо - завтра могу скинуть готовый проект часы /барометр /термометр + уличный градусник

http://arduino.ru/forum/programmirovanie/attiny13a-101-primenenie?page=2...

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

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

я Си знаю плохо очень

я тут подумал немного еще, и из знаний бейскика/паскали/js делалбы так

а можно ли просто число перевести с строку както быстро типа
string str = IntToStr(8765.3210)

сделать массив бийтов всех знаков 
buty b[] ={В00000000 /*0*/, В00000010 /*1*/,.... В00001001 /*9*/, точка хз как ..}

а дальше просто сопоставление циклом собирать массив данных
buty data[]

for i=0 i==eof(str) {str[i]!="."?data[]=b[str[i]]?data[]=b[точка]}

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

но вот как это правильно на языке ардуино написать, я чтото не понимаю... функций нет никаких, преобразований тоже.... :(

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

"язык ардуино" - это С++, всё там есть, просто кому-то лень читать :)

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

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

но у меня нет известного числа - надо вывести от -2^16 до +2^16 с плавующей точкой

//и да, С++ для меня, как учившегося на бейсике с паскалем - не логичен и непонятен, уже лет 5 не дается никак дальше простейших самых действий :(

и дело не в лени - я вначале первые 2 десятка страниц гугла/яндеккса изучаю, и только потом на форуме спрашиваю, если ничего не выходит

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

С арифметикой у вас как? Если я вам задам вопрос, сколько в числе 1234 тысяч, сотен, десятков, единиц - вы мне ответите? Вот вам и алгоритм.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

ELITE пишет:

но вот как это правильно на языке ардуино написать, я чтото не понимаю... функций нет никаких, преобразований тоже.... :(

В #8 я уже вам все расписал (с функциями).