простейшие часы на ардуино уно с индикацией на унивесальном шилде (Multi-function Shield)
- Войдите на сайт для отправки комментариев
#include // подключение библиотеки таймера,библиотеку надо скачать в ардуино с интернета const int SER=8;//контакт для подключения вывода SER (DATA) const int LATCH=4;//контакт для подключения вывода LATCН const int CLK=7;//контакт для подключения вывода CLK const int LED=13; // константа LED типа int, выводит сигнал на 13 pin плат int S=0;// секунды int M=0;// минуты int Md=0;// десятки минут int H=0;//часы int Hd=0;// десятки часов int S1=0;// секунды int M1=0;// минуты int Md1=0;// десятки минут int H1=0;//часы int Hd1=0;// десятки часов const int Hk=15;//вывод для кнопки установки часов +1 const int Mk=16;//вывод для кнопки установки минут +1 void setup() { // put your setup code here, to run once: // put your setup code here, to run once: pinMode (LED, OUTPUT); // выход платы присвоенный переменной LED является выходом Timer1.initialize(1000000); // Значение для переполнения таймера 1000000 мкс (1 сек) Timer1.attachInterrupt(blinky); //Выполнять blinky () при переполнении pinMode (SER, OUTPUT);//вывод SER ВЫХОД pinMode (LATCH, OUTPUT);//вывод LATCН ВЫХОД pinMode (CLK, OUTPUT);// вывод CLK ВЫХОД pinMode (Hk, INPUT);//вывод Hk ВХОД pinMode (Mk, INPUT);//вывод Мk ВХОД } void loop(){ // put your main code here, to run repeatedly: digitalWrite(LATCH, LOW); shiftOut(SER,CLK,MSBFIRST,M1); //вывод минут shiftOut(SER,CLK,MSBFIRST,B11111000);//вывод знака 4 в семи сегментном индикатоеpе посpедством гашения первых 3 digitalWrite(LATCH, HIGH); digitalWrite(LATCH, LOW); shiftOut(SER,CLK,MSBFIRST,Md1); //вывод десятков минут shiftOut(SER,CLK,MSBFIRST,B11110100);//вывод знака 3 в семи сегментном индикатоеpе посpедством гашения первых 2 и 4 digitalWrite(LATCH, HIGH); digitalWrite(LATCH, LOW); shiftOut(SER,CLK,MSBFIRST,H1); //вывод часов shiftOut(SER,CLK,MSBFIRST,B11110010);//вывод знака 2 в семи сегментном индикатоеpе посpедством гашения первого и 3 с 4 digitalWrite(LATCH, HIGH); digitalWrite(LATCH, LOW); shiftOut(SER,CLK,MSBFIRST,Hd1); //вывод десятков часов shiftOut(SER,CLK,MSBFIRST,B11110001);//вывод знака 1 в семи сегментном индикатоеpе посpедством гашения 2,3,4 digitalWrite(LATCH, HIGH); } void blinky() { digitalWrite(LED, !digitalRead(LED)); //изменить состояние светодиода на выходе 13 (LED) S=S+1;//к пеpеменной S+1 if(S==60)//если секунды дошли до 60 то к минутам +1 { M=M+1; S=0; } if(M==60)//если минуты дошли до 60 то к часам +1 { H=H+1; M=0; } if(H==24)//если часы дошли до 24 то обнулить часы { H=0; } if(M==0)//если минуты =0 то выводить коды для зажигания 00 на индикатоах и т.д. { M1=192; Md1=192; } if(M==1) { M1=249; } if(M==2) { M1=164; } if(M==3) { M1=176; } if(M==4) { M1=153; } if(M==5) { M1=146; } if(M==6) { M1=130; } if(M==7) { M1=248; } if(M==8) { M1=128; } if(M==9) { M1=144; } if(M==10) { M1=192; Md1=249; } if(M==11) { M1=249; Md1=249; } if(M==12) { M1=164; Md1=249; } if(M==13) { M1=176; Md1=249; } if(M==14) { M1=153; Md1=249; } if(M==15) { M1=146; Md1=249; } if(M==16) { M1=130; Md1=249; } if(M==17) { M1=248; Md1=249; } if(M==18) { M1=128; Md1=249; } if(M==19) { M1=144; Md1=249; } if(M==20) { M1=192; Md1=164; } if(M==21) { M1=249; Md1=164; } if(M==22) { M1=164; Md1=164; } if(M==23) { M1=176; Md1=164; } if(M==24) { M1=153; Md1=164; } if(M==25) { M1=146; Md1=164; } if(M==26) { M1=130; Md1=164; } if(M==27) { M1=248; Md1=164; } if(M==28) { M1=128; Md1=164; } if(M==29) { M1=144; Md1=164; } if(M==30) { M1=192; Md1=176; } if(M==31) { M1=249; Md1=176; } if(M==32) { M1=164; Md1=176; } if(M==33) { M1=176; Md1=176; } if(M==34) { M1=153; Md1=176; } if(M==35) { M1=146; Md1=176; } if(M==36) { M1=130; Md1=176; } if(M==37) { M1=248; Md1=176; } if(M==38) { M1=128; Md1=176; } if(M==39) { M1=144; Md1=176; } if(M==40) { M1=192; Md1=153; } if(M==41) { M1=249; Md1=153; } if(M==42) { M1=164; Md1=153; } if(M==43) { M1=176; Md1=153; } if(M==44) { M1=153; Md1=153; } if(M==45) { M1=146; Md1=153; } if(M==46) { M1=130; Md1=153; } if(M==47) { M1=248; Md1=153; } if(M==48) { M1=128; Md1=153; } if(M==49) { M1=144; Md1=153; } if(M==50) { M1=192; Md1=146; } if(M==51) { M1=249; Md1=146; } if(M==52) { M1=164; Md1=146; } if(M==53) { M1=176; Md1=146; } if(M==54) { M1=153; Md1=146; } if(M==55) { M1=146; Md1=146; } if(M==56) { M1=130; Md1=146; } if(M==57) { M1=248; Md1=146; } if(M==58) { M1=128; Md1=146; } if(M==59) { M1=144; Md1=146; } if(M==60) { M1=192; Md1=192; } if(H==0) { H1=192; Hd1=192; } if(H==1) { H1=249; Hd1=192; } if(H==2) { H1=164; Hd1=192; } if(H==3) { H1=176; Hd1=192; } if(H==4) { H1=153; Hd1=192; } if(H==5) { H1=146; Hd1=192; } if(H==6) { H1=130; Hd1=192; } if(H==7) { H1=248; Hd1=192; } if(H==8) { H1=128; Hd1=192; } if(H==9) { H1=144; Hd1=192; } if(H==10) { H1=192; Hd1=249; } if(H==11) { H1=249; Hd1=249; } if(H==12) { H1=164; Hd1=249; } if(H==13) { H1=176; Hd1=249; } if(H==14) { H1=153; Hd1=249; } if(H==15) { H1=146; Hd1=249; } if(H==16) { H1=130; Hd1=249; } if(H==17) { H1=248; Hd1=249; } if(H==18) { H1=128; Hd1=249; } if(H==19) { H1=144; Hd1=249; } if(H==20) { H1=192; Hd1=164; } if(H==21) { H1=249; Hd1=164; } if(H==22) { H1=164; Hd1=164; } if(H==23) { H1=176; Hd1=164; } if(H==24) { H1=192; Hd1=192; } if (digitalRead(Hk)== LOW)//если на входе кнопки часов 0 то к часам +1 { H=H+1; } if (digitalRead(Mk)== LOW)//если на входе кнопки минут 0 то к минутам +1 { M=M+1; } }
Это называется "поспешишь - людей насмешишь".
Шесть десятков IF для вывода всех показаний минут от "00" до "59" и 24 варианта вывода значений часов - такая усидчивость вызывает уважение %)))
Страшно представить, каким был бы код. если бы вам пришло в голову вывести на дисплей дату :)))
ЗЫ О массивах ничего не слышали? - почитайте. Они как раз для таких случаях придуманы.
И о разбиении числе на разряды. Открою страшную тайну - число "35" состоит из цифр "3" и "5". Составляя , например, минуты из разрядов, можно выводить их на индикатор, обходясь всего десятью цифрами - от "0" до "9" - и не писать в коде шестьдесят отдельных условий :)
я писал исключительно по книге ардуино, и по форумам в ютуб, опыта прогамиования "0", вот и хотел услышать мнение спецов)
Тут же очень просто - то же М=35 - тогда первая цифра 3 будет (M/10), вторая 5 (M%10).
Напишите одну подпрограмму функцию, которой передаешь цифру, а она возвращает код. И все.
я целую таблицу составил пока написал код, разбирался как цифры высветить, изначально все было в двоичном коде. В этой программе недостаток в том что установка времени происходит во время прерывания, кнопки срабатывают не сразу. Программно победить дребезг по книге Джереми Блума я не смог, обошел его таким путем
Вот эту самую таблицу и надо было оформить в виде массива. И от бинарного кода зря отказался
мне попадалась книга Геворкяна "Бейсик это просто" попробую по ней разобраться и переосмыслить для языка Ардуино. Следующий проект думаю сделать термометр, вот может там смогу шагнуть дальше
История наверное ещё не знала про такое количество if на 500 строк кода !!!
История наверное ещё не знала про такое количество if на 500 строк кода !!!
История точно не знала, что "простейшие часы далее по списку..." потребуют 500 строк кода :) Не, ну если на асме - то да, но блин блинский, терпения ТС не занимать :))
зато я написал каждую строку сам, и программа работает, часы ходят довольно точно,чтобы освоить программирование на ардуино я сам себе придумал задачи и вот написал первую программу, для меня это целый ОКР
зато delay нет ни одного)
Т.е. на данном этапе вы освоили только управляющий оператор if ?
А к чему привязаны ваши часы ? Для меня часы это прибор для того что бы узнать точное время ... (хотя бы два раза за сутки)
привязаны к частоте работы микроконтроллера. Аппаратно питание во время отладки подавал с USB, далее запитал сначала от кроны, села ну очень быстро, потом спаял штук пять пальчиковых батареек продержались несколько часов, следующие стали аккумуляторы 18650 стало лучше, потребление электричества неприятно удивило, кушать часы любят. А про оператор IFвы не правы, в программе используется и прерывание и работа со сдвиговым регистром причем не так просто на нем четыре разные цифры вывести
Простейшие часы, 55 строк, включая пустые, каждую написал сам.
P.S забыл. Ни одного deley-я()
мне пол кода не понятно, я CASE пока не знаю.
Вы используете модуль часов, а я заставил часами быть саму ардуинку уно, у Вас я так понял вывод времени на дисплей, а у меня на четыре 8 сегментных индикатора.
9150516627t как выставить точное время на ваших часах ? Насколько убегают/отстают ваши часы ?
а у меня на четыре 8 сегментных индикатора.
Дак и у меня на 4 индикатора. Вот такие https://aliexpress.ru/i/32832772646.html
в конце кода есть строки для двух кнопок, одна прибавляют +1час, другая +1минуту. Правда срабатывает нажатие только во время прерывания один раз в секунду. отставаний или замедлений часов я не заметил, сейчас попробую включить часы на пару недель от сети
у меня такие же но стоят они на шилде, управляются через два последовательных регистра сдвига
у меня такие же но стоят они на шилде, управляются через два последовательных регистра сдвига
сколько раз нужно написать. что ваш код вывода на индикаторы бредовый. чтобы вы поняли? Уже как минимум пять человек вам намекнукло :)
Вы свой код сюда вывалили не для того чтоб похвастать (надеюсь) - а чтобы вам указали на ошибки. Вам указали. Так исправляйте.
ТС, "роскошно" отдавать таймер 1 под часы, когда для этого есть millis() и работает тоже на прерывании. Вдруг потом таймер1 понадобится?
И минуты не могут поменяться, пока секунды не досчитают до 60. Также и с часами - пока минуты не дойдут до 60.
И какое терпение нужно иметь, чтоб подвести минуты с 01 на 56, например, и чтоб при этом не грохнуть эти часы об пол)))
Вобщем, есть над чем подумать...
я понял что надо освоить массивы, лучше подскажите хорошую книгу по программированию, я пользуюсь книгой Джереми Блума "Ардуино" и мне понравилась книга Геворкяна "Бейсик это просто" она хоть и про бэйсик но полезного в ней много
поеду думать на дачу до воскресенья буду читать, заодно и часы включу посмотрю точность
Тут как бы про C и C++.
Для начала текущий сайт бы почитали - http://arduino.ru/Reference
спасибо но там очень кратко, книга Геворкяна тем и хороша что он все разжевал, она конечно устарела, операторы по разному называются но мне помогла
операторы по разному называются
O_O
спасибо но там очень кратко, книга Геворкяна тем и хороша что он все разжевал, она конечно устарела, операторы по разному называются но мне помогла
А по настоящему, программирование начинается с создания алгоритма. А уже потом, создав нормальный алгоритм, переводят его на какой-нибудь язык. Причем в этом случае язык не так важен. Хоть си++, хоть питон, да хоть бейсик. А прочитав несколько глав книги, создать нормальную программу - это иллюзия.
прочитав несколько глав книги, создать нормальную программу - это иллюзия.
чойта. создать-то можно, но выйдет примерно, как в стартовом посте. :) пошти брэйнфак.
с чего то надо начинать...
Думаю, начинать надо с Кернигана и Ритчи.
спасибо, нашел эту книгу, чувствую надо купить фолиант
Надо что типа учебника информатики
где НЦ - начало цикла, КЦ - конец цикла, ЕСЛИ ТО ИНАЧЕ ... ПЕРЕМЕННАЯ КОНСТАНТА МАССИВ ...
Испортило программистов "скопировать-вставить".
Я бы, в свое время, сломался на вычерчивании блочного алгоритма такой программы. ТС вроде поупертее, но думаю и его бы сломало заполнение листов под печать перфокарт, а ни это - так девочка, которая их печатает. Когда он к ней подошел бы с пачкой листов и так, отводя глаза - Простейшие часики тут написал...
А потом еще раза 3-4 туда заходить. То сам ошибся, то девочка. Хороший стимул для оптимизации программ на стадии продумывания.
Ох, скока я конфет девочкам из ВЦ перетаскал... По весу кабы не больше, чем перфокарт. :)
А конфеты тада были дифьцыт.
Иопта, щас повспоминал, оказываеца 35 лет прошло. А я и не заметил. :)
Боже, как давно это было,
Помнит только мутной реки вода.
Время, када радость меня любила
Больше не вернуть, низашто, никада.
:)
Пора, аднака, ближе к кладбищу переежжять. Чтоб далеко не тащить.
Знакомьтесь: часы-радиоконструктор "Старт 7231", популярными были лет 30 назад. Для установки часов и минут тоже были только кнопки "+". Довольно медитативное занятие, я вам скажу. Особенно веселило, когда, "уснув на кнопке" в процессе, набегали лишние пару часов или минут. Но грохнуть об пол вещь, собранную своими руками... низачто.
парни никак не могу в комментарий фото вставить, подскажите пожалуйста, я первый раз на форуме тему создал
парни никак не могу в комментарий фото вставить, подскажите пожалуйста
http://arduino.ru/forum/obshchii/sokhranenie-kartinok-na-forume
Знакомьтесь: часы-радиоконструктор "Старт 7231", популярными были лет 30 назад. Для установки часов и минут тоже были только кнопки "+". Довольно медитативное занятие, я вам скажу. Особенно веселило, когда, "уснув на кнопке" в процессе, набегали лишние пару часов или минут. Но грохнуть об пол вещь, собранную своими руками... низачто.
Че знакомиться? Примерно такие 30 лет назад я тоже собирал. Только без корпуса, и кнопок настроек было поменьше. На корпус денег не было, поэтому сам колхозил. Работали лет 20 у родителей в деревне. Потом сегменты стали притухать -купил им китайские часы.
Всетаки опрос кнопок там был почаще 1 Гц))