Re: Часы с календарем
Физически
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
forum.rcl-radio.ru → Новые идеи для проектов Arduino → Часы с календарем
Страницы Назад 1 … 10 11 12 13 14 15 16 Далее
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Физически
Физически
Дни недели
Полностью проверить можно будет только после добавления кнопок коррекции времени
// 19 === SCL
// 20 === SDA
#define DIN PD3
#define CS PD4
#define CLK PD5
//// Катоды
#define SEG_A 28
#define SEG_B 29
#define SEG_C 30
#define SEG_D 31
#define SEG_E 23
#define SEG_F 22
#define SEG_G 21
#define SEG_DP 20
//// Аноды
#define AN_Q1 3
#define AN_Q2 2
#define AN_Q3 1
#define AN_Q4 0
#define AN_Q5 24
#define AN_Q6 25
#define AN_Q7 26
#define AN_Q8 27
#include <Wire.h>
#include <DS3231.h> // http://rcl-radio.ru/wp-content/uploads/2022/10/DS3231.zip
#include <OneWire.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip
DS3231 clock;RTCDateTime DateTime;
OneWire ds(4); // Вход датчика 18b20 (PD4 44 пин контр)
long oldPosition = -999, newPosition, times,times1,times2;
int a[8],segm,i,an, dp1,dp2;
int old_sec,dp,dp_l;
int hour,minut,secon,data,mon,year,den;
int temp;
long dn1[8],dn2[8];
void setup() {
Wire.begin();
clock.begin();
DDRD |= (1 << DIN) | (1 << CS) | (1 << CLK);
max7219(0x0F, 0, 0);// тест выкл.
max7219(0x0C, 1, 1);// вкл. индик.
max7219(0x0A, 1, 1);// яркость
max7219(0x09, 0, 0);// дешифраторы выкл.
max7219(0x0B, 7, 7);// кол-во разрядов
// clock.setDateTime(2023, 8, 26, 20, 40, 0);
cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
// (8000000/((300+1)x64))=415.28239202658 Hz
OCR1A = 300;
TCCR1B |= (1 << WGM12);
// Prescaler 64
TCCR1B |= (1 << CS11) | (1 << CS10);
TIMSK |= (1 << OCIE1A);
sei();
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(AN_Q1, OUTPUT);
pinMode(AN_Q2, OUTPUT);
pinMode(AN_Q3, OUTPUT);
pinMode(AN_Q4, OUTPUT);
pinMode(AN_Q5, OUTPUT);
pinMode(AN_Q6, OUTPUT);
pinMode(AN_Q7, OUTPUT);
pinMode(AN_Q8, OUTPUT);
// pinMode (EXIT,INPUT_PULLUP);
}
void loop() {
DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second;
data = DateTime.day;mon = DateTime.month;year = DateTime.year;
den=DateTime.dayOfWeek;
if(millis()-times1>10){temp=dsRead(0)*10;times1=millis();}
switch(den){
case 1:max7219(1, 0x7e,0x66);max7219(2, 0x7e,0x66);max7219(3, 0x66,0x66);max7219(4, 0x66,0x7e);
max7219(5, 0x66,0x66);max7219(6, 0x66,0x66);max7219(7, 0x66,0x66);max7219(8, 0x00,0x00);break;// ПH
case 2:max7219(1, 0x7c,0x7e);max7219(2, 0x66,0x18);max7219(3, 0x66,0x18);max7219(4, 0x66,0x18);
max7219(5, 0x66,0x18);max7219(6, 0x66,0x18);max7219(7, 0x66,0x18);max7219(8, 0x00,0x00);break;// BT
case 3:max7219(1, 0x3c,0x7c);max7219(2, 0x66,0x66);max7219(3, 0xc0,0x66);max7219(4, 0xc0,0x7c);
max7219(5, 0x66,0x60);max7219(6, 0x66,0x60);max7219(7, 0x66,0x60);max7219(8, 0x00,0x00);break;// CP
case 4:max7219(1, 0x66,0x7e);max7219(2, 0x66,0x18);max7219(3, 0x66,0x18);max7219(4, 0x3e,0x18);
max7219(5, 0x6,0x18);max7219(6, 0x6,0x18);max7219(7, 0x6,0x18);max7219(8, 0x00,0x00);break; // ЧТ
case 5:max7219(1, 0x7e,0x7e);max7219(2, 0x7e,0x18);max7219(3, 0x66,0x18);max7219(4, 0x66,0x18);
max7219(5, 0x66,0x18);max7219(6, 0x66,0x18);max7219(7, 0x66,0x18);max7219(8, 0x00,0x00);break;// ПТ
case 6:max7219(1, 0x3c,0x7c);max7219(2, 0x66,0x60);max7219(3, 0xc0,0x60);max7219(4, 0xc0,0x7c);
max7219(5, 0x66,0x66);max7219(6, 0x66,0x66);max7219(7, 0x66,0x7c);max7219(8, 0x00,0x00);break;// CБ
case 7:max7219(1, 0x7c,0x3c);max7219(2, 0x66,0x66);max7219(3, 0x66,0x00);max7219(4, 0x66,0x00);
max7219(5, 0x66,0x00);max7219(6, 0x66,0x66);max7219(7, 0x66,0x3c);max7219(8, 0x00,0x00);break;// BС
}
if(hour/10%10==0){a[0]=10;}else{a[0]=hour/10%10;}
a[1]=hour%10;
a[2]=minut/10%10;
a[3]=minut%10;
if( (secon>=5&&secon<=10) || (secon>=25&&secon<=30) || (secon>=45&&secon<50)){ dp_l=0;
if(data/10%10==0){a[4]=10;}else{a[4]=data/10%10;}
a[5]=data%10;
if(mon/10%10==0){a[6]=10;}else{a[6]=mon/10%10;}
a[7]=mon%10;
}
else{
if(temp>=0&&temp<100){dp_l=0;a[4]=10;a[5]=temp/10%10;a[6]=temp%10;a[7]=11; } // _1.3C
if(temp>=100){dp_l=0;a[4]=temp/100%10;a[5]=temp/10%10;a[6]=temp%10;a[7]=11; } // 23.5C
if(temp<0&&temp>-100){dp_l=0;a[4]=12;a[5]=abs(temp/10%10);a[6]=abs(temp%10);a[7]=11; } // -1.3C
if(temp<=-100){dp_l=1;a[4]=12;a[5]=abs(temp/100%10);a[6]=abs(temp/10%10);a[7]=11; } // -23C
}
if(millis()-times<500){dp=1;}else{dp=0;}
if(old_sec!=secon){old_sec=secon;times=millis();}
delay(100);
}
ISR(TIMER1_COMPA_vect){
switch (i) {
/// SMALL
// Q5
case 4: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[4];ch(SEG_DP,1); segment(); an = 0; anod();break;
// Q6
case 5: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[5];ch(SEG_DP,dp_l); segment(); an = 1; anod();break;
// Q7
case 6: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[6];ch(SEG_DP,1); segment(); an = 2; anod();break;
// Q8
case 7: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[7]; segment(); an = 3; anod();break;
/// BIG
// Q1
case 0: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[0];ch(SEG_DP,1); segment(); an = 4; anod();break;
// Q2
case 1: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[1];ch(SEG_DP,dp); segment(); an = 5; anod();break;
// Q3
case 2: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[2];ch(SEG_DP,dp); segment(); an = 6; anod();break;
// Q4
case 3: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[3];ch(SEG_DP,1); segment(); an = 7; anod();break;
}
i++;if (i > 7) {i = 0;}
}
void segment() {
switch (segm) {
// A B C D E F G
case 0: 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, 1); break; // 0
case 1: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 1
case 2: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 0); break; // 2
case 3: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 0); break; // 3
case 4: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 4
case 5: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 5
case 6: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // 6
case 7: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 7
case 8: 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; // 8
case 9: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 9
case 10: 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; // пусто
case 11: 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, 1);ch(SEG_DP, 0); break; // *C
case 12: 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; // -
}
}
void anod() {
switch (an) {
case 0: ch(AN_Q1, 1); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 1: ch(AN_Q1, 0); ch(AN_Q2, 1); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 2: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 1); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 3: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 1); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 4: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 1); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 5: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 1); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 6: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 1); ch(AN_Q8, 0); break;
case 7: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 1); break;
case 10: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
}
}
void ch(int pin, int logic) {
digitalWrite(pin, logic);
}
float dsRead(byte x) {
byte data[2], addr[8][8], kol = 0;
while (ds.search(addr[kol])) { // поиск датчиков, определение адреса и кол-ва датчиков
kol++;
}
ds.reset_search(); // Сброс поиска датчика
ds.reset(); // Инициализация, выполняется сброс шины
ds.select(addr[x]); // Обращение к датчику по адресу
ds.write(0x44, 0); // Измерение температуры с переносом данных в память
ds.reset(); // Инициализация, выполняется сброс шины
ds.select(addr[x]); // Обращение к датчику по адресу
ds.write(0xBE); // Обращение памяти
data[0] = ds.read();// Чтение памяти byte low
data[1] = ds.read();// Чтение памяти byte high
float value = ((data[1] << 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод
}
void max7219(byte reg_n, byte h1, byte h2){
PORTD &=~(1 << CS);WriteBit16(reg_n,h1);WriteBit16(reg_n,h2);PORTD |=(1 << CS);
}
void WriteBit16(byte reg, byte data){
for(char i = 7; i >= 0; i--){
PORTD &= ~(1 << CLK);
if(((reg >> i) & 1) == 1){PORTD |= (1 << DIN);}else{PORTD &= ~(1 << DIN);}
PORTD |=(1 << CLK);}
for(char i = 7; i >= 0; i--){
PORTD &= ~(1 << CLK);
if(((data >> i) & 1) == 1){PORTD |= (1 << DIN);}else{PORTD &= ~(1 << DIN);}
PORTD |=(1 << CLK);}
PORTD &= ~(1 << CLK);PORTD |= (1 << DIN);
}
void cl(){for(char i=1;i<=8;i++){max7219(i, 0, 0);}}
Здравствуйте. Куда подключить кнопки?
// 19 === SCL
// 20 === SDA
#define DIN PD3
#define CS PD4
#define CLK PD5
//// Катоды
#define SEG_A 28
#define SEG_B 29
#define SEG_C 30
#define SEG_D 31
#define SEG_E 23
#define SEG_F 22
#define SEG_G 21
#define SEG_DP 20
//// Аноды
#define AN_Q1 3
#define AN_Q2 2
#define AN_Q3 1
#define AN_Q4 0
#define AN_Q5 24
#define AN_Q6 25
#define AN_Q7 26
#define AN_Q8 27
#define SET 10
#define UP 9
#define DW 8
#include <Wire.h>
#include <DS3231.h> // http://rcl-radio.ru/wp-content/uploads/2022/10/DS3231.zip
#include <OneWire.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip
DS3231 clock;RTCDateTime DateTime;
OneWire ds(4); // Вход датчика 18b20 (PD4 44 пин контр)
long oldPosition = -999, newPosition, times,times1,times2;
int a[8],segm,i,an, dp1,dp2;
int old_sec,dp,dp_l;
int hour,minut,secon,data,mon,year,den;
int temp;
long dn1[8],dn2[8];
int hh,mm,ss,dd,mes,gg,set;
void setup() {
Wire.begin();
clock.begin();
DDRD |= (1 << DIN) | (1 << CS) | (1 << CLK);
max7219(0x0F, 0, 0);// тест выкл.
max7219(0x0C, 1, 1);// вкл. индик.
max7219(0x0A, 1, 1);// яркость
max7219(0x09, 0, 0);// дешифраторы выкл.
max7219(0x0B, 7, 7);// кол-во разрядов
// clock.setDateTime(2023, 8, 26, 20, 40, 0);
cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
// (8000000/((300+1)x64))=415.28239202658 Hz
OCR1A = 300;
TCCR1B |= (1 << WGM12);
// Prescaler 64
TCCR1B |= (1 << CS11) | (1 << CS10);
TIMSK |= (1 << OCIE1A);
sei();
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(AN_Q1, OUTPUT);
pinMode(AN_Q2, OUTPUT);
pinMode(AN_Q3, OUTPUT);
pinMode(AN_Q4, OUTPUT);
pinMode(AN_Q5, OUTPUT);
pinMode(AN_Q6, OUTPUT);
pinMode(AN_Q7, OUTPUT);
pinMode(AN_Q8, OUTPUT);
// pinMode (EXIT,INPUT_PULLUP);
}
void loop() {
DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second;
data = DateTime.day;mon = DateTime.month;year = DateTime.year;
den=DateTime.dayOfWeek;
if(millis()-times1>10){temp=dsRead(0)*10;times1=millis();}
if(digitalRead(SET)==LOW){set++;if(set>5){set=0;}delay(200);}
hh=hour;mm=minut;ss=secon;dd=data;mes=mon;gg=hour;
if(set==1 && digitalRead(UP)==LOW){hh++;if(hh>23){hh=0;}clock.setDateTime(year, mon, data, hh, minut, secon);delay(200);}
if(set==1 && digitalRead(DW)==LOW){hh--;if(hh<0){hh=0;}clock.setDateTime(year, mon, data, hh, minut, secon);delay(200);}
if(set==2 && digitalRead(UP)==LOW){mm++;if(mm>59){mm=0;}clock.setDateTime(year, mon, data, hour, mm, 0);delay(200);}
if(set==2 && digitalRead(DW)==LOW){mm--;if(mm<0){mm=0;}clock.setDateTime(year, mon, data, hour, mm, 0);delay(200);}
if(set==3 && digitalRead(UP)==LOW){dd++;if(dd>31){dd=31;}clock.setDateTime(year, mon, dd, hour, minut, secon);delay(200);}
if(set==3 && digitalRead(DW)==LOW){dd--;if(dd<1){dd=1;}clock.setDateTime(year, mon, dd, hour, minut, secon);delay(200);}
if(set==4 && digitalRead(UP)==LOW){mes++;if(mes>12){mes=12;}clock.setDateTime(year, mes, data, hour, minut, secon);delay(200);}
if(set==4 && digitalRead(DW)==LOW){mes--;if(mes<1){mes=1;}clock.setDateTime(year, mes, data, hour, minut, secon);delay(200);}
if(set==5 && digitalRead(UP)==LOW){gg++;if(gg>2100){gg=2100;}clock.setDateTime(gg, mon, data, hour, minut, secon);delay(200);}
if(set==5 && digitalRead(DW)==LOW){gg--;if(gg<2023){gg=2023;}clock.setDateTime(gg, mon, data, hour, minut, secon);delay(200);}
if(set==1){a[0] = hour/10%10;a[1] = hour%10; a[2]=10;a[3]=10;a[4]=10;a[5]=10;a[6]=10;a[7]=10;}
if(set==2){a[2] = minut/10%10;a[3] = minut%10; a[0]=10;a[1]=10;a[4]=10;a[5]=10;a[6]=10;a[7]=10;}
if(set==3){a[4] = data/10%10;a[5] = data%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;a[6]=10;a[7]=10;}
if(set==4){a[6] = mon/10%10;a[7] = mon%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;a[4]=10;a[5]=10;}
if(set==5){a[4] = year/1000%10;a[5] = year/100%10;a[6] = year/10%10; a[7] = year%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;}
if(set>0){dp_l=1;dp=1;dp1=1;dp2=1;}
switch(den){
case 1:max7219(1, 0x7e,0x66);max7219(2, 0x7e,0x66);max7219(3, 0x66,0x66);max7219(4, 0x66,0x7e);
max7219(5, 0x66,0x66);max7219(6, 0x66,0x66);max7219(7, 0x66,0x66);max7219(8, 0x00,0x00);break;// ПH
case 2:max7219(1, 0x7c,0x7e);max7219(2, 0x66,0x18);max7219(3, 0x66,0x18);max7219(4, 0x66,0x18);
max7219(5, 0x66,0x18);max7219(6, 0x66,0x18);max7219(7, 0x66,0x18);max7219(8, 0x00,0x00);break;// BT
case 3:max7219(1, 0x3c,0x7c);max7219(2, 0x66,0x66);max7219(3, 0xc0,0x66);max7219(4, 0xc0,0x7c);
max7219(5, 0x66,0x60);max7219(6, 0x66,0x60);max7219(7, 0x66,0x60);max7219(8, 0x00,0x00);break;// CP
case 4:max7219(1, 0x66,0x7e);max7219(2, 0x66,0x18);max7219(3, 0x66,0x18);max7219(4, 0x3e,0x18);
max7219(5, 0x6,0x18);max7219(6, 0x6,0x18);max7219(7, 0x6,0x18);max7219(8, 0x00,0x00);break; // ЧТ
case 5:max7219(1, 0x7e,0x7e);max7219(2, 0x7e,0x18);max7219(3, 0x66,0x18);max7219(4, 0x66,0x18);
max7219(5, 0x66,0x18);max7219(6, 0x66,0x18);max7219(7, 0x66,0x18);max7219(8, 0x00,0x00);break;// ПТ
case 6:max7219(1, 0x3c,0x7c);max7219(2, 0x66,0x60);max7219(3, 0xc0,0x60);max7219(4, 0xc0,0x7c);
max7219(5, 0x66,0x66);max7219(6, 0x66,0x66);max7219(7, 0x66,0x7c);max7219(8, 0x00,0x00);break;// CБ
case 7:max7219(1, 0x7c,0x3c);max7219(2, 0x66,0x66);max7219(3, 0x66,0x00);max7219(4, 0x66,0x00);
max7219(5, 0x66,0x00);max7219(6, 0x66,0x66);max7219(7, 0x66,0x3c);max7219(8, 0x00,0x00);break;// BС
}
if(set==0){
if(hour/10%10==0){a[0]=10;}else{a[0]=hour/10%10;}
a[1]=hour%10;
a[2]=minut/10%10;
a[3]=minut%10;
if( (secon>=5&&secon<=10) || (secon>=25&&secon<=30) || (secon>=45&&secon<50)){ dp_l=0;
if(data/10%10==0){a[4]=10;}else{a[4]=data/10%10;}
a[5]=data%10;
if(mon/10%10==0){a[6]=10;}else{a[6]=mon/10%10;}
a[7]=mon%10;
}
else{
if(temp>=0&&temp<100){dp_l=0;a[4]=10;a[5]=temp/10%10;a[6]=temp%10;a[7]=11; } // _1.3C
if(temp>=100){dp_l=0;a[4]=temp/100%10;a[5]=temp/10%10;a[6]=temp%10;a[7]=11; } // 23.5C
if(temp<0&&temp>-100){dp_l=0;a[4]=12;a[5]=abs(temp/10%10);a[6]=abs(temp%10);a[7]=11; } // -1.3C
if(temp<=-100){dp_l=1;a[4]=12;a[5]=abs(temp/100%10);a[6]=abs(temp/10%10);a[7]=11; } // -23C
}
if(millis()-times<500){dp=1;}else{dp=0;}
if(old_sec!=secon){old_sec=secon;times=millis();}
}
delay(100);
}
ISR(TIMER1_COMPA_vect){
switch (i) {
/// SMALL
// Q5
case 4: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[4];ch(SEG_DP,1); segment(); an = 0; anod();break;
// Q6
case 5: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[5];ch(SEG_DP,dp_l); segment(); an = 1; anod();break;
// Q7
case 6: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[6];ch(SEG_DP,1); segment(); an = 2; anod();break;
// Q8
case 7: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[7]; segment(); an = 3; anod();break;
/// BIG
// Q1
case 0: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[0];ch(SEG_DP,1); segment(); an = 4; anod();break;
// Q2
case 1: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[1];ch(SEG_DP,dp); segment(); an = 5; anod();break;
// Q3
case 2: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[2];ch(SEG_DP,dp); segment(); an = 6; anod();break;
// Q4
case 3: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[3];ch(SEG_DP,1); segment(); an = 7; anod();break;
}
i++;if (i > 7) {i = 0;}
}
void segment() {
switch (segm) {
// A B C D E F G
case 0: 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, 1); break; // 0
case 1: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 1
case 2: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 0); break; // 2
case 3: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 0); break; // 3
case 4: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 4
case 5: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 5
case 6: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // 6
case 7: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 7
case 8: 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; // 8
case 9: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 9
case 10: 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; // пусто
case 11: 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, 1);ch(SEG_DP, 0); break; // *C
case 12: 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; // -
}
}
void anod() {
switch (an) {
case 0: ch(AN_Q1, 1); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 1: ch(AN_Q1, 0); ch(AN_Q2, 1); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 2: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 1); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 3: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 1); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 4: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 1); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 5: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 1); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 6: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 1); ch(AN_Q8, 0); break;
case 7: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 1); break;
case 10: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
}
}
void ch(int pin, int logic) {
digitalWrite(pin, logic);
}
float dsRead(byte x) {
byte data[2], addr[8][8], kol = 0;
while (ds.search(addr[kol])) { // поиск датчиков, определение адреса и кол-ва датчиков
kol++;
}
ds.reset_search(); // Сброс поиска датчика
ds.reset(); // Инициализация, выполняется сброс шины
ds.select(addr[x]); // Обращение к датчику по адресу
ds.write(0x44, 0); // Измерение температуры с переносом данных в память
ds.reset(); // Инициализация, выполняется сброс шины
ds.select(addr[x]); // Обращение к датчику по адресу
ds.write(0xBE); // Обращение памяти
data[0] = ds.read();// Чтение памяти byte low
data[1] = ds.read();// Чтение памяти byte high
float value = ((data[1] << 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод
}
void max7219(byte reg_n, byte h1, byte h2){
PORTD &=~(1 << CS);WriteBit16(reg_n,h1);WriteBit16(reg_n,h2);PORTD |=(1 << CS);
}
void WriteBit16(byte reg, byte data){
for(char i = 7; i >= 0; i--){
PORTD &= ~(1 << CLK);
if(((reg >> i) & 1) == 1){PORTD |= (1 << DIN);}else{PORTD &= ~(1 << DIN);}
PORTD |=(1 << CLK);}
for(char i = 7; i >= 0; i--){
PORTD &= ~(1 << CLK);
if(((data >> i) & 1) == 1){PORTD |= (1 << DIN);}else{PORTD &= ~(1 << DIN);}
PORTD |=(1 << CLK);}
PORTD &= ~(1 << CLK);PORTD |= (1 << DIN);
}
void cl(){for(char i=1;i<=8;i++){max7219(i, 0, 0);}}
// 19 === SCL // 20 === SDA #define DIN PD3 #define CS PD4 #define CLK PD5 //// Катоды #define SEG_A 28 #define SEG_B 29 #define SEG_C 30 #define SEG_D 31 #define SEG_E 23 #define SEG_F 22 #define SEG_G 21 #define SEG_DP 20 //// Аноды #define AN_Q1 3 #define AN_Q2 2 #define AN_Q3 1 #define AN_Q4 0 #define AN_Q5 24 #define AN_Q6 25 #define AN_Q7 26 #define AN_Q8 27 #define SET 10 #define UP 9 #define DW 8 #include <Wire.h> #include <DS3231.h> // http://rcl-radio.ru/wp-content/uploads/2022/10/DS3231.zip #include <OneWire.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip DS3231 clock;RTCDateTime DateTime; OneWire ds(4); // Вход датчика 18b20 (PD4 44 пин контр) long oldPosition = -999, newPosition, times,times1,times2; int a[8],segm,i,an, dp1,dp2; int old_sec,dp,dp_l; int hour,minut,secon,data,mon,year,den; int temp; long dn1[8],dn2[8]; int hh,mm,ss,dd,mes,gg,set; void setup() { Wire.begin(); clock.begin(); DDRD |= (1 << DIN) | (1 << CS) | (1 << CLK); max7219(0x0F, 0, 0);// тест выкл. max7219(0x0C, 1, 1);// вкл. индик. max7219(0x0A, 1, 1);// яркость max7219(0x09, 0, 0);// дешифраторы выкл. max7219(0x0B, 7, 7);// кол-во разрядов // clock.setDateTime(2023, 8, 26, 20, 40, 0); cli(); TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; // (8000000/((300+1)x64))=415.28239202658 Hz OCR1A = 300; TCCR1B |= (1 << WGM12); // Prescaler 64 TCCR1B |= (1 << CS11) | (1 << CS10); TIMSK |= (1 << OCIE1A); sei(); 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(AN_Q1, OUTPUT); pinMode(AN_Q2, OUTPUT); pinMode(AN_Q3, OUTPUT); pinMode(AN_Q4, OUTPUT); pinMode(AN_Q5, OUTPUT); pinMode(AN_Q6, OUTPUT); pinMode(AN_Q7, OUTPUT); pinMode(AN_Q8, OUTPUT); // pinMode (EXIT,INPUT_PULLUP); } void loop() { DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second; data = DateTime.day;mon = DateTime.month;year = DateTime.year; den=DateTime.dayOfWeek; if(millis()-times1>10){temp=dsRead(0)*10;times1=millis();} if(digitalRead(SET)==LOW){set++;if(set>5){set=0;}delay(200);} hh=hour;mm=minut;ss=secon;dd=data;mes=mon;gg=hour; if(set==1 && digitalRead(UP)==LOW){hh++;if(hh>23){hh=0;}clock.setDateTime(year, mon, data, hh, minut, secon);delay(200);} if(set==1 && digitalRead(DW)==LOW){hh--;if(hh<0){hh=0;}clock.setDateTime(year, mon, data, hh, minut, secon);delay(200);} if(set==2 && digitalRead(UP)==LOW){mm++;if(mm>59){mm=0;}clock.setDateTime(year, mon, data, hour, mm, 0);delay(200);} if(set==2 && digitalRead(DW)==LOW){mm--;if(mm<0){mm=0;}clock.setDateTime(year, mon, data, hour, mm, 0);delay(200);} if(set==3 && digitalRead(UP)==LOW){dd++;if(dd>31){dd=31;}clock.setDateTime(year, mon, dd, hour, minut, secon);delay(200);} if(set==3 && digitalRead(DW)==LOW){dd--;if(dd<1){dd=1;}clock.setDateTime(year, mon, dd, hour, minut, secon);delay(200);} if(set==4 && digitalRead(UP)==LOW){mes++;if(mes>12){mes=12;}clock.setDateTime(year, mes, data, hour, minut, secon);delay(200);} if(set==4 && digitalRead(DW)==LOW){mes--;if(mes<1){mes=1;}clock.setDateTime(year, mes, data, hour, minut, secon);delay(200);} if(set==5 && digitalRead(UP)==LOW){gg++;if(gg>2100){gg=2100;}clock.setDateTime(gg, mon, data, hour, minut, secon);delay(200);} if(set==5 && digitalRead(DW)==LOW){gg--;if(gg<2023){gg=2023;}clock.setDateTime(gg, mon, data, hour, minut, secon);delay(200);} if(set==1){a[0] = hour/10%10;a[1] = hour%10; a[2]=10;a[3]=10;a[4]=10;a[5]=10;a[6]=10;a[7]=10;} if(set==2){a[2] = minut/10%10;a[3] = minut%10; a[0]=10;a[1]=10;a[4]=10;a[5]=10;a[6]=10;a[7]=10;} if(set==3){a[4] = data/10%10;a[5] = data%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;a[6]=10;a[7]=10;} if(set==4){a[6] = mon/10%10;a[7] = mon%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;a[4]=10;a[5]=10;} if(set==5){a[4] = year/1000%10;a[5] = year/100%10;a[6] = year/10%10; a[7] = year%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;} if(set>0){dp_l=1;dp=1;dp1=1;dp2=1;} switch(den){ case 1:max7219(1, 0x7e,0x66);max7219(2, 0x7e,0x66);max7219(3, 0x66,0x66);max7219(4, 0x66,0x7e); max7219(5, 0x66,0x66);max7219(6, 0x66,0x66);max7219(7, 0x66,0x66);max7219(8, 0x00,0x00);break;// ПH case 2:max7219(1, 0x7c,0x7e);max7219(2, 0x66,0x18);max7219(3, 0x66,0x18);max7219(4, 0x66,0x18); max7219(5, 0x66,0x18);max7219(6, 0x66,0x18);max7219(7, 0x66,0x18);max7219(8, 0x00,0x00);break;// BT case 3:max7219(1, 0x3c,0x7c);max7219(2, 0x66,0x66);max7219(3, 0xc0,0x66);max7219(4, 0xc0,0x7c); max7219(5, 0x66,0x60);max7219(6, 0x66,0x60);max7219(7, 0x66,0x60);max7219(8, 0x00,0x00);break;// CP case 4:max7219(1, 0x66,0x7e);max7219(2, 0x66,0x18);max7219(3, 0x66,0x18);max7219(4, 0x3e,0x18); max7219(5, 0x6,0x18);max7219(6, 0x6,0x18);max7219(7, 0x6,0x18);max7219(8, 0x00,0x00);break; // ЧТ case 5:max7219(1, 0x7e,0x7e);max7219(2, 0x7e,0x18);max7219(3, 0x66,0x18);max7219(4, 0x66,0x18); max7219(5, 0x66,0x18);max7219(6, 0x66,0x18);max7219(7, 0x66,0x18);max7219(8, 0x00,0x00);break;// ПТ case 6:max7219(1, 0x3c,0x7c);max7219(2, 0x66,0x60);max7219(3, 0xc0,0x60);max7219(4, 0xc0,0x7c); max7219(5, 0x66,0x66);max7219(6, 0x66,0x66);max7219(7, 0x66,0x7c);max7219(8, 0x00,0x00);break;// CБ case 7:max7219(1, 0x7c,0x3c);max7219(2, 0x66,0x66);max7219(3, 0x66,0x00);max7219(4, 0x66,0x00); max7219(5, 0x66,0x00);max7219(6, 0x66,0x66);max7219(7, 0x66,0x3c);max7219(8, 0x00,0x00);break;// BС } if(set==0){ if(hour/10%10==0){a[0]=10;}else{a[0]=hour/10%10;} a[1]=hour%10; a[2]=minut/10%10; a[3]=minut%10; if( (secon>=5&&secon<=10) || (secon>=25&&secon<=30) || (secon>=45&&secon<50)){ dp_l=0; if(data/10%10==0){a[4]=10;}else{a[4]=data/10%10;} a[5]=data%10; if(mon/10%10==0){a[6]=10;}else{a[6]=mon/10%10;} a[7]=mon%10; } else{ if(temp>=0&&temp<100){dp_l=0;a[4]=10;a[5]=temp/10%10;a[6]=temp%10;a[7]=11; } // _1.3C if(temp>=100){dp_l=0;a[4]=temp/100%10;a[5]=temp/10%10;a[6]=temp%10;a[7]=11; } // 23.5C if(temp<0&&temp>-100){dp_l=0;a[4]=12;a[5]=abs(temp/10%10);a[6]=abs(temp%10);a[7]=11; } // -1.3C if(temp<=-100){dp_l=1;a[4]=12;a[5]=abs(temp/100%10);a[6]=abs(temp/10%10);a[7]=11; } // -23C } if(millis()-times<500){dp=1;}else{dp=0;} if(old_sec!=secon){old_sec=secon;times=millis();} } delay(100); } ISR(TIMER1_COMPA_vect){ switch (i) { /// SMALL // Q5 case 4: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[4];ch(SEG_DP,1); segment(); an = 0; anod();break; // Q6 case 5: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[5];ch(SEG_DP,dp_l); segment(); an = 1; anod();break; // Q7 case 6: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[6];ch(SEG_DP,1); segment(); an = 2; anod();break; // Q8 case 7: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[7]; segment(); an = 3; anod();break; /// BIG // Q1 case 0: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[0];ch(SEG_DP,1); segment(); an = 4; anod();break; // Q2 case 1: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[1];ch(SEG_DP,dp); segment(); an = 5; anod();break; // Q3 case 2: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[2];ch(SEG_DP,dp); segment(); an = 6; anod();break; // Q4 case 3: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[3];ch(SEG_DP,1); segment(); an = 7; anod();break; } i++;if (i > 7) {i = 0;} } void segment() { switch (segm) { // A B C D E F G case 0: 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, 1); break; // 0 case 1: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 1 case 2: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 0); break; // 2 case 3: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 0); break; // 3 case 4: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 4 case 5: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 5 case 6: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // 6 case 7: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 7 case 8: 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; // 8 case 9: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 9 case 10: 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; // пусто case 11: 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, 1);ch(SEG_DP, 0); break; // *C case 12: 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; // - } } void anod() { switch (an) { case 0: ch(AN_Q1, 1); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 1: ch(AN_Q1, 0); ch(AN_Q2, 1); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 2: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 1); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 3: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 1); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 4: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 1); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 5: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 1); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 6: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 1); ch(AN_Q8, 0); break; case 7: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 1); break; case 10: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; } } void ch(int pin, int logic) { digitalWrite(pin, logic); } float dsRead(byte x) { byte data[2], addr[8][8], kol = 0; while (ds.search(addr[kol])) { // поиск датчиков, определение адреса и кол-ва датчиков kol++; } ds.reset_search(); // Сброс поиска датчика ds.reset(); // Инициализация, выполняется сброс шины ds.select(addr[x]); // Обращение к датчику по адресу ds.write(0x44, 0); // Измерение температуры с переносом данных в память ds.reset(); // Инициализация, выполняется сброс шины ds.select(addr[x]); // Обращение к датчику по адресу ds.write(0xBE); // Обращение памяти data[0] = ds.read();// Чтение памяти byte low data[1] = ds.read();// Чтение памяти byte high float value = ((data[1] << 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод } void max7219(byte reg_n, byte h1, byte h2){ PORTD &=~(1 << CS);WriteBit16(reg_n,h1);WriteBit16(reg_n,h2);PORTD |=(1 << CS); } void WriteBit16(byte reg, byte data){ for(char i = 7; i >= 0; i--){ PORTD &= ~(1 << CLK); if(((reg >> i) & 1) == 1){PORTD |= (1 << DIN);}else{PORTD &= ~(1 << DIN);} PORTD |=(1 << CLK);} for(char i = 7; i >= 0; i--){ PORTD &= ~(1 << CLK); if(((data >> i) & 1) == 1){PORTD |= (1 << DIN);}else{PORTD &= ~(1 << DIN);} PORTD |=(1 << CLK);} PORTD &= ~(1 << CLK);PORTD |= (1 << DIN); } void cl(){for(char i=1;i<=8;i++){max7219(i, 0, 0);}}
Не работает.цифры бегают в режиме бегущего огня
// 19 === SCL
// 20 === SDA
#define DIN PD3
#define CS PD4
#define CLK PD5
//// Катоды
#define SEG_A 28
#define SEG_B 29
#define SEG_C 30
#define SEG_D 31
#define SEG_E 23
#define SEG_F 22
#define SEG_G 21
#define SEG_DP 20
//// Аноды
#define AN_Q1 3
#define AN_Q2 2
#define AN_Q3 1
#define AN_Q4 0
#define AN_Q5 24
#define AN_Q6 25
#define AN_Q7 26
#define AN_Q8 27
#define SET 10
#define UP 9
#define DW 8
#include <Wire.h>
#include <DS3231.h> // http://rcl-radio.ru/wp-content/uploads/2022/10/DS3231.zip
#include <OneWire.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip
DS3231 clock;RTCDateTime DateTime;
OneWire ds(4); // Вход датчика 18b20 (PD4 44 пин контр)
long oldPosition = -999, newPosition, times,times1,times2;
int a[8],segm,i,an, dp1,dp2;
int old_sec,dp,dp_l;
int hour,minut,secon,data,mon,year,den;
int temp;
long dn1[8],dn2[8];
int hh,mm,ss,dd,mes,gg,set;
void setup() {
Wire.begin();
clock.begin();
DDRD |= (1 << DIN) | (1 << CS) | (1 << CLK);
max7219(0x0F, 0, 0);// тест выкл.
max7219(0x0C, 1, 1);// вкл. индик.
max7219(0x0A, 1, 1);// яркость
max7219(0x09, 0, 0);// дешифраторы выкл.
max7219(0x0B, 7, 7);// кол-во разрядов
// clock.setDateTime(2023, 8, 26, 20, 40, 0);
cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
// (8000000/((300+1)x64))=415.28239202658 Hz
OCR1A = 300;
TCCR1B |= (1 << WGM12);
// Prescaler 64
TCCR1B |= (1 << CS11) | (1 << CS10);
TIMSK |= (1 << OCIE1A);
sei();
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(AN_Q1, OUTPUT);
pinMode(AN_Q2, OUTPUT);
pinMode(AN_Q3, OUTPUT);
pinMode(AN_Q4, OUTPUT);
pinMode(AN_Q5, OUTPUT);
pinMode(AN_Q6, OUTPUT);
pinMode(AN_Q7, OUTPUT);
pinMode(AN_Q8, OUTPUT);
pinMode (SET,INPUT_PULLUP);
pinMode (UP,INPUT_PULLUP);
pinMode (DW,INPUT_PULLUP);
}
void loop() {
DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second;
data = DateTime.day;mon = DateTime.month;year = DateTime.year;
den=DateTime.dayOfWeek;
if(millis()-times1>10){temp=dsRead(0)*10;times1=millis();}
if(digitalRead(SET)==LOW){set++;if(set>5){set=0;}delay(200);}
hh=hour;mm=minut;ss=secon;dd=data;mes=mon;gg=hour;
if(set==1 && digitalRead(UP)==LOW){hh++;if(hh>23){hh=0;}clock.setDateTime(year, mon, data, hh, minut, secon);delay(200);}
if(set==1 && digitalRead(DW)==LOW){hh--;if(hh<0){hh=0;}clock.setDateTime(year, mon, data, hh, minut, secon);delay(200);}
if(set==2 && digitalRead(UP)==LOW){mm++;if(mm>59){mm=0;}clock.setDateTime(year, mon, data, hour, mm, 0);delay(200);}
if(set==2 && digitalRead(DW)==LOW){mm--;if(mm<0){mm=0;}clock.setDateTime(year, mon, data, hour, mm, 0);delay(200);}
if(set==3 && digitalRead(UP)==LOW){dd++;if(dd>31){dd=31;}clock.setDateTime(year, mon, dd, hour, minut, secon);delay(200);}
if(set==3 && digitalRead(DW)==LOW){dd--;if(dd<1){dd=1;}clock.setDateTime(year, mon, dd, hour, minut, secon);delay(200);}
if(set==4 && digitalRead(UP)==LOW){mes++;if(mes>12){mes=12;}clock.setDateTime(year, mes, data, hour, minut, secon);delay(200);}
if(set==4 && digitalRead(DW)==LOW){mes--;if(mes<1){mes=1;}clock.setDateTime(year, mes, data, hour, minut, secon);delay(200);}
if(set==5 && digitalRead(UP)==LOW){gg++;if(gg>2100){gg=2100;}clock.setDateTime(gg, mon, data, hour, minut, secon);delay(200);}
if(set==5 && digitalRead(DW)==LOW){gg--;if(gg<2023){gg=2023;}clock.setDateTime(gg, mon, data, hour, minut, secon);delay(200);}
if(set==1){a[0] = hour/10%10;a[1] = hour%10; a[2]=10;a[3]=10;a[4]=10;a[5]=10;a[6]=10;a[7]=10;}
if(set==2){a[2] = minut/10%10;a[3] = minut%10; a[0]=10;a[1]=10;a[4]=10;a[5]=10;a[6]=10;a[7]=10;}
if(set==3){a[4] = data/10%10;a[5] = data%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;a[6]=10;a[7]=10;}
if(set==4){a[6] = mon/10%10;a[7] = mon%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;a[4]=10;a[5]=10;}
if(set==5){a[4] = year/1000%10;a[5] = year/100%10;a[6] = year/10%10; a[7] = year%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;}
if(set>0){dp_l=1;dp=1;dp1=1;dp2=1;}
switch(den){
case 1:max7219(1, 0x7e,0x66);max7219(2, 0x7e,0x66);max7219(3, 0x66,0x66);max7219(4, 0x66,0x7e);
max7219(5, 0x66,0x66);max7219(6, 0x66,0x66);max7219(7, 0x66,0x66);max7219(8, 0x00,0x00);break;// ПH
case 2:max7219(1, 0x7c,0x7e);max7219(2, 0x66,0x18);max7219(3, 0x66,0x18);max7219(4, 0x66,0x18);
max7219(5, 0x66,0x18);max7219(6, 0x66,0x18);max7219(7, 0x66,0x18);max7219(8, 0x00,0x00);break;// BT
case 3:max7219(1, 0x3c,0x7c);max7219(2, 0x66,0x66);max7219(3, 0xc0,0x66);max7219(4, 0xc0,0x7c);
max7219(5, 0x66,0x60);max7219(6, 0x66,0x60);max7219(7, 0x66,0x60);max7219(8, 0x00,0x00);break;// CP
case 4:max7219(1, 0x66,0x7e);max7219(2, 0x66,0x18);max7219(3, 0x66,0x18);max7219(4, 0x3e,0x18);
max7219(5, 0x6,0x18);max7219(6, 0x6,0x18);max7219(7, 0x6,0x18);max7219(8, 0x00,0x00);break; // ЧТ
case 5:max7219(1, 0x7e,0x7e);max7219(2, 0x7e,0x18);max7219(3, 0x66,0x18);max7219(4, 0x66,0x18);
max7219(5, 0x66,0x18);max7219(6, 0x66,0x18);max7219(7, 0x66,0x18);max7219(8, 0x00,0x00);break;// ПТ
case 6:max7219(1, 0x3c,0x7c);max7219(2, 0x66,0x60);max7219(3, 0xc0,0x60);max7219(4, 0xc0,0x7c);
max7219(5, 0x66,0x66);max7219(6, 0x66,0x66);max7219(7, 0x66,0x7c);max7219(8, 0x00,0x00);break;// CБ
case 7:max7219(1, 0x7c,0x3c);max7219(2, 0x66,0x66);max7219(3, 0x66,0x00);max7219(4, 0x66,0x00);
max7219(5, 0x66,0x00);max7219(6, 0x66,0x66);max7219(7, 0x66,0x3c);max7219(8, 0x00,0x00);break;// BС
}
if(set==0){
if(hour/10%10==0){a[0]=10;}else{a[0]=hour/10%10;}
a[1]=hour%10;
a[2]=minut/10%10;
a[3]=minut%10;
if( (secon>=5&&secon<=10) || (secon>=25&&secon<=30) || (secon>=45&&secon<50)){ dp_l=0;
if(data/10%10==0){a[4]=10;}else{a[4]=data/10%10;}
a[5]=data%10;
if(mon/10%10==0){a[6]=10;}else{a[6]=mon/10%10;}
a[7]=mon%10;
}
else{
if(temp>=0&&temp<100){dp_l=0;a[4]=10;a[5]=temp/10%10;a[6]=temp%10;a[7]=11; } // _1.3C
if(temp>=100){dp_l=0;a[4]=temp/100%10;a[5]=temp/10%10;a[6]=temp%10;a[7]=11; } // 23.5C
if(temp<0&&temp>-100){dp_l=0;a[4]=12;a[5]=abs(temp/10%10);a[6]=abs(temp%10);a[7]=11; } // -1.3C
if(temp<=-100){dp_l=1;a[4]=12;a[5]=abs(temp/100%10);a[6]=abs(temp/10%10);a[7]=11; } // -23C
}
if(millis()-times<500){dp=1;}else{dp=0;}
if(old_sec!=secon){old_sec=secon;times=millis();}
}
delay(100);
}
ISR(TIMER1_COMPA_vect){
switch (i) {
/// SMALL
// Q5
case 4: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[4];ch(SEG_DP,1); segment(); an = 0; anod();break;
// Q6
case 5: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[5];ch(SEG_DP,dp_l); segment(); an = 1; anod();break;
// Q7
case 6: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[6];ch(SEG_DP,1); segment(); an = 2; anod();break;
// Q8
case 7: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[7]; segment(); an = 3; anod();break;
/// BIG
// Q1
case 0: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[0];ch(SEG_DP,1); segment(); an = 4; anod();break;
// Q2
case 1: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[1];ch(SEG_DP,dp); segment(); an = 5; anod();break;
// Q3
case 2: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[2];ch(SEG_DP,dp); segment(); an = 6; anod();break;
// Q4
case 3: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[3];ch(SEG_DP,1); segment(); an = 7; anod();break;
}
i++;if (i > 7) {i = 0;}
}
void segment() {
switch (segm) {
// A B C D E F G
case 0: 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, 1); break; // 0
case 1: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 1
case 2: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 0); break; // 2
case 3: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 0); break; // 3
case 4: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 4
case 5: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 5
case 6: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // 6
case 7: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 7
case 8: 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; // 8
case 9: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 9
case 10: 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; // пусто
case 11: 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, 1);ch(SEG_DP, 0); break; // *C
case 12: 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; // -
}
}
void anod() {
switch (an) {
case 0: ch(AN_Q1, 1); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 1: ch(AN_Q1, 0); ch(AN_Q2, 1); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 2: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 1); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 3: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 1); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 4: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 1); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 5: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 1); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 6: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 1); ch(AN_Q8, 0); break;
case 7: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 1); break;
case 10: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
}
}
void ch(int pin, int logic) {
digitalWrite(pin, logic);
}
float dsRead(byte x) {
byte data[2], addr[8][8], kol = 0;
while (ds.search(addr[kol])) { // поиск датчиков, определение адреса и кол-ва датчиков
kol++;
}
ds.reset_search(); // Сброс поиска датчика
ds.reset(); // Инициализация, выполняется сброс шины
ds.select(addr[x]); // Обращение к датчику по адресу
ds.write(0x44, 0); // Измерение температуры с переносом данных в память
ds.reset(); // Инициализация, выполняется сброс шины
ds.select(addr[x]); // Обращение к датчику по адресу
ds.write(0xBE); // Обращение памяти
data[0] = ds.read();// Чтение памяти byte low
data[1] = ds.read();// Чтение памяти byte high
float value = ((data[1] << 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод
}
void max7219(byte reg_n, byte h1, byte h2){
PORTD &=~(1 << CS);WriteBit16(reg_n,h1);WriteBit16(reg_n,h2);PORTD |=(1 << CS);
}
void WriteBit16(byte reg, byte data){
for(char i = 7; i >= 0; i--){
PORTD &= ~(1 << CLK);
if(((reg >> i) & 1) == 1){PORTD |= (1 << DIN);}else{PORTD &= ~(1 << DIN);}
PORTD |=(1 << CLK);}
for(char i = 7; i >= 0; i--){
PORTD &= ~(1 << CLK);
if(((data >> i) & 1) == 1){PORTD |= (1 << DIN);}else{PORTD &= ~(1 << DIN);}
PORTD |=(1 << CLK);}
PORTD &= ~(1 << CLK);PORTD |= (1 << DIN);
}
void cl(){for(char i=1;i<=8;i++){max7219(i, 0, 0);}}
// 19 === SCL // 20 === SDA #define DIN PD3 #define CS PD4 #define CLK PD5 //// Катоды #define SEG_A 28 #define SEG_B 29 #define SEG_C 30 #define SEG_D 31 #define SEG_E 23 #define SEG_F 22 #define SEG_G 21 #define SEG_DP 20 //// Аноды #define AN_Q1 3 #define AN_Q2 2 #define AN_Q3 1 #define AN_Q4 0 #define AN_Q5 24 #define AN_Q6 25 #define AN_Q7 26 #define AN_Q8 27 #define SET 10 #define UP 9 #define DW 8 #include <Wire.h> #include <DS3231.h> // http://rcl-radio.ru/wp-content/uploads/2022/10/DS3231.zip #include <OneWire.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip DS3231 clock;RTCDateTime DateTime; OneWire ds(4); // Вход датчика 18b20 (PD4 44 пин контр) long oldPosition = -999, newPosition, times,times1,times2; int a[8],segm,i,an, dp1,dp2; int old_sec,dp,dp_l; int hour,minut,secon,data,mon,year,den; int temp; long dn1[8],dn2[8]; int hh,mm,ss,dd,mes,gg,set; void setup() { Wire.begin(); clock.begin(); DDRD |= (1 << DIN) | (1 << CS) | (1 << CLK); max7219(0x0F, 0, 0);// тест выкл. max7219(0x0C, 1, 1);// вкл. индик. max7219(0x0A, 1, 1);// яркость max7219(0x09, 0, 0);// дешифраторы выкл. max7219(0x0B, 7, 7);// кол-во разрядов // clock.setDateTime(2023, 8, 26, 20, 40, 0); cli(); TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; // (8000000/((300+1)x64))=415.28239202658 Hz OCR1A = 300; TCCR1B |= (1 << WGM12); // Prescaler 64 TCCR1B |= (1 << CS11) | (1 << CS10); TIMSK |= (1 << OCIE1A); sei(); 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(AN_Q1, OUTPUT); pinMode(AN_Q2, OUTPUT); pinMode(AN_Q3, OUTPUT); pinMode(AN_Q4, OUTPUT); pinMode(AN_Q5, OUTPUT); pinMode(AN_Q6, OUTPUT); pinMode(AN_Q7, OUTPUT); pinMode(AN_Q8, OUTPUT); pinMode (SET,INPUT_PULLUP); pinMode (UP,INPUT_PULLUP); pinMode (DW,INPUT_PULLUP); } void loop() { DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second; data = DateTime.day;mon = DateTime.month;year = DateTime.year; den=DateTime.dayOfWeek; if(millis()-times1>10){temp=dsRead(0)*10;times1=millis();} if(digitalRead(SET)==LOW){set++;if(set>5){set=0;}delay(200);} hh=hour;mm=minut;ss=secon;dd=data;mes=mon;gg=hour; if(set==1 && digitalRead(UP)==LOW){hh++;if(hh>23){hh=0;}clock.setDateTime(year, mon, data, hh, minut, secon);delay(200);} if(set==1 && digitalRead(DW)==LOW){hh--;if(hh<0){hh=0;}clock.setDateTime(year, mon, data, hh, minut, secon);delay(200);} if(set==2 && digitalRead(UP)==LOW){mm++;if(mm>59){mm=0;}clock.setDateTime(year, mon, data, hour, mm, 0);delay(200);} if(set==2 && digitalRead(DW)==LOW){mm--;if(mm<0){mm=0;}clock.setDateTime(year, mon, data, hour, mm, 0);delay(200);} if(set==3 && digitalRead(UP)==LOW){dd++;if(dd>31){dd=31;}clock.setDateTime(year, mon, dd, hour, minut, secon);delay(200);} if(set==3 && digitalRead(DW)==LOW){dd--;if(dd<1){dd=1;}clock.setDateTime(year, mon, dd, hour, minut, secon);delay(200);} if(set==4 && digitalRead(UP)==LOW){mes++;if(mes>12){mes=12;}clock.setDateTime(year, mes, data, hour, minut, secon);delay(200);} if(set==4 && digitalRead(DW)==LOW){mes--;if(mes<1){mes=1;}clock.setDateTime(year, mes, data, hour, minut, secon);delay(200);} if(set==5 && digitalRead(UP)==LOW){gg++;if(gg>2100){gg=2100;}clock.setDateTime(gg, mon, data, hour, minut, secon);delay(200);} if(set==5 && digitalRead(DW)==LOW){gg--;if(gg<2023){gg=2023;}clock.setDateTime(gg, mon, data, hour, minut, secon);delay(200);} if(set==1){a[0] = hour/10%10;a[1] = hour%10; a[2]=10;a[3]=10;a[4]=10;a[5]=10;a[6]=10;a[7]=10;} if(set==2){a[2] = minut/10%10;a[3] = minut%10; a[0]=10;a[1]=10;a[4]=10;a[5]=10;a[6]=10;a[7]=10;} if(set==3){a[4] = data/10%10;a[5] = data%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;a[6]=10;a[7]=10;} if(set==4){a[6] = mon/10%10;a[7] = mon%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;a[4]=10;a[5]=10;} if(set==5){a[4] = year/1000%10;a[5] = year/100%10;a[6] = year/10%10; a[7] = year%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;} if(set>0){dp_l=1;dp=1;dp1=1;dp2=1;} switch(den){ case 1:max7219(1, 0x7e,0x66);max7219(2, 0x7e,0x66);max7219(3, 0x66,0x66);max7219(4, 0x66,0x7e); max7219(5, 0x66,0x66);max7219(6, 0x66,0x66);max7219(7, 0x66,0x66);max7219(8, 0x00,0x00);break;// ПH case 2:max7219(1, 0x7c,0x7e);max7219(2, 0x66,0x18);max7219(3, 0x66,0x18);max7219(4, 0x66,0x18); max7219(5, 0x66,0x18);max7219(6, 0x66,0x18);max7219(7, 0x66,0x18);max7219(8, 0x00,0x00);break;// BT case 3:max7219(1, 0x3c,0x7c);max7219(2, 0x66,0x66);max7219(3, 0xc0,0x66);max7219(4, 0xc0,0x7c); max7219(5, 0x66,0x60);max7219(6, 0x66,0x60);max7219(7, 0x66,0x60);max7219(8, 0x00,0x00);break;// CP case 4:max7219(1, 0x66,0x7e);max7219(2, 0x66,0x18);max7219(3, 0x66,0x18);max7219(4, 0x3e,0x18); max7219(5, 0x6,0x18);max7219(6, 0x6,0x18);max7219(7, 0x6,0x18);max7219(8, 0x00,0x00);break; // ЧТ case 5:max7219(1, 0x7e,0x7e);max7219(2, 0x7e,0x18);max7219(3, 0x66,0x18);max7219(4, 0x66,0x18); max7219(5, 0x66,0x18);max7219(6, 0x66,0x18);max7219(7, 0x66,0x18);max7219(8, 0x00,0x00);break;// ПТ case 6:max7219(1, 0x3c,0x7c);max7219(2, 0x66,0x60);max7219(3, 0xc0,0x60);max7219(4, 0xc0,0x7c); max7219(5, 0x66,0x66);max7219(6, 0x66,0x66);max7219(7, 0x66,0x7c);max7219(8, 0x00,0x00);break;// CБ case 7:max7219(1, 0x7c,0x3c);max7219(2, 0x66,0x66);max7219(3, 0x66,0x00);max7219(4, 0x66,0x00); max7219(5, 0x66,0x00);max7219(6, 0x66,0x66);max7219(7, 0x66,0x3c);max7219(8, 0x00,0x00);break;// BС } if(set==0){ if(hour/10%10==0){a[0]=10;}else{a[0]=hour/10%10;} a[1]=hour%10; a[2]=minut/10%10; a[3]=minut%10; if( (secon>=5&&secon<=10) || (secon>=25&&secon<=30) || (secon>=45&&secon<50)){ dp_l=0; if(data/10%10==0){a[4]=10;}else{a[4]=data/10%10;} a[5]=data%10; if(mon/10%10==0){a[6]=10;}else{a[6]=mon/10%10;} a[7]=mon%10; } else{ if(temp>=0&&temp<100){dp_l=0;a[4]=10;a[5]=temp/10%10;a[6]=temp%10;a[7]=11; } // _1.3C if(temp>=100){dp_l=0;a[4]=temp/100%10;a[5]=temp/10%10;a[6]=temp%10;a[7]=11; } // 23.5C if(temp<0&&temp>-100){dp_l=0;a[4]=12;a[5]=abs(temp/10%10);a[6]=abs(temp%10);a[7]=11; } // -1.3C if(temp<=-100){dp_l=1;a[4]=12;a[5]=abs(temp/100%10);a[6]=abs(temp/10%10);a[7]=11; } // -23C } if(millis()-times<500){dp=1;}else{dp=0;} if(old_sec!=secon){old_sec=secon;times=millis();} } delay(100); } ISR(TIMER1_COMPA_vect){ switch (i) { /// SMALL // Q5 case 4: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[4];ch(SEG_DP,1); segment(); an = 0; anod();break; // Q6 case 5: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[5];ch(SEG_DP,dp_l); segment(); an = 1; anod();break; // Q7 case 6: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[6];ch(SEG_DP,1); segment(); an = 2; anod();break; // Q8 case 7: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[7]; segment(); an = 3; anod();break; /// BIG // Q1 case 0: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[0];ch(SEG_DP,1); segment(); an = 4; anod();break; // Q2 case 1: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[1];ch(SEG_DP,dp); segment(); an = 5; anod();break; // Q3 case 2: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[2];ch(SEG_DP,dp); segment(); an = 6; anod();break; // Q4 case 3: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[3];ch(SEG_DP,1); segment(); an = 7; anod();break; } i++;if (i > 7) {i = 0;} } void segment() { switch (segm) { // A B C D E F G case 0: 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, 1); break; // 0 case 1: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 1 case 2: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 0); break; // 2 case 3: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 0); break; // 3 case 4: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 4 case 5: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 5 case 6: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // 6 case 7: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 7 case 8: 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; // 8 case 9: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 9 case 10: 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; // пусто case 11: 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, 1);ch(SEG_DP, 0); break; // *C case 12: 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; // - } } void anod() { switch (an) { case 0: ch(AN_Q1, 1); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 1: ch(AN_Q1, 0); ch(AN_Q2, 1); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 2: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 1); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 3: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 1); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 4: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 1); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 5: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 1); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 6: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 1); ch(AN_Q8, 0); break; case 7: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 1); break; case 10: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; } } void ch(int pin, int logic) { digitalWrite(pin, logic); } float dsRead(byte x) { byte data[2], addr[8][8], kol = 0; while (ds.search(addr[kol])) { // поиск датчиков, определение адреса и кол-ва датчиков kol++; } ds.reset_search(); // Сброс поиска датчика ds.reset(); // Инициализация, выполняется сброс шины ds.select(addr[x]); // Обращение к датчику по адресу ds.write(0x44, 0); // Измерение температуры с переносом данных в память ds.reset(); // Инициализация, выполняется сброс шины ds.select(addr[x]); // Обращение к датчику по адресу ds.write(0xBE); // Обращение памяти data[0] = ds.read();// Чтение памяти byte low data[1] = ds.read();// Чтение памяти byte high float value = ((data[1] << 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод } void max7219(byte reg_n, byte h1, byte h2){ PORTD &=~(1 << CS);WriteBit16(reg_n,h1);WriteBit16(reg_n,h2);PORTD |=(1 << CS); } void WriteBit16(byte reg, byte data){ for(char i = 7; i >= 0; i--){ PORTD &= ~(1 << CLK); if(((reg >> i) & 1) == 1){PORTD |= (1 << DIN);}else{PORTD &= ~(1 << DIN);} PORTD |=(1 << CLK);} for(char i = 7; i >= 0; i--){ PORTD &= ~(1 << CLK); if(((data >> i) & 1) == 1){PORTD |= (1 << DIN);}else{PORTD &= ~(1 << DIN);} PORTD |=(1 << CLK);} PORTD &= ~(1 << CLK);PORTD |= (1 << DIN); } void cl(){for(char i=1;i<=8;i++){max7219(i, 0, 0);}}
Время,дата устанавливается но год либо 2023 или 2071 не меняется.День недели ПТ стоит
// 19 === SCL
// 20 === SDA
#define DIN PD3
#define CS PD4
#define CLK PD5
//// Катоды
#define SEG_A 28
#define SEG_B 29
#define SEG_C 30
#define SEG_D 31
#define SEG_E 23
#define SEG_F 22
#define SEG_G 21
#define SEG_DP 20
//// Аноды
#define AN_Q1 3
#define AN_Q2 2
#define AN_Q3 1
#define AN_Q4 0
#define AN_Q5 24
#define AN_Q6 25
#define AN_Q7 26
#define AN_Q8 27
#define SET 10
#define UP 9
#define DW 8
#include <Wire.h>
#include <DS3231.h> // http://rcl-radio.ru/wp-content/uploads/2022/10/DS3231.zip
#include <OneWire.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip
DS3231 clock;RTCDateTime DateTime;
OneWire ds(4); // Вход датчика 18b20 (PD4 44 пин контр)
long oldPosition = -999, newPosition, times,times1,times2;
int a[8],segm,i,an, dp1,dp2;
int old_sec,dp,dp_l;
int hour,minut,secon,data,mon,year,den;
int temp;
long dn1[8],dn2[8];
int hh,mm,ss,dd,mes,gg,set;
void setup() {
Wire.begin();
clock.begin();
DDRD |= (1 << DIN) | (1 << CS) | (1 << CLK);
max7219(0x0F, 0, 0);// тест выкл.
max7219(0x0C, 1, 1);// вкл. индик.
max7219(0x0A, 1, 1);// яркость
max7219(0x09, 0, 0);// дешифраторы выкл.
max7219(0x0B, 7, 7);// кол-во разрядов
// clock.setDateTime(2023, 8, 26, 20, 40, 0);
cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
// (8000000/((300+1)x64))=415.28239202658 Hz
OCR1A = 300;
TCCR1B |= (1 << WGM12);
// Prescaler 64
TCCR1B |= (1 << CS11) | (1 << CS10);
TIMSK |= (1 << OCIE1A);
sei();
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(AN_Q1, OUTPUT);
pinMode(AN_Q2, OUTPUT);
pinMode(AN_Q3, OUTPUT);
pinMode(AN_Q4, OUTPUT);
pinMode(AN_Q5, OUTPUT);
pinMode(AN_Q6, OUTPUT);
pinMode(AN_Q7, OUTPUT);
pinMode(AN_Q8, OUTPUT);
pinMode (SET,INPUT_PULLUP);
pinMode (UP,INPUT_PULLUP);
pinMode (DW,INPUT_PULLUP);
}
void loop() {
DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second;
data = DateTime.day;mon = DateTime.month;year = DateTime.year;
den=DateTime.dayOfWeek;
if(millis()-times1>10){temp=dsRead(0)*10;times1=millis();}
if(digitalRead(SET)==LOW){set++;if(set>5){set=0;}delay(200);}
hh=hour;mm=minut;ss=secon;dd=data;mes=mon;gg=year;
if(set==1 && digitalRead(UP)==LOW){hh++;if(hh>23){hh=0;}clock.setDateTime(year, mon, data, hh, minut, secon);delay(200);}
if(set==1 && digitalRead(DW)==LOW){hh--;if(hh<0){hh=0;}clock.setDateTime(year, mon, data, hh, minut, secon);delay(200);}
if(set==2 && digitalRead(UP)==LOW){mm++;if(mm>59){mm=0;}clock.setDateTime(year, mon, data, hour, mm, 0);delay(200);}
if(set==2 && digitalRead(DW)==LOW){mm--;if(mm<0){mm=0;}clock.setDateTime(year, mon, data, hour, mm, 0);delay(200);}
if(set==3 && digitalRead(UP)==LOW){dd++;if(dd>31){dd=31;}clock.setDateTime(year, mon, dd, hour, minut, secon);delay(200);}
if(set==3 && digitalRead(DW)==LOW){dd--;if(dd<1){dd=1;}clock.setDateTime(year, mon, dd, hour, minut, secon);delay(200);}
if(set==4 && digitalRead(UP)==LOW){mes++;if(mes>12){mes=12;}clock.setDateTime(year, mes, data, hour, minut, secon);delay(200);}
if(set==4 && digitalRead(DW)==LOW){mes--;if(mes<1){mes=1;}clock.setDateTime(year, mes, data, hour, minut, secon);delay(200);}
if(set==5 && digitalRead(UP)==LOW){gg++;if(gg>2100){gg=2100;}clock.setDateTime(gg, mon, data, hour, minut, secon);delay(200);}
if(set==5 && digitalRead(DW)==LOW){gg--;if(gg<2023){gg=2023;}clock.setDateTime(gg, mon, data, hour, minut, secon);delay(200);}
if(set==1){a[0] = hour/10%10;a[1] = hour%10; a[2]=10;a[3]=10;a[4]=10;a[5]=10;a[6]=10;a[7]=10;}
if(set==2){a[2] = minut/10%10;a[3] = minut%10; a[0]=10;a[1]=10;a[4]=10;a[5]=10;a[6]=10;a[7]=10;}
if(set==3){a[4] = data/10%10;a[5] = data%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;a[6]=10;a[7]=10;}
if(set==4){a[6] = mon/10%10;a[7] = mon%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;a[4]=10;a[5]=10;}
if(set==5){a[4] = year/1000%10;a[5] = year/100%10;a[6] = year/10%10; a[7] = year%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;}
if(set>0){dp_l=1;dp=1;dp1=1;dp2=1;}
switch(den){
case 1:max7219(1, 0x7e,0x66);max7219(2, 0x7e,0x66);max7219(3, 0x66,0x66);max7219(4, 0x66,0x7e);
max7219(5, 0x66,0x66);max7219(6, 0x66,0x66);max7219(7, 0x66,0x66);max7219(8, 0x00,0x00);break;// ПH
case 2:max7219(1, 0x7c,0x7e);max7219(2, 0x66,0x18);max7219(3, 0x66,0x18);max7219(4, 0x66,0x18);
max7219(5, 0x66,0x18);max7219(6, 0x66,0x18);max7219(7, 0x66,0x18);max7219(8, 0x00,0x00);break;// BT
case 3:max7219(1, 0x3c,0x7c);max7219(2, 0x66,0x66);max7219(3, 0xc0,0x66);max7219(4, 0xc0,0x7c);
max7219(5, 0x66,0x60);max7219(6, 0x66,0x60);max7219(7, 0x66,0x60);max7219(8, 0x00,0x00);break;// CP
case 4:max7219(1, 0x66,0x7e);max7219(2, 0x66,0x18);max7219(3, 0x66,0x18);max7219(4, 0x3e,0x18);
max7219(5, 0x6,0x18);max7219(6, 0x6,0x18);max7219(7, 0x6,0x18);max7219(8, 0x00,0x00);break; // ЧТ
case 5:max7219(1, 0x7e,0x7e);max7219(2, 0x7e,0x18);max7219(3, 0x66,0x18);max7219(4, 0x66,0x18);
max7219(5, 0x66,0x18);max7219(6, 0x66,0x18);max7219(7, 0x66,0x18);max7219(8, 0x00,0x00);break;// ПТ
case 6:max7219(1, 0x3c,0x7c);max7219(2, 0x66,0x60);max7219(3, 0xc0,0x60);max7219(4, 0xc0,0x7c);
max7219(5, 0x66,0x66);max7219(6, 0x66,0x66);max7219(7, 0x66,0x7c);max7219(8, 0x00,0x00);break;// CБ
case 7:max7219(1, 0x7c,0x3c);max7219(2, 0x66,0x66);max7219(3, 0x66,0x00);max7219(4, 0x66,0x00);
max7219(5, 0x66,0x00);max7219(6, 0x66,0x66);max7219(7, 0x66,0x3c);max7219(8, 0x00,0x00);break;// BС
}
if(set==0){
if(hour/10%10==0){a[0]=10;}else{a[0]=hour/10%10;}
a[1]=hour%10;
a[2]=minut/10%10;
a[3]=minut%10;
if( (secon>=5&&secon<=10) || (secon>=25&&secon<=30) || (secon>=45&&secon<50)){ dp_l=0;
if(data/10%10==0){a[4]=10;}else{a[4]=data/10%10;}
a[5]=data%10;
if(mon/10%10==0){a[6]=10;}else{a[6]=mon/10%10;}
a[7]=mon%10;
}
else{
if(temp>=0&&temp<100){dp_l=0;a[4]=10;a[5]=temp/10%10;a[6]=temp%10;a[7]=11; } // _1.3C
if(temp>=100){dp_l=0;a[4]=temp/100%10;a[5]=temp/10%10;a[6]=temp%10;a[7]=11; } // 23.5C
if(temp<0&&temp>-100){dp_l=0;a[4]=12;a[5]=abs(temp/10%10);a[6]=abs(temp%10);a[7]=11; } // -1.3C
if(temp<=-100){dp_l=1;a[4]=12;a[5]=abs(temp/100%10);a[6]=abs(temp/10%10);a[7]=11; } // -23C
}
if(millis()-times<500){dp=1;}else{dp=0;}
if(old_sec!=secon){old_sec=secon;times=millis();}
}
delay(100);
}
ISR(TIMER1_COMPA_vect){
switch (i) {
/// SMALL
// Q5
case 4: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[4];ch(SEG_DP,1); segment(); an = 0; anod();break;
// Q6
case 5: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[5];ch(SEG_DP,dp_l); segment(); an = 1; anod();break;
// Q7
case 6: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[6];ch(SEG_DP,1); segment(); an = 2; anod();break;
// Q8
case 7: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[7]; segment(); an = 3; anod();break;
/// BIG
// Q1
case 0: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[0];ch(SEG_DP,1); segment(); an = 4; anod();break;
// Q2
case 1: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[1];ch(SEG_DP,dp); segment(); an = 5; anod();break;
// Q3
case 2: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[2];ch(SEG_DP,dp); segment(); an = 6; anod();break;
// Q4
case 3: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[3];ch(SEG_DP,1); segment(); an = 7; anod();break;
}
i++;if (i > 7) {i = 0;}
}
void segment() {
switch (segm) {
// A B C D E F G
case 0: 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, 1); break; // 0
case 1: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 1
case 2: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 0); break; // 2
case 3: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 0); break; // 3
case 4: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 4
case 5: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 5
case 6: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // 6
case 7: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 7
case 8: 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; // 8
case 9: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 9
case 10: 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; // пусто
case 11: 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, 1);ch(SEG_DP, 0); break; // *C
case 12: 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; // -
}
}
void anod() {
switch (an) {
case 0: ch(AN_Q1, 1); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 1: ch(AN_Q1, 0); ch(AN_Q2, 1); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 2: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 1); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 3: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 1); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 4: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 1); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 5: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 1); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 6: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 1); ch(AN_Q8, 0); break;
case 7: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 1); break;
case 10: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
}
}
void ch(int pin, int logic) {
digitalWrite(pin, logic);
}
float dsRead(byte x) {
byte data[2], addr[8][8], kol = 0;
while (ds.search(addr[kol])) { // поиск датчиков, определение адреса и кол-ва датчиков
kol++;
}
ds.reset_search(); // Сброс поиска датчика
ds.reset(); // Инициализация, выполняется сброс шины
ds.select(addr[x]); // Обращение к датчику по адресу
ds.write(0x44, 0); // Измерение температуры с переносом данных в память
ds.reset(); // Инициализация, выполняется сброс шины
ds.select(addr[x]); // Обращение к датчику по адресу
ds.write(0xBE); // Обращение памяти
data[0] = ds.read();// Чтение памяти byte low
data[1] = ds.read();// Чтение памяти byte high
float value = ((data[1] << 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод
}
void max7219(byte reg_n, byte h1, byte h2){
PORTD &=~(1 << CS);WriteBit16(reg_n,h1);WriteBit16(reg_n,h2);PORTD |=(1 << CS);
}
void WriteBit16(byte reg, byte data){
for(char i = 7; i >= 0; i--){
PORTD &= ~(1 << CLK);
if(((reg >> i) & 1) == 1){PORTD |= (1 << DIN);}else{PORTD &= ~(1 << DIN);}
PORTD |=(1 << CLK);}
for(char i = 7; i >= 0; i--){
PORTD &= ~(1 << CLK);
if(((data >> i) & 1) == 1){PORTD |= (1 << DIN);}else{PORTD &= ~(1 << DIN);}
PORTD |=(1 << CLK);}
PORTD &= ~(1 << CLK);PORTD |= (1 << DIN);
}
void cl(){for(char i=1;i<=8;i++){max7219(i, 0, 0);}}
// 19 === SCL // 20 === SDA #define DIN PD3 #define CS PD4 #define CLK PD5 //// Катоды #define SEG_A 28 #define SEG_B 29 #define SEG_C 30 #define SEG_D 31 #define SEG_E 23 #define SEG_F 22 #define SEG_G 21 #define SEG_DP 20 //// Аноды #define AN_Q1 3 #define AN_Q2 2 #define AN_Q3 1 #define AN_Q4 0 #define AN_Q5 24 #define AN_Q6 25 #define AN_Q7 26 #define AN_Q8 27 #define SET 10 #define UP 9 #define DW 8 #include <Wire.h> #include <DS3231.h> // http://rcl-radio.ru/wp-content/uploads/2022/10/DS3231.zip #include <OneWire.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip DS3231 clock;RTCDateTime DateTime; OneWire ds(4); // Вход датчика 18b20 (PD4 44 пин контр) long oldPosition = -999, newPosition, times,times1,times2; int a[8],segm,i,an, dp1,dp2; int old_sec,dp,dp_l; int hour,minut,secon,data,mon,year,den; int temp; long dn1[8],dn2[8]; int hh,mm,ss,dd,mes,gg,set; void setup() { Wire.begin(); clock.begin(); DDRD |= (1 << DIN) | (1 << CS) | (1 << CLK); max7219(0x0F, 0, 0);// тест выкл. max7219(0x0C, 1, 1);// вкл. индик. max7219(0x0A, 1, 1);// яркость max7219(0x09, 0, 0);// дешифраторы выкл. max7219(0x0B, 7, 7);// кол-во разрядов // clock.setDateTime(2023, 8, 26, 20, 40, 0); cli(); TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; // (8000000/((300+1)x64))=415.28239202658 Hz OCR1A = 300; TCCR1B |= (1 << WGM12); // Prescaler 64 TCCR1B |= (1 << CS11) | (1 << CS10); TIMSK |= (1 << OCIE1A); sei(); 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(AN_Q1, OUTPUT); pinMode(AN_Q2, OUTPUT); pinMode(AN_Q3, OUTPUT); pinMode(AN_Q4, OUTPUT); pinMode(AN_Q5, OUTPUT); pinMode(AN_Q6, OUTPUT); pinMode(AN_Q7, OUTPUT); pinMode(AN_Q8, OUTPUT); pinMode (SET,INPUT_PULLUP); pinMode (UP,INPUT_PULLUP); pinMode (DW,INPUT_PULLUP); } void loop() { DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second; data = DateTime.day;mon = DateTime.month;year = DateTime.year; den=DateTime.dayOfWeek; if(millis()-times1>10){temp=dsRead(0)*10;times1=millis();} if(digitalRead(SET)==LOW){set++;if(set>5){set=0;}delay(200);} hh=hour;mm=minut;ss=secon;dd=data;mes=mon;gg=year; if(set==1 && digitalRead(UP)==LOW){hh++;if(hh>23){hh=0;}clock.setDateTime(year, mon, data, hh, minut, secon);delay(200);} if(set==1 && digitalRead(DW)==LOW){hh--;if(hh<0){hh=0;}clock.setDateTime(year, mon, data, hh, minut, secon);delay(200);} if(set==2 && digitalRead(UP)==LOW){mm++;if(mm>59){mm=0;}clock.setDateTime(year, mon, data, hour, mm, 0);delay(200);} if(set==2 && digitalRead(DW)==LOW){mm--;if(mm<0){mm=0;}clock.setDateTime(year, mon, data, hour, mm, 0);delay(200);} if(set==3 && digitalRead(UP)==LOW){dd++;if(dd>31){dd=31;}clock.setDateTime(year, mon, dd, hour, minut, secon);delay(200);} if(set==3 && digitalRead(DW)==LOW){dd--;if(dd<1){dd=1;}clock.setDateTime(year, mon, dd, hour, minut, secon);delay(200);} if(set==4 && digitalRead(UP)==LOW){mes++;if(mes>12){mes=12;}clock.setDateTime(year, mes, data, hour, minut, secon);delay(200);} if(set==4 && digitalRead(DW)==LOW){mes--;if(mes<1){mes=1;}clock.setDateTime(year, mes, data, hour, minut, secon);delay(200);} if(set==5 && digitalRead(UP)==LOW){gg++;if(gg>2100){gg=2100;}clock.setDateTime(gg, mon, data, hour, minut, secon);delay(200);} if(set==5 && digitalRead(DW)==LOW){gg--;if(gg<2023){gg=2023;}clock.setDateTime(gg, mon, data, hour, minut, secon);delay(200);} if(set==1){a[0] = hour/10%10;a[1] = hour%10; a[2]=10;a[3]=10;a[4]=10;a[5]=10;a[6]=10;a[7]=10;} if(set==2){a[2] = minut/10%10;a[3] = minut%10; a[0]=10;a[1]=10;a[4]=10;a[5]=10;a[6]=10;a[7]=10;} if(set==3){a[4] = data/10%10;a[5] = data%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;a[6]=10;a[7]=10;} if(set==4){a[6] = mon/10%10;a[7] = mon%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;a[4]=10;a[5]=10;} if(set==5){a[4] = year/1000%10;a[5] = year/100%10;a[6] = year/10%10; a[7] = year%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;} if(set>0){dp_l=1;dp=1;dp1=1;dp2=1;} switch(den){ case 1:max7219(1, 0x7e,0x66);max7219(2, 0x7e,0x66);max7219(3, 0x66,0x66);max7219(4, 0x66,0x7e); max7219(5, 0x66,0x66);max7219(6, 0x66,0x66);max7219(7, 0x66,0x66);max7219(8, 0x00,0x00);break;// ПH case 2:max7219(1, 0x7c,0x7e);max7219(2, 0x66,0x18);max7219(3, 0x66,0x18);max7219(4, 0x66,0x18); max7219(5, 0x66,0x18);max7219(6, 0x66,0x18);max7219(7, 0x66,0x18);max7219(8, 0x00,0x00);break;// BT case 3:max7219(1, 0x3c,0x7c);max7219(2, 0x66,0x66);max7219(3, 0xc0,0x66);max7219(4, 0xc0,0x7c); max7219(5, 0x66,0x60);max7219(6, 0x66,0x60);max7219(7, 0x66,0x60);max7219(8, 0x00,0x00);break;// CP case 4:max7219(1, 0x66,0x7e);max7219(2, 0x66,0x18);max7219(3, 0x66,0x18);max7219(4, 0x3e,0x18); max7219(5, 0x6,0x18);max7219(6, 0x6,0x18);max7219(7, 0x6,0x18);max7219(8, 0x00,0x00);break; // ЧТ case 5:max7219(1, 0x7e,0x7e);max7219(2, 0x7e,0x18);max7219(3, 0x66,0x18);max7219(4, 0x66,0x18); max7219(5, 0x66,0x18);max7219(6, 0x66,0x18);max7219(7, 0x66,0x18);max7219(8, 0x00,0x00);break;// ПТ case 6:max7219(1, 0x3c,0x7c);max7219(2, 0x66,0x60);max7219(3, 0xc0,0x60);max7219(4, 0xc0,0x7c); max7219(5, 0x66,0x66);max7219(6, 0x66,0x66);max7219(7, 0x66,0x7c);max7219(8, 0x00,0x00);break;// CБ case 7:max7219(1, 0x7c,0x3c);max7219(2, 0x66,0x66);max7219(3, 0x66,0x00);max7219(4, 0x66,0x00); max7219(5, 0x66,0x00);max7219(6, 0x66,0x66);max7219(7, 0x66,0x3c);max7219(8, 0x00,0x00);break;// BС } if(set==0){ if(hour/10%10==0){a[0]=10;}else{a[0]=hour/10%10;} a[1]=hour%10; a[2]=minut/10%10; a[3]=minut%10; if( (secon>=5&&secon<=10) || (secon>=25&&secon<=30) || (secon>=45&&secon<50)){ dp_l=0; if(data/10%10==0){a[4]=10;}else{a[4]=data/10%10;} a[5]=data%10; if(mon/10%10==0){a[6]=10;}else{a[6]=mon/10%10;} a[7]=mon%10; } else{ if(temp>=0&&temp<100){dp_l=0;a[4]=10;a[5]=temp/10%10;a[6]=temp%10;a[7]=11; } // _1.3C if(temp>=100){dp_l=0;a[4]=temp/100%10;a[5]=temp/10%10;a[6]=temp%10;a[7]=11; } // 23.5C if(temp<0&&temp>-100){dp_l=0;a[4]=12;a[5]=abs(temp/10%10);a[6]=abs(temp%10);a[7]=11; } // -1.3C if(temp<=-100){dp_l=1;a[4]=12;a[5]=abs(temp/100%10);a[6]=abs(temp/10%10);a[7]=11; } // -23C } if(millis()-times<500){dp=1;}else{dp=0;} if(old_sec!=secon){old_sec=secon;times=millis();} } delay(100); } ISR(TIMER1_COMPA_vect){ switch (i) { /// SMALL // Q5 case 4: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[4];ch(SEG_DP,1); segment(); an = 0; anod();break; // Q6 case 5: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[5];ch(SEG_DP,dp_l); segment(); an = 1; anod();break; // Q7 case 6: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[6];ch(SEG_DP,1); segment(); an = 2; anod();break; // Q8 case 7: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[7]; segment(); an = 3; anod();break; /// BIG // Q1 case 0: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[0];ch(SEG_DP,1); segment(); an = 4; anod();break; // Q2 case 1: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[1];ch(SEG_DP,dp); segment(); an = 5; anod();break; // Q3 case 2: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[2];ch(SEG_DP,dp); segment(); an = 6; anod();break; // Q4 case 3: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[3];ch(SEG_DP,1); segment(); an = 7; anod();break; } i++;if (i > 7) {i = 0;} } void segment() { switch (segm) { // A B C D E F G case 0: 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, 1); break; // 0 case 1: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 1 case 2: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 0); break; // 2 case 3: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 0); break; // 3 case 4: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 4 case 5: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 5 case 6: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // 6 case 7: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 7 case 8: 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; // 8 case 9: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 9 case 10: 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; // пусто case 11: 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, 1);ch(SEG_DP, 0); break; // *C case 12: 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; // - } } void anod() { switch (an) { case 0: ch(AN_Q1, 1); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 1: ch(AN_Q1, 0); ch(AN_Q2, 1); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 2: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 1); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 3: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 1); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 4: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 1); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 5: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 1); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 6: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 1); ch(AN_Q8, 0); break; case 7: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 1); break; case 10: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; } } void ch(int pin, int logic) { digitalWrite(pin, logic); } float dsRead(byte x) { byte data[2], addr[8][8], kol = 0; while (ds.search(addr[kol])) { // поиск датчиков, определение адреса и кол-ва датчиков kol++; } ds.reset_search(); // Сброс поиска датчика ds.reset(); // Инициализация, выполняется сброс шины ds.select(addr[x]); // Обращение к датчику по адресу ds.write(0x44, 0); // Измерение температуры с переносом данных в память ds.reset(); // Инициализация, выполняется сброс шины ds.select(addr[x]); // Обращение к датчику по адресу ds.write(0xBE); // Обращение памяти data[0] = ds.read();// Чтение памяти byte low data[1] = ds.read();// Чтение памяти byte high float value = ((data[1] << 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод } void max7219(byte reg_n, byte h1, byte h2){ PORTD &=~(1 << CS);WriteBit16(reg_n,h1);WriteBit16(reg_n,h2);PORTD |=(1 << CS); } void WriteBit16(byte reg, byte data){ for(char i = 7; i >= 0; i--){ PORTD &= ~(1 << CLK); if(((reg >> i) & 1) == 1){PORTD |= (1 << DIN);}else{PORTD &= ~(1 << DIN);} PORTD |=(1 << CLK);} for(char i = 7; i >= 0; i--){ PORTD &= ~(1 << CLK); if(((data >> i) & 1) == 1){PORTD |= (1 << DIN);}else{PORTD &= ~(1 << DIN);} PORTD |=(1 << CLK);} PORTD &= ~(1 << CLK);PORTD |= (1 << DIN); } void cl(){for(char i=1;i<=8;i++){max7219(i, 0, 0);}}
5 число
6 число
9 число
10 число
11 число
12 число
Время после 23 часа в 00 кнопкой назад не работает, работает только вперёд
// 19 === SCL
// 20 === SDA
#define DIN PD3
#define CS PD4
#define CLK PD5
//// Катоды
#define SEG_A 28
#define SEG_B 29
#define SEG_C 30
#define SEG_D 31
#define SEG_E 23
#define SEG_F 22
#define SEG_G 21
#define SEG_DP 20
//// Аноды
#define AN_Q1 3
#define AN_Q2 2
#define AN_Q3 1
#define AN_Q4 0
#define AN_Q5 24
#define AN_Q6 25
#define AN_Q7 26
#define AN_Q8 27
#define SET 10
#define UP 9
#define DW 8
#include <Wire.h>
#include <DS3231.h> // http://rcl-radio.ru/wp-content/uploads/2022/10/DS3231.zip
#include <OneWire.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip
DS3231 clock;RTCDateTime DateTime;
OneWire ds(4); // Вход датчика 18b20 (PD4 44 пин контр)
long oldPosition = -999, newPosition, times,times1,times2;
int a[8],segm,i,an, dp1,dp2;
int old_sec,dp,dp_l;
int hour,minut,secon,data,mon,year,den;
int temp;
long dn1[8],dn2[8];
int hh,mm,ss,dd,mes,gg,set;
void setup() {
Wire.begin();
clock.begin();
DDRD |= (1 << DIN) | (1 << CS) | (1 << CLK);
max7219(0x0F, 0, 0);// тест выкл.
max7219(0x0C, 1, 1);// вкл. индик.
max7219(0x0A, 1, 1);// яркость
max7219(0x09, 0, 0);// дешифраторы выкл.
max7219(0x0B, 7, 7);// кол-во разрядов
// clock.setDateTime(2023, 8, 26, 20, 40, 0);
cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
// (8000000/((300+1)x64))=415.28239202658 Hz
OCR1A = 300;
TCCR1B |= (1 << WGM12);
// Prescaler 64
TCCR1B |= (1 << CS11) | (1 << CS10);
TIMSK |= (1 << OCIE1A);
sei();
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(AN_Q1, OUTPUT);
pinMode(AN_Q2, OUTPUT);
pinMode(AN_Q3, OUTPUT);
pinMode(AN_Q4, OUTPUT);
pinMode(AN_Q5, OUTPUT);
pinMode(AN_Q6, OUTPUT);
pinMode(AN_Q7, OUTPUT);
pinMode(AN_Q8, OUTPUT);
pinMode (SET,INPUT_PULLUP);
pinMode (UP,INPUT_PULLUP);
pinMode (DW,INPUT_PULLUP);
}
void loop() {
DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second;
data = DateTime.day;mon = DateTime.month;year = DateTime.year;
den=DateTime.dayOfWeek;
if(millis()-times1>10){temp=dsRead(0)*10;times1=millis();}
if(digitalRead(SET)==LOW){set++;if(set>5){set=0;}delay(200);}
hh=hour;mm=minut;ss=secon;dd=data;mes=mon;gg=year;
if(set==1 && digitalRead(UP)==LOW){hh++;if(hh>23){hh=23;}clock.setDateTime(year, mon, data, hh, minut, secon);delay(200);}
if(set==1 && digitalRead(DW)==LOW){hh--;if(hh<0){hh=0;}clock.setDateTime(year, mon, data, hh, minut, secon);delay(200);}
if(set==2 && digitalRead(UP)==LOW){mm++;if(mm>59){mm=0;}clock.setDateTime(year, mon, data, hour, mm, 0);delay(200);}
if(set==2 && digitalRead(DW)==LOW){mm--;if(mm<0){mm=0;}clock.setDateTime(year, mon, data, hour, mm, 0);delay(200);}
if(set==3 && digitalRead(UP)==LOW){dd++;if(dd>31){dd=31;}clock.setDateTime(year, mon, dd, hour, minut, secon);delay(200);}
if(set==3 && digitalRead(DW)==LOW){dd--;if(dd<1){dd=1;}clock.setDateTime(year, mon, dd, hour, minut, secon);delay(200);}
if(set==4 && digitalRead(UP)==LOW){mes++;if(mes>12){mes=12;}clock.setDateTime(year, mes, data, hour, minut, secon);delay(200);}
if(set==4 && digitalRead(DW)==LOW){mes--;if(mes<1){mes=1;}clock.setDateTime(year, mes, data, hour, minut, secon);delay(200);}
if(set==5 && digitalRead(UP)==LOW){gg++;if(gg>2100){gg=2100;}clock.setDateTime(gg, mon, data, hour, minut, secon);delay(200);}
if(set==5 && digitalRead(DW)==LOW){gg--;if(gg<2023){gg=2023;}clock.setDateTime(gg, mon, data, hour, minut, secon);delay(200);}
if(set==1){a[0] = hour/10%10;a[1] = hour%10; a[2]=10;a[3]=10;a[4]=10;a[5]=10;a[6]=10;a[7]=10;}
if(set==2){a[2] = minut/10%10;a[3] = minut%10; a[0]=10;a[1]=10;a[4]=10;a[5]=10;a[6]=10;a[7]=10;}
if(set==3){a[4] = data/10%10;a[5] = data%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;a[6]=10;a[7]=10;}
if(set==4){a[6] = mon/10%10;a[7] = mon%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;a[4]=10;a[5]=10;}
if(set==5){a[4] = year/1000%10;a[5] = year/100%10;a[6] = year/10%10; a[7] = year%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;}
if(set>0){dp_l=1;dp=1;dp1=1;dp2=1;}
switch(den){
case 1:max7219(1, 126,102);max7219(2, 102,102);max7219(3, 102,102);max7219(4, 102,126);
max7219(5, 102,102);max7219(6, 102,102);max7219(7, 102,102);max7219(8, 0,0);break;// ПH
case 2:max7219(1, 124,126);max7219(2, 102,24);max7219(3, 102,24);max7219(4, 124,24);
max7219(5, 102,24);max7219(6, 102,24);max7219(7, 124,24);max7219(8, 0,0);break;// BT
case 3:max7219(1, 60,124);max7219(2, 102,102);max7219(3, 192,102);max7219(4, 192,124);
max7219(5, 192,96);max7219(6, 102,96);max7219(7, 60,96);max7219(8, 0,0);break;// CP
case 4:max7219(1, 102,126);max7219(2, 102,24);max7219(3, 102,24);max7219(4, 62,24);
max7219(5, 6,24);max7219(6, 6,24);max7219(7, 6,24);max7219(8, 0,0);break; // ЧТ
case 5:max7219(1, 126,0x7e);max7219(2, 102,0x18);max7219(3, 102,0x18);max7219(4, 102,0x18);
max7219(5, 102,0x18);max7219(6, 102,0x18);max7219(7, 102,0x18);max7219(8, 0x00,0x00);break;// ПТ
case 6:max7219(1, 60,127);max7219(2, 102,96);max7219(3, 192,96);max7219(4, 192,124);
max7219(5, 192,102);max7219(6, 102,102);max7219(7, 60,124);max7219(8, 0,0);break;// CБ
case 7:max7219(1, 124,60);max7219(2, 102,102);max7219(3, 102,192);max7219(4, 124,192);
max7219(5, 102,192);max7219(6, 102,102);max7219(7, 124,60);max7219(8, 0,0);break;// BС
}
if(set==0){
if(hour/10%10==0){a[0]=10;}else{a[0]=hour/10%10;}
a[1]=hour%10;
a[2]=minut/10%10;
a[3]=minut%10;
if( (secon>=5&&secon<=10) || (secon>=25&&secon<=30) || (secon>=45&&secon<50)){ dp_l=0;
if(data/10%10==0){a[4]=10;}else{a[4]=data/10%10;}
a[5]=data%10;
if(mon/10%10==0){a[6]=10;}else{a[6]=mon/10%10;}
a[7]=mon%10;
}
else{
if(temp>=0&&temp<100){dp_l=0;a[4]=10;a[5]=temp/10%10;a[6]=temp%10;a[7]=11; } // _1.3C
if(temp>=100){dp_l=0;a[4]=temp/100%10;a[5]=temp/10%10;a[6]=temp%10;a[7]=11; } // 23.5C
if(temp<0&&temp>-100){dp_l=0;a[4]=12;a[5]=abs(temp/10%10);a[6]=abs(temp%10);a[7]=11; } // -1.3C
if(temp<=-100){dp_l=1;a[4]=12;a[5]=abs(temp/100%10);a[6]=abs(temp/10%10);a[7]=11; } // -23C
}
if(millis()-times<500){dp=1;}else{dp=0;}
if(old_sec!=secon){old_sec=secon;times=millis();}
}
delay(100);
}
ISR(TIMER1_COMPA_vect){
switch (i) {
/// SMALL
// Q5
case 4: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[4];ch(SEG_DP,1); segment(); an = 0; anod();break;
// Q6
case 5: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[5];ch(SEG_DP,dp_l); segment(); an = 1; anod();break;
// Q7
case 6: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[6];ch(SEG_DP,1); segment(); an = 2; anod();break;
// Q8
case 7: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[7]; segment(); an = 3; anod();break;
/// BIG
// Q1
case 0: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[0];ch(SEG_DP,1); segment(); an = 4; anod();break;
// Q2
case 1: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[1];ch(SEG_DP,dp); segment(); an = 5; anod();break;
// Q3
case 2: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[2];ch(SEG_DP,dp); segment(); an = 6; anod();break;
// Q4
case 3: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[3];ch(SEG_DP,1); segment(); an = 7; anod();break;
}
i++;if (i > 7) {i = 0;}
}
void segment() {
switch (segm) {
// A B C D E F G
case 0: 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, 1); break; // 0
case 1: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 1
case 2: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 0); break; // 2
case 3: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 0); break; // 3
case 4: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 4
case 5: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 5
case 6: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // 6
case 7: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 7
case 8: 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; // 8
case 9: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 9
case 10: 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; // пусто
case 11: 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, 1);ch(SEG_DP, 0); break; // *C
case 12: 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; // -
}
}
void anod() {
switch (an) {
case 0: ch(AN_Q1, 1); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 1: ch(AN_Q1, 0); ch(AN_Q2, 1); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 2: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 1); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 3: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 1); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 4: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 1); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 5: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 1); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 6: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 1); ch(AN_Q8, 0); break;
case 7: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 1); break;
case 10: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
}
}
void ch(int pin, int logic) {
digitalWrite(pin, logic);
}
float dsRead(byte x) {
byte data[2], addr[8][8], kol = 0;
while (ds.search(addr[kol])) { // поиск датчиков, определение адреса и кол-ва датчиков
kol++;
}
ds.reset_search(); // Сброс поиска датчика
ds.reset(); // Инициализация, выполняется сброс шины
ds.select(addr[x]); // Обращение к датчику по адресу
ds.write(0x44, 0); // Измерение температуры с переносом данных в память
ds.reset(); // Инициализация, выполняется сброс шины
ds.select(addr[x]); // Обращение к датчику по адресу
ds.write(0xBE); // Обращение памяти
data[0] = ds.read();// Чтение памяти byte low
data[1] = ds.read();// Чтение памяти byte high
float value = ((data[1] << 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод
}
void max7219(byte reg_n, byte h1, byte h2){
PORTD &=~(1 << CS);WriteBit16(reg_n,h1);WriteBit16(reg_n,h2);PORTD |=(1 << CS);
}
void WriteBit16(byte reg, byte data){
for(char i = 7; i >= 0; i--){
PORTD &= ~(1 << CLK);
if(((reg >> i) & 1) == 1){PORTD |= (1 << DIN);}else{PORTD &= ~(1 << DIN);}
PORTD |=(1 << CLK);}
for(char i = 7; i >= 0; i--){
PORTD &= ~(1 << CLK);
if(((data >> i) & 1) == 1){PORTD |= (1 << DIN);}else{PORTD &= ~(1 << DIN);}
PORTD |=(1 << CLK);}
PORTD &= ~(1 << CLK);PORTD |= (1 << DIN);
}
void cl(){for(char i=1;i<=8;i++){max7219(i, 0, 0);}}
// 19 === SCL // 20 === SDA #define DIN PD3 #define CS PD4 #define CLK PD5 //// Катоды #define SEG_A 28 #define SEG_B 29 #define SEG_C 30 #define SEG_D 31 #define SEG_E 23 #define SEG_F 22 #define SEG_G 21 #define SEG_DP 20 //// Аноды #define AN_Q1 3 #define AN_Q2 2 #define AN_Q3 1 #define AN_Q4 0 #define AN_Q5 24 #define AN_Q6 25 #define AN_Q7 26 #define AN_Q8 27 #define SET 10 #define UP 9 #define DW 8 #include <Wire.h> #include <DS3231.h> // http://rcl-radio.ru/wp-content/uploads/2022/10/DS3231.zip #include <OneWire.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip DS3231 clock;RTCDateTime DateTime; OneWire ds(4); // Вход датчика 18b20 (PD4 44 пин контр) long oldPosition = -999, newPosition, times,times1,times2; int a[8],segm,i,an, dp1,dp2; int old_sec,dp,dp_l; int hour,minut,secon,data,mon,year,den; int temp; long dn1[8],dn2[8]; int hh,mm,ss,dd,mes,gg,set; void setup() { Wire.begin(); clock.begin(); DDRD |= (1 << DIN) | (1 << CS) | (1 << CLK); max7219(0x0F, 0, 0);// тест выкл. max7219(0x0C, 1, 1);// вкл. индик. max7219(0x0A, 1, 1);// яркость max7219(0x09, 0, 0);// дешифраторы выкл. max7219(0x0B, 7, 7);// кол-во разрядов // clock.setDateTime(2023, 8, 26, 20, 40, 0); cli(); TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; // (8000000/((300+1)x64))=415.28239202658 Hz OCR1A = 300; TCCR1B |= (1 << WGM12); // Prescaler 64 TCCR1B |= (1 << CS11) | (1 << CS10); TIMSK |= (1 << OCIE1A); sei(); 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(AN_Q1, OUTPUT); pinMode(AN_Q2, OUTPUT); pinMode(AN_Q3, OUTPUT); pinMode(AN_Q4, OUTPUT); pinMode(AN_Q5, OUTPUT); pinMode(AN_Q6, OUTPUT); pinMode(AN_Q7, OUTPUT); pinMode(AN_Q8, OUTPUT); pinMode (SET,INPUT_PULLUP); pinMode (UP,INPUT_PULLUP); pinMode (DW,INPUT_PULLUP); } void loop() { DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second; data = DateTime.day;mon = DateTime.month;year = DateTime.year; den=DateTime.dayOfWeek; if(millis()-times1>10){temp=dsRead(0)*10;times1=millis();} if(digitalRead(SET)==LOW){set++;if(set>5){set=0;}delay(200);} hh=hour;mm=minut;ss=secon;dd=data;mes=mon;gg=year; if(set==1 && digitalRead(UP)==LOW){hh++;if(hh>23){hh=23;}clock.setDateTime(year, mon, data, hh, minut, secon);delay(200);} if(set==1 && digitalRead(DW)==LOW){hh--;if(hh<0){hh=0;}clock.setDateTime(year, mon, data, hh, minut, secon);delay(200);} if(set==2 && digitalRead(UP)==LOW){mm++;if(mm>59){mm=0;}clock.setDateTime(year, mon, data, hour, mm, 0);delay(200);} if(set==2 && digitalRead(DW)==LOW){mm--;if(mm<0){mm=0;}clock.setDateTime(year, mon, data, hour, mm, 0);delay(200);} if(set==3 && digitalRead(UP)==LOW){dd++;if(dd>31){dd=31;}clock.setDateTime(year, mon, dd, hour, minut, secon);delay(200);} if(set==3 && digitalRead(DW)==LOW){dd--;if(dd<1){dd=1;}clock.setDateTime(year, mon, dd, hour, minut, secon);delay(200);} if(set==4 && digitalRead(UP)==LOW){mes++;if(mes>12){mes=12;}clock.setDateTime(year, mes, data, hour, minut, secon);delay(200);} if(set==4 && digitalRead(DW)==LOW){mes--;if(mes<1){mes=1;}clock.setDateTime(year, mes, data, hour, minut, secon);delay(200);} if(set==5 && digitalRead(UP)==LOW){gg++;if(gg>2100){gg=2100;}clock.setDateTime(gg, mon, data, hour, minut, secon);delay(200);} if(set==5 && digitalRead(DW)==LOW){gg--;if(gg<2023){gg=2023;}clock.setDateTime(gg, mon, data, hour, minut, secon);delay(200);} if(set==1){a[0] = hour/10%10;a[1] = hour%10; a[2]=10;a[3]=10;a[4]=10;a[5]=10;a[6]=10;a[7]=10;} if(set==2){a[2] = minut/10%10;a[3] = minut%10; a[0]=10;a[1]=10;a[4]=10;a[5]=10;a[6]=10;a[7]=10;} if(set==3){a[4] = data/10%10;a[5] = data%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;a[6]=10;a[7]=10;} if(set==4){a[6] = mon/10%10;a[7] = mon%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;a[4]=10;a[5]=10;} if(set==5){a[4] = year/1000%10;a[5] = year/100%10;a[6] = year/10%10; a[7] = year%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;} if(set>0){dp_l=1;dp=1;dp1=1;dp2=1;} switch(den){ case 1:max7219(1, 126,102);max7219(2, 102,102);max7219(3, 102,102);max7219(4, 102,126); max7219(5, 102,102);max7219(6, 102,102);max7219(7, 102,102);max7219(8, 0,0);break;// ПH case 2:max7219(1, 124,126);max7219(2, 102,24);max7219(3, 102,24);max7219(4, 124,24); max7219(5, 102,24);max7219(6, 102,24);max7219(7, 124,24);max7219(8, 0,0);break;// BT case 3:max7219(1, 60,124);max7219(2, 102,102);max7219(3, 192,102);max7219(4, 192,124); max7219(5, 192,96);max7219(6, 102,96);max7219(7, 60,96);max7219(8, 0,0);break;// CP case 4:max7219(1, 102,126);max7219(2, 102,24);max7219(3, 102,24);max7219(4, 62,24); max7219(5, 6,24);max7219(6, 6,24);max7219(7, 6,24);max7219(8, 0,0);break; // ЧТ case 5:max7219(1, 126,0x7e);max7219(2, 102,0x18);max7219(3, 102,0x18);max7219(4, 102,0x18); max7219(5, 102,0x18);max7219(6, 102,0x18);max7219(7, 102,0x18);max7219(8, 0x00,0x00);break;// ПТ case 6:max7219(1, 60,127);max7219(2, 102,96);max7219(3, 192,96);max7219(4, 192,124); max7219(5, 192,102);max7219(6, 102,102);max7219(7, 60,124);max7219(8, 0,0);break;// CБ case 7:max7219(1, 124,60);max7219(2, 102,102);max7219(3, 102,192);max7219(4, 124,192); max7219(5, 102,192);max7219(6, 102,102);max7219(7, 124,60);max7219(8, 0,0);break;// BС } if(set==0){ if(hour/10%10==0){a[0]=10;}else{a[0]=hour/10%10;} a[1]=hour%10; a[2]=minut/10%10; a[3]=minut%10; if( (secon>=5&&secon<=10) || (secon>=25&&secon<=30) || (secon>=45&&secon<50)){ dp_l=0; if(data/10%10==0){a[4]=10;}else{a[4]=data/10%10;} a[5]=data%10; if(mon/10%10==0){a[6]=10;}else{a[6]=mon/10%10;} a[7]=mon%10; } else{ if(temp>=0&&temp<100){dp_l=0;a[4]=10;a[5]=temp/10%10;a[6]=temp%10;a[7]=11; } // _1.3C if(temp>=100){dp_l=0;a[4]=temp/100%10;a[5]=temp/10%10;a[6]=temp%10;a[7]=11; } // 23.5C if(temp<0&&temp>-100){dp_l=0;a[4]=12;a[5]=abs(temp/10%10);a[6]=abs(temp%10);a[7]=11; } // -1.3C if(temp<=-100){dp_l=1;a[4]=12;a[5]=abs(temp/100%10);a[6]=abs(temp/10%10);a[7]=11; } // -23C } if(millis()-times<500){dp=1;}else{dp=0;} if(old_sec!=secon){old_sec=secon;times=millis();} } delay(100); } ISR(TIMER1_COMPA_vect){ switch (i) { /// SMALL // Q5 case 4: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[4];ch(SEG_DP,1); segment(); an = 0; anod();break; // Q6 case 5: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[5];ch(SEG_DP,dp_l); segment(); an = 1; anod();break; // Q7 case 6: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[6];ch(SEG_DP,1); segment(); an = 2; anod();break; // Q8 case 7: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[7]; segment(); an = 3; anod();break; /// BIG // Q1 case 0: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[0];ch(SEG_DP,1); segment(); an = 4; anod();break; // Q2 case 1: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[1];ch(SEG_DP,dp); segment(); an = 5; anod();break; // Q3 case 2: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[2];ch(SEG_DP,dp); segment(); an = 6; anod();break; // Q4 case 3: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[3];ch(SEG_DP,1); segment(); an = 7; anod();break; } i++;if (i > 7) {i = 0;} } void segment() { switch (segm) { // A B C D E F G case 0: 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, 1); break; // 0 case 1: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 1 case 2: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 0); break; // 2 case 3: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 0); break; // 3 case 4: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 4 case 5: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 5 case 6: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // 6 case 7: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 7 case 8: 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; // 8 case 9: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 9 case 10: 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; // пусто case 11: 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, 1);ch(SEG_DP, 0); break; // *C case 12: 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; // - } } void anod() { switch (an) { case 0: ch(AN_Q1, 1); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 1: ch(AN_Q1, 0); ch(AN_Q2, 1); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 2: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 1); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 3: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 1); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 4: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 1); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 5: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 1); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 6: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 1); ch(AN_Q8, 0); break; case 7: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 1); break; case 10: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; } } void ch(int pin, int logic) { digitalWrite(pin, logic); } float dsRead(byte x) { byte data[2], addr[8][8], kol = 0; while (ds.search(addr[kol])) { // поиск датчиков, определение адреса и кол-ва датчиков kol++; } ds.reset_search(); // Сброс поиска датчика ds.reset(); // Инициализация, выполняется сброс шины ds.select(addr[x]); // Обращение к датчику по адресу ds.write(0x44, 0); // Измерение температуры с переносом данных в память ds.reset(); // Инициализация, выполняется сброс шины ds.select(addr[x]); // Обращение к датчику по адресу ds.write(0xBE); // Обращение памяти data[0] = ds.read();// Чтение памяти byte low data[1] = ds.read();// Чтение памяти byte high float value = ((data[1] << 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод } void max7219(byte reg_n, byte h1, byte h2){ PORTD &=~(1 << CS);WriteBit16(reg_n,h1);WriteBit16(reg_n,h2);PORTD |=(1 << CS); } void WriteBit16(byte reg, byte data){ for(char i = 7; i >= 0; i--){ PORTD &= ~(1 << CLK); if(((reg >> i) & 1) == 1){PORTD |= (1 << DIN);}else{PORTD &= ~(1 << DIN);} PORTD |=(1 << CLK);} for(char i = 7; i >= 0; i--){ PORTD &= ~(1 << CLK); if(((data >> i) & 1) == 1){PORTD |= (1 << DIN);}else{PORTD &= ~(1 << DIN);} PORTD |=(1 << CLK);} PORTD &= ~(1 << CLK);PORTD |= (1 << DIN); } void cl(){for(char i=1;i<=8;i++){max7219(i, 0, 0);}}
По дням недели все работает. Время выше 23 часа не увеличивается, только уменьшать
Время что минуты часы дата месяц в плюс достигает придела и все, в минус аналогично, достигает минимум и все
Если надо по другому напишите, что будет при превышении предела в минус и плюс
// 19 === SCL
// 20 === SDA
#define DIN PD3
#define CS PD4
#define CLK PD5
//// Катоды
#define SEG_A 28
#define SEG_B 29
#define SEG_C 30
#define SEG_D 31
#define SEG_E 23
#define SEG_F 22
#define SEG_G 21
#define SEG_DP 20
//// Аноды
#define AN_Q1 3
#define AN_Q2 2
#define AN_Q3 1
#define AN_Q4 0
#define AN_Q5 24
#define AN_Q6 25
#define AN_Q7 26
#define AN_Q8 27
#define SET 10
#define UP 9
#define DW 8
#include <Wire.h>
#include <DS3231.h> // http://rcl-radio.ru/wp-content/uploads/2022/10/DS3231.zip
#include <OneWire.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip
DS3231 clock;RTCDateTime DateTime;
OneWire ds(4); // Вход датчика 18b20 (PD4 44 пин контр)
long oldPosition = -999, newPosition, times,times1,times2;
int a[8],segm,i,an, dp1,dp2;
int old_sec,dp,dp_l;
int hour,minut,secon,data,mon,year,den;
int temp;
long dn1[8],dn2[8];
int hh,mm,ss,dd,mes,gg,set;
void setup() {
Wire.begin();
clock.begin();
DDRD |= (1 << DIN) | (1 << CS) | (1 << CLK);
max7219(0x0F, 0, 0);// тест выкл.
max7219(0x0C, 1, 1);// вкл. индик.
max7219(0x0A, 1, 1);// яркость
max7219(0x09, 0, 0);// дешифраторы выкл.
max7219(0x0B, 7, 7);// кол-во разрядов
// clock.setDateTime(2023, 8, 26, 20, 40, 0);
cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
// (8000000/((300+1)x64))=415.28239202658 Hz
OCR1A = 300;
TCCR1B |= (1 << WGM12);
// Prescaler 64
TCCR1B |= (1 << CS11) | (1 << CS10);
TIMSK |= (1 << OCIE1A);
sei();
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(AN_Q1, OUTPUT);
pinMode(AN_Q2, OUTPUT);
pinMode(AN_Q3, OUTPUT);
pinMode(AN_Q4, OUTPUT);
pinMode(AN_Q5, OUTPUT);
pinMode(AN_Q6, OUTPUT);
pinMode(AN_Q7, OUTPUT);
pinMode(AN_Q8, OUTPUT);
pinMode (SET,INPUT_PULLUP);
pinMode (UP,INPUT_PULLUP);
pinMode (DW,INPUT_PULLUP);
}
void loop() {
DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second;
data = DateTime.day;mon = DateTime.month;year = DateTime.year;
den=DateTime.dayOfWeek;
if(millis()-times1>10){temp=dsRead(0)*10;times1=millis();}
if(digitalRead(SET)==LOW){set++;if(set>5){set=0;}delay(200);}
hh=hour;mm=minut;ss=secon;dd=data;mes=mon;gg=year;
if(set==1 && digitalRead(UP)==LOW){hh++;if(hh>23){hh=23;}clock.setDateTime(year, mon, data, hh, minut, secon);delay(200);}
if(set==1 && digitalRead(DW)==LOW){hh--;if(hh<0){hh=0;}clock.setDateTime(year, mon, data, hh, minut, secon);delay(200);}
if(set==2 && digitalRead(UP)==LOW){mm++;if(mm>59){mm=59;}clock.setDateTime(year, mon, data, hour, mm, 0);delay(200);}
if(set==2 && digitalRead(DW)==LOW){mm--;if(mm<0){mm=0;}clock.setDateTime(year, mon, data, hour, mm, 0);delay(200);}
if(set==3 && digitalRead(UP)==LOW){dd++;if(dd>31){dd=31;}clock.setDateTime(year, mon, dd, hour, minut, secon);delay(200);}
if(set==3 && digitalRead(DW)==LOW){dd--;if(dd<1){dd=1;}clock.setDateTime(year, mon, dd, hour, minut, secon);delay(200);}
if(set==4 && digitalRead(UP)==LOW){mes++;if(mes>12){mes=12;}clock.setDateTime(year, mes, data, hour, minut, secon);delay(200);}
if(set==4 && digitalRead(DW)==LOW){mes--;if(mes<1){mes=1;}clock.setDateTime(year, mes, data, hour, minut, secon);delay(200);}
if(set==5 && digitalRead(UP)==LOW){gg++;if(gg>2100){gg=2100;}clock.setDateTime(gg, mon, data, hour, minut, secon);delay(200);}
if(set==5 && digitalRead(DW)==LOW){gg--;if(gg<2023){gg=2023;}clock.setDateTime(gg, mon, data, hour, minut, secon);delay(200);}
if(set==1){a[0] = hour/10%10;a[1] = hour%10; a[2]=10;a[3]=10;a[4]=10;a[5]=10;a[6]=10;a[7]=10;}
if(set==2){a[2] = minut/10%10;a[3] = minut%10; a[0]=10;a[1]=10;a[4]=10;a[5]=10;a[6]=10;a[7]=10;}
if(set==3){a[4] = data/10%10;a[5] = data%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;a[6]=10;a[7]=10;}
if(set==4){a[6] = mon/10%10;a[7] = mon%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;a[4]=10;a[5]=10;}
if(set==5){a[4] = year/1000%10;a[5] = year/100%10;a[6] = year/10%10; a[7] = year%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;}
if(set>0){dp_l=1;dp=1;dp1=1;dp2=1;}
switch(den){
case 1:max7219(1, 126,102);max7219(2, 102,102);max7219(3, 102,102);max7219(4, 102,126);
max7219(5, 102,102);max7219(6, 102,102);max7219(7, 102,102);max7219(8, 0,0);break;// ПH
case 2:max7219(1, 124,126);max7219(2, 102,24);max7219(3, 102,24);max7219(4, 124,24);
max7219(5, 102,24);max7219(6, 102,24);max7219(7, 124,24);max7219(8, 0,0);break;// BT
case 3:max7219(1, 60,124);max7219(2, 102,102);max7219(3, 192,102);max7219(4, 192,124);
max7219(5, 192,96);max7219(6, 102,96);max7219(7, 60,96);max7219(8, 0,0);break;// CP
case 4:max7219(1, 102,126);max7219(2, 102,24);max7219(3, 102,24);max7219(4, 62,24);
max7219(5, 6,24);max7219(6, 6,24);max7219(7, 6,24);max7219(8, 0,0);break; // ЧТ
case 5:max7219(1, 126,0x7e);max7219(2, 102,0x18);max7219(3, 102,0x18);max7219(4, 102,0x18);
max7219(5, 102,0x18);max7219(6, 102,0x18);max7219(7, 102,0x18);max7219(8, 0x00,0x00);break;// ПТ
case 6:max7219(1, 60,127);max7219(2, 102,96);max7219(3, 192,96);max7219(4, 192,124);
max7219(5, 192,102);max7219(6, 102,102);max7219(7, 60,124);max7219(8, 0,0);break;// CБ
case 7:max7219(1, 124,60);max7219(2, 102,102);max7219(3, 102,192);max7219(4, 124,192);
max7219(5, 102,192);max7219(6, 102,102);max7219(7, 124,60);max7219(8, 0,0);break;// BС
}
if(set==0){
if(hour/10%10==0){a[0]=10;}else{a[0]=hour/10%10;}
a[1]=hour%10;
a[2]=minut/10%10;
a[3]=minut%10;
if( (secon>=5&&secon<=10) || (secon>=25&&secon<=30) || (secon>=45&&secon<50)){ dp_l=0;
if(data/10%10==0){a[4]=10;}else{a[4]=data/10%10;}
a[5]=data%10;
if(mon/10%10==0){a[6]=10;}else{a[6]=mon/10%10;}
a[7]=mon%10;
}
else{
if(temp>=0&&temp<100){dp_l=0;a[4]=10;a[5]=temp/10%10;a[6]=temp%10;a[7]=11; } // _1.3C
if(temp>=100){dp_l=0;a[4]=temp/100%10;a[5]=temp/10%10;a[6]=temp%10;a[7]=11; } // 23.5C
if(temp<0&&temp>-100){dp_l=0;a[4]=12;a[5]=abs(temp/10%10);a[6]=abs(temp%10);a[7]=11; } // -1.3C
if(temp<=-100){dp_l=1;a[4]=12;a[5]=abs(temp/100%10);a[6]=abs(temp/10%10);a[7]=11; } // -23C
}
if(millis()-times<500){dp=1;}else{dp=0;}
if(old_sec!=secon){old_sec=secon;times=millis();}
}
delay(100);
}
ISR(TIMER1_COMPA_vect){
switch (i) {
/// SMALL
// Q5
case 4: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[4];ch(SEG_DP,1); segment(); an = 0; anod();break;
// Q6
case 5: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[5];ch(SEG_DP,dp_l); segment(); an = 1; anod();break;
// Q7
case 6: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[6];ch(SEG_DP,1); segment(); an = 2; anod();break;
// Q8
case 7: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[7]; segment(); an = 3; anod();break;
/// BIG
// Q1
case 0: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[0];ch(SEG_DP,1); segment(); an = 4; anod();break;
// Q2
case 1: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[1];ch(SEG_DP,dp); segment(); an = 5; anod();break;
// Q3
case 2: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[2];ch(SEG_DP,dp); segment(); an = 6; anod();break;
// Q4
case 3: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[3];ch(SEG_DP,1); segment(); an = 7; anod();break;
}
i++;if (i > 7) {i = 0;}
}
void segment() {
switch (segm) {
// A B C D E F G
case 0: 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, 1); break; // 0
case 1: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 1
case 2: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 0); break; // 2
case 3: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 0); break; // 3
case 4: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 4
case 5: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 5
case 6: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // 6
case 7: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 7
case 8: 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; // 8
case 9: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 9
case 10: 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; // пусто
case 11: 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, 1);ch(SEG_DP, 0); break; // *C
case 12: 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; // -
}
}
void anod() {
switch (an) {
case 0: ch(AN_Q1, 1); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 1: ch(AN_Q1, 0); ch(AN_Q2, 1); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 2: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 1); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 3: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 1); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 4: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 1); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 5: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 1); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 6: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 1); ch(AN_Q8, 0); break;
case 7: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 1); break;
case 10: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
}
}
void ch(int pin, int logic) {
digitalWrite(pin, logic);
}
float dsRead(byte x) {
byte data[2], addr[8][8], kol = 0;
while (ds.search(addr[kol])) { // поиск датчиков, определение адреса и кол-ва датчиков
kol++;
}
ds.reset_search(); // Сброс поиска датчика
ds.reset(); // Инициализация, выполняется сброс шины
ds.select(addr[x]); // Обращение к датчику по адресу
ds.write(0x44, 0); // Измерение температуры с переносом данных в память
ds.reset(); // Инициализация, выполняется сброс шины
ds.select(addr[x]); // Обращение к датчику по адресу
ds.write(0xBE); // Обращение памяти
data[0] = ds.read();// Чтение памяти byte low
data[1] = ds.read();// Чтение памяти byte high
float value = ((data[1] << 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод
}
void max7219(byte reg_n, byte h1, byte h2){
PORTD &=~(1 << CS);WriteBit16(reg_n,h1);WriteBit16(reg_n,h2);PORTD |=(1 << CS);
}
void WriteBit16(byte reg, byte data){
for(char i = 7; i >= 0; i--){
PORTD &= ~(1 << CLK);
if(((reg >> i) & 1) == 1){PORTD |= (1 << DIN);}else{PORTD &= ~(1 << DIN);}
PORTD |=(1 << CLK);}
for(char i = 7; i >= 0; i--){
PORTD &= ~(1 << CLK);
if(((data >> i) & 1) == 1){PORTD |= (1 << DIN);}else{PORTD &= ~(1 << DIN);}
PORTD |=(1 << CLK);}
PORTD &= ~(1 << CLK);PORTD |= (1 << DIN);
}
void cl(){for(char i=1;i<=8;i++){max7219(i, 0, 0);}}
Я думал по кругу ,достигает предела затем начинается с минимума.С минимума до максимума
Я думал по кругу ,достигает предела затем начинается с минимума.С минимума до максимума
Могу так сделать
// 19 === SCL
// 20 === SDA
#define DIN PD3
#define CS PD4
#define CLK PD5
//// Катоды
#define SEG_A 28
#define SEG_B 29
#define SEG_C 30
#define SEG_D 31
#define SEG_E 23
#define SEG_F 22
#define SEG_G 21
#define SEG_DP 20
//// Аноды
#define AN_Q1 3
#define AN_Q2 2
#define AN_Q3 1
#define AN_Q4 0
#define AN_Q5 24
#define AN_Q6 25
#define AN_Q7 26
#define AN_Q8 27
#define SET 10
#define UP 9
#define DW 8
#include <Wire.h>
#include <DS3231.h> // http://rcl-radio.ru/wp-content/uploads/2022/10/DS3231.zip
#include <OneWire.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip
DS3231 clock;RTCDateTime DateTime;
OneWire ds(4); // Вход датчика 18b20 (PD4 44 пин контр)
long oldPosition = -999, newPosition, times,times1,times2;
int a[8],segm,i,an, dp1,dp2;
int old_sec,dp,dp_l;
int hour,minut,secon,data,mon,year,den;
int temp;
long dn1[8],dn2[8];
int hh,mm,ss,dd,mes,gg,set;
void setup() {
Wire.begin();
clock.begin();
DDRD |= (1 << DIN) | (1 << CS) | (1 << CLK);
max7219(0x0F, 0, 0);// тест выкл.
max7219(0x0C, 1, 1);// вкл. индик.
max7219(0x0A, 1, 1);// яркость
max7219(0x09, 0, 0);// дешифраторы выкл.
max7219(0x0B, 7, 7);// кол-во разрядов
// clock.setDateTime(2023, 8, 26, 20, 40, 0);
cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
// (8000000/((300+1)x64))=415.28239202658 Hz
OCR1A = 300;
TCCR1B |= (1 << WGM12);
// Prescaler 64
TCCR1B |= (1 << CS11) | (1 << CS10);
TIMSK |= (1 << OCIE1A);
sei();
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(AN_Q1, OUTPUT);
pinMode(AN_Q2, OUTPUT);
pinMode(AN_Q3, OUTPUT);
pinMode(AN_Q4, OUTPUT);
pinMode(AN_Q5, OUTPUT);
pinMode(AN_Q6, OUTPUT);
pinMode(AN_Q7, OUTPUT);
pinMode(AN_Q8, OUTPUT);
pinMode (SET,INPUT_PULLUP);
pinMode (UP,INPUT_PULLUP);
pinMode (DW,INPUT_PULLUP);
}
void loop() {
DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second;
data = DateTime.day;mon = DateTime.month;year = DateTime.year;
den=DateTime.dayOfWeek;
if(millis()-times1>10){temp=dsRead(0)*10;times1=millis();}
if(digitalRead(SET)==LOW){set++;if(set>5){set=0;}delay(200);}
hh=hour;mm=minut;ss=secon;dd=data;mes=mon;gg=year;
if(set==1 && digitalRead(UP)==LOW){hh++;if(hh>23){hh=0;}clock.setDateTime(year, mon, data, hh, minut, secon);delay(200);}
if(set==1 && digitalRead(DW)==LOW){hh--;if(hh<0){hh=23;}clock.setDateTime(year, mon, data, hh, minut, secon);delay(200);}
if(set==2 && digitalRead(UP)==LOW){mm++;if(mm>59){mm=0;}clock.setDateTime(year, mon, data, hour, mm, 0);delay(200);}
if(set==2 && digitalRead(DW)==LOW){mm--;if(mm<0){mm=59;}clock.setDateTime(year, mon, data, hour, mm, 0);delay(200);}
if(set==3 && digitalRead(UP)==LOW){dd++;if(dd>31){dd=1;}clock.setDateTime(year, mon, dd, hour, minut, secon);delay(200);}
if(set==3 && digitalRead(DW)==LOW){dd--;if(dd<1){dd=31;}clock.setDateTime(year, mon, dd, hour, minut, secon);delay(200);}
if(set==4 && digitalRead(UP)==LOW){mes++;if(mes>12){mes=0;}clock.setDateTime(year, mes, data, hour, minut, secon);delay(200);}
if(set==4 && digitalRead(DW)==LOW){mes--;if(mes<1){mes=12;}clock.setDateTime(year, mes, data, hour, minut, secon);delay(200);}
if(set==5 && digitalRead(UP)==LOW){gg++;if(gg>2100){gg=2023;}clock.setDateTime(gg, mon, data, hour, minut, secon);delay(200);}
if(set==5 && digitalRead(DW)==LOW){gg--;if(gg<2023){gg=2100;}clock.setDateTime(gg, mon, data, hour, minut, secon);delay(200);}
if(set==1){a[0] = hour/10%10;a[1] = hour%10; a[2]=10;a[3]=10;a[4]=10;a[5]=10;a[6]=10;a[7]=10;}
if(set==2){a[2] = minut/10%10;a[3] = minut%10; a[0]=10;a[1]=10;a[4]=10;a[5]=10;a[6]=10;a[7]=10;}
if(set==3){a[4] = data/10%10;a[5] = data%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;a[6]=10;a[7]=10;}
if(set==4){a[6] = mon/10%10;a[7] = mon%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;a[4]=10;a[5]=10;}
if(set==5){a[4] = year/1000%10;a[5] = year/100%10;a[6] = year/10%10; a[7] = year%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;}
if(set>0){dp_l=1;dp=1;dp1=1;dp2=1;}
switch(den){
case 1:max7219(1, 126,102);max7219(2, 102,102);max7219(3, 102,102);max7219(4, 102,126);
max7219(5, 102,102);max7219(6, 102,102);max7219(7, 102,102);max7219(8, 0,0);break;// ПH
case 2:max7219(1, 124,126);max7219(2, 102,24);max7219(3, 102,24);max7219(4, 124,24);
max7219(5, 102,24);max7219(6, 102,24);max7219(7, 124,24);max7219(8, 0,0);break;// BT
case 3:max7219(1, 60,124);max7219(2, 102,102);max7219(3, 192,102);max7219(4, 192,124);
max7219(5, 192,96);max7219(6, 102,96);max7219(7, 60,96);max7219(8, 0,0);break;// CP
case 4:max7219(1, 102,126);max7219(2, 102,24);max7219(3, 102,24);max7219(4, 62,24);
max7219(5, 6,24);max7219(6, 6,24);max7219(7, 6,24);max7219(8, 0,0);break; // ЧТ
case 5:max7219(1, 126,0x7e);max7219(2, 102,0x18);max7219(3, 102,0x18);max7219(4, 102,0x18);
max7219(5, 102,0x18);max7219(6, 102,0x18);max7219(7, 102,0x18);max7219(8, 0x00,0x00);break;// ПТ
case 6:max7219(1, 60,127);max7219(2, 102,96);max7219(3, 192,96);max7219(4, 192,124);
max7219(5, 192,102);max7219(6, 102,102);max7219(7, 60,124);max7219(8, 0,0);break;// CБ
case 7:max7219(1, 124,60);max7219(2, 102,102);max7219(3, 102,192);max7219(4, 124,192);
max7219(5, 102,192);max7219(6, 102,102);max7219(7, 124,60);max7219(8, 0,0);break;// BС
}
if(set==0){
if(hour/10%10==0){a[0]=10;}else{a[0]=hour/10%10;}
a[1]=hour%10;
a[2]=minut/10%10;
a[3]=minut%10;
if( (secon>=5&&secon<=10) || (secon>=25&&secon<=30) || (secon>=45&&secon<50)){ dp_l=0;
if(data/10%10==0){a[4]=10;}else{a[4]=data/10%10;}
a[5]=data%10;
if(mon/10%10==0){a[6]=10;}else{a[6]=mon/10%10;}
a[7]=mon%10;
}
else{
if(temp>=0&&temp<100){dp_l=0;a[4]=10;a[5]=temp/10%10;a[6]=temp%10;a[7]=11; } // _1.3C
if(temp>=100){dp_l=0;a[4]=temp/100%10;a[5]=temp/10%10;a[6]=temp%10;a[7]=11; } // 23.5C
if(temp<0&&temp>-100){dp_l=0;a[4]=12;a[5]=abs(temp/10%10);a[6]=abs(temp%10);a[7]=11; } // -1.3C
if(temp<=-100){dp_l=1;a[4]=12;a[5]=abs(temp/100%10);a[6]=abs(temp/10%10);a[7]=11; } // -23C
}
if(millis()-times<500){dp=1;}else{dp=0;}
if(old_sec!=secon){old_sec=secon;times=millis();}
}
delay(100);
}
ISR(TIMER1_COMPA_vect){
switch (i) {
/// SMALL
// Q5
case 4: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[4];ch(SEG_DP,1); segment(); an = 0; anod();break;
// Q6
case 5: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[5];ch(SEG_DP,dp_l); segment(); an = 1; anod();break;
// Q7
case 6: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[6];ch(SEG_DP,1); segment(); an = 2; anod();break;
// Q8
case 7: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[7]; segment(); an = 3; anod();break;
/// BIG
// Q1
case 0: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[0];ch(SEG_DP,1); segment(); an = 4; anod();break;
// Q2
case 1: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[1];ch(SEG_DP,dp); segment(); an = 5; anod();break;
// Q3
case 2: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[2];ch(SEG_DP,dp); segment(); an = 6; anod();break;
// Q4
case 3: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[3];ch(SEG_DP,1); segment(); an = 7; anod();break;
}
i++;if (i > 7) {i = 0;}
}
void segment() {
switch (segm) {
// A B C D E F G
case 0: 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, 1); break; // 0
case 1: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 1
case 2: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 0); break; // 2
case 3: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 0); break; // 3
case 4: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 4
case 5: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 5
case 6: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // 6
case 7: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 7
case 8: 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; // 8
case 9: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 9
case 10: 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; // пусто
case 11: 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, 1);ch(SEG_DP, 0); break; // *C
case 12: 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; // -
}
}
void anod() {
switch (an) {
case 0: ch(AN_Q1, 1); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 1: ch(AN_Q1, 0); ch(AN_Q2, 1); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 2: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 1); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 3: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 1); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 4: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 1); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 5: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 1); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
case 6: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 1); ch(AN_Q8, 0); break;
case 7: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 1); break;
case 10: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break;
}
}
void ch(int pin, int logic) {
digitalWrite(pin, logic);
}
float dsRead(byte x) {
byte data[2], addr[8][8], kol = 0;
while (ds.search(addr[kol])) { // поиск датчиков, определение адреса и кол-ва датчиков
kol++;
}
ds.reset_search(); // Сброс поиска датчика
ds.reset(); // Инициализация, выполняется сброс шины
ds.select(addr[x]); // Обращение к датчику по адресу
ds.write(0x44, 0); // Измерение температуры с переносом данных в память
ds.reset(); // Инициализация, выполняется сброс шины
ds.select(addr[x]); // Обращение к датчику по адресу
ds.write(0xBE); // Обращение памяти
data[0] = ds.read();// Чтение памяти byte low
data[1] = ds.read();// Чтение памяти byte high
float value = ((data[1] << 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод
}
void max7219(byte reg_n, byte h1, byte h2){
PORTD &=~(1 << CS);WriteBit16(reg_n,h1);WriteBit16(reg_n,h2);PORTD |=(1 << CS);
}
void WriteBit16(byte reg, byte data){
for(char i = 7; i >= 0; i--){
PORTD &= ~(1 << CLK);
if(((reg >> i) & 1) == 1){PORTD |= (1 << DIN);}else{PORTD &= ~(1 << DIN);}
PORTD |=(1 << CLK);}
for(char i = 7; i >= 0; i--){
PORTD &= ~(1 << CLK);
if(((data >> i) & 1) == 1){PORTD |= (1 << DIN);}else{PORTD &= ~(1 << DIN);}
PORTD |=(1 << CLK);}
PORTD &= ~(1 << CLK);PORTD |= (1 << DIN);
}
void cl(){for(char i=1;i<=8;i++){max7219(i, 0, 0);}}
Я думал по кругу ,достигает предела затем начинается с минимума.С минимума до максимума
Могу так сделать
// 19 === SCL // 20 === SDA #define DIN PD3 #define CS PD4 #define CLK PD5 //// Катоды #define SEG_A 28 #define SEG_B 29 #define SEG_C 30 #define SEG_D 31 #define SEG_E 23 #define SEG_F 22 #define SEG_G 21 #define SEG_DP 20 //// Аноды #define AN_Q1 3 #define AN_Q2 2 #define AN_Q3 1 #define AN_Q4 0 #define AN_Q5 24 #define AN_Q6 25 #define AN_Q7 26 #define AN_Q8 27 #define SET 10 #define UP 9 #define DW 8 #include <Wire.h> #include <DS3231.h> // http://rcl-radio.ru/wp-content/uploads/2022/10/DS3231.zip #include <OneWire.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip DS3231 clock;RTCDateTime DateTime; OneWire ds(4); // Вход датчика 18b20 (PD4 44 пин контр) long oldPosition = -999, newPosition, times,times1,times2; int a[8],segm,i,an, dp1,dp2; int old_sec,dp,dp_l; int hour,minut,secon,data,mon,year,den; int temp; long dn1[8],dn2[8]; int hh,mm,ss,dd,mes,gg,set; void setup() { Wire.begin(); clock.begin(); DDRD |= (1 << DIN) | (1 << CS) | (1 << CLK); max7219(0x0F, 0, 0);// тест выкл. max7219(0x0C, 1, 1);// вкл. индик. max7219(0x0A, 1, 1);// яркость max7219(0x09, 0, 0);// дешифраторы выкл. max7219(0x0B, 7, 7);// кол-во разрядов // clock.setDateTime(2023, 8, 26, 20, 40, 0); cli(); TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; // (8000000/((300+1)x64))=415.28239202658 Hz OCR1A = 300; TCCR1B |= (1 << WGM12); // Prescaler 64 TCCR1B |= (1 << CS11) | (1 << CS10); TIMSK |= (1 << OCIE1A); sei(); 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(AN_Q1, OUTPUT); pinMode(AN_Q2, OUTPUT); pinMode(AN_Q3, OUTPUT); pinMode(AN_Q4, OUTPUT); pinMode(AN_Q5, OUTPUT); pinMode(AN_Q6, OUTPUT); pinMode(AN_Q7, OUTPUT); pinMode(AN_Q8, OUTPUT); pinMode (SET,INPUT_PULLUP); pinMode (UP,INPUT_PULLUP); pinMode (DW,INPUT_PULLUP); } void loop() { DateTime = clock.getDateTime();hour = DateTime.hour;minut = DateTime.minute;secon = DateTime.second; data = DateTime.day;mon = DateTime.month;year = DateTime.year; den=DateTime.dayOfWeek; if(millis()-times1>10){temp=dsRead(0)*10;times1=millis();} if(digitalRead(SET)==LOW){set++;if(set>5){set=0;}delay(200);} hh=hour;mm=minut;ss=secon;dd=data;mes=mon;gg=year; if(set==1 && digitalRead(UP)==LOW){hh++;if(hh>23){hh=0;}clock.setDateTime(year, mon, data, hh, minut, secon);delay(200);} if(set==1 && digitalRead(DW)==LOW){hh--;if(hh<0){hh=23;}clock.setDateTime(year, mon, data, hh, minut, secon);delay(200);} if(set==2 && digitalRead(UP)==LOW){mm++;if(mm>59){mm=0;}clock.setDateTime(year, mon, data, hour, mm, 0);delay(200);} if(set==2 && digitalRead(DW)==LOW){mm--;if(mm<0){mm=59;}clock.setDateTime(year, mon, data, hour, mm, 0);delay(200);} if(set==3 && digitalRead(UP)==LOW){dd++;if(dd>31){dd=1;}clock.setDateTime(year, mon, dd, hour, minut, secon);delay(200);} if(set==3 && digitalRead(DW)==LOW){dd--;if(dd<1){dd=31;}clock.setDateTime(year, mon, dd, hour, minut, secon);delay(200);} if(set==4 && digitalRead(UP)==LOW){mes++;if(mes>12){mes=0;}clock.setDateTime(year, mes, data, hour, minut, secon);delay(200);} if(set==4 && digitalRead(DW)==LOW){mes--;if(mes<1){mes=12;}clock.setDateTime(year, mes, data, hour, minut, secon);delay(200);} if(set==5 && digitalRead(UP)==LOW){gg++;if(gg>2100){gg=2023;}clock.setDateTime(gg, mon, data, hour, minut, secon);delay(200);} if(set==5 && digitalRead(DW)==LOW){gg--;if(gg<2023){gg=2100;}clock.setDateTime(gg, mon, data, hour, minut, secon);delay(200);} if(set==1){a[0] = hour/10%10;a[1] = hour%10; a[2]=10;a[3]=10;a[4]=10;a[5]=10;a[6]=10;a[7]=10;} if(set==2){a[2] = minut/10%10;a[3] = minut%10; a[0]=10;a[1]=10;a[4]=10;a[5]=10;a[6]=10;a[7]=10;} if(set==3){a[4] = data/10%10;a[5] = data%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;a[6]=10;a[7]=10;} if(set==4){a[6] = mon/10%10;a[7] = mon%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;a[4]=10;a[5]=10;} if(set==5){a[4] = year/1000%10;a[5] = year/100%10;a[6] = year/10%10; a[7] = year%10; a[0]=10;a[1]=10;a[2]=10;a[3]=10;} if(set>0){dp_l=1;dp=1;dp1=1;dp2=1;} switch(den){ case 1:max7219(1, 126,102);max7219(2, 102,102);max7219(3, 102,102);max7219(4, 102,126); max7219(5, 102,102);max7219(6, 102,102);max7219(7, 102,102);max7219(8, 0,0);break;// ПH case 2:max7219(1, 124,126);max7219(2, 102,24);max7219(3, 102,24);max7219(4, 124,24); max7219(5, 102,24);max7219(6, 102,24);max7219(7, 124,24);max7219(8, 0,0);break;// BT case 3:max7219(1, 60,124);max7219(2, 102,102);max7219(3, 192,102);max7219(4, 192,124); max7219(5, 192,96);max7219(6, 102,96);max7219(7, 60,96);max7219(8, 0,0);break;// CP case 4:max7219(1, 102,126);max7219(2, 102,24);max7219(3, 102,24);max7219(4, 62,24); max7219(5, 6,24);max7219(6, 6,24);max7219(7, 6,24);max7219(8, 0,0);break; // ЧТ case 5:max7219(1, 126,0x7e);max7219(2, 102,0x18);max7219(3, 102,0x18);max7219(4, 102,0x18); max7219(5, 102,0x18);max7219(6, 102,0x18);max7219(7, 102,0x18);max7219(8, 0x00,0x00);break;// ПТ case 6:max7219(1, 60,127);max7219(2, 102,96);max7219(3, 192,96);max7219(4, 192,124); max7219(5, 192,102);max7219(6, 102,102);max7219(7, 60,124);max7219(8, 0,0);break;// CБ case 7:max7219(1, 124,60);max7219(2, 102,102);max7219(3, 102,192);max7219(4, 124,192); max7219(5, 102,192);max7219(6, 102,102);max7219(7, 124,60);max7219(8, 0,0);break;// BС } if(set==0){ if(hour/10%10==0){a[0]=10;}else{a[0]=hour/10%10;} a[1]=hour%10; a[2]=minut/10%10; a[3]=minut%10; if( (secon>=5&&secon<=10) || (secon>=25&&secon<=30) || (secon>=45&&secon<50)){ dp_l=0; if(data/10%10==0){a[4]=10;}else{a[4]=data/10%10;} a[5]=data%10; if(mon/10%10==0){a[6]=10;}else{a[6]=mon/10%10;} a[7]=mon%10; } else{ if(temp>=0&&temp<100){dp_l=0;a[4]=10;a[5]=temp/10%10;a[6]=temp%10;a[7]=11; } // _1.3C if(temp>=100){dp_l=0;a[4]=temp/100%10;a[5]=temp/10%10;a[6]=temp%10;a[7]=11; } // 23.5C if(temp<0&&temp>-100){dp_l=0;a[4]=12;a[5]=abs(temp/10%10);a[6]=abs(temp%10);a[7]=11; } // -1.3C if(temp<=-100){dp_l=1;a[4]=12;a[5]=abs(temp/100%10);a[6]=abs(temp/10%10);a[7]=11; } // -23C } if(millis()-times<500){dp=1;}else{dp=0;} if(old_sec!=secon){old_sec=secon;times=millis();} } delay(100); } ISR(TIMER1_COMPA_vect){ switch (i) { /// SMALL // Q5 case 4: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[4];ch(SEG_DP,1); segment(); an = 0; anod();break; // Q6 case 5: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[5];ch(SEG_DP,dp_l); segment(); an = 1; anod();break; // Q7 case 6: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[6];ch(SEG_DP,1); segment(); an = 2; anod();break; // Q8 case 7: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[7]; segment(); an = 3; anod();break; /// BIG // Q1 case 0: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[0];ch(SEG_DP,1); segment(); an = 4; anod();break; // Q2 case 1: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[1];ch(SEG_DP,dp); segment(); an = 5; anod();break; // Q3 case 2: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[2];ch(SEG_DP,dp); segment(); an = 6; anod();break; // Q4 case 3: segm = 10; segment(); an = 10; anod(); delayMicroseconds(200);segm = a[3];ch(SEG_DP,1); segment(); an = 7; anod();break; } i++;if (i > 7) {i = 0;} } void segment() { switch (segm) { // A B C D E F G case 0: 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, 1); break; // 0 case 1: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 1 case 2: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 0); break; // 2 case 3: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 0); break; // 3 case 4: ch(SEG_A, 1); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 4 case 5: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 5 case 6: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // 6 case 7: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 1); ch(SEG_F, 1); ch(SEG_G, 1); break; // 7 case 8: 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; // 8 case 9: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // 9 case 10: 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; // пусто case 11: 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, 1);ch(SEG_DP, 0); break; // *C case 12: 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; // - } } void anod() { switch (an) { case 0: ch(AN_Q1, 1); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 1: ch(AN_Q1, 0); ch(AN_Q2, 1); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 2: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 1); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 3: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 1); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 4: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 1); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 5: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 1); ch(AN_Q7, 0); ch(AN_Q8, 0); break; case 6: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 1); ch(AN_Q8, 0); break; case 7: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 1); break; case 10: ch(AN_Q1, 0); ch(AN_Q2, 0); ch(AN_Q3, 0); ch(AN_Q4, 0); ch(AN_Q5, 0); ch(AN_Q6, 0); ch(AN_Q7, 0); ch(AN_Q8, 0); break; } } void ch(int pin, int logic) { digitalWrite(pin, logic); } float dsRead(byte x) { byte data[2], addr[8][8], kol = 0; while (ds.search(addr[kol])) { // поиск датчиков, определение адреса и кол-ва датчиков kol++; } ds.reset_search(); // Сброс поиска датчика ds.reset(); // Инициализация, выполняется сброс шины ds.select(addr[x]); // Обращение к датчику по адресу ds.write(0x44, 0); // Измерение температуры с переносом данных в память ds.reset(); // Инициализация, выполняется сброс шины ds.select(addr[x]); // Обращение к датчику по адресу ds.write(0xBE); // Обращение памяти data[0] = ds.read();// Чтение памяти byte low data[1] = ds.read();// Чтение памяти byte high float value = ((data[1] << 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод } void max7219(byte reg_n, byte h1, byte h2){ PORTD &=~(1 << CS);WriteBit16(reg_n,h1);WriteBit16(reg_n,h2);PORTD |=(1 << CS); } void WriteBit16(byte reg, byte data){ for(char i = 7; i >= 0; i--){ PORTD &= ~(1 << CLK); if(((reg >> i) & 1) == 1){PORTD |= (1 << DIN);}else{PORTD &= ~(1 << DIN);} PORTD |=(1 << CLK);} for(char i = 7; i >= 0; i--){ PORTD &= ~(1 << CLK); if(((data >> i) & 1) == 1){PORTD |= (1 << DIN);}else{PORTD &= ~(1 << DIN);} PORTD |=(1 << CLK);} PORTD &= ~(1 << CLK);PORTD |= (1 << DIN); } void cl(){for(char i=1;i<=8;i++){max7219(i, 0, 0);}}
Вроде пока все хорошо,буду в корпус монтировать и тестировать. Ночной режим ещё думаю нужен,хотя как в реале будут светить цифры покажет после сборки.Спасибо за терпение)))
Здравствуйте! С модулем Р10 на бегущей строке приводилось сталкиватся?
http://sotvorimvmeste.ru/viewtopic.php?p=615
Нет, не приходилось сталкиваться.
Здравствуйте. Подскажите где в скетче поправить сегменты под ОК,циферки большие оказалось у меня с ОК((
Там много правок надо делать, добавлять дополнительный код. Сегодня - завтра постараюсь сделать.
Там много правок надо делать, добавлять дополнительный код. Сегодня - завтра постараюсь сделать.
В ключах пусть будет n-p-n транзисторы
Да сразу все под ОК пусть будет
Маленькие цифры тоже под ОК?
Страницы Назад 1 … 10 11 12 13 14 15 16 Далее
Чтобы отправить ответ, вы должны войти или зарегистрироваться
forum.rcl-radio.ru → Новые идеи для проектов Arduino → Часы с календарем
Форум работает на PunBB, при поддержке Informer Technologies, Inc
|