Re: Ретро часы на ИВ-6
Кнопки настройки как и куда подкючить, есть схема
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
forum.rcl-radio.ru → Законченные проекты → Ретро часы на ИВ-6
Страницы Назад 1 2 3 4 5 6 7 … 11 Далее
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Кнопки настройки как и куда подкючить, есть схема
Вот номера выводов:
A1 SET
A2+/sec
A3 -/temp
Собрал эти часы на плате с использованием ULN2003A и резисторных сборок. Накалы ламп соединил последовательно и подключил на стабилизатор 3,3 вольта. Работают отлично от 5 вольт. Только есть трудность с редактированием прошивки так как я поменял схему. Сделал возможность отключения преобразователя, подсветки и накала, а кнопки подключил через резисторы и на один пин. Может кто помочь с прошивкой?
Схема кнопок
Кнопки подключил на A3
Включение подсветки на A1 (при 5 вольтах на A1 подсветка гаснет)
Включение нитей накала A2 (при 5 вольтах на A2 накалы ламп отключается)
Отключение преобразователя на A0 (при 0 вольт преобразователь отключается)
Опубликуйте скетч и опишите в чем нужна помощь.
В скетче я только добавил строки для включения преобразователя, подсветки и накала ламп для проверки. Хотелось иметь возможность корректировки времени с кнопок и возможность отключения подсветки и преобразователя вместе с накалом ламп.
Кнопки
+/sec (Кнопка 1)
-/temp (Кнопка 2)
set и отключение подсветки по первому нажатию-удержанию и по второму отключение ламп полностью (Кнопка 3)
Открыл монитор порта и узнал значения приходящее при нажатии кнопок:
SW1 - 709...711
SW2 - 837...840
SW3 - 1022...1023
Скетч
#include <MsTimer2.h> // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <Wire.h>
#include <DS3231.h>
DS3231 clock;RTCDateTime DateTime;
int an, segm,times,i;
int sps = A0;
int heat = A2;
int led = A1;
byte a[4];
void setup(){ Wire.begin();clock.begin();
MsTimer2::set(5, to_Timer);MsTimer2::start();
// clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
pinMode(9,OUTPUT); // D9 === A0
pinMode(10,OUTPUT); // D10 === A1
pinMode(11,OUTPUT); // D11 === A2
pinMode(12,OUTPUT); // D12 === A3
pinMode(2,OUTPUT); // D2 === a
pinMode(3,OUTPUT); // D3 === b
pinMode(4,OUTPUT); // D4 === c
pinMode(5,OUTPUT); // D5 === d
pinMode(6,OUTPUT); // D6 === e
pinMode(7,OUTPUT); // D7 === f
pinMode(8,OUTPUT); // D8 === g
clock.setOutput(DS3231_1HZ);
pinMode(sps,OUTPUT);
pinMode(heat,OUTPUT);
pinMode(led,OUTPUT);
digitalWrite(sps,HIGH); //Включил преобразователь
digitalWrite(heat,LOW); //Включил накал ламп
digitalWrite(led,LOW); //Включил подсветку ламп
}
void loop(){
DateTime=clock.getDateTime();// опрос времени
times = DateTime.hour*100+DateTime.minute;
a[0]=times/1000;
a[1]=times/100%10;
a[2]=times/10%10;
a[3]=times%10%10;
}// loop
void to_Timer(){
switch(i){
case 0: segm=a[0]; an=0; anod(); segment();delay(1);break;
case 1: segm=a[1]; an=1; anod(); segment();delay(1);break;
case 2: segm=a[2]; an=2; anod(); segment();delay(1);break;
case 3: segm=a[3]; an=3; anod(); segment();delay(1);break;}i++;if(i>3){i=0;}}
void segment(){
switch(segm){
// A B C D E F G
case 0: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,1);break;// 0
case 1: ch(2,1);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// 1
case 2: ch(2,0);ch(3,0);ch(4,1);ch(5,0);ch(6,0);ch(7,1);ch(8,0);break;// 2
case 3: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,1);ch(7,1);ch(8,0);break;// 3
case 4: ch(2,1);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,0);ch(8,0);break;// 4
case 5: ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// 5
case 6: ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// 6
case 7: ch(2,0);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// 7
case 8: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// 8
case 9: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// 9
}}
void anod(){
switch(an){
case 0:ch(9,0);ch(10,1);ch(11,1);ch(12,1);break;
case 1:ch(9,1);ch(10,0);ch(11,1);ch(12,1);break;
case 2:ch(9,1);ch(10,1);ch(11,0);ch(12,1);break;
case 3:ch(9,1);ch(10,1);ch(11,1);ch(12,0);break;
}}
void ch(int pin, int logic){digitalWrite(pin,logic);}
Как у Вас будет отключаться подсветка, через что она сейчас работает? Тоже самое накал. У Вас стоят транзиторные ключи?
Какой механизм отключения преобразователя, он основан на 555 таймере.
Подсветка и накал включается через транзисторы
Преобразователь я собрал на 555 таймере и отключаю его через RESET
Тестируйте:
#include <MsTimer2.h> // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <Wire.h>
#include <DS3231.h>
DS3231 clock;RTCDateTime DateTime;
int an, segm,times,i, u_d;
bool svet,nakal,gener;
byte a[4];
void setup(){ Wire.begin();clock.begin();
MsTimer2::set(5, to_Timer);MsTimer2::start();
// clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
pinMode(9,OUTPUT); // D9 === A0
pinMode(10,OUTPUT); // D10 === A1
pinMode(11,OUTPUT); // D11 === A2
pinMode(12,OUTPUT); // D12 === A3
pinMode(2,OUTPUT); // D2 === a
pinMode(3,OUTPUT); // D3 === b
pinMode(4,OUTPUT); // D4 === c
pinMode(5,OUTPUT); // D5 === d
pinMode(6,OUTPUT); // D6 === e
pinMode(7,OUTPUT); // D7 === f
pinMode(8,OUTPUT); // D8 === g
clock.setOutput(DS3231_1HZ);
pinMode(A0,OUTPUT);
pinMode(A1,OUTPUT);
pinMode(A2,OUTPUT);
pinMode(A3,INPUT);
digitalWrite(A0,HIGH);//Включил преобразователь
digitalWrite(A2,LOW); //Включил накал ламп
digitalWrite(A1,LOW); //Включил подсветку ламп
}
void loop(){
u_d = analogRead(A3);
if((u_d>500 && u_d<750) && nakal == 0){nakal=1;digitalWrite(A2,HIGH);delay(200);}
if((u_d>500 && u_d<750) && nakal == 1){nakal=0;digitalWrite(A2,LOW);delay(200);}
if((u_d>750 && u_d<950) && svet == 0){svet=1;digitalWrite(A1,LOW);delay(200);}
if((u_d>750 && u_d<950) && svet == 1){svet=0;digitalWrite(A1,HIGH);delay(200);}
if(u_d>950 && gener == 0){gener=1;digitalWrite(A0,LOW);delay(200);}
if(u_d>950 && gener == 1){gener=0;digitalWrite(A0,HIGH);delay(200);}
DateTime=clock.getDateTime();// опрос времени
times = DateTime.hour*100+DateTime.minute;
a[0]=times/1000;
a[1]=times/100%10;
a[2]=times/10%10;
a[3]=times%10%10;
}// loop
void to_Timer(){
switch(i){
case 0: segm=a[0]; an=0; anod(); segment();delay(1);break;
case 1: segm=a[1]; an=1; anod(); segment();delay(1);break;
case 2: segm=a[2]; an=2; anod(); segment();delay(1);break;
case 3: segm=a[3]; an=3; anod(); segment();delay(1);break;}i++;if(i>3){i=0;}}
void segment(){
switch(segm){
// A B C D E F G
case 0: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,1);break;// 0
case 1: ch(2,1);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// 1
case 2: ch(2,0);ch(3,0);ch(4,1);ch(5,0);ch(6,0);ch(7,1);ch(8,0);break;// 2
case 3: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,1);ch(7,1);ch(8,0);break;// 3
case 4: ch(2,1);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,0);ch(8,0);break;// 4
case 5: ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// 5
case 6: ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// 6
case 7: ch(2,0);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// 7
case 8: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// 8
case 9: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// 9
}}
void anod(){
switch(an){
case 0:ch(9,0);ch(10,1);ch(11,1);ch(12,1);break;
case 1:ch(9,1);ch(10,0);ch(11,1);ch(12,1);break;
case 2:ch(9,1);ch(10,1);ch(11,0);ch(12,1);break;
case 3:ch(9,1);ch(10,1);ch(11,1);ch(12,0);break;
}}
void ch(int pin, int logic){digitalWrite(pin,logic);}
Протестировал. При включении все работает, но при нажатии на кнопки всё просто мигает, а подсветка гаснет после первого нажатия и далее при нажатии зажигается и сама гаснет.
Я пробовал разобраться со скетчем для коррекции времени с кнопок и в итоге отображается какая-то каша из непонятных цифр, а второй индикатор вообще не зажигается.
#include <MsTimer2.h>
#include <Wire.h>
#include <DS3231.h>
DS3231 clock;RTCDateTime DateTime;
int an, segm,times,i;
byte a[4];
int menu,year,month,day,hour,minute,w,w2;
void setup(){ Wire.begin();clock.begin();MsTimer2::set(2, to_Timer);MsTimer2::start();Serial.begin(9600);
// clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
pinMode(9,OUTPUT); // D9 === A0
pinMode(10,OUTPUT); // D10 === A1
pinMode(11,OUTPUT); // D11 === A2
pinMode(12,OUTPUT); // D12 === A3
pinMode(2,OUTPUT); // D2 === a
pinMode(3,OUTPUT); // D3 === b
pinMode(4,OUTPUT); // D4 === c
pinMode(5,OUTPUT); // D5 === d
pinMode(6,OUTPUT); // D6 === e
pinMode(7,OUTPUT); // D7 === f
pinMode(8,OUTPUT); // D8 === g
pinMode(13,OUTPUT);// D13 === dp
pinMode(A6,INPUT); // SQW
/////управление питанием/////
pinMode(A0,OUTPUT);
pinMode(A2,OUTPUT);
pinMode(A1,OUTPUT);
digitalWrite(A0,HIGH); //Включил преобразователь
digitalWrite(A2,LOW); //Включил накал ламп
digitalWrite(A1,HIGH); //Включил подсветку ламп
///// BUTTON //////
// pinMode(A1,INPUT); // SET
// pinMode(A2,INPUT); // +/sec
// pinMode(A3,INPUT); // -/temp
pinMode(A3,INPUT);
/*SW1 - 709...711 --- 700<analogRead(A3)<720 вместо A1
SW2 - 837...840 --- 830<analogRead(A3)<850 вместо A2
SW3 - 1022...1023 --- analogRead(A3)>1000 вместо A3*/
//// текущее время перенос в переменные коррекции времени
DateTime=clock.getDateTime();// опрос времени
year = DateTime.year;
month = DateTime.month;
day = DateTime.day;
hour = DateTime.hour;
minute = DateTime.minute;
}
void loop(){ DateTime=clock.getDateTime();// опрос времени
if(700<analogRead(A3)<720){menu++;delay(200);if(menu>5){menu=0;w=1;}}
/////////// ВРЕМЯ /////////////
if(menu==0&&w2==0){times = DateTime.hour*100+DateTime.minute;
a[0]=times/1000;
a[1]=times/100%10;
a[2]=times/10%10;
a[3]=times%10%10;
if(analogRead(A6)>900){digitalWrite(13,HIGH);}else{digitalWrite(13,LOW);}// dp
}
w2=0;
////// вывод секунд - нажать и удерживать кнопку +/sec /////////////////////////////////////
if(830<analogRead(A3)<850&&menu==0){w2=1;times = DateTime.second;digitalWrite(13,HIGH);
a[0]=11;
a[1]=10;
a[2]=times/10;
a[3]=times%10;}
////// вывод температуры - нажать и удерживать кнопку -/temp /////////////////////////////////////
if(analogRead(A3)>1000&&menu==0){w2=1;times = int(clock.readTemperature());digitalWrite(13,HIGH);
a[0]=12;
a[1]=10;
a[2]=times/10;
a[3]=times%10;}
///////// коррекция минут /////////////////
if(menu==1){
if(830<analogRead(A3)<850){minute++;delay(300);if(minute>59){minute=0;}}
if(analogRead(A3)>1000){minute--;delay(300);if(minute<0){minute=0;}}
times=minute;
a[0]=1;
a[1]=10;
a[2]=times/10;
a[3]=times%10;}
///////// коррекция часов /////////////////
if(menu==2){
if(830<analogRead(A3)<850){hour++;delay(300);if(hour>23){hour=0;}}
if(analogRead(A3)>1000){hour--;delay(300);if(hour<0){hour=0;}}
times=hour;
a[0]=2;
a[1]=10;
a[2]=times/10;
a[3]=times%10;}
///////// коррекция дата /////////////////
if(menu==3){
if(830<analogRead(A3)<850){day++;delay(300);if(day>31){day=0;}}
if(analogRead(A3)>1000){day--;delay(300);if(day<0){day=0;}}
times=day;
a[0]=3;
a[1]=10;
a[2]=times/10;
a[3]=times%10;}
///////// коррекция месяц /////////////////
if(menu==4){
if(830<analogRead(A3)<850){month++;delay(300);if(month>12){month=0;}}
if(analogRead(A3)>1000){month--;delay(300);if(month<0){month=0;}}
times=month;
a[0]=4;
a[1]=10;
a[2]=times/10;
a[3]=times%10;}
///////// коррекция год /////////////////
if(menu==5){
if(830<analogRead(A3)<850){year++;delay(300);if(year>99){year=19;}}
if(analogRead(A3)>1000){year--;delay(300);if(year<19){year=19;}}
times=year;
a[0]=5;
a[1]=10;
a[2]=times/10;
a[3]=times%10;}
if(w==1){clock.setDateTime(year+2000, month, day, hour, minute, 59 );// год (19),месяц(11),день(15),час(23),минуты(32),секунды
w=0;}
} // loop
void to_Timer(){
switch(i){
case 0: cl();segm=a[0]; an=0; anod(); segment();break;
case 1: cl();segm=a[1]; an=1; anod(); segment();break;
case 2: cl();segm=a[2]; an=2; anod(); segment();break;
case 3: cl();segm=a[3]; an=3; anod(); segment();break;
}i++;if(i>3){i=0;}}
void segment(){
switch(segm){
// A B C D E F G
case 0: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,1);break;// 0
case 1: ch(2,1);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// 1
case 2: ch(2,0);ch(3,0);ch(4,1);ch(5,0);ch(6,0);ch(7,1);ch(8,0);break;// 2
case 3: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,1);ch(7,1);ch(8,0);break;// 3
case 4: ch(2,1);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,0);ch(8,0);break;// 4
case 5: ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// 5
case 6: ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// 6
case 7: ch(2,0);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// 7
case 8: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// 8
case 9: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// 9
case 10:ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// ПУСТО
case 11:ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// S
case 12:ch(2,1);ch(3,1);ch(4,1);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// t
}}
void anod(){
switch(an){
case 0:ch(9,0);ch(10,1);ch(11,1);ch(12,1);break;
case 1:ch(9,1);ch(10,0);ch(11,1);ch(12,1);break;
case 2:ch(9,1);ch(10,1);ch(11,0);ch(12,1);break;
case 3:ch(9,1);ch(10,1);ch(11,1);ch(12,0);break;
}}
void cl(){
segm=10; an=0; segment(); anod(); an=1; segment(); anod(); an=2; segment(); anod(); an=3; segment();anod();
}
void ch(int pin, int logic){digitalWrite(pin,logic);}
Я увеличил задержку после нажатия кнопок. Одиночное кратковременное нажатие.
#include <MsTimer2.h> // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <Wire.h>
#include <DS3231.h>
DS3231 clock;RTCDateTime DateTime;
int an, segm,times,i, u_d;
bool svet,nakal,gener;
byte a[4];
void setup(){ Wire.begin();clock.begin();
MsTimer2::set(5, to_Timer);MsTimer2::start();
// clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
pinMode(9,OUTPUT); // D9 === A0
pinMode(10,OUTPUT); // D10 === A1
pinMode(11,OUTPUT); // D11 === A2
pinMode(12,OUTPUT); // D12 === A3
pinMode(2,OUTPUT); // D2 === a
pinMode(3,OUTPUT); // D3 === b
pinMode(4,OUTPUT); // D4 === c
pinMode(5,OUTPUT); // D5 === d
pinMode(6,OUTPUT); // D6 === e
pinMode(7,OUTPUT); // D7 === f
pinMode(8,OUTPUT); // D8 === g
clock.setOutput(DS3231_1HZ);
pinMode(A0,OUTPUT);
pinMode(A1,OUTPUT);
pinMode(A2,OUTPUT);
pinMode(A3,INPUT);
digitalWrite(A0,HIGH);//Включил преобразователь
digitalWrite(A2,LOW); //Включил накал ламп
digitalWrite(A1,LOW); //Включил подсветку ламп
}
void loop(){
u_d = analogRead(A3);
if((u_d>500 && u_d<750) && nakal == 0){nakal=1;digitalWrite(A2,HIGH);delay(500);}
if((u_d>500 && u_d<750) && nakal == 1){nakal=0;digitalWrite(A2,LOW);delay(500);}
if((u_d>750 && u_d<950) && svet == 0){svet=1;digitalWrite(A1,LOW);delay(500);}
if((u_d>750 && u_d<950) && svet == 1){svet=0;digitalWrite(A1,HIGH);delay(500);}
if(u_d>950 && gener == 0){gener=1;digitalWrite(A0,LOW);delay(500);}
if(u_d>950 && gener == 1){gener=0;digitalWrite(A0,HIGH);delay(500);}
DateTime=clock.getDateTime();// опрос времени
times = DateTime.hour*100+DateTime.minute;
a[0]=times/1000;
a[1]=times/100%10;
a[2]=times/10%10;
a[3]=times%10%10;
}// loop
void to_Timer(){
switch(i){
case 0: segm=a[0]; an=0; anod(); segment();delay(1);break;
case 1: segm=a[1]; an=1; anod(); segment();delay(1);break;
case 2: segm=a[2]; an=2; anod(); segment();delay(1);break;
case 3: segm=a[3]; an=3; anod(); segment();delay(1);break;}i++;if(i>3){i=0;}}
void segment(){
switch(segm){
// A B C D E F G
case 0: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,1);break;// 0
case 1: ch(2,1);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// 1
case 2: ch(2,0);ch(3,0);ch(4,1);ch(5,0);ch(6,0);ch(7,1);ch(8,0);break;// 2
case 3: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,1);ch(7,1);ch(8,0);break;// 3
case 4: ch(2,1);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,0);ch(8,0);break;// 4
case 5: ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// 5
case 6: ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// 6
case 7: ch(2,0);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// 7
case 8: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// 8
case 9: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// 9
}}
void anod(){
switch(an){
case 0:ch(9,0);ch(10,1);ch(11,1);ch(12,1);break;
case 1:ch(9,1);ch(10,0);ch(11,1);ch(12,1);break;
case 2:ch(9,1);ch(10,1);ch(11,0);ch(12,1);break;
case 3:ch(9,1);ch(10,1);ch(11,1);ch(12,0);break;
}}
void ch(int pin, int logic){digitalWrite(pin,logic);}
Кнопки с делителем напряжения не самый лучший вариант, проще применять отдельные пины для каждой кнопки
Немного изменил скетч и корректировка времени заработала.
#include <MsTimer2.h>
#include <Wire.h>
#include <DS3231.h>
DS3231 clock;RTCDateTime DateTime;
int an, segm,times, i, u_d;
byte a[4];
int menu,year,month,day,hour,minute,w,w2;
void setup(){ Wire.begin();clock.begin();MsTimer2::set(2, to_Timer);MsTimer2::start();Serial.begin(9600);
// clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
pinMode(9,OUTPUT); // D9 === A0
pinMode(10,OUTPUT); // D10 === A1
pinMode(11,OUTPUT); // D11 === A2
pinMode(12,OUTPUT); // D12 === A3
pinMode(2,OUTPUT); // D2 === a
pinMode(3,OUTPUT); // D3 === b
pinMode(4,OUTPUT); // D4 === c
pinMode(5,OUTPUT); // D5 === d
pinMode(6,OUTPUT); // D6 === e
pinMode(7,OUTPUT); // D7 === f
pinMode(8,OUTPUT); // D8 === g
pinMode(13,OUTPUT);// D13 === dp
pinMode(A6,INPUT); // SQW
/////управление питанием/////
pinMode(A0,OUTPUT);
pinMode(A2,OUTPUT);
pinMode(A1,OUTPUT);
digitalWrite(A0,HIGH); //Включил преобразователь
digitalWrite(A2,LOW); //Включил накал ламп
digitalWrite(A1,LOW); //Включил подсветку ламп
///// BUTTON //////
// pinMode(A1,INPUT); // SET
// pinMode(A2,INPUT); // +/sec
// pinMode(A3,INPUT); // -/temp
pinMode(A3,INPUT);
/*SW1 - 709...711 --- 700<u_d && u_d<720 вместо A1
SW2 - 837...840 --- 830<u_d && u_d<850 вместо A2
SW3 - 1022...1023 --- u_d>1000 вместо A3*/
//// текущее время перенос в переменные коррекции времени
DateTime=clock.getDateTime();// опрос времени
year = DateTime.year;
month = DateTime.month;
day = DateTime.day;
hour = DateTime.hour;
minute = DateTime.minute;
}
void loop(){ DateTime=clock.getDateTime();// опрос времени
u_d = analogRead(A3);
if(700<u_d && u_d<720){menu++;delay(200);if(menu>5){menu=0;w=1;}}
/////////// ВРЕМЯ /////////////
if(menu==0&&w2==0){times = DateTime.hour*100+DateTime.minute;
a[0]=times/1000;
a[1]=times/100%10;
a[2]=times/10%10;
a[3]=times%10%10;
if(analogRead(A6)>900){digitalWrite(13,HIGH);}else{digitalWrite(13,LOW);}// dp
}
w2=0;
////// вывод секунд - нажать и удерживать кнопку +/sec /////////////////////////////////////
if(830<u_d && u_d<850&&menu==0){w2=1;times = DateTime.second;digitalWrite(13,HIGH);
a[0]=11;
a[1]=10;
a[2]=times/10;
a[3]=times%10;}
////// вывод температуры - нажать и удерживать кнопку -/temp /////////////////////////////////////
if(u_d>1000&&menu==0){w2=1;times = int(clock.readTemperature());digitalWrite(13,HIGH);
a[0]=12;
a[1]=10;
a[2]=times/10;
a[3]=times%10;}
///////// коррекция минут /////////////////
if(menu==1){
if(830<u_d && u_d<850){minute++;delay(300);if(minute>59){minute=0;}}
if(u_d>1000){minute--;delay(300);if(minute<0){minute=0;}}
times=minute;
a[0]=1;
a[1]=10;
a[2]=times/10;
a[3]=times%10;}
///////// коррекция часов /////////////////
if(menu==2){
if(830<u_d && u_d<850){hour++;delay(300);if(hour>23){hour=0;}}
if(u_d>1000){hour--;delay(300);if(hour<0){hour=0;}}
times=hour;
a[0]=2;
a[1]=10;
a[2]=times/10;
a[3]=times%10;}
///////// коррекция дата /////////////////
if(menu==3){
if(830<u_d && u_d<850){day++;delay(300);if(day>31){day=0;}}
if(u_d>1000){day--;delay(300);if(day<0){day=0;}}
times=day;
a[0]=3;
a[1]=10;
a[2]=times/10;
a[3]=times%10;}
///////// коррекция месяц /////////////////
if(menu==4){
if(830<u_d && u_d<850){month++;delay(300);if(month>12){month=0;}}
if(u_d>1000){month--;delay(300);if(month<0){month=0;}}
times=month;
a[0]=4;
a[1]=10;
a[2]=times/10;
a[3]=times%10;}
///////// коррекция год /////////////////
if(menu==5){
if(830<u_d && u_d<850){year++;delay(300);if(year>99){year=19;}}
if(u_d>1000){year--;delay(300);if(year<19){year=19;}}
times=year;
a[0]=5;
a[1]=10;
a[2]=times/10;
a[3]=times%10;}
if(w==1){clock.setDateTime(year+2000, month, day, hour, minute, 59 );// год (19),месяц(11),день(15),час(23),минуты(32),секунды
w=0;}
} // loop
void to_Timer(){
switch(i){
case 0: cl();segm=a[0]; an=0; anod(); segment();break;
case 1: cl();segm=a[1]; an=1; anod(); segment();break;
case 2: cl();segm=a[2]; an=2; anod(); segment();break;
case 3: cl();segm=a[3]; an=3; anod(); segment();break;
}i++;if(i>3){i=0;}}
void segment(){
switch(segm){
// A B C D E F G
case 0: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,1);break;// 0
case 1: ch(2,1);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// 1
case 2: ch(2,0);ch(3,0);ch(4,1);ch(5,0);ch(6,0);ch(7,1);ch(8,0);break;// 2
case 3: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,1);ch(7,1);ch(8,0);break;// 3
case 4: ch(2,1);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,0);ch(8,0);break;// 4
case 5: ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// 5
case 6: ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// 6
case 7: ch(2,0);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// 7
case 8: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// 8
case 9: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// 9
case 10:ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// ПУСТО
case 11:ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// S
case 12:ch(2,1);ch(3,1);ch(4,1);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// t
}}
void anod(){
switch(an){
case 0:ch(9,0);ch(10,1);ch(11,1);ch(12,1);break;
case 1:ch(9,1);ch(10,0);ch(11,1);ch(12,1);break;
case 2:ch(9,1);ch(10,1);ch(11,0);ch(12,1);break;
case 3:ch(9,1);ch(10,1);ch(11,1);ch(12,0);break;
}}
void cl(){
segm=10; an=0; segment(); anod(); an=1; segment(); anod(); an=2; segment(); anod(); an=3; segment();anod();
}
void ch(int pin, int logic){digitalWrite(pin,logic);}
Кнопки с делителем напряжения не самый лучший вариант, проще применять отдельные пины для каждой кнопки
Спасибо в следующем проекте учту. Сейчас уже нет смысла плату переделывать.
Доброго времени суток. Прошу не пинать, я не силен в написании кодов, может совсем глупость спрашиваю, всю жизнь с железом работаю. Но вот зачесались руки сделать часы, так как имеется запас индикаторов ив-6. Когда очередь дошла до компиляции кода, выдаёт ошибку:
Arduino: 1.8.13 (Windows Store 1.8.42.0) (Windows 10), Плата:"Arduino Uno"
sketch_jan29g:4:10: error: no matching function for call to 'DS3231::DS3231()'
DS3231 clock;RTCDateTime DateTime;
Библиотеки уже менял...результат один и тот((((
замените библиотеку ds3231 - http://rcl-radio.ru/wp-content/uploads/ … DS3231.zip
Парадокс с Arduino Ide под windows 10. Ставил на этой винде программу через инсталятор и были регулярные ошибки в компиляциях не только этого скетча. А вот когда полностью снёс программу и установил как приложение из магазина Майкрософт всё стало работать отлично.
Спасибо большое! С этой библиотекой все работает)))) Счастья полные штаны:D
Схема часов с применением ULN2003 Данный контент доступен только зарегистрированным пользователям.
Скетч для данной схемы.
#define ADDR_INIT 6 // Адрес для проверки
#define INIT_KEY 12 // Ключ проверки на первый запуск
#define ADDR_YRKOST 0 // Адрес хранения значения яркости
#define ADDR_SVET 2 // Адрес хранения состояния подсветки
#include <MsTimer2.h>
#include <EEPROM.h>
#include <Wire.h>
#include <DS3231.h>
DS3231 clock;RTCDateTime DateTime;
int an, segm,times, i, u_d;
byte a[4];
int menu,year,month,day,hour,minute,w,w2,save_t;
int menu_svet, svet_state, brightness, svet,w3;
int led_pwm = 10; //выход с ШИМ для управления подсветкой (переключается блоком перемычек X1)
//************** Управляющие сетки ВЛИ *****************************
int grids_HL1 = 9;
int grids_HL2 = 11;
int grids_HL3 = A2; //Переключается блоком перемычек X1
int grids_HL4 = 12;
void setup(){
Wire.begin();
clock.begin();
MsTimer2::set(2, to_Timer);
MsTimer2::start();
Serial.begin(9600);
if (EEPROM.read(ADDR_INIT) != INIT_KEY) { // проверка на первый запуск
EEPROM.put(ADDR_INIT, INIT_KEY);
EEPROM.put(ADDR_YRKOST, 50); // значение яркости по умолчанию
EEPROM.put(ADDR_SVET, 1); // состояние подвсетки по умолчанию
clock.setDateTime(__DATE__, __TIME__);} // Устанавливаем время на часах, основываясь на времени компиляции скетча
//************* Настройка выводов микроконтроллера *****************
pinMode(grids_HL1,OUTPUT); // D9 === Сетка A0
pinMode(grids_HL2,OUTPUT); // D10 === Сетка A1
pinMode(grids_HL3,OUTPUT); // D11 === Сетка A2
pinMode(grids_HL4,OUTPUT); // D12 === Сетка A3
pinMode(2,OUTPUT); // D2 === a
pinMode(3,OUTPUT); // D3 === b
pinMode(4,OUTPUT); // D4 === c
pinMode(5,OUTPUT); // D5 === d
pinMode(6,OUTPUT); // D6 === e
pinMode(7,OUTPUT); // D7 === f
pinMode(8,OUTPUT); // D8 === g
pinMode(13,OUTPUT); // D13 === dp
pinMode(A6,INPUT); // SQW
clock.setOutput(DS3231_1HZ);
//***************** Управление энергопотреблением ******************
pinMode(A0,OUTPUT);
pinMode(A1,OUTPUT);
pinMode(led_pwm,OUTPUT);
digitalWrite(A0,HIGH); // Включил преобразователь +27 Вольт
digitalWrite(A1,LOW); // Включил накал ламп
//************************** Кнопки ********************************
pinMode(A3,INPUT);
pinMode(A7,INPUT);
/*Значения полученны со входа A3 при нажитии кнопок
SW1 - 709...711 --- 700<u_d && u_d<720
SW2 - 837...840 --- 830<u_d && u_d<850
SW3 - 1022...1023 --- u_d>1000
Назначение кнопок:
set - при однократном нажатии активируется режим корректировки минут(1), далее нажимая set - часы(2), дата(3), месяц(4) и год(5)
+/sec - при нажатии и удержании кнопки должны отображаться секунды "S_31"
-/temp - при нажатии и удержании кнопки должна отображаться температура
light - при однократном нажатии меню включения/отключения подсветки, далее меню настройки яркости
*/
// текущее время перенос в переменные коррекции времени
DateTime=clock.getDateTime(); // опрос времени
year = DateTime.year;
month = DateTime.month;
day = DateTime.day;
hour = DateTime.hour;
minute = DateTime.minute;
EEPROM.get(ADDR_YRKOST,brightness); // Чтение значения яркости подсветки
EEPROM.get(ADDR_SVET,svet_state); // Чтение значения состояния подсветки
}
void loop(){
DateTime=clock.getDateTime();// опрос времени
u_d = analogRead(A3); // Значение с делителя напряжения для кнопок
if(700<u_d && u_d<720 && menu_svet==0){ menu++;delay(200);if(menu>6&&save_t==1){menu=0;w=1;} //Вход в меню корректировки и выход с сохранением
if(menu>6&&save_t==0){menu=0;w=0;} //Выход без изменения настроек времени
digitalWrite(13,HIGH);}
// Меню настройки подсветки вход/выход с сохранением в ЭСППЗУ
if(analogRead(A7)>1000 && menu==0){menu_svet++;delay(200);if(menu_svet>2){menu_svet=0;w3=1;}digitalWrite(13,HIGH);}
//*************************** Время ********************************
if(menu==0&&w2==0&&menu_svet==0){times = DateTime.hour*100+DateTime.minute;
a[0]=times/1000;
a[1]=times/100%10;
a[2]=times/10%10;
a[3]=times%10%10;
if(analogRead(A6)>900){digitalWrite(13,HIGH);}else{digitalWrite(13,LOW);}// dp
}
w2=0;
//****** вывод секунд - нажать и удерживать кнопку +/sec ***********
if(830<u_d && u_d<850&&menu==0&&menu_svet==0){w2=1;times = DateTime.second;digitalWrite(13,HIGH);
a[0]=11;
a[1]=10;
a[2]=times/10;
a[3]=times%10;}
//***** вывод температуры - нажать и удерживать кнопку -/temp ******
if(u_d>1000&&menu==0&&menu_svet==0){w2=1;times = int(clock.readTemperature());digitalWrite(13,HIGH);
a[0]=12;
a[1]=10;
a[2]=times/10;
a[3]=times%10;}
//********************* Коррекция минут ****************************
if(menu==1){
if(830<u_d && u_d<850){minute++;delay(300);if(minute>59){minute=0;}}
if(u_d>1000){minute--;delay(300);if(minute<0){minute=0;}}
times=minute;
a[0]=1;
a[1]=10;
a[2]=times/10;
a[3]=times%10;}
//********************** Коррекция часов ***************************
if(menu==2){
if(830<u_d && u_d<850){hour++;delay(300);if(hour>23){hour=0;}}
if(u_d>1000){hour--;delay(300);if(hour<0){hour=0;}}
times=hour;
a[0]=2;
a[1]=10;
a[2]=times/10;
a[3]=times%10;}
//********************** Коррекция даты ****************************
if(menu==3){
if(830<u_d && u_d<850){day++;delay(300);if(day>31){day=0;}}
if(u_d>1000){day--;delay(300);if(day<0){day=0;}}
times=day;
a[0]=3;
a[1]=10;
a[2]=times/10;
a[3]=times%10;}
//********************* Коррекция месяца ***************************
if(menu==4){
if(830<u_d && u_d<850){month++;delay(300);if(month>12){month=0;}}
if(u_d>1000){month--;delay(300);if(month<0){month=0;}}
times=month;
a[0]=4;
a[1]=10;
a[2]=times/10;
a[3]=times%10;}
//********************** Коррекция года ****************************
if(menu==5){
if(830<u_d && u_d<850){year++;delay(300);if(year>99){year=19;}}
if(u_d>1000){year--;delay(300);if(year<19){year=19;}}
times=year;
a[0]=5;
a[1]=10;
a[2]=times/10%10;
a[3]=times%10;}
//***** Запрос на сохранение изменений корректировки времени *******
if(menu==6){
if(830<u_d && u_d<850){save_t++;delay(300);if(save_t>1){save_t=0;}}
if(u_d>1000){save_t--;delay(300);if(save_t<0){save_t=1;}}
if(save_t==1){
a[0]=11;
a[1]=17;
a[2]=10;
a[3]=16;}
if(save_t==0){
a[0]=11;
a[1]=17;
a[2]=10;
a[3]=14;}
}
if(w==1){clock.setDateTime(year+2000, month, day, hour, minute, 59 );// год (19),месяц(11),день(15),час(23),минуты(32),секунды
w=0;}// Сохранение времени при флаге w==1
//*************** Включение/выключение подсветки *******************
if(menu_svet==1){
if(830<u_d && u_d<850){svet_state++;delay(300);if(svet_state>1){svet_state=0;}}
if(u_d>1000){svet_state--;delay(300);if(svet_state<0){svet_state=1;}}
if(svet_state==1){
a[0]=10;
a[1]=10;
a[2]=0;
a[3]=14;}
if(svet_state==0){
a[0]=10;
a[1]=0;
a[2]=13;
a[3]=13;}
}
//***************** Настройка яркости подсветки ********************
if(menu_svet==2){
if(830<u_d && u_d<850){brightness++;delay(200);if(brightness>100){brightness=100;}}
if(u_d>1000){brightness--;delay(200);if(brightness<0){brightness=0;}}
times = brightness;
a[0]=15;
if(times==100){a[1]=1;} else {a[1]=10;}
if(times>9){a[2]=times/10%10;} else {a[2]=10;}
a[3]=times%10;};
svet=255-(brightness*2.55);
if(svet_state==1){analogWrite(led_pwm,svet);
} else {digitalWrite(led_pwm,HIGH);}
if(w3==1){EEPROM.put(ADDR_YRKOST,brightness);EEPROM.put(ADDR_SVET,svet_state);
w3=0;}// Сохранение настроек в ЭСППЗУ при флаге w3==1
//***************** Проверка через монитор порта *******************
Serial.print("Raw data: "); // Вывод времени в монитор порта
Serial.print(DateTime.year); Serial.print("-");
Serial.print(DateTime.month); Serial.print("-");
Serial.print(DateTime.day); Serial.print(" ");
Serial.print(DateTime.hour); Serial.print(":");
Serial.print(DateTime.minute); Serial.print(":");
Serial.print(DateTime.second); Serial.println("");
Serial.print("brightness: ");Serial.println(brightness); // Вывод значений яркости подсветки
Serial.print("PWM: "); Serial.println(svet);
} // loop
//******************** Динамическая индикация **********************
void to_Timer(){
switch(i){
case 0: cl();segm=a[0]; an=0; anod(); segment();break;
case 1: cl();segm=a[1]; an=1; anod(); segment();break;
case 2: cl();segm=a[2]; an=2; anod(); segment();break;
case 3: cl();segm=a[3]; an=3; anod(); segment();break;
}i++;if(i>3){i=0;};}
/*Таблица символов составленных из сегментов индикатора
Обозначение сегментов индикатора
A
/////////
/// ///
F /// /// B
/// G ///
/////////
/// ///
E /// /// C
/// ///
////////
D */
void segment(){
switch(segm){
// A B C D E F G
case 0: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,1);break;// 0
case 1: ch(2,1);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// 1
case 2: ch(2,0);ch(3,0);ch(4,1);ch(5,0);ch(6,0);ch(7,1);ch(8,0);break;// 2
case 3: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,1);ch(7,1);ch(8,0);break;// 3
case 4: ch(2,1);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,0);ch(8,0);break;// 4
case 5: ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// 5
case 6: ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// 6
case 7: ch(2,0);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// 7
case 8: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// 8
case 9: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// 9
case 10:ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,1);ch(7,1);ch(8,1);break;// ПУСТО
case 11:ch(2,0);ch(3,1);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// S
case 12:ch(2,1);ch(3,1);ch(4,1);ch(5,0);ch(6,0);ch(7,0);ch(8,0);break;// t
case 13:ch(2,0);ch(3,1);ch(4,1);ch(5,1);ch(6,0);ch(7,0);ch(8,0);break;// F
case 14:ch(2,1);ch(3,1);ch(4,0);ch(5,1);ch(6,0);ch(7,1);ch(8,0);break;// n
case 15:ch(2,1);ch(3,1),ch(4,1);ch(5,0);ch(6,0);ch(7,0);ch(8,1);break;// L
case 16:ch(2,1);ch(3,0);ch(4,0);ch(5,0);ch(6,1);ch(7,0);ch(8,0);break;// y
case 17:ch(2,0);ch(3,0);ch(4,0);ch(5,1);ch(6,0);ch(7,0);ch(8,0);break;// A
}}
void anod(){
switch(an){
case 0:ch(grids_HL1,0);ch(grids_HL2,1);ch(grids_HL3,1);ch(grids_HL4,1);break;
case 1:ch(grids_HL1,1);ch(grids_HL2,0);ch(grids_HL3,1);ch(grids_HL4,1);break;
case 2:ch(grids_HL1,1);ch(grids_HL2,1);ch(grids_HL3,0);ch(grids_HL4,1);break;
case 3:ch(grids_HL1,1);ch(grids_HL2,1);ch(grids_HL3,1);ch(grids_HL4,0);break;
}}
void cl(){
segm=10; an=0; segment(); anod(); an=1; segment(); anod(); an=2; segment(); anod(); an=3; segment();anod();
}
void ch(int pin, int logic){digitalWrite(pin,logic);}
Добавил:
1) ШИМ регулировка яркости подсветки
2) Меню запроса на сохранений времени при корректировке
3) Меню настройки подсветки
4) Автоматическая установка времени на RTC DS3231 при первой загрузке скетча в плату
5) Автоматическое сохранение параметров настройки подсветки в ЭСППЗУ контроллера
Думал как правильно реализовать работу (по времени суток) с включением/отключением преобразователя на 27В, накала ламп и подсветки, но так не сделал. Может у кого будут мысли как это грамотно реализовать в скетче.
Управление сетками тоже можно организовать через ULN2003?
Схема часов с применением ULN2003 Данный контент доступен только зарегистрированным пользователям.
Да. Это будет удобнее, если использовать 6 индикаторов, так как меньше нужно загромождать место на плате резисторами и транзисторами.
Схема и печатная плата часов на индикаторах ИВ-6. Двухстороннюю печатную плату я сделал ЛУТом.
Использовал ULN2003 и резисторные сборки в SMD корпусах. Повышающий преобразователь выполнен отдельной платой на NE555 так как MT3608 сразу сгорел. Для счета времени использовал DS1302.
Данный контент доступен только зарегистрированным пользователям.
Схема и печатная плата проверена.
Преобразователь настроил на 26 вольт. Вместо подстроечного резистора использовал резистор на 500 Ом.
#define ADDR_INIT 6 // Адрес для проверки
#define INIT_KEY 15 // Ключ проверки на первый запуск
#define ADDR_YRKOST 0 // Адрес хранения значения яркости
#define ADDR_SVET 2 // Адрес хранения состояния подсветки
#define PERIOD 1000
#include "MsTimer2.h"
#include <EEPROM.h>
#include <Wire.h>
#include <iarduino_RTC.h>
iarduino_RTC watch(RTC_DS1302, A4, A3, A5); // RST, CLK, DAT
int an, segm, times, i, ss, mm, hh;
int dp;
byte a[5]; // масив содержащий выводимую на индикаторы информацию
int menu, year, month, day, hour, minute, second, weekday, w, w2, save_t;
int menu_svet, svet_state, brightness, svet, w3;
uint32_t timer = 0;
int led_pwm = 10;
int dps;
///////////// Управляющие сетки ВЛИ/////////////////////////
int grids_HL1 = 4;
int grids_HL2 = 3;
int grids_HL3 = 2;
int grids_HL4 = 13;
int grids_HL5 = A0;
////////////////////////// Сегменты ВЛИ////////////////////////
int SEG_A = 7;
int SEG_B = 5;
int SEG_C = 6;
int SEG_D = 12;
int SEG_E = 11;
int SEG_F = 9;
int SEG_G = 8;
//////////////////////////////////// Кнопки //////////////////////
int SW1 = A1;
int SW2 = A2;
int SW3 = A6;
int SW4 = A7;
void setup() {
watch.begin(); // Инициируем работу с модулем.
MsTimer2::set(2, to_Timer);
MsTimer2::start();
Serial.begin(9600);
//Serial.end(); // Отключаем последовательный порт
if (EEPROM.read(ADDR_INIT) != INIT_KEY) { // проверка на первый запуск
EEPROM.put(ADDR_INIT, INIT_KEY);
EEPROM.put(ADDR_YRKOST, 50); // значение яркости по умолчанию
EEPROM.put(ADDR_SVET, 1); // состояние подвсетки по умолчанию
}
//////////////////////// Настройка выводов микроконтроллера////////////////
pinMode(grids_HL1, OUTPUT);
pinMode(grids_HL2, OUTPUT);
pinMode(grids_HL3, OUTPUT);
pinMode(grids_HL4, OUTPUT);
pinMode(grids_HL5, OUTPUT);
pinMode(SEG_A, OUTPUT);
pinMode(SEG_B, OUTPUT);
pinMode(SEG_C, OUTPUT);
pinMode(SEG_D, OUTPUT);
pinMode(SEG_E, OUTPUT);
pinMode(SEG_F, OUTPUT);
pinMode(SEG_G, OUTPUT);
pinMode(SW1, INPUT);
pinMode(SW2, INPUT);
pinMode(SW3, INPUT);
pinMode(SW4, INPUT);
pinMode(led_pwm, OUTPUT); // подсветка ламп
/* Назначение кнопок:
SW4 --- set - при однократном нажатии активируется режим корректировки минут(1), далее нажимая set - часы(2), день(3), месяц(4) и год(5)
SW3 --- +/sec - при нажатии и удержании кнопки должны отображаться секунды "S_31"
SW2 --- -/day - при нажатии и удержании кнопки должна отображаться дата
SW1 --- light - при однократном нажатии меню включения/отключения подсветки, далее меню настройки яркости
*/
watch.gettime();
year = watch.year; // текущее время перенос в переменные коррекции времени
month = watch.month;
day = watch.day;
hour = watch.Hours;
minute = watch.minutes;
EEPROM.get(ADDR_YRKOST, brightness); // Чтение значения яркости подсветки
EEPROM.get(ADDR_SVET, svet_state); // Чтение значения состояния подсветки
}
void loop() {
// Опрос времени
if (millis() - timer >= PERIOD) {
dps=1;
if (dp != dps){
dp=1;} else {dp=0;}
watch.gettime();
hh = watch.Hours; // Часы
mm = watch.minutes; // Минуты
ss = watch.seconds; // Секунды
Serial.println(watch.gettime("d-m-Y, H:i:s, D")); // Выводим время.
do {
timer += PERIOD;
if (timer < PERIOD) break; // переполнение uint32_t
} while (timer < millis() - PERIOD); // защита от пропуска шага
} else {dps=0;}
if (analogRead(SW4) > 500 && menu_svet == 0) { // Вход в меню корректировки
menu++; delay(200); if (menu > 6 && save_t == 1) {menu = 0;w = 1;} // Выход с изменением настроек времени
if (menu > 6 && save_t == 0) {menu = 0;w = 0;};}// Выход без изменения настроек времени
// Вход в меню настройки подсветки и выход с сохранением в ЭСППЗУ
if (analogRead(SW1) > 500 && menu == 0) {menu_svet++;delay(200); if (menu_svet > 2) {menu_svet = 0;w3 = 1;};}
///////////////////////////// Время/////////////////////////////
if (menu == 0 && w2 == 0 && menu_svet == 0) {times = hh*100+mm;
a[0] = times / 1000;
a[1] = times / 100 % 10;
if (dp == 1) { // Мигающее тире разделителяющее минуты и секунды
a[2] = 18;
} else {
a[2] = 10;}
a[3] = times / 10 % 10;
a[4] = times % 10 % 10;
}
w2 = 0;
////////////////// вывод секунд - нажать и удерживать кнопку +/sec //////
if (analogRead(SW3) > 500 && menu == 0 && menu_svet == 0) {
w2 = 1; times = ss;
a[0] = 11;
a[1] = 10;
a[2] = 10;
a[3] = times / 10;
a[4] = times % 10;
}
////////////////////////// Коррекция минут//////////////////////////
if (menu == 1) {
if (analogRead(SW3) > 500 ) {minute++;delay(300);if (minute > 59) {minute = 0;}}
if (analogRead(SW2) > 500 ) {minute--;delay(300);if (minute < 0) {minute = 0;}}
times = minute;
a[0] = 1;
a[1] = 10;
a[2] = 10;
a[3] = times / 10;
a[4] = times % 10;}
/////////////////////////// Коррекция часов///////////////////////////
if (menu == 2) {
if (analogRead(SW3) > 500 ) {hour++;delay(300);if (hour > 23) {hour = 0;}}
if (analogRead(SW2) > 500 ) {hour--;delay(300);if (hour < 0) {hour = 0;}}
times = hour;
a[0] = 2;
a[1] = 10;
a[2] = 10;
a[3] = times / 10;
a[4] = times % 10;}
//////////////////////////// Коррекция даты//////////////////////////////
if (menu == 3) {
if (analogRead(SW3) > 500 ) {day++;delay(300);if (day > 31) {day = 0;}}
if (analogRead(SW2) > 500 ) {day--;delay(300);if (day < 0) {day = 0;}}
times = day;
a[0] = 3;
a[1] = 10;
a[2] = 10;
a[3] = times / 10;
a[4] = times % 10;}
////////////////////////// Коррекция месяца /////////////////
if (menu == 4) {
if (analogRead(SW3) > 500 ) {month++;delay(300);if (month > 12) {month = 1;}}
if (analogRead(SW2) > 500 ) {month--;delay(300);if (month < 1) {month = 1;}}
times = month;
a[0] = 4;
a[1] = 10;
a[2] = 10;
a[3] = times / 10;
a[4] = times % 10;}
///////////////////////////// Коррекция года ////////////////////////
if (menu == 5) {
if (analogRead(SW3) > 500 ) {year++;delay(300);if (year > 99) {year = 19;}}
if (analogRead(SW2) > 500 ) {year--;delay(300);if (year < 19) {year = 19;}}
times = year;
a[0] = 5;
a[1] = 10;
a[2] = 10;
a[3] = times / 10 % 10;
a[4] = times % 10;}
///////Запрос на сохранение изменений корректировки времени////////
if (menu == 6) {
if (analogRead(SW3) > 500 ) {save_t++;delay(300);if (save_t > 1) {save_t = 0;}}
if (analogRead(SW2) > 500 ) {save_t--;delay(300);if (save_t < 0) {save_t = 1;}}
if (save_t == 1) {
a[0] = 11;
a[1] = 17;
a[2] = 10;
a[3] = 10;
a[4] = 16;}
if (save_t == 0) {
a[0] = 11;
a[1] = 17;
a[2] = 10;
a[3] = 10;
a[4] = 14;}}
if (w==1) { // Сохранение времени при флаге w==1
watch.settime(59,minute,hour,day,month,year,weekday); // 59 сек, 52 мин, 22 часа, 2, мая, 2021 года, воскресенье
w=0;
}
///////////////////// Включение/выключение подсветки//////////////////
if (menu_svet == 1) {
if (analogRead(SW3) > 500 ) {svet_state++;delay(300);if (svet_state > 1) {svet_state = 0;}}
if (analogRead(SW2) > 500 ) {svet_state--;delay(300);if (svet_state < 0) {svet_state = 1;}}
if (svet_state == 1) {
a[0] = 10;
a[1] = 10;
a[2] = 10;
a[3] = 0;
a[4] = 14;}
if (svet_state == 0) {
a[0] = 10;
a[1] = 10;
a[2] = 0;
a[3] = 13;
a[4] = 13;}}
////////////////////// Настройка яркости подсветки ////////////////
if (menu_svet == 2) {
if (analogRead(SW3) > 500 ) {brightness++;delay(200);if (brightness > 100) {brightness = 100;}}
if (analogRead(SW2) > 500 ) {brightness--;delay(200);if (brightness < 0) {brightness = 0;}}
times = brightness;
a[0] = 15;
a[1] = 10;
if (times == 100) {
a[2] = 1;
} else {
a[2] = 10;
}
if (times > 9) {
a[3] = times / 10 % 10;
} else {
a[3] = 10;
}
a[4] = times % 10;
};
svet = brightness * 2.55;
if (svet_state == 1) {
analogWrite(led_pwm, svet);
} else {
digitalWrite(led_pwm, LOW);
}
if (w3 == 1) { // Сохранение настроек в ЭСППЗУ при флаге w3==1
EEPROM.put(ADDR_YRKOST, brightness); EEPROM.put(ADDR_SVET, svet_state);
w3 = 0;
}
} // loop
void to_Timer() {
switch (i) {
case 0: cl(); segm = a[0]; an = 0; anod(); segment(); break;
case 1: cl(); segm = a[1]; an = 1; anod(); segment(); break;
case 2: cl(); segm = a[2]; an = 2; anod(); segment(); break;
case 3: cl(); segm = a[3]; an = 3; anod(); segment(); break;
case 4: cl(); segm = a[4]; an = 4; anod(); segment(); break;
} i++; if (i > 4) {i = 0;};}
void segment() {
switch (segm) {
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, 0); ch(SEG_D, 0); ch(SEG_E, 1); ch(SEG_F, 0); ch(SEG_G, 0); break; // S
case 12: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // t
case 13: ch(SEG_A, 0); ch(SEG_B, 1); ch(SEG_C, 1); ch(SEG_D, 1); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // F
case 14: ch(SEG_A, 1); ch(SEG_B, 1); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 0); ch(SEG_F, 1); ch(SEG_G, 0); break; // n
case 15: ch(SEG_A, 1); ch(SEG_B, 1), ch(SEG_C, 1); ch(SEG_D, 0); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 1); break; // L
case 16: ch(SEG_A, 1); 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; // y
case 17: ch(SEG_A, 0); ch(SEG_B, 0); ch(SEG_C, 0); ch(SEG_D, 1); ch(SEG_E, 0); ch(SEG_F, 0); ch(SEG_G, 0); break; // A
case 18: 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(grids_HL1, 0); ch(grids_HL2, 1); ch(grids_HL3, 1); ch(grids_HL4, 1); ch(grids_HL5, 1); break;
case 1: ch(grids_HL1, 1); ch(grids_HL2, 0); ch(grids_HL3, 1); ch(grids_HL4, 1); ch(grids_HL5, 1); break;
case 2: ch(grids_HL1, 1); ch(grids_HL2, 1); ch(grids_HL3, 0); ch(grids_HL4, 1); ch(grids_HL5, 1); break;
case 3: ch(grids_HL1, 1); ch(grids_HL2, 1); ch(grids_HL3, 1); ch(grids_HL4, 0); ch(grids_HL5, 1); break;
case 4: ch(grids_HL1, 1); ch(grids_HL2, 1); ch(grids_HL3, 1); ch(grids_HL4, 1); ch(grids_HL5, 0); break;
}
}
void cl() {
segm = 10;
an = 0; segment(); anod();
an = 1; segment(); anod();
an = 2; segment(); anod();
an = 3; segment(); anod();
an = 4; segment(); anod();
}
void ch(int pin, int logic) {digitalWrite(pin, logic);}
Фото готовых часов
Плата с обратной стороны
Всем привет! Успешно собрал часы по предоставленным здесь схемам, но столкнулся с одной проблемой в прошивке часов с кнопками. Установил я допустим время в 12.15, и оно тикает себе, все хорошо. прошло 3 часа к примеру, стало 15.15. И тут я решаю понажимать кнопку set, что бы дату посмотреть. долистываю до даты, смотрю, листаю дальше что бы вернуться ко времени. И вижу вновь 12.15, т е после нажатия кнопки set время возращается ко времени установки. Вопрос к знатокам, ибо я в прошивках не большой специалист. Это проблема прошивки, и можно ее исправить, или что то не так с моим ds3132 (так же, например системное время при компиляции скетча часы ни в какую не подтягивают). Либо, можно ли переназначить кнопку sec на date, ибо смотреть на секунды смысла не вижу, а дата гораздо нужнее.
ну и последнее. не знаю у кого как, а у меня температуру показывает на 2-3 градуса выше нормы (причем после включения показывает верную, а поработав 10-20 мин начинает завышать) DS3132 стоит в стороне от всего, и греть его нечему, так понимаю это его собственное тепло (если бы он не грелся, то и термостабилизация была бы не к чему). может имеет смысл использовать какой либо датчик температуры для ардуино? готов ли кто то подкорректировать прошивку?
опубликуйте скетч
Страницы Назад 1 2 3 4 5 6 7 … 11 Далее
Чтобы отправить ответ, вы должны войти или зарегистрироваться
forum.rcl-radio.ru → Законченные проекты → Ретро часы на ИВ-6
Форум работает на PunBB, при поддержке Informer Technologies, Inc
|