Пишу код сикундомера для этой конфигурации отсчет от 0-59. Приходится писать для каждой цифры отдельно. Можно как то поменять ситуацию. Пока добрался от 1-10.
unsigned long time;
//Пин подключен к ST_CP входу 74HC595
int latchPin = 10;
//Пин подключен к SH_CP входу 74HC595
int clockPin = 6;
//Пин подключен к DS входу 74HC595
int dataPin = 7;
int dir = 10;
int led1 = 8;
int led2 = 9;
int var = 11;
void setup() {
//устанавливаем режим OUTPUT
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(9-8,OUTPUT);
Serial.begin(9600);
}
// 00000001 - низ
// 00000010 - центр
// 00000100 - точка
// 00001000 - верх
// 00010000 - лево верх
// 00100000 - право верх
// 01000000 - право низ
// 10000000 - лево низ
int f1 = B01100000;
int f2 = B10101011;
int f3 = B01101011;
int f4 = B01110010;
int f5 = B01011011;
int f6 = B11011011;
int f7 = B01101000;
int f8 = B11111011;
int f9 = B01111011;
int f0 = B11111001;
void loop()
{
//{
time = millis();
int sek = time/1000;
int minyt = (time/1000)/60;
int cas = (minyt/60);
int minyt2 = minyt;
if(cas>0) minyt2 =(minyt-60*cas);
if((time/1000)>60) sek =(sek-60*minyt);
//int var = sek;
Serial.print(cas);Serial.print("c.");Serial.print(minyt2);
Serial.print("m:");Serial.print(sek);Serial.println("s:");
// ждет секунду, перед следующей итерацией цикла.
if(sek<1)
{
digitalWrite(latchPin, LOW);
// передаем последовательно на dataPin
shiftOut(dataPin, clockPin, MSBFIRST, f0);
delay(9);
PORTB=B101;
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, f0);
delay(9);
PORTB=B110;
digitalWrite(latchPin, LOW);
// передаем последовательно на dataPin
shiftOut(dataPin, clockPin, MSBFIRST, B00000000);
delay(1);
PORTB=B111;
}
////////
//4
if((sek>0)&(sek<2)){
digitalWrite(latchPin, LOW);
// передаем последовательно на dataPin
shiftOut(dataPin, clockPin, MSBFIRST, f1);
delay(9);
PORTB=B101;
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, f0);
delay(9);
PORTB=B110;
digitalWrite(latchPin, LOW);
// передаем последовательно на dataPin
shiftOut(dataPin, clockPin, MSBFIRST, B00000000);
delay(1);
PORTB=B111;
}
//2
if((sek>1)&(sek<3)){
digitalWrite(latchPin, LOW);
// передаем последовательно на dataPin
shiftOut(dataPin, clockPin, MSBFIRST, f2);
delay(9);
PORTB=B101;
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, f0);
delay(9);
PORTB=B110;
digitalWrite(latchPin, LOW);
// передаем последовательно на dataPin
shiftOut(dataPin, clockPin, MSBFIRST, B00000000);
delay(1);
PORTB=B111;
}
//3
if((sek>2)&(sek<4)){
digitalWrite(latchPin, LOW);
// передаем последовательно на dataPin
shiftOut(dataPin, clockPin, MSBFIRST, f3);
delay(9);
PORTB=B101;
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, f0);
delay(9);
PORTB=B110;
digitalWrite(latchPin, LOW);
// передаем последовательно на dataPin
shiftOut(dataPin, clockPin, MSBFIRST, B00000000);
delay(1);
PORTB=B111;
}
//4
if((sek>3)&(sek<5)){
digitalWrite(latchPin, LOW);
// передаем последовательно на dataPin
shiftOut(dataPin, clockPin, MSBFIRST, f4);
delay(9);
PORTB=B101;
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, f0);
delay(9);
PORTB=B110;
digitalWrite(latchPin, LOW);
// передаем последовательно на dataPin
shiftOut(dataPin, clockPin, MSBFIRST, B00000000);
delay(1);
PORTB=B111;
}
//5
if((sek>4)&(sek<6)){
digitalWrite(latchPin, LOW);
// передаем последовательно на dataPin
shiftOut(dataPin, clockPin, MSBFIRST, f5);
delay(9);
PORTB=B101;
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, f0);
delay(9);
PORTB=B110;
digitalWrite(latchPin, LOW);
// передаем последовательно на dataPin
shiftOut(dataPin, clockPin, MSBFIRST, B00000000);
delay(1);
PORTB=B111;
}
//6
if((sek>5)&(sek<7)){
digitalWrite(latchPin, LOW);
// передаем последовательно на dataPin
shiftOut(dataPin, clockPin, MSBFIRST, f6);
delay(9);
PORTB=B101;
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, f0);
delay(9);
PORTB=B110;
digitalWrite(latchPin, LOW);
// передаем последовательно на dataPin
shiftOut(dataPin, clockPin, MSBFIRST, B00000000);
delay(1);
PORTB=B111;
}
//7
if((sek>6)&(sek<8)){
digitalWrite(latchPin, LOW);
// передаем последовательно на dataPin
shiftOut(dataPin, clockPin, MSBFIRST, f7);
delay(9);
PORTB=B101;
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, f0);
delay(9);
PORTB=B110;
digitalWrite(latchPin, LOW);
// передаем последовательно на dataPin
shiftOut(dataPin, clockPin, MSBFIRST, B00000000);
delay(1);
PORTB=B111;
}
//8
//4
if((sek>7)&(sek<9)){
digitalWrite(latchPin, LOW);
// передаем последовательно на dataPin
shiftOut(dataPin, clockPin, MSBFIRST, f8);
delay(9);
PORTB=B101;
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, f0);
delay(9);
PORTB=B110;
digitalWrite(latchPin, LOW);
// передаем последовательно на dataPin
shiftOut(dataPin, clockPin, MSBFIRST, B00000000);
delay(1);
PORTB=B111;
}
//9
if((sek>8)&(sek<10)){
digitalWrite(latchPin, LOW);
// передаем последовательно на dataPin
shiftOut(dataPin, clockPin, MSBFIRST, f9);
delay(9);
PORTB=B101;
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, f0);
delay(9);
PORTB=B110;
digitalWrite(latchPin, LOW);
// передаем последовательно на dataPin
shiftOut(dataPin, clockPin, MSBFIRST, B00000000);
delay(1);
PORTB=B111;
}
//10
if((sek>9)&(sek<11)){
digitalWrite(latchPin, LOW);
// передаем последовательно на dataPin
shiftOut(dataPin, clockPin, MSBFIRST, f0);
delay(9);
PORTB=B101;
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, f1);
delay(9);
PORTB=B110;
digitalWrite(latchPin, LOW);
// передаем последовательно на dataPin
shiftOut(dataPin, clockPin, MSBFIRST, B00000000);
delay(1);
PORTB=B111;
}
}
Мда... Наверно круто 59 одинаковых кусков кода писать.... Я бы тупо поленился :) Попробуйте изображения цыфр в массиве хранить и выводить из массива нужную по индексу. Уверен, Вам понравится!
Вам нужен не диод, а транзистор и можно использовать обычный биполярный. Зачем вообще у вас там стоит этот диод??? по-причине того что без него не работает? ну так и с ним тоже результат не лучше...
Извините за мою тупость но я уже несколько раз писал что нужно запитать сток исток минусами затвор плюс. если нет диода между затвором и истоком ниче не работает . транзистор кп 505. если сток плюс исток минус то и так все нормально работает
Мда... Наверно круто 59 одинаковых кусков кода писать.... Я бы тупо поленился :) Попробуйте изображения цыфр в массиве хранить и выводить из массива нужную по индексу. Уверен, Вам понравится!
если не сложно киньте пример кода с массивом если честно никак его не осилю(массив)
Извините за мою тупость но я уже несколько раз писал что нужно запитать сток исток минусами затвор плюс. если нет диода между затвором и истоком ниче не работает . транзистор кп 505. если сток плюс исток минус то и так все нормально работает
Я все равно без схемы не совсем понимаю как вы подключаете транзистор, но точно знаю, что при нормальном включении никакого диода быть не должно, если уж вы собираетесь покупать диоды для неверного подключения, то купите лучше другие транзисторы - обычные биполярные и пару резисторов к ним.
Извините за мою тупость но я уже несколько раз писал что нужно запитать сток исток минусами затвор плюс. если нет диода между затвором и истоком ниче не работает . транзистор кп 505. если сток плюс исток минус то и так все нормально работает
Я все равно без схемы не совсем понимаю как вы подключаете транзистор, но точно знаю, что при нормальном включении никакого диода быть не должно, если уж вы собираетесь покупать диоды для неверного подключения, то купите лучше другие транзисторы - обычные биполярные и пару резисторов к ним.
Я тоже толком не понял. Ну неужели трудно нарисовать схему? Некоторые рисуют на бумажке и загоняют в комп через фотик, сканер или даже веб-камеру!
Возможно, здесь была ситуация, когда вывод был настроен на вход, "1" подключала подтягивающее сопротивление, "0" - отключал, после чего заряд затвора транзистора неторопясь рассасывался. А вообще, при прочих правильных условиях, этому транзистору ничего не нужно.
100% правы изза того что не указал выход и не работатало а диод отсекал 1 направлени А я чут ли не с пеной у рта доказывал что это не так. КАЮСЬ. но всеравно засветка есть возможно транзистор или мало времени чтоб погаснуть.
Каким образом можно добавить минуты и часы ?? насколькоя понимаю код отсчета связан с кодом часов тока задержкой на переключение в 1 секунду. поставил точно такой экранчик тока на 4 знака. не пойму как привязать еще два знака для начала к минутам
Здравствуйте, прошу помощи с моими часами собранными на дуине. У меня четыре 7ми сегментных лампочки все спаял подключил, но с программированием у меня туговато. С кодом чуть выше который у меня идут секунды, единицы в 1 и 3 лампе, а десятки во 2й и 4й. Помогите пожалуйста подправить код под мои цели, буду очень признателен.
P.s. Рядом на этойже плате собрана небольшая схемка часов на DS1307, есть ли возможность получать время с нее, запихивать в дуину и высвечивать на индикаторах?
Я разобрался с проблемой, регистры сдвига нужно было перепаять в обратной последовательности. Возникли новые проблемы. После загрузки скетча минуты выставляет, а часы нет. Можно ли прикрутить DS1307 и как с нее получать время?
unsigned long time, time_setup;
int latchPin = 8;//Пин подключен к ST_CP входу 74HC595
int clockPin = 12;//Пин подключен к SH_CP входу 74HC595
int dataPin = 11;//Пин подключен к DS входу 74HC595
int dir;
// задержка
int led1;
int led2; //мин
int led3;
int led4; //часы
int min1 = 59; // настройка минут
int cas2 = 2; //настройка часов
void setup() {
// Расчет миллисекунд
time_setup = min1*60000 + cas2*3600000;
//устанавливаем режим OUTPUT
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
Serial.begin(9600);
}
byte mask[10] =
{
B00111111, // 0
B00011000, // 1
B01101101, // 2
B01111100, // 3
B01011010, // 4
B01110110, // 5
B01110111, // 6
B00011100, // 7
B01111111, // 8
B01111110 // 9
};
byte maskSek[10] =
{
B00111111, // 0
B00011000, // 1
B01101101, // 2
B01111100, // 3
B01011010, // 4
B01110110, // 5
B01110111, // 6
B00011100, // 7
B01111111, // 8
B01111110 // 9
};
void loop()
{
time = millis();
int sek = time/1000;
int minyt = (time/1000)/60+min1;
int minyt3 = (time/1000)/60; // дубляж для того чтоб не сбились секунды
int cas = (minyt/60);
int cas3 = cas + cas2;
int minyt2 = minyt;
if(cas>0) minyt2 =(minyt-60*cas);
if(cas3 > 23) cas3 =cas3-24;
if((time/1000)>60) sek =(sek-60*minyt3);
// настройка времени
Serial.print(cas);
Serial.print("c.");
Serial.print(minyt2);
Serial.print("m:");
Serial.print(sek);
Serial.println("s:");
//часы
out(led3, mask[(cas)%10]); // передаем последовательно на dataPin
out(led4, mask[(cas)/10]); // передаем последовательно на dataPin
// минуты
out(led1, mask[(minyt2)/10]); // целые
out(led2, mask[(minyt2)%10]); // десятые
}
void out(int catode, int numeric){
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, numeric); // передаем последовательно на dataPin
digitalWrite(latchPin, HIGH); //"защелкиваем" регистр
digitalWrite(catode, 1);
delay(dir); // пауза перед следующей итерацией
digitalWrite(catode, 0);
}
Дело в том, что я использую вот такую лампу и там общий вывод, которые соеденины вместе. А каждая нога идет напрямую на ногу регистра 74hc595, по этому мне эти выводы led1, led2, led3, led4 не нужны вовсе.
Они конечно может вам и не нужны, но работать у вас с этим кодом ваш индикатор не будет, так как тогда состояние катодов вам нужно выводить в регистры.
Данный код предназначен для индикатора подключенного анодами к одному сдвиговому регистру и катодами (через транзисторы) к выводам дуины. Когда у вас, если я правильно понял, и катоды (через транзисторы) и аноды подключены к двум сдвиговым регистрам, я правильно понимаю?
Во-первых у меня нет транзисторов, во-вторых у меня 4 сдвиговых регистра т.к. у каждой лампы-индикатора 7 ног и 1 общая. Как это не странно, но все работает с этим кодом, только при заливке скетча у меня выставляются только минуты, часы не хотят. Схему нарисовал так как паял схему все 1:1.
Спасибо за код, все работает. Посоветуйте пожалуйста какой дешовой атмегой можно заменить ардуину, чтобы сделать их автономными? И как все-таки прикрутить ds1307, чтобы часы без питания не обнулялись?
P.s. нашел косяк небольшой, через 59 минут следующая цифра высвечивается 60, а не 00. Где править подскажите.
Дуину можно заменить например ATmega8, как работать с ds1307 инфы валом, расчет секунд/минут/часов писал не я так что попробуйте сами разобраться или напишите свой расчет.
И как все-таки прикрутить ds1307, чтобы часы без питания не обнулялись?
Чудес не бывает. Святым духом микросхемы питатся не умеют. Так что какое-то питание, хотя-бы для одной ds1307 потребуется в любом случае. Хотя-бы "махонькой часовой батарейки".
Схему "как это прикрутить" думаю можно подсмотреть в готовых шилдах (гугланите, есть шилды ds1307 с батарейкой).
Пишу код сикундомера для этой конфигурации отсчет от 0-59. Приходится писать для каждой цифры отдельно. Можно как то поменять ситуацию. Пока добрался от 1-10.
Так проблема с затуханием решилась?
или транзистор или диод железяк проблема. код не причем . все никак не сгоняю за норм диодом
Мда... Наверно круто 59 одинаковых кусков кода писать.... Я бы тупо поленился :) Попробуйте изображения цыфр в массиве хранить и выводить из массива нужную по индексу. Уверен, Вам понравится!
Вам нужен не диод, а транзистор и можно использовать обычный биполярный. Зачем вообще у вас там стоит этот диод??? по-причине того что без него не работает? ну так и с ним тоже результат не лучше...
Извините за мою тупость но я уже несколько раз писал что нужно запитать сток исток минусами затвор плюс. если нет диода между затвором и истоком ниче не работает . транзистор кп 505. если сток плюс исток минус то и так все нормально работает
Мда... Наверно круто 59 одинаковых кусков кода писать.... Я бы тупо поленился :) Попробуйте изображения цыфр в массиве хранить и выводить из массива нужную по индексу. Уверен, Вам понравится!
если не сложно киньте пример кода с массивом если честно никак его не осилю(массив)
Примерно так но не проверял, подшлифуйте сами
Извините за мою тупость но я уже несколько раз писал что нужно запитать сток исток минусами затвор плюс. если нет диода между затвором и истоком ниче не работает . транзистор кп 505. если сток плюс исток минус то и так все нормально работает
Я все равно без схемы не совсем понимаю как вы подключаете транзистор, но точно знаю, что при нормальном включении никакого диода быть не должно, если уж вы собираетесь покупать диоды для неверного подключения, то купите лучше другие транзисторы - обычные биполярные и пару резисторов к ним.
Подправил. вот все норм работает спасиб . паузы убрались затухание тож. секунды хвататет чтоб полностью пропасть
Извините за мою тупость но я уже несколько раз писал что нужно запитать сток исток минусами затвор плюс. если нет диода между затвором и истоком ниче не работает . транзистор кп 505. если сток плюс исток минус то и так все нормально работает
Я все равно без схемы не совсем понимаю как вы подключаете транзистор, но точно знаю, что при нормальном включении никакого диода быть не должно, если уж вы собираетесь покупать диоды для неверного подключения, то купите лучше другие транзисторы - обычные биполярные и пару резисторов к ним.
Я тоже толком не понял. Ну неужели трудно нарисовать схему? Некоторые рисуют на бумажке и загоняют в комп через фотик, сканер или даже веб-камеру!
Возможно, здесь была ситуация, когда вывод был настроен на вход, "1" подключала подтягивающее сопротивление, "0" - отключал, после чего заряд затвора транзистора неторопясь рассасывался. А вообще, при прочих правильных условиях, этому транзистору ничего не нужно.
код для секундомера работает и без диодов . код с 15 сообщения тока с диодами
код для секундомера работает и без диодов . код с 15 сообщения тока с диодами
Все верно, в #15 пины не настроены как выход.
А почему в "схеме" не указаны анод и катод у диода?
плюс диода + ардуины
100% правы изза того что не указал выход и не работатало а диод отсекал 1 направлени А я чут ли не с пеной у рта доказывал что это не так. КАЮСЬ. но всеравно засветка есть возможно транзистор или мало времени чтоб погаснуть.
так нет засветки спасибо максиму
Сообщение #47
оно сильно засвечивало сильно оба знака
ЗАСВЕТКА БЫЛА ИЗ_ЗА ТОГО ЧТО СТОК ИСТОК БЫЛИ ПЕРЕПУТАНЫ!!!!!
Каким образом можно добавить минуты и часы ?? насколькоя понимаю код отсчета связан с кодом часов тока задержкой на переключение в 1 секунду. поставил точно такой экранчик тока на 4 знака. не пойму как привязать еще два знака для начала к минутам
Да точно так же как и с секундами.
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, mask[sek/59]); // передаем последовательно на dataPin
digitalWrite(latchPin, HIGH); //"защелкиваем" регистр
digitalWrite(led2, 1);
delay(dir);// пауза перед следующей итерацией
digitalWrite(led2, 0);
???? если не туплю
У вас же уже есть расчет минут, вам нужно таким же способом как и секунды вывести на дисплей минуты.
точку всунул как отдельный элемент
Здравствуйте, прошу помощи с моими часами собранными на дуине. У меня четыре 7ми сегментных лампочки все спаял подключил, но с программированием у меня туговато. С кодом чуть выше который у меня идут секунды, единицы в 1 и 3 лампе, а десятки во 2й и 4й. Помогите пожалуйста подправить код под мои цели, буду очень признателен.
P.s. Рядом на этойже плате собрана небольшая схемка часов на DS1307, есть ли возможность получать время с нее, запихивать в дуину и высвечивать на индикаторах?
Заранее спасибо за ответы.
Код свой покажите
Вставка программного кода в тему/комментарий
И вот продолжение этой темы.
Я разобрался с проблемой, регистры сдвига нужно было перепаять в обратной последовательности. Возникли новые проблемы. После загрузки скетча минуты выставляет, а часы нет. Можно ли прикрутить DS1307 и как с нее получать время?
Я вообще не понимаю как этот код у вас может работать??? Вы не определии выводы, к которым подключены катоды дисплея и не настроили их на выход...
Дело в том, что я использую вот такую лампу и там общий вывод, которые соеденины вместе. А каждая нога идет напрямую на ногу регистра 74hc595, по этому мне эти выводы led1, led2, led3, led4 не нужны вовсе.
Они конечно может вам и не нужны, но работать у вас с этим кодом ваш индикатор не будет, так как тогда состояние катодов вам нужно выводить в регистры.
Данный код предназначен для индикатора подключенного анодами к одному сдвиговому регистру и катодами (через транзисторы) к выводам дуины. Когда у вас, если я правильно понял, и катоды (через транзисторы) и аноды подключены к двум сдвиговым регистрам, я правильно понимаю?
Схему вашего подключения посмотреть можно?
Сохранение картинок на форуме
Во-первых у меня нет транзисторов, во-вторых у меня 4 сдвиговых регистра т.к. у каждой лампы-индикатора 7 ног и 1 общая. Как это не странно, но все работает с этим кодом, только при заливке скетча у меня выставляются только минуты, часы не хотят. Схему нарисовал так как паял схему все 1:1.
ссылка на схему
То что у вас работает с этим кодом - это чистая случайность, у вас вообще статическая индикация, а код предназначен для динамической.
В вашем случае все проще:
Спасибо за код, все работает. Посоветуйте пожалуйста какой дешовой атмегой можно заменить ардуину, чтобы сделать их автономными? И как все-таки прикрутить ds1307, чтобы часы без питания не обнулялись?
P.s. нашел косяк небольшой, через 59 минут следующая цифра высвечивается 60, а не 00. Где править подскажите.
Дуину можно заменить например ATmega8, как работать с ds1307 инфы валом, расчет секунд/минут/часов писал не я так что попробуйте сами разобраться или напишите свой расчет.
И как все-таки прикрутить ds1307, чтобы часы без питания не обнулялись?
Чудес не бывает. Святым духом микросхемы питатся не умеют. Так что какое-то питание, хотя-бы для одной ds1307 потребуется в любом случае. Хотя-бы "махонькой часовой батарейки".
Схему "как это прикрутить" думаю можно подсмотреть в готовых шилдах (гугланите, есть шилды ds1307 с батарейкой).
Ну вот на слова "DS1307 ds1307 battery" гугл ПЕРВОЙ ссылкой дает http://www.ladyada.net/learn/breakoutplus/ds1307rtc.html
P.S. Кстати это все уже как-то далеко от названия топика "led 2 цифры 8 контактов прикрутить к ардуине"