таймер-часы, помогите с кодом ))
- Войдите на сайт для отправки комментариев
Ср, 13/11/2013 - 11:51
может у кого есть скетч на использование 4х семи-сегментного индикатора под таймер-часы... ну чтобы производил отсчет, можно было остановить и обнулить... совсем туплю ^_(((
ну хорошо, ни у кого нет, может кто подскажет как сделать так, чтобы мигала точка только между секундами и минутами. а-то мигают все четыри... не знаю как исправить
точка это отдельный светодиод, вот им и мигайте. посмотрите распиновку индикатора
вот юзайте если сами не хотите писать
общий катод или анод не помню. массив если что надо будет менять и пару строк
//============================================================================ // Программные часы с 7 сегментным индикатором //============================================================================ //============================================================================ // Выводы подключения 7 сегментного индикатора //============================================================================ #define DIGIT1 7 #define DIGIT2 11 #define DIGIT3 12 #define DIGIT4 A2 #define SEGMENTA 8 #define SEGMENTB 13 #define SEGMENTC A0 #define SEGMENTD A4 #define SEGMENTE A5 #define SEGMENTF 9 #define SEGMENTG A1 #define SEGMENT_DP A3 //============================================================================ // Переменные хранения времени //============================================================================ long prevmicros = 0; //переменная для хранения значений таймера byte sek = 0; //значение секунд byte minu = 0; //значение минут byte chas = 0; //значение часов boolean counter=false; // счетчик для полусекунд void setup(){ //============================================================================ // Настраиваем выводы на выход //============================================================================ pinMode(DIGIT1, OUTPUT); pinMode(DIGIT2, OUTPUT); pinMode(DIGIT3, OUTPUT); pinMode(DIGIT4, OUTPUT); pinMode(SEGMENTA, OUTPUT); pinMode(SEGMENTB, OUTPUT); pinMode(SEGMENTC, OUTPUT); pinMode(SEGMENTD, OUTPUT); pinMode(SEGMENTE, OUTPUT); pinMode(SEGMENTF, OUTPUT); pinMode(SEGMENTG, OUTPUT); pinMode(SEGMENT_DP, OUTPUT); } void loop(){ if (micros() - prevmicros >500000){ prevmicros = micros(); //принимает значение каждые полсекунды counter=!counter; if (counter==false) { sek++; //переменная секунда + 1 digitalWrite(SEGMENT_DP,0); //включаем точки } else { digitalWrite(SEGMENT_DP,1); //выключаем точки } //============================================================================ // Считачем часы минуты секунды //============================================================================ if(sek>59){ //если переменная секунда больше 59 ... sek=0; //сбрасываем ее на 0 minu++; //пишем +1 в переменную минута } if(minu>59){ //если переменная минута больше 59 ... minu=0; //сбрасываем ее на 0 chas++; //пишем +1 в переменную час } if(chas>23){ //если переменная час больше 23 ... chas=0; //сбрасываем ее на 0 } } //============================================================================ // разбиваем часы,минуты и секунды на цифры (секунды только на время тестирования) //============================================================================ byte chas_1 = chas/10; //1 цифра часов byte chas_2 = chas%10; //2 цифра часов byte minu_1 = minu/10; //1 цифра минут byte minu_2 = minu%10; //2 цифра минут byte sek_1 = sek/10; //1 цифра секунд byte sek_2 = sek%10; //2 цифра секунд //============================================================================ // Выводим время //============================================================================ vivod(minu_1); digitalWrite(DIGIT1,1); digitalWrite(DIGIT1,0); vivod(minu_2); digitalWrite(DIGIT2,1); digitalWrite(DIGIT2,0); vivod(sek_1); digitalWrite(DIGIT3,1); digitalWrite(DIGIT3,0); vivod(sek_2); digitalWrite(DIGIT4,1); digitalWrite(DIGIT4,0); } //============================================================================ // Массив с включаемыми сегментами индикатора соответстуеющие цифрам //============================================================================ byte cifr(byte y, byte x){ byte myArray[10][7]={ {0,0,0,0,0,0,1}, // цифра 0 {1,0,0,1,1,1,1}, // цифра 1 {0,0,1,0,0,1,0}, // цифра 2 {0,0,0,0,1,1,0}, // цифра 3 {1,0,0,1,1,0,0}, // цифра 4 {0,1,0,0,1,0,0}, // цифра 5 {0,1,0,0,0,0,0}, // цифра 6 {0,0,0,1,1,1,1}, // цифра 7 {0,0,0,0,0,0,0}, // цифра 8 {0,0,0,0,1,0,0}, // цифра 9 }; return myArray[y][x]; } //============================================================================ // Управление сегментами индикатор соответствующее числу number //============================================================================ void vivod(byte number){ digitalWrite(SEGMENTA,(cifr(number,0))); digitalWrite(SEGMENTB,(cifr(number,1))); digitalWrite(SEGMENTC,(cifr(number,2))); digitalWrite(SEGMENTD,(cifr(number,3))); digitalWrite(SEGMENTE,(cifr(number,4))); digitalWrite(SEGMENTF,(cifr(number,5))); digitalWrite(SEGMENTG,(cifr(number,6))); }можно обойтись без массива если переделать под этот код
void Vivod(byte n) { if((n!=1)&&(n!=4)){ digitalWrite(SEGMENTA,1); // сегмент A } if((n!=5)&&(n!=6)){ digitalWrite(SEGMENTB,1); // сегмент B } if(n!=2){ digitalWrite(SEGMENTC,1); // сегмент C } if((n!=1)&&(n!=4)&&(n!=7)){ digitalWrite(SEGMENTD,1); // сегмент D } if((n==0)||(n==2)||(n==6)||(n==8)){ digitalWrite(SEGMENTE,1); // сегмент E } if((n!=1)&&(n!=2)&&(n!=3)&&(n!=7)){ digitalWrite(SEGMENTF,1); // сегмент F } if((n!=0)&&(n!=1)&&(n!=7)){ digitalWrite(SEGMENTG,1); // сегмент G } }остановку и обнуление сами добавляйте
вот юзайте если сами не хотите писать
общий катод или анод не помню. массив если что надо будет менять и пару строк
это код чего угодно, но только не часов на 4-х 7-мисегментных индикаторах. либо половину потеряли когда копипастили
вот юзайте если сами не хотите писать
общий катод или анод не помню. массив если что надо будет менять и пару строк
это код чего угодно, но только не часов на 4-х 7-мисегментных индикаторах. либо половину потеряли когда копипастили
да ладно. а я и не знал. видно часы которые я реально запускал не должны были работать)))
что же вас смутило что вы так яросто утверждаете что это не должно работать
приведите схему подключения
в коде в начале смециально названо чтобы было понятно что куда подключать
это для кого написано? читать научитесь
а вот хамить не надо
если бы попытались подумать и соотнести схему с кодом, то поняли бы, что ваши часы выводят все, кроме собственнов часов - минуты выводят, секунды выводят, а именно часы - нет
секунды для тестирования выводятся. чтобы понять все ли правильно подключено
когда все норм. и цифры правильно показываются. разряды не перепутали меняется на
если сразу включить часы и минуты проверка затянется
а при чем здесь схема подключения?
ребята, не ругайтесь - смысла-то нет кровь портить. сип-сип, код работает, часики тикают))) тока остановку-то как сделать? и как эти точки после 1 и 3 диг'а убрать - мамочки как раздражает, чё-т мучаюсь - ничего не получается... туплю не потому что тупая, а потому что ещё не умею (первый курс^~/) хотя может и тупая малёх
укажите какие точки вы хотите зажечь
предполагаю у вас такой дисплей
у меня лежит дисплей в нем только средние работают а точки не работают (вроде так)
а бывают наоборот. какой у вас
кстати если применить дисплей с 6 цифрами можно выводить часы минуты и секунды
чтобы останавливать нужно добавить кнопку и ее обработку, в том числе с защитой от дребезга
и в этот кусок добавить условие
if (micros() - prevmicros >500000){ prevmicros = micros(); //принимает значение каждые полсекунды counter=!counter; if (counter==false && button_1 == true) // button_1 будет переменная зависящая от кнопки 1 { sek++; //переменная секунда + 1 digitalWrite(SEGMENT_DP,0); //включаем точки } else { digitalWrite(SEGMENT_DP,1); //выключаем точки }честно сказать не самое лучше решение, будет происходить такое что запускаться не сразу, а через какое то время, секунду максимум. если это вас устроит то все норм. если нет то надо сделать по другому
вот пример работы с кнопками
http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku
обнулять значения будем от кнопки button_2
if(button_2 == true) { //если кнопка 2 нажата sek=0; //сбрасываем на 0 секунды minu=0; //сбрасываем на 0 минуты chas=0; //сбрасываем на 0 часы }у меня только такой (NFD-3641BS), с общим анодом, программа, кстати для общего анода и написана. вот хотелось бы чтобы мигали только 2 точки. ща попробую остановку))) и где это вы всё учите....
а какие точки должны светиться?
вам повезло, а то пришлось бы инвертировать массив
буквально полгода назад был почти как вы. много читал и пробовал. когда что то не получается или не понимешь задаешь вопрос
ну вторая и четвёртая, чтобы типа делили визуально минуты и часы. мне бы ещё кнопки вбахать надо, которыми можно установить время вручную, с этим и мучаюсь в данный момент.^%// я то-к на форумах могу учить, книжки на инглиш, а мы не оч дружим... я тут про закон ома вроде как в первый раз два месяца назад услышала. думаю вы не были почти как я)))
ну я же сказал почти. я имел в виду программирование.
должны светиться постоянно или моргать как секундные точки?
вот я хотела чтобы моргали, но...... я оказалась барышней переменчивой - откопала LCD дисплей и все это добро перекинула на него (скетч, конеч стырила, ну да там похоже было) + забахала кнопки чтобы можно было выставлять время, сижу - будильник колдую.. но .... у меня вопрос остался не решённым - может знаете - как мне с помощью кнопки останаливать время и снова запускать не обнуляя? спасибки, кстати за ссылку про кнопки - многое выучила - там было и про остановку (пример со светодиодами), но у меня почему-то не работает (наверно чё-т не так делаю), может уже имели с этим дело-a
так я же давал код как остановить и снова запустить. и как обнулить тоже. просто делаете обработку снопки. состояние кнопки записываете в переменную button_1 типа boolean
if (micros() - prevmicros >500000){ prevmicros = micros(); //принимает значение каждые полсекунды counter=!counter; if (counter==false && button_1 == true) // button_1 будет переменная зависящая от кнопки 1 { sek++; //переменная секунда + 1 digitalWrite(SEGMENT_DP,0); //включаем точки } else { digitalWrite(SEGMENT_DP,1); //выключаем точки }когда кнопка false счет остановится, когда true запустится
это ж вы про 7-сегментник, верно? а как на LCD дисплее остановить? я, верно, точно туплю...
это счет и ему по барабану дисплей и что вы выводите.
if (micros() - prevmicros >500000){ prevmicros = micros(); //принимает значение каждые полсекунды counter=!counter; if (counter==false && button_1 == true) { sek++; //переменная секунда + 1 } //============================================================================ // Считачем часы минуты секунды //============================================================================ if(sek>59){ //если переменная секунда больше 59 ... sek=0; //сбрасываем ее на 0 minu++; //пишем +1 в переменную минута } if(minu>59){ //если переменная минута больше 59 ... minu=0; //сбрасываем ее на 0 chas++; //пишем +1 в переменную час } if(chas>23){ //если переменная час больше 23 ... chas=0; //сбрасываем ее на 0 } }попробуйте сделать так
блин... не получается - вообще тогда при запуске ардуино отсчёт не идет.
код обработки кнопки приложите
#include <LiquidCrystal.h> long prevmicros = 0; int sek = 0; int minutt = 0; int time = 0; int knappM = 0; int knappT = 0; boolean counter = false; LiquidCrystal lcd (12, 10, 5, 4, 3, 2); void setup (){ lcd.begin (16, 2); pinMode (8, INPUT); pinMode (6, INPUT); pinMode (13, OUTPUT); } void loop (){ if (micros () < prevmicros) { prevmicros = 0; } if (micros () - prevmicros > 500000){ prevmicros = micros (); counter = !counter; if (counter == false) { sek ++; lcd.setCursor (6, 1); lcd.print (":"); lcd.setCursor (9, 1); lcd.print (":"); } else { lcd.setCursor (9, 1); lcd.print (" "); lcd.setCursor (6,1); lcd.print (" "); } if (sek>59) { sek = 0; minutt++; } if (minutt>59).. { minutt = 0; time++; } if (time>23) { time = 0; } lcd.setCursor (4, 1); if (time <10){ lcd.print ("0"); lcd.print (time); } else lcd.print (time); lcd.setCursor (7, 1); if (minutt <10){ lcd.print ("0"); lcd.print (minutt); } // antall minutter else lcd.print (minutt); lcd.setCursor (10, 1); if (sek <10){ lcd.print ("0"); lcd.print (sek); } else lcd.print (sek); } if (digitalRead (8) == HIGH&&knappM == 0) { minutt++; sek = 0; knappM++; if (time < 10) { lcd.setCursor (5, 1); lcd.print (time); lcd.setCursor (4, 1); lcd.print ("0"); } else { lcd.setCursor (4, 1); lcd.print (time); } if (minutt < 10) { lcd.setCursor (8, 1); lcd.print (minutt); lcd.setCursor (7, 1); lcd.print ("0"); } else { lcd.setCursor (7, 1); lcd.print (minutt); } lcd.setCursor (10, 1); lcd.print (sek); } if (digitalRead (8) == LOW&&knappM == 1) { knappM = 0; } if (digitalRead (6) == HIGH&&knappT == 0) { time++; sek = 0; knappT++; if (time < 10) { lcd.setCursor (5, 1); lcd.print (time); lcd.setCursor (4, 1); lcd.print ("0"); } else { lcd.setCursor (4, 1); lcd.print (time); } if (minutt < 10) { lcd.setCursor (8, 1); lcd.print (minutt); lcd.setCursor (7, 1); lcd.print ("0"); } else { lcd.setCursor (7, 1); lcd.print (minutt); } lcd.setCursor (10, 1); lcd.print (sek); } if (digitalRead (6) == LOW&&knappT == 1) { knappT = 0; } lcd.setCursor (5, 0); lcd.print ("KLOKKE"); }помогите, кто может, не могу закончить программу - есть LCD дисплей, считает время + можно выставить время вручную. как остановить часы так, чтобы время остановилось при нажатии на кнопку, а при повторном нажатии обнулило значение и считывало время заново с нуля? желательно избежать глобальных переменних, но мне уже пофиг, лишь бы программку дописать...
попробуйте для начала так. это ваш код только немного переделанный
#include <LiquidCrystal.h> long prevmicros = 0; int sek = 0; int minutt = 0; int time = 0; int knappM = 0; int knappT = 0; boolean counter = false; LiquidCrystal lcd (12, 10, 5, 4, 3, 2); void setup (){ lcd.begin (16, 2); pinMode (8, INPUT); pinMode (6, INPUT); pinMode (13, OUTPUT); } void loop (){ if (micros () < prevmicros) { prevmicros = 0; } if (micros() - prevmicros >500000){ prevmicros = micros(); //принимает значение каждые полсекунды counter=!counter; if (counter==false){ sek++; //переменная секунда + 1 //выводим точки lcd.setCursor (6, 1); lcd.print (":"); lcd.setCursor (9, 1); lcd.print (":"); } else { lcd.setCursor (6,1); lcd.print (" "); lcd.setCursor (9, 1); lcd.print (" "); } //считаем часы минуты секунды if (sek>59){ sek = 0; minutt++; } if (minutt>59){ minutt = 0; time++; } if (time>23){ time = 0; } vivod(); //выводим время } lcd.setCursor (5, 0); lcd.print ("KLOKKE"); if (digitalRead (8) == HIGH&&knappM == 0){ minutt++; if (minutt>59){ minutt = 0; } sek = 0; knappM = 1; vivod(); } if (digitalRead (6) == HIGH&&knappT == 0){ time++; if (time>23){ time = 0; } sek = 0; knappT = 1; vivod(); } if (digitalRead (8) == LOW && knappM == 1){ knappM = 0; } if (digitalRead (6) == LOW&&knappT == 1){ knappT = 0; } } void vivod(){ lcd.setCursor (4, 1); lcd.print (time/10); lcd.print (time%10); lcd.setCursor (7, 1); lcd.print (minutt/10); lcd.print (minutt%10); lcd.setCursor (10, 1); lcd.print (sek/10); lcd.print (sek%10); }вам нужно добавить еще одну кнопку для остановки и запуска
но сначала проверьте этот. все так же работает или нет
агась, здорово, этот работае
у вас не бывает когда выставляете время что за одно нажатие не одна а сразу 2-3 цифры прибавляется?
не-а, все отлично работает ))
ну тогда добавляйте кнопку и пробуйте. если не получится пишите. но попробуйте сами
и старайтесь не писать огромные коды. если что то повторяется несколько раз используйте функции
aaa спасибочки, я попробую=)) мя-у
уфф...слушайте, ну не могу я эти часы остановить - что ж такое-то... мозгов-то, видно, так и не прибавилось за неделю. у меня экзамен в 9.00, так я или с законченной програмкой или нет.. если есть желание помочь и время, ну, или жаль дурёху, помогите плизя, а-т у меня совсем чёт не получается..
пробуйте. еще одна кнопка на 7 выводе для остановки и запуска
#include <LiquidCrystal.h> long prevmicros = 0; int sek = 0; int minutt = 0; int time = 0; int knappM = 0; int knappT = 0; boolean counter = false; boolean razr = false; LiquidCrystal lcd (12, 10, 5, 4, 3, 2); void setup (){ lcd.begin (16, 2); pinMode (8, INPUT); pinMode (6, INPUT); pinMode (7, INPUT); pinMode (13, OUTPUT); digitalWrite(7, HIGH); } void loop (){ if (micros () < prevmicros) { prevmicros = 0; } if ((micros() - prevmicros >500000) && razr == false){ prevmicros = micros(); //принимает значение каждые полсекунды counter=!counter; if (counter==false){ sek++; //переменная секунда + 1 //выводим точки lcd.setCursor (6, 1); lcd.print (":"); lcd.setCursor (9, 1); lcd.print (":"); } else { lcd.setCursor (6,1); lcd.print (" "); lcd.setCursor (9, 1); lcd.print (" "); } //считаем часы минуты секунды if (sek>59){ sek = 0; minutt++; } if (minutt>59){ minutt = 0; time++; } if (time>23){ time = 0; } vivod(); //выводим время } lcd.setCursor (5, 0); lcd.print ("KLOKKE"); if (digitalRead (8) == HIGH&&knappM == 0){ minutt++; if (minutt>59){ minutt = 0; } sek = 0; knappM = 1; vivod(); } if (digitalRead (6) == HIGH&&knappT == 0){ time++; if (time>23){ time = 0; } sek = 0; knappT = 1; vivod(); } if (digitalRead (8) == LOW && knappM == 1){ knappM = 0; } if (digitalRead (6) == LOW&&knappT == 1){ knappT = 0; } if (digitalRead (7) == LOW){ razr != razr; } } void vivod(){ lcd.setCursor (4, 1); lcd.print (time/10); lcd.print (time%10); lcd.setCursor (7, 1); lcd.print (minutt/10); lcd.print (minutt%10); lcd.setCursor (10, 1); lcd.print (sek/10); lcd.print (sek%10); }надо было раньше написать что не получается. зачем так долго тянули
не работает....вообще ничего не получается, ардуино на кнопку не реагирует
#include <LiquidCrystal.h> unsigned long prevmillis = 0; byte sek = 0; byte minutt = 0; byte time = 0; boolean razr = false; LiquidCrystal lcd (12, 10, 5, 4, 3, 2); void setup () { lcd.begin (16, 2); pinMode (13, OUTPUT); } void loop () { if (!razr && (millis() - prevmillis >= 500)) { prevmillis = millis(); //принимает значение каждые полсекунды static boolean counter = false; if (counter) { sek++; //переменная секунда + 1 to4ki(1); //выводим точки //считаем часы минуты секунды if (sek > 59) { sek = 0; minutt++; } if (minutt > 59) { minutt = 0; time++; } if (time > 23) time = 0; vivod(); //выводим время } else to4ki(0); counter = !counter; } static bool knappM = 0; if (!knappM && digitalRead(8)) { minutt++; if (minutt > 59) minutt = 0; sek = 0; knappM = 1; vivod(); } static bool knappT = 0; if (!knappT && digitalRead(6)) { time++; if(time > 23) time = 0; sek = 0; knappT = 1; vivod(); } static bool knappS = 0; if(!knappS && digitalRead(7)) { razr != razr; knappS = 1; delay(100); } if (knappM && !digitalRead(8)) knappM = 0; if (knappT && !digitalRead(6)) knappT = 0; if (knappS && !digitalRead(7)) knappS = 0; } void vivod() { lcd.setCursor (5, 0); lcd.print ("KLOKKE"); lcd.setCursor (4, 1); lcd.print (time/10); lcd.print (time%10); lcd.setCursor (7, 1); lcd.print (minutt/10); lcd.print (minutt%10); lcd.setCursor (10, 1); lcd.print (sek/10); lcd.print (sek%10); } void to4ki(bool en) { lcd.setCursor(6, 1); lcd.print(en?':':' '); lcd.setCursor(9, 1); lcd.print(en?':':' '); }спасибо максим доработал код
максим подскажите как это работает?
и еще вопрос. это условие . так можно писать вроде если только что то одно будет выполнятся?
в смысле не нужны фигурные скобки
читается: если knappM не равен нулю и инвертированное значение на 8 выводе не равно нулю то knappM равен нулю. так?
Работает так:
en ? ':' : ' ' ; if(en == 1) ':' else ' ' ;Эквивалентные строки:
Работает так:
en ? ':' : ' ' ; if(en == 1) ':' else ' ' ;Эквивалентные строки:
спасибо
jeka_tm - спасибо вам большое! вы меня тогда так выручили, я проект, кстати на 4 защитила - ну, я не все необходимые задания сделала + выучила-таки C++
поздравляю. но я не владею тем языком