Вывод информации на 4 разрядный 7сегментный индикатор при помощи двух 74hc595
- Войдите на сайт для отправки комментариев
Здравствуйте!
Для одного из проектов мне потребовались часы на 7 сегментном 4-х разрядном индикаторе и возможность подключить еще ряд внешних исполнительных устройств.
Вариант с LCD мне не подходит. То что находил в интернете не подходит, т.к. либо индикатором заняты все "ноги" Arduino, либо, при использовании 74hc595, регистр ставили на каждый разряд, что я считаю перерасходом микросхем.
В итоге решил делать на двух регистрах - один для генерации символов, другой для переключения разрядов.
После долгих часов оптимизации чужих скетчей у меня получился представленный ниже. В принципе код рабочий, но напрягает то что "засвечиваются" соседние разряды. В принципе жить с этим можно, но охота чтобы все разряды показывали четко те символы какие мне необходимы.
В данный момент вместо часов я подключил переменный резистор, для наглядности, а так же может кому и такое решение подойдет.
Вопрос у меня в следующем - Подскажите, пожалуйста что нужно переделать или добавить для корректного отображения символов.
/* ******************************************************************** Name : Arduino, 4-разрядный 7-сегментный индикатор и 74HC595 сдвиговый регистр Author : CheBuraw Date : 10 Feb, 2015 Modified: Version : 0.9 Это вариативная смесь уроков: 1. Tutorial: 74HC595 Shift Bit Register using a 7 Segment Display, ... http://www.youtube.com/watch?v=shcumKPTcTk shiftOutDisplay https://gist.github.com/benjjo/6559436 shiftOutAnalogueDisplay https://gist.github.com/benjjo/6559456 ShiftOut Reference: http://arduino.ru/Reference/ShiftOut ShiftOut Tutorial: http://arduino.ru/Reference/ShiftOut http://arduino.ru/Tutorial/registr_74HC595 2. Digital Clock with 7-segments LED and RTC (Realtime Clock) http://arduino-for-beginners.blogspot.ru/2010/12/digital-clock-with-7-se... ******************************************************************** 4-разрядный 7-сегментный индикатор 1 A F 2 3 B _______________|__|__|__|__|__|_____________ | | | | | | | A | A | | A | A | | F B | F B | dp | F B | F B | | G | G | | G | G | | E C | E C | dp | E C | E C | | D | D | | D | D | |_________|_________|____|_________|_________| | | | | | | E D dp C G 4 Соответствие отображаемого знака данным порта общий анод __________________________________________________ | двоичный вид по сегментам | | Цифра|dp | G | F | E | D | C | B | A | Десятичный | -----|---|---|---|---|---|---|---|---|------------| 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 192 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 249 | 2 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 164 | 3 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 176 | 4 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 153 | 5 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 146 | 6 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 130 | 7 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 248 | 8 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 128 | 9 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 144 | dp | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 127 | -----*---*---*---*---*---*---*---*---*------------* 74HC595 Map: _______ Q1 |1 * 16| Vcc PINS 1-7, 15 Q0 - Q7 Output Pins Q2 |2 15| Q0 PIN 8 GND Ground, Vss Q3 |3 14| DS PIN 9 Q7" Serial Out Q4 |4 13| OE PIN 10 MR Master Reclear, active low Q5 |5 12| ST_CP PIN 11 SH_CP Shift register clock pin Q6 |6 11| SH_CP PIN 12 ST_CP Storage register clock pin (latch pin) Q7 |7 10| MR PIN 13 OE Output enable, active low GND |8_____9| Q7" PIN 14 DS Serial data input PIN 16 Vcc Positive supply voltage _______ LED B -|1 * 16|-5V LED C -|2 15|-LED A LED D -|3 14|-PIN 11 LED E -|4 13|-GND LED F -|5 12|-PIN 8 LED G -|6 11|-PIN 12 ; 1uF TO GND LED dp-|7 10|-5V GND-|8_____9|-NILL */ int latchPin = 8; //Пин "защелки" первого регистра подключен к ST_CP входу первого регистра отвечающего за сегменты int latchPin2 = 9; //Пин "защелки" второго регистра подключен к ST_CP входу первого регистра отвечающего за разряды int clockPin = 12; //Пин подключен к SH_CP входу 74HC595 int dataPin = 11; //Пин подключен к DS входу 74HC595 int TimeLight = 5; //время для разогрева сегментов int sensorPin=A0; byte SegDisplay; // переменная для вывода символов на индикаторе byte RazrDisplay; // переменная для включения разрядов // Настройка комбинации для отображения каждого номера на дисплее. // Комбинация выбрана на основе таблицы отображаемого знака данным порта // Соответственно { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , dp, - } byte g_digits[12]={192,249,164,176,153,146,130,248,128,144,127,255}; //массив цифр, генерирующий из сегментов цифры byte g_registerArray[4]={1,2,4,8}; //массив цифр, указывающий разряды void setup() { // обозначаем все пины как выходы pinMode(latchPin, OUTPUT); pinMode(latchPin2, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { int disp = 0; //создаем переменную для вывода на экран int analogueValue = analogRead(sensorPin); // читаем аналоговый пин A0 analogueValue = map(analogueValue, 0, 1023, 0, 8888); //преобразуем диапазон с А0 (0-1023) в нужный нам (0-8888) disp = analogueValue; // записываем получившуюся после преобразования цифру в переменну для вывода на экран // Разбиваем цифру по разрядам индикатора if (disp < 10) // если наша цифра меньше 10, то { Razryad(3); Segment(11); // пишем в первый разряд прочерк Razryad(0); Segment(11); // пишем во второй разряд прочерк Razryad(1); Segment(11); // пишем в третий разряд прочерк Razryad(2); Segment(disp); // пишем в четвертый разряд нашу цифру } else if (disp < 100) // если наша цифра меньше 100, то { Razryad(3); Segment(11); // пишем в первый разряд прочерк Razryad(0); Segment(11); // пишем во второй разряд прочерк Razryad(1); Segment(disp / 10); // пишем в третий разряд - цифру делёную на 10 Razryad(2); Segment(disp % 10); // пишем в четвертый разряд цифру оставшуюся от деления на 10 /* Допустим наша цифра 25. Если мы ее поделим на 10, то у нас получится 2,5. Цифры после запятой, в данном случае, у нас не остаются. Таким образом мы имеем в третем разряде цифру 2. В чевертый разряд мы, как раз и записываем цифру-остаток полученную в результате деления. В нашем случае это и есть та самая 5. Аналогичным образом разбивается наша цифра и далее. */ } else if (disp < 1000) { Razryad(3); Segment(11); Razryad(0); Segment(disp / 100); Razryad(1); Segment((disp % 100) / 10); Razryad(2); Segment(disp % 10); } else { Razryad(3); Segment(disp / 1000); Razryad(0); Segment((disp % 1000) / 100); Razryad(1); Segment((disp % 100) / 10); Razryad(2); Segment(disp % 10); } } void Segment(int x) //функция для записи в 1 регистр информации для генерации символов { digitalWrite(latchPin, LOW); // устанавливаем синхронизацию "защелки" на LOW SegDisplay=g_digits[x]; // получаем цифру и выводим символ, из массива цифр, соответствующий этой цифре. shiftOut(dataPin, clockPin, MSBFIRST, SegDisplay); // Записываем информацию в регистр digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах } void Razryad(int r) //функция для записи во 2 регистр номера разряда индикатора { digitalWrite(latchPin2, LOW); // устанавливаем синхронизацию "защелки" на LOW RazrDisplay=g_registerArray[r]; // получаем цифру и выводим номер регистра, из массива цифр, соответствующий этой цифре. shiftOut(dataPin, clockPin, MSBFIRST, RazrDisplay); // Записываем информацию в регистр digitalWrite(latchPin2, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах delay(TimeLight); // пауза, чтобы сегменты "разгорелись" }
напрягает то что "засвечиваются" соседние разряды
Ну, а почему засвечиваются, выяснили?
Предлагаю, например, сэкономить ардуиноноги, и оставить только один выход Latch, на обе 595-е.
Заодно и засвечивание пропадёт, мне кажется.
напрягает то что "засвечиваются" соседние разряды
Ну, а почему засвечиваются, выяснили?
Предлагаю, например, сэкономить ардуиноноги, и оставить только один выход Latch, на обе 595-е.
Заодно и засвечивание пропадёт, мне кажется.
Я так думаю, что причина в функции отображения. Как-то не очень мне нравиться как она работает. Видел проекты в которых всё четко отображается, но вот в коде их я так разобраться и не смог :(. Поэтому, собственно и сюда решил написать, может кто подскажет правильный вариант.
Паралельное расположение сдвиговых регистров я оставил умышленно, т.к. мне показалось, что так код проще получается. Возможно заблуждаюсь. Идея в том чтобы в перспективе, при необходимости, можно было расширить еще на 4 разряда. Такая реализация мне проще показалась, да и так всего 4 ноги у Arduino занял.
Не знаю как сюда видео работы устройства выложить, поэтому залил на яндекс
https://yadi.sk/i/DYnnWiuTeb4jD
Да я же подсказал, осталось попробовать. :)
Проблема в том, что цифра на индикаторе меняется в один момент времени - в функции Segment(int x),
а номер разряда в другой момент - в функции Razryad(int r).
Чем эти моменты дальше друг от друга, тем больше рассинхронизация разряда и цифры, и соответственно заметнее засветка.
Можно попробовать изменить программу, чтобы строчки digitalWrite(latchPin, HIGH); и digitalWrite(latchPin2, HIGH); выполнялись подряд, и пауза между ними была как можно меньше.
Но в идеале, всё-таки советую оставить один latchPin, для достижения полной синхронности.
А увеличению разрядности это никак не помешает.
Паралельное расположение сдвиговых регистров я оставил умышленно, т.к. мне показалось, что так код проще получается.
Я, кстати, параллельное расположение менять не предлагаю. Оно ничем не мешает - пусть остаётся, если удобно.
Нужно только объединить у 595-ых сдвиговые входы, и подключить к одному выходу ардуины.
-------
Upd: Не сдвиговые конечно, а входы защёлкивания. Ошибся, извините - ночью советовал. :)
Стало интересно сколько и какие внешние устройства предполагается подключить помимо семисегментника.
Может стоит именно эти устройства подключить через сдвиговые регистры или взят I2C расширитель портов например PCF8574 и не мучаться со сдвиговыми регистрами.
А вообще вот мой код для работы с семисегментным индикатором напрямую без сдвиговых регистров но его не сложно модифицировать под регистры.
Стало интересно сколько и какие внешние устройства предполагается подключить помимо семисегментника.
согласен, логичнее именно другую переферию подключить на сдвиговые регистры (если применимо), потому как врядли другую переферию нужно так часто переключать как выводы для семисегментника при динамической индикации
в данном варианте вместо PCF8574 целесообразней поставить драйвер семисегментников типа max7219
Для семисегиентников есть прекрасный драйвер stled316.
в данном варианте вместо PCF8574 целесообразней поставить драйвер семисегментников типа max7219
О применении max7219 я думал, но не стал использовать по ряду причин:
1. Работают только с индикаторами с общим катодом, а у меня общий анод на всех имеющихся индикаторах :(
2. У нас в городе max7219 не купить, а заказывать с китая только партиями не менее 10 штук. Ради 3-4 проектов заказывать 10 микросхем не охота.
3. Для своих нужд посчитал кощунством использовать max7219. Если уж их грузить, то по полной :)
4. max7219 в 3 раза дороже 74hc595. 300 рублей (за 10 штук), конечно, не великие деньги, но тем не менее.
5. 74hc595 считаю более распространенным.
...хотя, касательно цены! В данной схеме используются две 74hc595, а значит разница уже не в 3 раза, а с учетом удобства работы с библиотекой для max7219, может оно и действительно вариант правильнее и проще ;). Но не для меня. Если бы не причина №1, то думаю сделалбы на max7219.
Драйвер stled316 и PCF8574 не стал использовать по тем же причинам - недоступность у нас в городе (думаю не только у меня) да и цена куда выше 74hc595.
Еще, просто хотелось понять как работать с 74hc595 :)
Стало интересно сколько и какие внешние устройства предполагается подключить помимо семисегментника.
На данный момент хочу повесить релюшки. Согласен, ими куда проще управлять через 74hc595, но я думал сделать некую универсальную схему, чтобы любой другой мог взять данный код и подключить другие устройства, необходимые именно ему.
Но в идеале, всё-таки советую оставить один latchPin, для достижения полной синхронности.
А увеличению разрядности это никак не помешает.
Datak, большое Вам спасибо! Подключил как Вы советовали. Немного модифицировал код и УРА - все работает четко, без засветов :).
Я до этого пренебрегал данным вариантом в силу незнания как разделить данные отправляемые в разные регистры. Думал что это как-то сложно. Но после Вашей рекомендации, решил таки более детально изучить данный вариант. Как оказалось что это не сложнее моего варианта ранее. Просто данные необходима передавать, так сказать, наоборот - с начала для последнего регистра, затем для предпоследнего и т.д.
Скорректированная схема:
Итоговый код:
А еще буду очень благодарен, если мне подскажут как информацию в спойлер прятать.
CheBuraw, рад что всё получилось.
Схема размытая, не видно, то ли там, о чём я писал, но судя по программе - да, кажется всё так.
Только лишний latchPin2 там почистить бы, чтобы с толку не сбивал. :)
А строки с 41 по 77 можно попробовать заменить на такие:
Должно работать, если я нигде не ошибся.
Datak, код почистил, latchPin2 убрал :) .
По поводу предложенного Вами кода. В моем исходнике фигурируют "Indicate(1, (disp % 1000) / 100);" в Вашем коде я не понял как реализуются такие моменты. Может я просто плохо понял, я еще новичек в програмировании.
Я тут собрал на основе данного скетча Вариант использования.
Arduino, 4-разрядный 7-сегментный индикатор, 74HC595 сдвиговый регистр, DS1307 RTC
я не понял как реализуются такие моменты
Реализуются до обидного просто.
Сначала выводится младший разряд числа - disp % 10,
а потом число делится на десять - disp /= 10 - и значит, младшим становится следующий разряд.
Индикатор 4-х разрядный, поэтому весь этот фокус повторяется в цикле 4 раза.
Дополнительная проверка, if в цикле, нужна для того чтобы не выводить нули перед старшим значащим разрядом. Вот тут я как раз немного сомневаюсь, но надеюсь что не ошибся. :)
Реализуются до обидного просто.
Сначала выводится младший разряд числа - disp % 10,
а потом число делится на десять - disp /= 10 - и значит, младшим становится следующий разряд.
Индикатор 4-х разрядный, поэтому весь этот фокус повторяется в цикле 4 раза.
Дополнительная проверка, if в цикле, нужна для того чтобы не выводить нули перед старшим значащим разрядом. Вот тут я как раз немного сомневаюсь, но надеюсь что не ошибся. :)
На индикаторе все показывается :). Круть!
..но есть один нюанс - разряды отображаются зеркально. Например сейчас 21:27, а показывается 72:12.
В принципе это не смертельно и можно поправить тут:
byte g_registerArray[4]={8,4,2,1}; //массив цифр, указывающий разряды
Крутил, вертел Ваш код, менял значения в цикле, но ничего толкового из этого так и не вышло :(
...но может Вы поправите это в Вашем варианте? (извините за наглость)
Индикатор 4-х разрядный, поэтому весь этот фокус повторяется в цикле 4 раза.
Правильно ли я понял, что если я задействую 8 разрядов, то мне необходимо будет заменить 4 на 8 в строке
?
..но есть один нюанс - разряды отображаются зеркально. Например сейчас 21:27, а показывается 72:12.
Ну, бывает, да, когда вслепую программы пишешь, без проверки. :)
В принципе это не смертельно и можно поправить тут:
byte g_registerArray[4]={8,4,2,1}; //массив цифр, указывающий разряды
Крутил, вертел Ваш код, менял значения в цикле, но ничего толкового из этого так и не вышло :(
...но может Вы поправите это в Вашем варианте? (извините за наглость)
Да кажется должно помочь, если g_registerArray написать в обратном порядке. Что, действительно не работает? Так сразу не соображу что-то.
Поправить наверно не трудно, но без проверки боюсь опять обману. Попробуйте лучше там, на месте починить. В конце концов, провода идущие на разряды можно перевоткнуть.
Если уж никак не получится - пишите, придумаем что-нибудь.
Правильно ли я понял, что если я задействую 8 разрядов, то мне необходимо будет заменить 4 на 8 в строке
?
Абсолютно правильно, задумано именно так. Только размер переменной disp придётся взять побольше - unsigned long - т.к. 8 разрядов в int не уместятся. И таблицу g_registerArray удлиннить, разумеется.
Ну и потом ещё отладить всё, если я опять где-то ошибся. :)
Нашел у себя ошибку в Arduino, 4-разрядный 7-сегментный индикатор, 74HC595 сдвиговый регистр, DS1307 RTC
Indicate(0, 11); ссылается на 12 символ (учитывая, что адрес первого символа - 0, а последнего - 11) в массиве данных, а там его нет :( поэтому отображаются все сегменты, а надо чтобы ничего не отображалось :).
Что бы всё отображалось надо поправить на Indicate(0, 10);
Исправленная, оптимизированная Datak`ом и проверенная версия кода:
Arduino, 4-разрядный 7-сегментный индикатор, 74HC595 сдвиговый регистр, DS1307 RTC
...но и тут есть небольшая недоработочка - в 0 часов будут показываться только минуты :).
Корректируется исправлением нашего пресловутого Indicate(0, 10); на Indicate(0, 0); и в этом случае до 10 утра часы будут отображаться в формате 00, 01, 02, ..., 09. Если не напрягает, то скетч готов к использованию. Ну а если кому надо будет, то, думаю, допилят. ...а может и сам как-нибудь попозже доделаю.
Корректируется исправлением нашего пресловутого Indicate(0, 10); на Indicate(0, 0); и в этом случае до 10 утра часы будут отображаться в формате 00, 01, 02, ..., 09.
Не, исправляется это тем, что условие if -- else в цикле вообще убирается, оставляется просто
Результат должен получиться тот же.
А если всё же хочется чтобы часы показывались без лишних нулей, можно условие поменять на такое:
Да! На сколько все просто, как оказывается, решается :).
А я уж пробовал внуть Вашего кода еще один if запихать, но ничего путёвого из этого не получилось.
Добрый день, спасибо за код!
Все собрал, но как выяснилось у меня общий катод, подскажите новичку что нужно изменить в коде или в схеме подключения.
Щас нет возможности проверить, но если инвертировать эти значения то поможет ?
Sirox, грубо говоря, Вам необходимо все нули поменять на единички, а единички на нули.
Поясню смысл указанного Вами фрагмента кода.
Символ "B" говорит что представленное число в бинарном формате.
Далее следуют команды для зажигания сегментов индикатора - "dpGFEDCBA". Для отображения цифры 5 нам необходимо подать питание или "единички" (для индикаторов с общим катодом) на сегменты A,F,G,C,D или если написать их в алфавитном порядке A,C,D,F,G. Остальные сегменты мы оставляем "обесточенными" то есть пишем в них "нули".
Таким образом заполняем наш шаблон:
B - Говорим что число бинарное
dp - Зажигаем точку, значит ставим 1
G - Зажигаем этот сегмент, значит ставим 1
F - Зажигаем этот сегмент, значит ставим 1
E - Этот сегмент не должен гореть, значит ставим 0
D - Зажигаем этот сегмент, значит ставим 1
C - Зажигаем этот сегмент, значит ставим 1
B - Этот сегмент не должен гореть, значит ставим 0
A - Зажигаем этот сегмент, значит ставим 1
В итоге имеем следующий код для цифры 5 - B11101101 (для индикаторов с общим катодом)
_________
| |
| A |
| F B |
| G |
| E C |
| D |
|_________|
Остальные цифры давайте сами ;) !
Если не получиться, то пишите.
Не выходит, и так и пробовал и эдак, даташит моего индикатора http://zip-2002.ru/z_pdf/kem-5461agr-1.pdf / Предпологаю что порядок сегментов у меня другой, поэтому такая абра кадабра выводится.
а если просто инвертировать значение? для сегментов и для общего анода или катода
а лучше добавить переменную типа boolean которой задаешь общий катор иди анод
что такое shiftOut. цикл от 0 до 8 (или наоборот) и перебор битов с дерганьем clock.
можно залезть в файлы, и найти что делает конктено shiftOut, переделать, добавить инверсию или доп. параметр boolean через & и радоваться жизни
да и незачем делать такое
если умеешь выводить цифрц в нужном месте, и разбивать число по разрядам
а то получается собираем число сотни и тысячи + десятки и еденицы, а потом снова разделяем
Sirox, посмотрите повнимательнее, может где соединили не так. У меня такое было :). Долго мучался, потом нашел и все запустилось. Порой даже проще все провода повыдё1ргивать и заново подключить.
Ноги Вашего индикатора, судя по представленному даташиту, полностью совпадают с моим индикатором. Так что тут все должно быть нормально.
Пока еще не разобрал свою схему, залил Ваш скетч. Все нормально работает.
jeka_tm, из всех найденных мною вариантов, только этот мне показался понятным, поэтому я и сделал по этому принципу.
Буду Вам очень признателен, да думаю и не я один, если Вы покажете Ваше решение вывода цифр в заданном разряде. Если Ваш код будет короче и понятнее, то буду использовать его ;) !
Спасибо за отзывчивость ! Проверял уже раза 3, буду ковыряться дальше, приносит это дело удовольствие мне )
я этот вариант предлагал так как ТС мог выводить число, но не умел похоже выводить отдельную цифру в нужном разряде
вот посмотри код. может наведет на мысли переделать
переменная anod кстати задает общий анод или катод подключен
Sirox, дело это интересное, и представленный мною скетч, для кого-то, сущая фигня, но для меня он такой выстраданный :). Недели две сидел вникал в работу регистров и собирал этот код из других кусочков :).
Вы отключите катоды индикатора от второго регистра и поочерёдно их подключите к минусу. Посмотрите что будет. Должно на тех что подключены отображаться какое-то число.
Если вновь ничего не получиться, то попробуйте для начала с одним регистром 74HC595 например такой скетч:
Я с него начинал :). Только тут надо еще переменный резистор подключить к A0, выше есть схема подключения. В скетче есть ссылка на ролик ютубовкий, он на английском, но, даже если Вы им и не владеете, то думаю в общих чертах поймете о чем речь идет.
jeka_tm, правильно ли я понимаю что предложенный Вами код это фрагмент какого-то большого кода? Вы его выкладывали куда-нибудь? Можно ли его целиком посмотреть? Просто судя по незакрытой скобке функции void F_Seg там должен быть еще код.
Если Вам не трудно, можете прокомментировать, для таких бестолковых как я, смысл каждой строки в представленном Вами фрагменте.
да весь смысла нет
функция dWrite это урезанная digitalWrite и делает тоже самое, ну почти. шим не отрубает на выходе
jeka_tm, правильно ли я понял, что этот код некая альтернатива shiftOut? Или тут есть и средство разбиения цифр на разряды, т.е. записи каждой цифры в нужный разряд?
это не альтернатива. это код для управления индикатором без 74HC595. а точнее 1 цифрой просто ногодрыганьем
короче это долго. если работает оставь как есть
Sirox, инвертировать нужно не только массив g_digits, но и g_registerArray тоже.
В остальном - всё так же, по-моему. Должно работать.
А каким образом? 1,2,4,8 делал, не получается. Может цифры другие должны быть?
Одна голова хорошо, а две лучше, спасибо все заработало!
Доброго дня, дисплей я планирую приспособить для авто по типу (без верхней шкалы)
Есть проблемы по выводу дробных и отрицательных чисел , а также по избавлению от delay
Вот код для вывода temp, цифры моргают, как правильно использовать millis или библиотеку которая это просто сделает?
По дробным и отрицательным нашол код по преобразованию , но там напрямую без регистров подключено, как совместить?
по millis():
unsigned long a; Объявили переменную
if (a<=millis()) {Выполнили; a=millis()+5000;} Проверили, произвели действия, обновили значение задержки (5 секунд)
Все.
Sirox, delay в обоих схемах используется для свечения сегментов. Сама по себе задержка минимальна и я думаю что она сильно не должна мешать. Как я понимаю delay не всегда плохо и порой без него сложно (но задействуя разные прерывания, можно) обойтись. Ну это мое ламерское заключение :).
По поводу предложенного Вами кода. А можете его целиком и под спойлер выложить, или ссылочку на него дать? Думаю я смогу их "объединить", ну или по крайней мере попробую :). Самому интересно себя проверить.
Для свечения сегментов - нет претензий, у меня там есть еще один который дает задержку при опросе датчика. А код, это был весь, ссылка вот http://nextable.ru/144-4-razryadnyy-7-segmentnyy-indikator-i-arduino.html. было б замечательно если получится.
Спасибо! Бубду пробывать
CheBuraw, привет!
Есть какие нибудь успехи по числам ?
Sirox, Извините, но пока порадовать не чем :(. Все попытки успехом не увенчались. Я, ведь тоже, програмист тот еще :) сам ардуиной и програмерством в целом где-то полгода занимаюсь. Буду продолжать попытки. Я думаю Datak бы Вам помог, он мне вон сколько конструктивных советов давал, да и Вам тоже помочь успел.
Да я отвлёкся как-то, извините. К тому же, думаю, вдруг там у вас спортивный интерес, или азарт какой-нибудь - а тут я со своими советами. :)
Вывод цифр там происходит в строках 41...55. Для начала можно просто заменить их на вызов нашей Indicate( i, temp ), но придётся добавить дополнительные проверки для вывода точки и минуса, и незначащие нули у них гасятся немного по-другому... так что проще получится своё написать. :)
Для начала разбираемся с минусом:
В таблицу g_digits, разумеется, надо добавить ещё одно значение - для вывода знака "минус". Попробуйте, должно работать.
Останется добавить "точку" для дробных чисел, и ещё, желательно, проверку на переполнение. Но не сейчас, попозже, ладно?
Спасибо огромное! Вечером буду пробывать, да конечно подождем
Подскажите пожалуйста, купил вот такой вот шилд. http://www.aliexpress.com/snapshot/6494994863.html?orderId=65798713751283
Не могу понять как правильно подключить на 8 11 и 12 входы андруино что куда.
QH; RCLK; SCLK - на шилде, и
DS; ST_CP; SH_CP - в данной теме.
Что куда чтобы ничего не спалить?
Nemo, я думаю спалить Вам там ничего не удастся, если правильно подключите GND и VCC. А вот остальные пины я бы советовал Вам прозвонить тестером, на какие ноги регистров они разведены. Нам нужны 11, 12 и 14 ножки регистров.
Описание у продавца данного шильдика крайне непонятное :). Если подключить получиться. то решение очень компактное. Мне же вон что нагородить пришлось :)

Вот нашел схему подключения Вашего шилда на каком-то китайском сайте, немного погуглив :).

Судя по ней на данном шилде с одной стороны выходы именуются SCLK, RCLK и DIO , что для нашего подключения значит SH_CP, ST_CP и DS соответственно. Я так думаю что именно на этих контактах и распаены контакты для подключения на данном шилде.
Еще я обратил внимание, что тут к первому регистру подключены разряды, а ко второму сегменты. Таким образом для работы с нашим скетчем Вам потребуется поменять очередность регистров в функции Indicate. Ниже уже подкорретированный для Вас вариант.
CheBuraw Большое спасибо. По коду сам допетрил. Все подключил, индикация работает. Девайсик действительно компактный получился.
Правильный ответ на мой вопрос, который задан постом выше такой:
RCLK - это защелка (SS, STcp); SCLK - тактовый (CLK, SHcp); а QH - остается пин данных (SDI, DS)
(Люди на соседнем ресурсе подсказали.)
Теперь вот ломаю голову как отобразить числа с плавающей точкой. Например "-3.75"
Собираю термометр на ds18b20. По индикации с минусом - получилось. К стати, по поводу минуса: как переделать цыкл for на минус так и не допетрил. Пришлось идти более длинным путем. А если брать модуль числа и после вывода подставлять минус вперед, то мерцение всех цыфр получается не здоровое. Теперь у меня в коде по if проверяется число на минус, затем через if выводится минусовое значение, а ниже в случае положительного значения - выводится через for. Может кому сгодиться.
А вот с точкой - пока ваяю.
Ну как то так:
в строке №30 можно менять значение на любый цифры, и смотреть что получается на индикаторе. Обрабатывается диапазон значений от -99,99 до +999 градусов цельсия с сотыми долями.
Прикрутить реальный датчик температуры ds18b20 думаю сможете сами. Это уже дело техники.
Осталось все это великолепие записать как библиотеку, так как в дальнейшем планирую успользовать в одном проекте несколько датчиков и несколько индикаторов. (Улица, дом, телица, аквариум, и т.д.) Не пропадать же выходам Arduino !
Отличная работа, благодарствую! У тебя с датчиком получилось? А то при опросе датчика задержка которая мешает (мерцают цифры)
Отличная работа, благодарствую! У тебя с датчиком получилось? А то при опросе датчика задержка которая мешает (мерцают цифры)
Спсибо. Сейчас кумекаю как эту красоту в функцию запихнуть. У меня будет датчик не один. С датчиком поке не пробовал. Привинчу - отпишусь.
К стати: переменные TimeLight, SegDisplay, RazrDisplay можно объявлять непосредственно в самой функции Indicate. Я их туда перенес.
И еще: баг какой то. Если поставить температуру 36,6 - показывает 36,59 Где то арифметика с округлениями шалит наверное. Но погрешность в 1 сотую думаю не критично.
p/s/ а как код свернуть, чтобы страницу не раздувать?
4 дисплея сразу это сильно) Можно проще - выводить на одном по кнопке или по интервалу, чтобы различать датчики можно докупить одноразрядный индикатор и поставить рядом, на котом будет меняться символ или цифра обозначающая тот или иной датчик.