1

Тема: Простые часы на семисегментных индикаторах (Arduino Nano+ds3231)

индикаторы - 5161AS - http://www.xlitx.com/datasheet/5161AS.pdf

http://forum.rcl-radio.ru/uploads/images/2023/09/499292c4bb8938984ba7abc9577eea7c.png


http://forum.rcl-radio.ru/uploads/images/2023/09/c3c8a1e3cde1668446975d083a92811c.png

#define K3 A3
#define K2 A2
#define K1 A1
#define K0 A0

#define SEG_A       8 
#define SEG_B       7 
#define SEG_C       4 
#define SEG_D       5 
#define SEG_E       2 
#define SEG_F       6
#define SEG_G       9 
#define SEG_DP      3 

#define SET  10
#define UP   11
#define DW   12

#define NIGHT 1

#include <EEPROM.h>
#include <Wire.h>
#include <DS3231.h>             // http://rcl-radio.ru/wp-content/uploads/2022/10/DS3231.zip
DS3231 clock;RTCDateTime DateTime;
byte an,segm,a[4],i,dp;
int hour,minut,secon,old_sec,hh,mm,set=0;
unsigned long times,times1;
int brig,br;


void setup(){
  Wire.begin();
  clock.begin();
  Serial.begin(9600);
  cli();
  TCCR2A = 0;
  TCCR2B = 0;
  TCNT2 = 0;
// (16000000/((155+1)x256))=400.64102564103 Hz
  OCR2A = 155;
  TCCR2A |= (1 << WGM21);
// Prescaler 256
  TCCR2B |= (1 << CS22) | (1 << CS21);
  TIMSK2 |= (1 << OCIE2A);
  sei();
  pinMode(K3,OUTPUT);
  pinMode(K2,OUTPUT);
  pinMode(K1,OUTPUT);
  pinMode(K0,OUTPUT);
  pinMode(SEG_A, OUTPUT);
  pinMode(SEG_B, OUTPUT);
  pinMode(SEG_C, OUTPUT);
  pinMode(SEG_D, OUTPUT);
  pinMode(SEG_E, OUTPUT);
  pinMode(SEG_F, OUTPUT);
  pinMode(SEG_G, OUTPUT);
  pinMode(SEG_DP, OUTPUT);
  pinMode (SET,INPUT_PULLUP);
  pinMode (UP,INPUT_PULLUP);
  pinMode (DW,INPUT_PULLUP);
  brig = EEPROM.read(100);
  if(brig>20){brig=1;EEPROM.update(100,brig);}
  }

void loop(){
  DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second;

  if((hour<7||hour>=22)&&NIGHT==1){br=20;}else{br=brig;}

  if(digitalRead(SET)==LOW){set++;if(set>2){set=0;}delay(200);}
  hh=hour;mm=minut;
  if(set==1 && digitalRead(UP)==LOW){hh++;if(hh>23){hh=0;}clock.setDateTime(2023, 9, 5, hh, minut, 0);delay(200);}
  if(set==1 && digitalRead(DW)==LOW){hh--;if(hh<0){hh=0;}clock.setDateTime(2023, 9, 5, hh, minut, 0);delay(200);}
  if(set==2 && digitalRead(UP)==LOW){mm++;if(mm>59){mm=0;}clock.setDateTime(2023, 9, 5, hour, mm, 0);delay(200);}
  if(set==2 && digitalRead(DW)==LOW){mm--;if(mm<0){mm=0;}clock.setDateTime(2023, 9, 5, hour, mm, 0);delay(200);}
  if(set==0 && digitalRead(UP)==LOW){brig--;if(brig<1){brig=1;}EEPROM.update(100,brig);delay(200);}
  if(set==0 && digitalRead(DW)==LOW){brig++;if(brig>20){brig=20;}EEPROM.update(100,brig);delay(200);}

  if(set==1&&millis()-times<200){a[0]=10;a[1]=10;}  
    else{a[0] = hour/10%10; a[1] = hour%10; }
  if(set==2&&millis()-times<200){a[2]=10;a[3]=10;}  
    else{a[2] = minut/10%10; a[3] = minut%10; }
  
  if(set==0){ 
    a[0]=hour/10%10;
    a[1]=hour%10;
    a[2]=minut/10%10;
    a[3]=minut%10;
    }
  if(millis()-times>400){times=millis();}
  if(millis()-times1<500){dp=1;}else{dp=0;}
  if(old_sec!=secon){old_sec=secon;times1=millis();}
  delay(100);
  }  

void segment() {
  switch (segm) {
            //  A          B             C              D             E            F            G
    case 0: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 0); break; // 0
    case 1: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // 1
    case 2: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 1); break; // 2
    case 3: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 1); break; // 3
    case 4: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 1); break; // 4
    case 5: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 1); break; // 5
    case 6: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 6
    case 7: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // 7
    case 8: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 8
    case 9: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 1); break; // 9
   case 10: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // пусто
  }
}


ISR(TIMER2_COMPA_vect){
   switch (i) {
    case 0: segm = 10; segment();an = 10;kat();delayMicroseconds(br*100);segm = a[0];segment();an = 0;kat();ch(SEG_DP, 0);break;
    case 1: segm = 10; segment();an = 10;kat();delayMicroseconds(br*100);segm = a[1];segment();an = 1;kat();ch(SEG_DP, dp);break;
    case 2: segm = 10; segment();an = 10;kat();delayMicroseconds(br*100);segm = a[2];segment();an = 2;kat();ch(SEG_DP, dp);break;
    case 3: segm = 10; segment();an = 10;kat();delayMicroseconds(br*100);segm = a[3];segment();an = 3;kat();ch(SEG_DP, 0);break;
  }
  i++;if (i > 3) {i = 0;}
  }

void kat() {
  switch (an) {
    case 0: ch(K3, 1); ch(K2, 0); ch(K1, 0); ch(K0, 0); break;
    case 1: ch(K3, 0); ch(K2, 1); ch(K1, 0); ch(K0, 0); break;
    case 2: ch(K3, 0); ch(K2, 0); ch(K1, 1); ch(K0, 0); break;
    case 3: ch(K3, 0); ch(K2, 0); ch(K1, 0); ch(K0, 1); break;
   case 10: ch(K3, 0); ch(K2, 0); ch(K1, 0); ch(K0, 0); break;
  }
}  

void ch(int pin, int logic){digitalWrite(pin, logic);}

2

Re: Простые часы на семисегментных индикаторах (Arduino Nano+ds3231)

http://forum.rcl-radio.ru/uploads/images/2023/09/b21bfa7f9a01bbf7fd586ddea79a32bd.png

http://forum.rcl-radio.ru/uploads/images/2023/09/c90338abf27c039057236cf9c7873dc9.png

3

Re: Простые часы на семисегментных индикаторах (Arduino Nano+ds3231)

http://forum.rcl-radio.ru/uploads/images/2023/09/d1e5ac610e6ef63fe59eaa4ccbf99880.gif

4

Re: Простые часы на семисегментных индикаторах (Arduino Nano+ds3231)

Добрый день!
А что нужно переделать в скетче, что бы можно было подключить индикаторы с общим анодом?

5

Re: Простые часы на семисегментных индикаторах (Arduino Nano+ds3231)

В функциях kat() и segment() инвертировать выходы