Прошу помощи со скетчем часов.
- Войдите на сайт для отправки комментариев
Доброго времени суток всем.
Делаю часы на редких 8-и сегментных индикаторах (марсианская восьмерка)
Поскольку индикаторы работают только в статике, было принято решение использовать сдвиговые регистры 74HC595.
Регистры подключены каскадом.
Прицепил к ардуине RTC 1302 (знаю, что не лучший вариант, но она была под рукой) повесил ее на пины 5,6,7.
Испытал - работает.
Теперь встала задача вывести время на индикаторы.... и вот тут получилась загвоздка.
написал вот такой скетч:
/* используем 8-и сегментные индикаторы ИЭЛ 0-VI */ #include <iarduino_RTC.h> // Подключаем библиотеку iarduino_RTC для работы с модулями реального времени. iarduino_RTC time(RTC_DS1302, 5, 6, 7); // Объявляем объект time для работы с RTC модулем на базе чипа DS1302, указывая выводы Arduino подключённые к выводам модуля RST, CLK, DAT // iarduino_RTC time(RTC_DS1307); // Объявляем объект time для работы с RTC модулем на базе чипа DS1307, используется аппаратная шина I2C // iarduino_RTC time(RTC_DS3231); // Объявляем объект time для работы с RTC модулем на базе чипа DS3231, используется аппаратная шина I2C int latchpin = 2; // connect to pin 2 on the '595 ST_CP int clockpin = 3; // connect to pin 3 on the '595 SH_CP int datapin = 4; // connect to pin 4 on the '595 DS // Пишем карту сегментов индикатора в двоичном формате int segdisp[10] = { 0b00001111, 0b00000010, 0b01100101, 0b10100101, 0b01001100, 0b10101001, 0b10110011, 0b10000110, 0b10101111, 0b11101100 }; void setup() { delay(300); // Ждем готовности модуля отвечать на запросы time.begin(); // Инициируем работу с модулем. pinMode(latchpin, OUTPUT); // Пин ST_CP как выход. pinMode(clockpin, OUTPUT); // Пин SН_CP как выход. pinMode(datapin, OUTPUT); // Пин DS как выход. } void loop() { time.gettime(); int s1 = time.seconds; // объявили переменную s1 как единицы секунд int s10 = (time.seconds%10); // объявили переменную s10 как десятки секунд int m1 = time.minutes; // объявили переменную m1 как единицы минут int m10 = (time.minutes%10); // объявили переменную m10 как десятки минут int h1 = time.Hours; // объявили переменную h1 как единицы часов int h10 = (time.Hours%10); // объявили переменную h10 как десятки часов digitalWrite(latchpin, LOW); shiftOut(datapin, clockpin, MSBFIRST, segdisp[s1]); // выводим на первый регистр единицы секунд shiftOut(datapin, clockpin, MSBFIRST, segdisp[s10]); // выводим на второй регистр десятки секунд shiftOut(datapin, clockpin, LSBFIRST, segdisp[m1]); // выводим на третий регистр единицы минут shiftOut(datapin, clockpin, LSBFIRST, segdisp[m10]); // выводим на четвертый регистр десятки минут shiftOut(datapin, clockpin, LSBFIRST, segdisp[h1]); // выводим на пятый регистр единицы часов shiftOut(datapin, clockpin, LSBFIRST, segdisp[h10]); // выводим на шестой регистр десятки часов digitalWrite(latchpin, HIGH); delay (1000); }
В итоге ОНО тикает, но куда то не туда.
Сегменты переключаются хаотично, на всех индикаторах сразу.
Прошу помощи.
Не могу понять, где накосячил.
P.S.
Со сдвиговыми дело имею первый раз. Тапками прошу не бить.
P.P.S.
Если есть у кого скетч готовых часов со статикой, поделитесь пожалуйста.
А это нормально, что у вас часть цифер выводится с MSBFIRST, а другая с LSBFIRST?
Ой, забыл поправить.
Это я экспериментировал.
Я для теста 2 регистра использую (только секунды) и на них пробую.
Остальные строки были закомментированы.
А тут решил выложить полный скетч и раскомментировал все.
Но секунды-то нормально отображаются?
Или если просто известные числа вытолкнуть на все индикаторы - типа segdisp[5] - тогда как?
Вот такой код.
И он не работает.
Как то так :((
не выводит нормально. обозначил вывод на 1 индикатор цифры 5, на второй - цифры 6.
Теперь горит только ведущий (к которому от ардуины DS приходит), и то не в соответствии с битами.
Зажглось только 2 сегмента.
Значит часы непричем. Засылайте туда shiftout-ом 0b11111111 - должны все сегменты загореться. Если нет - что-то напутано в проводах. Например - клок и дата перепутаны местами.
Надо схему проверять. А если в карте сегментов все 1 поставить у какой-нибудь цифры и вывести её - что гореть будет?
И кстати по скетчу, s1 это не единицы секунд (соответственно и m1, h1). Единицы это как раз s10. А сейчас Вы за пределы массива обращаетесь.
Должно быть
А это нормально, что у вас часть цифер выводится с MSBFIRST, а другая с LSBFIRST?
Нормально! В войну, как ивестно, синус до пяти доходил, а Вы тут с глупостЯми лезете!
Всё сейчас ещё раз проверил.
Буду думать над схемой управления индикаторами.
Похоже, что у меня симмисторы с оптронами не выдержали.
Сейчас горят все сегменты, независимо от того, подключены сдвиговые к ардуине или нет.
Скетч буду проверять на светодиодах. Дома как раз тестовая плата с 6-ю сдвиговыми и 48 диодами лежит.
Всем большущее спасибо за ответы.
Вернусь к теме, когда деталями закуплюсь. (на днях)
Программа завелась с полоборота. Я уже начал было грешить на аппаратные проблемы, но как оказалось, мои расчеты были верны.
Не знаю, насколько я корректно дописал в программу строки про SPI, Wire и Serial, но все получилось и затикало туда, куда надо и как надо.
Теперь буду дописывать в скетч кнопки.
Не хочу заморачиваться и делать меню, а сделаю просто кучу кнопок подсоединенных к аналоговым пинам. (корпус будет большой... места на панели много)
Будет:
Установка минут,
Установка часов,
Установка числа,
Установка месяца,
Установка года,
Установка дня недели.
сейчас скетч выглядит таким образом:
Теперь немного фоток, ради чего все это делается:
Это индикаторы ИЭЛ:
Они же
Он же, пойдет на день недели
Вот так один из них светится:
И еще раз: (он зеленый, другие цвета есть, но они очень редкие)
Отреставрировал вольтметр с амперметром. У них теперь черный матовый корпус, золотистая зеркальная шкала и еле заметная зеленая подсветка:
И еще раз они же:
Вот как то так :))
Ух ты! У меня где-то один похожий электролюминесцентный индикатор лежит на память. Надеюсь, кнопки тоже винтажные будут? Успехов!
И про блинк без делей почитайте. А то фигово будут кнопки нажиматься.
Теперь буду дописывать в скетч кнопки.
Не хочу заморачиваться и делать меню, а сделаю просто кучу кнопок подсоединенных к аналоговым пинам. (корпус будет большой... места на панели много)
Можно теперь даже немношко поискать и найти схему как много кнопок можно подключить к ОДНОМУ аналоговому пину, чтоб не нарушать бизабразия.
Может сразу ПТК туда прикрутить и пассатижи рядом на цепь привесить...
SPI там вообще ни в какую красную армию. Оно, конечно, инклюдится, но не используется. Wire, вроде тоже не задевает ничего - квадратной шины в 1302 же нет?
Будет:
Установка минут,
Установка часов,
Установка числа,
Установка месяца,
Установка года,
Установка дня недели.
А ничего, что для текущей даты (число/месяц/год) день недели не допускает вариантов?
Или Вы решили создать собственный календарь?
Предусмотрите тогда установки количества дней в неделе, в году и в каждом из месяцев.
Будет:
Установка минут,
Установка часов,
Установка числа,
Установка месяца,
Установка года,
Установка дня недели.
И ограбление корованов!
А ничего, что для текущей даты (число/месяц/год) день недели не допускает вариантов?
Почему же не допускает?
Ещё классик писал: "Большинством голсов решили, что сегодня среда, а был понедельник". Демократия-с!
Прикрутил точки между индикаторами (работают) и попытался воткнуть кнопки (коррекцию дня недели убрал :) - разогнался малость с кнопками...)
Вот только кнопки не хотят работать..
Ткните плиз носом (ежели не трудно), где косяк.
Заранее спс.
olegovich80.Вы наверно обидетесь, но главный косяк это тот кто такой скетч написал. А использование delay(100); следствие. И в результате что пишем то и получаем.
Так расскажите, как они не хотят. Думаете, что легко по виду скетча угадать, что как глючит?
Квон сейчас вам классы приложит ко лбу и всё пройдет (но это не точно).
И старайтесь избегать имен переменных типа a1, A1 и т.д. Забудетесь - напишите с прописной, да начнете ошибки искать там, где их нет.
какие тут классы, тут трепанацию надо проводить.
146
if
(a == HIGH){
147
for
(a1=0; a1 <= 59; a1++){
148
time.blinktime(2, 4);
// мигаем минутами
149
time.settime(-1, a1, -1, -1, -1, -1, -1);
// пишем минуты в RTC
150
delay(100);
// ждем 0,1 секунду
151
}
152
}
Вот что будет если a будет HIGH . Код войдет в штопор(зачеркнуто ) в цикл 60 раз выполнит delay (100) итого 6 секунд будет в тормозе.
Я так понимаю delay надо вынести за рамки for? правильно?
P.S. кнопки в данный момент не работают вообще. время в RTC не корректируется.
P.P.S. А в чем косяк всего скетча? мне нужна статика на всех индикаторах. (в динамике они в принципе не работают) Нужна гора отдельных индикаторов. (их в итоге 19 будет).
Знаний вам не хватает. И их я не буду выкладывать индивидуально для вас.
olegovich80,
ну что Вы творите? Ну, вот смотрите сами
Строки 138 и 146
В строке 138 Вы используете "a" как номер пина, а в 146 Вы ту же самую "a" используете как некое значение, которое сравниваете с HIGH. Вы уж определитесь, если она номер пина, то нахрена её с HIGH сравнивать, а если она - значение, так зачем её в качестве номера пина использовать.
То же самое касается многих других переменных, см. сами.
Такие ошибки появляются от лени. Ну, как нахрен "a"? Переменная должна называться примерно pinZelenoyKnopki, понимаете? Если все переменные будут называться осмысленно - то их труднее перепутать, а так как у Вас ....
Владимира Владимировича читали?
Если тебе корова имя,
У тебя должно быть молоко и вымя!
А если нет ни молока, ни вымени,
То чёрта ль в твоём коровьем имени?
Вот так надо переменные называть!
Принято. Будем исправляться.
Я так понимаю delay надо вынести за рамки for? правильно?
Неправильно. От него надо избавиться. Совсем. Я же выше написал, что плохо кнопкам будет. Смотрите в примерах blink without delay. Или прямо тут: Мигаем светодиодом без delay() Да и на форуме куча тем про это.
Решил разместить фотки того, что получается.
Воткнул всё в корпус.
Жду от наших друзей из поднебесной посылку с оптореле. Приедет, выложу фотку с работающими индикаторами.
Брутально! А вот эти приборы по бокам (вотльтметры?) - неужели они в аналоговом режиме показывают месяц и день недели? Только не говорите, что "да", а то я от зависти умру! Ну, очень брутально выглядит. Такое суровое ретро! Блеск!
Нет, они просто для красоты. Показывают напряжение на контроллере и ток на индикаторах. Подсвечены зелёным неоном в цвет индикаторов.
А зря, аналоговые индикаторы должны показывать год и столетие. И надпись должна быть very powerful time machine
А зря, аналоговые индикаторы должны показывать год и столетие. И надпись должна быть very powerful time machine
аналоговые индикаторы должны показывать дату апокалипсиса
Лучше бы они что-то связанное со временем показывали - реально круто, подумайте!
Если реально решите делать, могу подарить Вам скетч (и схемотехнику) для дня недели. Т.е. Вы аккуратно вытаскиваете циферблат, заменяете его на свой, разрисованный на 7 секторов (от стрелки и расширяющиеся вверх, как солнечные лучи), а я подскажу как соединить и как скетч написать, чтобы стрелка всегда находилась в нужном дне недели, причём двигалась постоянно, т.е. по ней можно и время приблизительно прикинуть)..
Можно еще "зеленый глаз" из лампового приемника присобачить. Пусть показывает... Фазу луны, во.
Можно еще "зеленый глаз" из лампового приемника присобачить.
Где б его ещё взять? А то можно было бы и присобачить.
Я так понимаю, что вывод можно осуществить при помощи analogWrite. Правильно? Идея интересная, но сейчас, к сожалению, нет пока времени ей заняться. На работе завал, который продолжится до начала лета. А насчет зеленого глаза - не проблема. Не сочтите за рекламу, я иногда закупаюсь в ретрорадиодетали и в тех орге. Там много, чего интересного есть.
я иногда закупаюсь в ретрорадиодетали и в тех орге. Там много, чего интересного есть.
Пожалуйста, ссылочки!
А то я попробовал http://tech.org/ - не то :(
Вот.
http://retro-detal.ru/
и еще
http://tec.org.ru/
Хрена се - 6Е5С - 2 т.р. на ретро-детали! Да они ухи нажрались! На том же техорге она за 500!
Я так думаю, если порыскать по авитоподобным сайтам то можно на переферии найти за копейки. Я недавно ИВ-27 в количестве купил за 200 рублей. ИН-ки всякие по 50 - 100 собираю по всей России. Ну и всякое такое. ИЭЛы из Тулы заказываю.
Очень хочу матрицу точек цветную электролюминисцентную 50-х годов. Но видел такую всего раз в жизни и стоила она 1500 долл. Я на такие жертвы еще не готов. :))
Часики в работе.
https://youtu.be/x3qla2TdIfE
И немного фото
Вот как то так пока.
Если появится время, буду дописывать эффекты индикации, температуру, дату и другие подобные плюшки.
Молодец, что до готового изделия всё довели! Чуть-чуть критики. По-моему, зря Вы индикаторы внутрь утопили. На первом фото, где они крупно, видны дефекты вырезания отверстий. Хотя, изделие крупное, смотреть будут издали, мелочи наверное и не видно будет. Казалось бы, ну чего хорошего во всём этом старье? А притягивает! Сам при случае подбираю разные приборчики/индикаторы, может дойдут руки сделать чего-нибудь.
Спасибо за похвалу.
У меня 2 панельки передних. Одна действительно с косяками, с ней и решил собирать экспериментальный образец. (мало ли испорчу). На второй панели дефектов нет. Я буду с ней собирать такие же, но корпус будет сделан качественнее. Подсветку приборов переделаю на EL, сделаю заднюю панель с кнопочками. Но это всё позже. Сейчас просто рад, что они заработали.
P.S. Идей с этими индикаторами еще много. На примере этих часов - проверю их на выживаемость. Если долго проживут, буду с ними дальше баловаться, если же нет, то буду индикаторы сам делать из EL бумаги.
Мне их "марсианская" восьмерка нравится :)