led 2 цифры 8 контактов прикрутить к ардуине

Protez1999
Offline
Зарегистрирован: 08.07.2012

Пишу код сикундомера для этой конфигурации отсчет от 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;
     }
     }
     
     



 

maksim
Offline
Зарегистрирован: 12.02.2012

 Так проблема с затуханием решилась?

Protez1999
Offline
Зарегистрирован: 08.07.2012

или транзистор или диод железяк проблема. код не причем . все никак не сгоняю за норм диодом

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Мда... Наверно круто 59 одинаковых кусков кода писать....  Я бы тупо поленился :) Попробуйте изображения цыфр в массиве хранить и выводить из массива нужную по индексу. Уверен, Вам понравится! 

maksim
Offline
Зарегистрирован: 12.02.2012

 Вам нужен не диод, а транзистор и можно использовать обычный биполярный. Зачем вообще у вас там стоит этот диод??? по-причине того что без него не работает? ну так и с ним тоже результат не лучше...

Protez1999
Offline
Зарегистрирован: 08.07.2012

Извините за мою тупость но я уже несколько раз писал что нужно запитать сток исток минусами затвор плюс. если нет диода между затвором и истоком ниче не работает   . транзистор кп 505. если сток плюс исток минус то и так все нормально работает

Protez1999
Offline
Зарегистрирован: 08.07.2012

AlexFisher пишет:

Мда... Наверно круто 59 одинаковых кусков кода писать....  Я бы тупо поленился :) Попробуйте изображения цыфр в массиве хранить и выводить из массива нужную по индексу. Уверен, Вам понравится! 

если не сложно киньте пример кода с массивом если честно никак его не осилю(массив)

maksim
Offline
Зарегистрирован: 12.02.2012

 Примерно так но не проверял, подшлифуйте сами

unsigned long time;

int latchPin = 10;//Пин подключен к ST_CP входу 74HC595
int clockPin = 6;//Пин подключен к SH_CP входу 74HC595
int dataPin = 7;//Пин подключен к DS входу 74HC595
int dir = 10;
int led1 = 8;
int led2 = 9;
int var = 11; 

boolean catod = 0;

void setup() {
  //устанавливаем режим OUTPUT
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  Serial.begin(9600);
}

byte mask[10] = 
{
  B11111001, // 0
  B01100000, // 1
  B10101011, // 2
  B01101011, // 3
  B01110010, // 4
  B01011011, // 5
  B11011011, // 6
  B01101000, // 7
  B11111011, // 8
  B01111011  // 9  
};

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:");

  delay(1000); // ждет секунду, перед следующей итерацией цикла.

  if(catod){
    digitalWrite(latchPin, LOW); 
    shiftOut(dataPin, clockPin, MSBFIRST, mask[sek%10]); // передаем последовательно на dataPin     
    digitalWrite(latchPin, HIGH); //"защелкиваем" регистр

    digitalWrite(led2, 1);   
    delay(dir);// пауза перед следующей итерацией
    digitalWrite(led2, 0);     
  }
  else{
    digitalWrite(latchPin, LOW); 
    shiftOut(dataPin, clockPin, MSBFIRST, mask[sek/10]); // передаем последовательно на dataPin
    digitalWrite(latchPin, HIGH); //"защелкиваем" регистр

    digitalWrite(led1, 1); 
    delay(dir); // пауза перед следующей итерацией
    digitalWrite(led1, 0);
  }
  catod = !catod;
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

Protez1999 пишет:

Извините за мою тупость но я уже несколько раз писал что нужно запитать сток исток минусами затвор плюс. если нет диода между затвором и истоком ниче не работает   . транзистор кп 505. если сток плюс исток минус то и так все нормально работает

Я все равно без схемы не совсем понимаю как вы подключаете транзистор, но точно знаю, что при нормальном включении никакого диода быть не должно, если уж вы собираетесь покупать диоды для неверного подключения, то купите лучше другие транзисторы - обычные биполярные и пару резисторов к ним.

Protez1999
Offline
Зарегистрирован: 08.07.2012
unsigned long time;

int latchPin = 10;//Пин подключен к ST_CP входу 74HC595
int clockPin = 6;//Пин подключен к SH_CP входу 74HC595
int dataPin = 7;//Пин подключен к DS входу 74HC595
int dir = 10;
int led1 = 8;
int led2 = 9;
int var = 11; 

boolean catod = 0;

void setup() {
  //устанавливаем режим OUTPUT
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  Serial.begin(9600);
}

byte mask[10] = 
{
  B11111001, // 0
  B01100000, // 1
  B10101011, // 2
  B01101011, // 3
  B01110010, // 4
  B01011011, // 5
  B11011011, // 6
  B01101000, // 7
  B11111011, // 8
  B01111011  // 9  
};

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:");

 // ждет секунду, перед следующей итерацией цикла.


    digitalWrite(latchPin, LOW); 
    shiftOut(dataPin, clockPin, MSBFIRST, mask[sek/10]); // передаем последовательно на dataPin     
    digitalWrite(latchPin, HIGH); //"защелкиваем" регистр

    digitalWrite(led2, 1);   
    delay(dir);// пауза перед следующей итерацией
    digitalWrite(led2, 0);     

    digitalWrite(latchPin, LOW); 
    shiftOut(dataPin, clockPin, MSBFIRST, mask[sek%10]); // передаем последовательно на dataPin
    digitalWrite(latchPin, HIGH); //"защелкиваем" регистр

    digitalWrite(led1, 1); 
    delay(dir); // пауза перед следующей итерацией
    digitalWrite(led1, 0);
  }

 

Protez1999
Offline
Зарегистрирован: 08.07.2012

Подправил. вот все норм работает спасиб . паузы убрались затухание тож. секунды хвататет чтоб полностью пропасть

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

maksim пишет:

Protez1999 пишет:

Извините за мою тупость но я уже несколько раз писал что нужно запитать сток исток минусами затвор плюс. если нет диода между затвором и истоком ниче не работает   . транзистор кп 505. если сток плюс исток минус то и так все нормально работает

Я все равно без схемы не совсем понимаю как вы подключаете транзистор, но точно знаю, что при нормальном включении никакого диода быть не должно, если уж вы собираетесь покупать диоды для неверного подключения, то купите лучше другие транзисторы - обычные биполярные и пару резисторов к ним.

Я тоже толком не понял. Ну неужели трудно нарисовать схему? Некоторые рисуют на бумажке и загоняют в комп через фотик, сканер или даже веб-камеру!

Возможно, здесь была ситуация, когда вывод был настроен на вход, "1" подключала подтягивающее сопротивление, "0" - отключал, после чего заряд затвора транзистора неторопясь рассасывался. А вообще, при прочих правильных условиях, этому транзистору ничего не нужно.

Protez1999
Offline
Зарегистрирован: 08.07.2012

 

Protez1999
Offline
Зарегистрирован: 08.07.2012

код для секундомера работает и без диодов . код с 15 сообщения тока с диодами

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Protez1999 пишет:

код для секундомера работает и без диодов . код с 15 сообщения тока с диодами

Все верно, в #15 пины не настроены как выход.

А почему в "схеме" не указаны анод и катод у диода?

Protez1999
Offline
Зарегистрирован: 08.07.2012

плюс диода + ардуины  

Protez1999
Offline
Зарегистрирован: 08.07.2012

100% правы изза того что не указал выход и не работатало а диод отсекал 1 направлени А я чут ли не с пеной у рта доказывал что это не так. КАЮСЬ. но всеравно засветка есть возможно транзистор или мало времени чтоб погаснуть.

Protez1999
Offline
Зарегистрирован: 08.07.2012
digitalWrite(latchPin, LOW); 
    shiftOut(dataPin, clockPin, MSBFIRST, B01101011); // передаем последовательно на dataPin     
    digitalWrite(latchPin, HIGH); //"защелкиваем" регистр

    digitalWrite(led2, 1);   
    delay(dir);// пауза перед следующей итерацией
    digitalWrite(led2, 0);     

    digitalWrite(latchPin, LOW); 
    shiftOut(dataPin, clockPin, MSBFIRST, B10101011); // передаем последовательно на dataPin
    digitalWrite(latchPin, HIGH); //"защелкиваем" регистр

    digitalWrite(led1, 1); 
    delay(dir); // пауза перед следующей итерацией
    digitalWrite(led1, 0);

так нет засветки спасибо максиму 

maksim
Offline
Зарегистрирован: 12.02.2012

Сообщение #47

maksim пишет:
Если вы раньше уже пробовали включать транзистор по-всякому, то он мог не работать из-за того что не были настроены выводы.

 

maksim
Offline
Зарегистрирован: 12.02.2012

  

Protez1999
Offline
Зарегистрирован: 08.07.2012

оно сильно  засвечивало сильно оба знака 

Protez1999
Offline
Зарегистрирован: 08.07.2012

ЗАСВЕТКА БЫЛА ИЗ_ЗА ТОГО ЧТО СТОК ИСТОК БЫЛИ ПЕРЕПУТАНЫ!!!!! 

Protez1999
Offline
Зарегистрирован: 08.07.2012

Каким образом можно добавить минуты и часы  ?? насколькоя понимаю код отсчета связан с кодом часов тока задержкой на переключение в 1 секунду. поставил точно такой экранчик тока на 4 знака. не пойму как привязать  еще два знака для начала к минутам 

maksim
Offline
Зарегистрирован: 12.02.2012

 Да точно так же как и с секундами.

Protez1999
Offline
Зарегистрирован: 08.07.2012

digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, mask[sek/59]); // передаем последовательно на dataPin
digitalWrite(latchPin, HIGH); //"защелкиваем" регистр

digitalWrite(led2, 1);
delay(dir);// пауза перед следующей итерацией
digitalWrite(led2, 0);

???? если не туплю 

maksim
Offline
Зарегистрирован: 12.02.2012

 У вас же уже есть расчет минут, вам нужно таким же способом как и секунды вывести на дисплей минуты.

Protez1999
Offline
Зарегистрирован: 08.07.2012

точку всунул как отдельный элемент

leptodon
Offline
Зарегистрирован: 27.09.2012

 Здравствуйте, прошу помощи с моими часами собранными на дуине. У меня четыре 7ми сегментных лампочки все спаял подключил, но с программированием у меня туговато. С кодом чуть выше который у меня идут секунды, единицы в 1 и 3 лампе, а десятки во 2й и 4й. Помогите пожалуйста подправить код под мои цели, буду очень признателен.

P.s. Рядом на этойже плате собрана небольшая схемка часов на DS1307, есть ли возможность получать время с нее, запихивать в дуину и высвечивать на индикаторах?

Заранее спасибо за ответы.

maksim
Offline
Зарегистрирован: 12.02.2012
maksim
Offline
Зарегистрирован: 12.02.2012
leptodon
Offline
Зарегистрирован: 27.09.2012

Я разобрался с проблемой, регистры сдвига нужно было перепаять в обратной последовательности. Возникли новые проблемы. После загрузки скетча минуты выставляет, а часы нет. Можно ли прикрутить 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);
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

Я вообще не понимаю как этот код у вас может работать??? Вы не определии выводы, к которым подключены катоды дисплея и не настроили их на выход...

int led1;
int led2; //мин
int led3;
int led4; //часы

 

 

 

leptodon
Offline
Зарегистрирован: 27.09.2012

 Дело в том, что я использую вот такую лампу и там общий вывод, которые соеденины вместе. А каждая нога идет напрямую на ногу регистра 74hc595, по этому мне эти выводы led1, led2, led3, led4 не нужны вовсе.

maksim
Offline
Зарегистрирован: 12.02.2012

Они конечно может вам и не нужны, но работать у вас с этим кодом ваш индикатор не будет, так как тогда состояние катодов вам нужно выводить в регистры.
Данный код предназначен для индикатора подключенного анодами к одному сдвиговому регистру и катодами (через транзисторы) к выводам дуины. Когда у вас, если я правильно понял, и катоды (через транзисторы) и аноды подключены к двум сдвиговым регистрам, я правильно понимаю?

Схему вашего подключения посмотреть можно?
Сохранение картинок на форуме

leptodon
Offline
Зарегистрирован: 27.09.2012

 Во-первых у меня нет транзисторов, во-вторых у меня 4 сдвиговых регистра т.к. у каждой лампы-индикатора 7 ног и 1 общая. Как это не странно, но все работает с этим кодом, только при заливке скетча у меня выставляются только минуты, часы не хотят. Схему нарисовал так как паял схему все 1:1. 

ссылка на схему

maksim
Offline
Зарегистрирован: 12.02.2012

То что у вас работает с этим кодом - это чистая случайность, у вас вообще статическая индикация, а код предназначен для динамической. 

В вашем случае все проще:

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 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 
};

void loop()
{
  time = millis() + time_setup;
  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:");

  digitalWrite(latchPin, LOW); 
  shiftOut(dataPin, clockPin, MSBFIRST, mask[(cas)%10]);   //часы
  shiftOut(dataPin, clockPin, MSBFIRST, mask[(cas)/10]);
  shiftOut(dataPin, clockPin, MSBFIRST, mask[(minyt2)/10]); // минуты
  shiftOut(dataPin, clockPin, MSBFIRST, mask[(minyt2)%10]); 
  digitalWrite(latchPin, HIGH); //"защелкиваем" регистр
  delay(1000);
}

 

leptodon
Offline
Зарегистрирован: 27.09.2012

Спасибо за код, все работает. Посоветуйте пожалуйста какой дешовой атмегой можно заменить ардуину, чтобы сделать их автономными? И как все-таки прикрутить ds1307, чтобы часы без питания не обнулялись?

 P.s. нашел косяк небольшой, через 59 минут следующая цифра высвечивается 60, а не 00. Где править подскажите.

maksim
Offline
Зарегистрирован: 12.02.2012

Дуину можно заменить например ATmega8, как работать с ds1307 инфы валом, расчет секунд/минут/часов писал не я так что попробуйте сами разобраться или напишите свой расчет.

leshak
Offline
Зарегистрирован: 29.09.2011

leptodon пишет:

 И как все-таки прикрутить ds1307, чтобы часы без питания не обнулялись?

Чудес не бывает. Святым духом микросхемы питатся не умеют. Так что какое-то питание, хотя-бы для одной ds1307 потребуется в любом случае. Хотя-бы "махонькой часовой батарейки".

Схему "как это прикрутить" думаю можно подсмотреть в готовых шилдах (гугланите, есть шилды ds1307 с батарейкой).

leshak
Offline
Зарегистрирован: 29.09.2011

 Ну вот на слова "DS1307 ds1307 battery" гугл ПЕРВОЙ ссылкой дает http://www.ladyada.net/learn/breakoutplus/ds1307rtc.html

P.S. Кстати это все уже как-то далеко от названия топика "led 2 цифры 8 контактов прикрутить к ардуине"