Часы, будильник, термометр. На ARDUINO NANO, DS3231.
- Войдите на сайт для отправки комментариев
Пт, 06/05/2016 - 09:55
Часы, будильник, термометр. На ARDUINO NANO, DS3231.
#include <Wire.h>
#include <DS3231.h>
DS3231 clock;
RTCDateTime dt;
RTCAlarmTime al;
boolean AlarmOn = LOW;
boolean AlarmSound = LOW;
boolean Colon = LOW;
boolean ButtonMinuteFlag = LOW;
boolean ButtonHourFlag = LOW;
boolean ButtonAlarmFlag = LOW;
boolean AlarmSet = LOW;
long OneButtonTimer;
long TwoButtonTimer;
long ThreeButtonTimer;
long AlarmTimer;
long CheckTimer;
byte LedDigit[4] = {5, 4, 3, 2};// Led Pin Digit, Digit2, Digit3, Digit4, Led Pin
byte LedSigment[7] = {A0, A1, A2, 9, 8, 7, 6};// Led Pin A, B, C, D, E, F, G
byte LedColon = 13;// Led Pin Colon
byte MinuteButton = 12;// Button Minute Pin
byte HourButton = 11;// Button Hour Pin
byte AlarmButton = 10;// Alarm Button Pin
byte PinBuzzer = A3;// Buzzer Pin
byte Second;
byte Minute;
byte Hour;
byte Day;
byte Month;
byte Year;
byte ActivateDigit[4][4] = {
{0, 1, 1, 1}, // First digit is on // Change if Anode
{1, 0, 1, 1}, // Second digit is on // Change if Anode
{1, 1, 0, 1}, // Third digit is on // Change if Anode
{1, 1, 1, 0}};// Fourth digit is on // Change if Anode
byte ActivateSegments[11][7] = {
{ 1, 1, 1, 1, 1, 1, 0 }, // = 0 // Change if Anode
{ 0, 1, 1, 0, 0, 0, 0 }, // = 1 // Change if Anode
{ 1, 1, 0, 1, 1, 0, 1 }, // = 2 // Change if Anode
{ 1, 1, 1, 1, 0, 0, 1 }, // = 3 // Change if Anode
{ 0, 1, 1, 0, 0, 1, 1 }, // = 4 // Change if Anode
{ 1, 0, 1, 1, 0, 1, 1 }, // = 5 // Change if Anode
{ 1, 0, 1, 1, 1, 1, 1 }, // = 6 // Change if Anode
{ 1, 1, 1, 0, 0, 0, 0 }, // = 7 // Change if Anode
{ 1, 1, 1, 1, 1, 1, 1 }, // = 8 // Change if Anode
{ 1, 1, 1, 1, 0, 1, 1 }, // = 9 // Change if Anode
{ 0, 0, 0, 1, 1, 1, 1 }}; // = ("t") // Change if Anode
void setup() {
clock.begin();
pinMode (LedColon, OUTPUT);
pinMode (PinBuzzer, OUTPUT);
pinMode (MinuteButton, INPUT_PULLUP);
pinMode (HourButton, INPUT_PULLUP);
pinMode (AlarmButton, INPUT_PULLUP);
for (byte a = 0; a < 4; ++a) {
pinMode (LedDigit[a], OUTPUT);
}
for (byte b = 0; b < 7; ++b) {
pinMode (LedSigment[b], OUTPUT);
}
}
void loop() {
if (clock.isArmed1()) {
if (clock.isAlarm1()) {
AlarmTimer = millis();
AlarmOn = HIGH;
}
}
if (AlarmOn) {
if (dt.second % 2 == 0) tone(PinBuzzer, 2000, 100);
if (millis() - AlarmTimer > 120000) {
AlarmOn = LOW;
}
}
if (AlarmSet == HIGH) LED_WriteAlarm();
else {
if (millis() - CheckTimer > 400) {
dt = clock.getDateTime();
CheckTimer = millis();
}
if ((dt.minute % 10) == 0 && dt.second >= 10 && dt.second < 30) {
LED_WriteTemp();
}
else LED_WriteTime();
}
if (digitalRead(MinuteButton) == LOW && digitalRead(HourButton) && (digitalRead(AlarmButton))) {
if (ButtonMinuteFlag == LOW && ButtonHourFlag == LOW && ButtonAlarmFlag == LOW ) {
ButtonMinuteFlag = HIGH;
if (AlarmSet == HIGH) {
IncAlarmMinutes();
}
else {
IncMinutes();
}
}
if (ButtonMinuteFlag == HIGH) {
if (millis() - OneButtonTimer > 1300) {
if (millis() - TwoButtonTimer > 100) {
if (AlarmSet == HIGH) {
IncAlarmMinutes();
}
else {
IncMinutes();
}
TwoButtonTimer = millis();
}
}
}
ThreeButtonTimer = millis();
}
else {
if (digitalRead(HourButton) == LOW && digitalRead(MinuteButton) && (digitalRead(AlarmButton))) {
if (ButtonMinuteFlag == LOW && ButtonHourFlag == LOW && ButtonAlarmFlag == LOW ) {
ButtonHourFlag = HIGH;
if (AlarmSet == HIGH) {
IncAlarmHour();
}
else {
IncHour();
}
}
if (ButtonHourFlag == HIGH) {
if (millis() - OneButtonTimer > 1300) {
if (millis() - TwoButtonTimer > 100) {
if (AlarmSet == HIGH) {
IncAlarmHour();
}
else {
IncHour();
}
TwoButtonTimer = millis();
}
}
}
ThreeButtonTimer = millis();
}
else {
if (digitalRead(AlarmButton) == LOW && digitalRead(MinuteButton) && digitalRead(HourButton)) {
if (ButtonMinuteFlag == LOW && ButtonHourFlag == LOW && ButtonAlarmFlag == LOW ) {
ButtonAlarmFlag = HIGH;
tone(PinBuzzer, 2000, 100);// resonance frequency buzzer
AlarmOn = LOW;
clock.isAlarm1(LOW);
clock.clearAlarm1();
}
if (ButtonAlarmFlag == HIGH && AlarmSet == LOW) {
if (millis() - OneButtonTimer > 1300) {
AlarmSet = HIGH;
TwoButtonTimer = millis();
tone(PinBuzzer, 2000, 100);// resonance frequency buzzer
}
}
if (ButtonAlarmFlag == HIGH && AlarmSet == HIGH) {
if (millis() - TwoButtonTimer > 1300) {
TwoButtonTimer = millis();
if (clock.isArmed1()) {
al = clock.getAlarm1();
clock.setAlarm1(al.day, al.hour, al.minute, 0, DS3231_MATCH_H_M_S, LOW);
}
else {
al = clock.getAlarm1();
clock.setAlarm1(al.day, al.hour, al.minute, 0, DS3231_MATCH_H_M_S, HIGH);
}
tone(PinBuzzer, 2000, 100);// resonance frequency buzzer
}
}
ThreeButtonTimer = millis();
}
else {
OneButtonTimer = millis();
TwoButtonTimer = millis();
}
}
if (AlarmSet == HIGH && millis() - ThreeButtonTimer > 5000) {
AlarmSet = LOW;
tone(PinBuzzer, 2000, 100);// resonance frequency buzzer
}
if (digitalRead(MinuteButton) && ButtonMinuteFlag) ButtonMinuteFlag = LOW;
if (digitalRead(HourButton) && ButtonHourFlag) ButtonHourFlag = LOW;
if (digitalRead(AlarmButton) && ButtonAlarmFlag) ButtonAlarmFlag = LOW;
}
}
void IncMinutes() {
dt = clock.getDateTime();
Minute = dt.minute + 1;
if (Minute >= 60) Minute = 0;
clock.setDateTime(dt.year, dt.month, dt.day, dt.hour, Minute, 0);
tone(PinBuzzer, 2000, 100);// resonance frequency buzzer
}
void IncAlarmMinutes() {
al = clock.getAlarm1();
Minute = al.minute + 1;
if (Minute >= 60) Minute = 0;
clock.setAlarm1(al.day, al.hour, Minute, 0, DS3231_MATCH_H_M_S, HIGH);
tone(PinBuzzer, 2000, 100);// resonance frequency buzzer
}
void IncHour() {
dt = clock.getDateTime();
Hour = dt.hour + 1;
if (Hour >= 24) Hour = 0;
clock.setDateTime(dt.year, dt.month, dt.day, Hour, dt.minute, 0);
tone(PinBuzzer, 2000, 100);// resonance frequency buzzer
}
void IncAlarmHour() {
al = clock.getAlarm1();
Hour = al.hour + 1;
if (Hour >= 24) Hour = 0;
clock.setAlarm1(al.day, Hour, al.minute, 0, DS3231_MATCH_H_M_S, HIGH);
tone(PinBuzzer, 2000, 100);// resonance frequency buzzer
}
void LED_WriteTime() {
dt = clock.getDateTime();
Minute = dt.minute;
Hour = dt.hour;
if (dt.second % 2 == 0) Colon = HIGH;
else Colon = LOW;
if (Hour > 9) LED_WriteDigit(1, Hour / 10, 0);
LED_WriteDigit(2, Hour % 10, Colon);
if (Minute < 10) LED_WriteDigit(3, 0, 0);
else LED_WriteDigit(3, Minute / 10, 0);
LED_WriteDigit(4, Minute % 10, clock.isArmed1());
}
void LED_WriteAlarm() {
dt = clock.getDateTime();
al = clock.getAlarm1();
Minute = al.minute;
Hour = al.hour;
if (dt.second % 2 == 0) Colon = HIGH;
else Colon = LOW;
if (Hour > 9) LED_WriteDigit(1, Hour / 10, 0);
LED_WriteDigit(2, Hour % 10, AlarmSet);
if (Minute < 10) LED_WriteDigit(3, 0, 0);
else LED_WriteDigit(3, Minute / 10, 0);
LED_WriteDigit(4, Minute % 10, clock.isArmed1());
}
void LED_WriteTemp() {
float Temp = clock.readTemperature();
LED_WriteDigit(1, 10, 0);
int Temp1 = (Temp * 10) / 100;
LED_WriteDigit(2, Temp1, 0);
int Temp2 = ((Temp * 10) - (Temp1 * 100)) / 10;
LED_WriteDigit(3, Temp2, 1);
LED_WriteDigit(4, (Temp * 10) - (Temp1 * 100) - (Temp2 * 10), 0);
}
void LED_WriteDigit(byte Digit, byte Value, byte Colon) {
for (byte DigCount = 0; DigCount < 4; ++DigCount) {
digitalWrite(LedDigit[DigCount], ActivateDigit[Digit - 1][DigCount]);
}
for (byte SegCount = 0; SegCount < 7; ++SegCount) {
digitalWrite(LedSigment[SegCount], ActivateSegments[Value][SegCount]);
delayMicroseconds(100);
digitalWrite(LedSigment[SegCount], 0);
}// Change if Anode
if (Colon) {
digitalWrite(LedColon, HIGH); // Change if Anode
delayMicroseconds(100);
digitalWrite(LedColon, LOW);
}
}
Красиво. Цвета на картинке поплыли или индикатор дйствительно розовый? Если розовый, дайте пожалуйста ссылку, где брали такой.
Поплыли.
подскажите, плз, как заменить DS3231 на DS1302 в этом скетче?
Красиво. Цвета на картинке поплыли или индикатор дйствительно розовый? Если розовый, дайте пожалуйста ссылку, где брали такой.
немного поиграя с напряжением можно поиграть с оттенком свечения, только осторожно)
заменить библиотеку и управляющие команды, у меня ds1302 нету не чем помочь не могу. Да и хуже она значительно.
подскажите, плз, как заменить DS3231 на DS1302 в этом скетче?
На АЛИ как буханка хлеба стоит!
я видел, спасибо.
но есть трудности - 1302 у мну есть, а с Али я не смогу получить ближайшее (хз сколько - год, може меньше) время.
так что пытаюсь слепить и говна и палок =)
DarkGenius, спасибо! хоть понятно куда копать.
Делаю часы на WS2812B, с внешним беспроводным термометром. Так же хочу прикрутить IR пульт и сделать функцию лампы настроения ( с этим пока туго т.к. не уживаются пульт и эти светодиоды из-за ограничения по "таймингам", если кто пробовал, то посоветуйте куда копать.)
Использую библ. Adafruit_GFX, Adafruit_NeoMatrix, Adafruit_NeoPixel
На максах дополнительный дисплей реализовал.

https://youtu.be/IJ8PPtEiprQ
подскажите, пожалуйста, что означает в строке 221
"clock.isArmed1()"? смотрю в библиотеках(скачал уже штук пять) для этого RTC и не вижу такой команды.
или подскажите, плз, какая команда соответствует из библиотеки DS1302?
суть простая - пытаюсь авторский скетч переделать под DS1302
статус будильника, включен\выключен
ага!
"я догадался, что 0,5 и 0,5 это литр, да постеснялся сказать"(с)
спасибо DarkGenius!
UPD. не подскажешь где библиотеку 3231 брал?
пытаюсь разобраться с командами, что б заменить на 1302, но все библиотеки которые мне попадаются не имеют команд, которые в скетче.
UPD1. сам спросил, сам ответил =) вот библиотека
UPD2. всё-таки 1302 это "г" на палочке - создание будильника целый геморр
У меня почему то не идет ... горят одни восьмёрки. Скетч загрузился без ошибок. индикатор - общий анод. DS3231 предварительно тоже проверял из образцов. В мониторе все показывает нормально. Три раза пересобирал на макетке, думал ошибка. Но всё одно и то же. :(
Да все есть в самом начале. Повторю еще раз, чтоб рядом было.
Подключение к индикатору и кнопки:
byte LedDigit[4] = {5, 4, 3, 2};// Led Pin Digit, Digit2, Digit3, Digit4, Led Pin 019 byte LedSigment[7] = {A0, A1, A2, 9, 8, 7, 6};// Led Pin A, B, C, D, E, F, G 020 byte LedColon = 13;// Led Pin Colon 021 byte MinuteButton = 12;// Button Minute Pin 022 byte HourButton = 11;// Button Hour Pin 023 byte AlarmButton = 10;// Alarm Button Pin 024 byte PinBuzzer = A3;// Buzzer Pinи скетч
#include <Wire.h> #include <DS3231.h> DS3231 clock; RTCDateTime dt; RTCAlarmTime al; boolean AlarmOn = LOW; boolean AlarmSound = LOW; boolean Colon = LOW; boolean ButtonMinuteFlag = LOW; boolean ButtonHourFlag = LOW; boolean ButtonAlarmFlag = LOW; boolean AlarmSet = LOW; long OneButtonTimer; long TwoButtonTimer; long ThreeButtonTimer; long AlarmTimer; long CheckTimer; byte LedDigit[4] = {5, 4, 3, 2};// Led Pin Digit, Digit2, Digit3, Digit4, Led Pin byte LedSigment[7] = {A0, A1, A2, 9, 8, 7, 6};// Led Pin A, B, C, D, E, F, G byte LedColon = 13;// Led Pin Colon byte MinuteButton = 12;// Button Minute Pin byte HourButton = 11;// Button Hour Pin byte AlarmButton = 10;// Alarm Button Pin byte PinBuzzer = A3;// Buzzer Pin byte Second; byte Minute; byte Hour; byte Day; byte Month; byte Year; byte ActivateDigit[4][4] = { {0, 1, 1, 1}, // First digit is on // Change if Anode {1, 0, 1, 1}, // Second digit is on // Change if Anode {1, 1, 0, 1}, // Third digit is on // Change if Anode {1, 1, 1, 0}};// Fourth digit is on // Change if Anode byte ActivateSegments[11][7] = { { 1, 1, 1, 1, 1, 1, 0 }, // = 0 // Change if Anode { 0, 1, 1, 0, 0, 0, 0 }, // = 1 // Change if Anode { 1, 1, 0, 1, 1, 0, 1 }, // = 2 // Change if Anode { 1, 1, 1, 1, 0, 0, 1 }, // = 3 // Change if Anode { 0, 1, 1, 0, 0, 1, 1 }, // = 4 // Change if Anode { 1, 0, 1, 1, 0, 1, 1 }, // = 5 // Change if Anode { 1, 0, 1, 1, 1, 1, 1 }, // = 6 // Change if Anode { 1, 1, 1, 0, 0, 0, 0 }, // = 7 // Change if Anode { 1, 1, 1, 1, 1, 1, 1 }, // = 8 // Change if Anode { 1, 1, 1, 1, 0, 1, 1 }, // = 9 // Change if Anode { 0, 0, 0, 1, 1, 1, 1 }}; // = ("t") // Change if Anode void setup() { clock.begin(); pinMode (LedColon, OUTPUT); pinMode (PinBuzzer, OUTPUT); pinMode (MinuteButton, INPUT_PULLUP); pinMode (HourButton, INPUT_PULLUP); pinMode (AlarmButton, INPUT_PULLUP); for (byte a = 0; a < 4; ++a) { pinMode (LedDigit[a], OUTPUT); } for (byte b = 0; b < 7; ++b) { pinMode (LedSigment[b], OUTPUT); } } void loop() { if (clock.isArmed1()) { if (clock.isAlarm1()) { AlarmTimer = millis(); AlarmOn = HIGH; } } if (AlarmOn) { if (dt.second % 2 == 0) tone(PinBuzzer, 2000, 100); if (millis() - AlarmTimer > 120000) { AlarmOn = LOW; } } if (AlarmSet == HIGH) LED_WriteAlarm(); else { if (millis() - CheckTimer > 400) { dt = clock.getDateTime(); CheckTimer = millis(); } if ((dt.minute % 10) == 0 && dt.second >= 10 && dt.second < 30) { LED_WriteTemp(); } else LED_WriteTime(); } if (digitalRead(MinuteButton) == LOW && digitalRead(HourButton) && (digitalRead(AlarmButton))) { if (ButtonMinuteFlag == LOW && ButtonHourFlag == LOW && ButtonAlarmFlag == LOW ) { ButtonMinuteFlag = HIGH; if (AlarmSet == HIGH) { IncAlarmMinutes(); } else { IncMinutes(); } } if (ButtonMinuteFlag == HIGH) { if (millis() - OneButtonTimer > 1300) { if (millis() - TwoButtonTimer > 100) { if (AlarmSet == HIGH) { IncAlarmMinutes(); } else { IncMinutes(); } TwoButtonTimer = millis(); } } } ThreeButtonTimer = millis(); } else { if (digitalRead(HourButton) == LOW && digitalRead(MinuteButton) && (digitalRead(AlarmButton))) { if (ButtonMinuteFlag == LOW && ButtonHourFlag == LOW && ButtonAlarmFlag == LOW ) { ButtonHourFlag = HIGH; if (AlarmSet == HIGH) { IncAlarmHour(); } else { IncHour(); } } if (ButtonHourFlag == HIGH) { if (millis() - OneButtonTimer > 1300) { if (millis() - TwoButtonTimer > 100) { if (AlarmSet == HIGH) { IncAlarmHour(); } else { IncHour(); } TwoButtonTimer = millis(); } } } ThreeButtonTimer = millis(); } else { if (digitalRead(AlarmButton) == LOW && digitalRead(MinuteButton) && digitalRead(HourButton)) { if (ButtonMinuteFlag == LOW && ButtonHourFlag == LOW && ButtonAlarmFlag == LOW ) { ButtonAlarmFlag = HIGH; tone(PinBuzzer, 2000, 100);// resonance frequency buzzer AlarmOn = LOW; clock.isAlarm1(LOW); clock.clearAlarm1(); } if (ButtonAlarmFlag == HIGH && AlarmSet == LOW) { if (millis() - OneButtonTimer > 1300) { AlarmSet = HIGH; TwoButtonTimer = millis(); tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } } if (ButtonAlarmFlag == HIGH && AlarmSet == HIGH) { if (millis() - TwoButtonTimer > 1300) { TwoButtonTimer = millis(); if (clock.isArmed1()) { al = clock.getAlarm1(); clock.setAlarm1(al.day, al.hour, al.minute, 0, DS3231_MATCH_H_M_S, LOW); } else { al = clock.getAlarm1(); clock.setAlarm1(al.day, al.hour, al.minute, 0, DS3231_MATCH_H_M_S, HIGH); } tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } } ThreeButtonTimer = millis(); } else { OneButtonTimer = millis(); TwoButtonTimer = millis(); } } if (AlarmSet == HIGH && millis() - ThreeButtonTimer > 5000) { AlarmSet = LOW; tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } if (digitalRead(MinuteButton) && ButtonMinuteFlag) ButtonMinuteFlag = LOW; if (digitalRead(HourButton) && ButtonHourFlag) ButtonHourFlag = LOW; if (digitalRead(AlarmButton) && ButtonAlarmFlag) ButtonAlarmFlag = LOW; } } void IncMinutes() { dt = clock.getDateTime(); Minute = dt.minute + 1; if (Minute >= 60) Minute = 0; clock.setDateTime(dt.year, dt.month, dt.day, dt.hour, Minute, 0); tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } void IncAlarmMinutes() { al = clock.getAlarm1(); Minute = al.minute + 1; if (Minute >= 60) Minute = 0; clock.setAlarm1(al.day, al.hour, Minute, 0, DS3231_MATCH_H_M_S, HIGH); tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } void IncHour() { dt = clock.getDateTime(); Hour = dt.hour + 1; if (Hour >= 24) Hour = 0; clock.setDateTime(dt.year, dt.month, dt.day, Hour, dt.minute, 0); tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } void IncAlarmHour() { al = clock.getAlarm1(); Hour = al.hour + 1; if (Hour >= 24) Hour = 0; clock.setAlarm1(al.day, Hour, al.minute, 0, DS3231_MATCH_H_M_S, HIGH); tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } void LED_WriteTime() { dt = clock.getDateTime(); Minute = dt.minute; Hour = dt.hour; if (dt.second % 2 == 0) Colon = HIGH; else Colon = LOW; if (Hour > 9) LED_WriteDigit(1, Hour / 10, 0); LED_WriteDigit(2, Hour % 10, Colon); if (Minute < 10) LED_WriteDigit(3, 0, 0); else LED_WriteDigit(3, Minute / 10, 0); LED_WriteDigit(4, Minute % 10, clock.isArmed1()); } void LED_WriteAlarm() { dt = clock.getDateTime(); al = clock.getAlarm1(); Minute = al.minute; Hour = al.hour; if (dt.second % 2 == 0) Colon = HIGH; else Colon = LOW; if (Hour > 9) LED_WriteDigit(1, Hour / 10, 0); LED_WriteDigit(2, Hour % 10, AlarmSet); if (Minute < 10) LED_WriteDigit(3, 0, 0); else LED_WriteDigit(3, Minute / 10, 0); LED_WriteDigit(4, Minute % 10, clock.isArmed1()); } void LED_WriteTemp() { float Temp = clock.readTemperature(); LED_WriteDigit(1, 10, 0); int Temp1 = (Temp * 10) / 100; LED_WriteDigit(2, Temp1, 0); int Temp2 = ((Temp * 10) - (Temp1 * 100)) / 10; LED_WriteDigit(3, Temp2, 1); LED_WriteDigit(4, (Temp * 10) - (Temp1 * 100) - (Temp2 * 10), 0); } void LED_WriteDigit(byte Digit, byte Value, byte Colon) { for (byte DigCount = 0; DigCount < 4; ++DigCount) { digitalWrite(LedDigit[DigCount], ActivateDigit[Digit - 1][DigCount]); } for (byte SegCount = 0; SegCount < 7; ++SegCount) { digitalWrite(LedSigment[SegCount], ActivateSegments[Value][SegCount]); delayMicroseconds(100); digitalWrite(LedSigment[SegCount], 0); }// Change if Anode if (Colon) { digitalWrite(LedColon, HIGH); // Change if Anode delayMicroseconds(100); digitalWrite(LedColon, LOW); } }два примера для различных индикаторов. Возможно что то править надо. Под такой индикатор делал, пока не знаю как включенный будильник обозначить.
CommonCathode
#include <Wire.h> #include <DS3231.h> DS3231 clock; RTCDateTime dt; RTCAlarmTime al; boolean AlarmOn = LOW; boolean AlarmSound = LOW; boolean Colon = LOW; boolean ButtonMinuteFlag = LOW; boolean ButtonHourFlag = LOW; boolean ButtonAlarmFlag = LOW; boolean AlarmSet = LOW; long OneButtonTimer; long TwoButtonTimer; long ThreeButtonTimer; long AlarmTimer; long CheckTimer; byte LedDigit[4] = {5, 4, 3, 2};// Led Pin Digit, Digit2, Digit3, Digit4, Led Pin byte LedSigment[7] = {A0, A1, A2, 9, 8, 7, 6};// Led Pin A, B, C, D, E, F, G byte LedColon = 13;// Led Pin Colon byte MinuteButton = 12;// Button Minute Pin byte HourButton = 11;// Button Hour Pin byte AlarmButton = 10;// Alarm Button Pin byte PinBuzzer = A3;// Buzzer Pin byte Second; byte Minute; byte Hour; byte Day; byte Month; byte Year; byte ActivateDigit[4][4] = { {0, 1, 1, 1}, // First digit is on // Change if Anode {1, 0, 1, 1}, // Second digit is on // Change if Anode {1, 1, 0, 1}, // Third digit is on // Change if Anode {1, 1, 1, 0}};// Fourth digit is on // Change if Anode byte ActivateSegments[11][7] = { { 1, 1, 1, 1, 1, 1, 0 }, // = 0 // Change if Anode { 0, 1, 1, 0, 0, 0, 0 }, // = 1 // Change if Anode { 1, 1, 0, 1, 1, 0, 1 }, // = 2 // Change if Anode { 1, 1, 1, 1, 0, 0, 1 }, // = 3 // Change if Anode { 0, 1, 1, 0, 0, 1, 1 }, // = 4 // Change if Anode { 1, 0, 1, 1, 0, 1, 1 }, // = 5 // Change if Anode { 1, 0, 1, 1, 1, 1, 1 }, // = 6 // Change if Anode { 1, 1, 1, 0, 0, 0, 0 }, // = 7 // Change if Anode { 1, 1, 1, 1, 1, 1, 1 }, // = 8 // Change if Anode { 1, 1, 1, 1, 0, 1, 1 }, // = 9 // Change if Anode { 0, 0, 0, 1, 1, 1, 1 }}; // = ("t") // Change if Anode void setup() { clock.begin(); pinMode (LedColon, OUTPUT); pinMode (PinBuzzer, OUTPUT); pinMode (MinuteButton, INPUT_PULLUP); pinMode (HourButton, INPUT_PULLUP); pinMode (AlarmButton, INPUT_PULLUP); for (byte a = 0; a < 4; ++a) { pinMode (LedDigit[a], OUTPUT); } for (byte b = 0; b < 7; ++b) { pinMode (LedSigment[b], OUTPUT); } } void loop() { if (clock.isArmed1()) { if (clock.isAlarm1()) { AlarmTimer = millis(); AlarmOn = HIGH; } } if (AlarmOn) { if (dt.second % 2 == 0) tone(PinBuzzer, 2000, 100); if (millis() - AlarmTimer > 120000) { AlarmOn = LOW; } } if (AlarmSet == HIGH) LED_WriteAlarm(); else { if (millis() - CheckTimer > 400) { dt = clock.getDateTime(); CheckTimer = millis(); } if ((dt.minute % 10) == 0 && dt.second >= 10 && dt.second < 30) { LED_WriteTemp(); } else LED_WriteTime(); } if (digitalRead(MinuteButton) == LOW && digitalRead(HourButton) && (digitalRead(AlarmButton))) { if (ButtonMinuteFlag == LOW && ButtonHourFlag == LOW && ButtonAlarmFlag == LOW ) { ButtonMinuteFlag = HIGH; if (AlarmSet == HIGH) { IncAlarmMinutes(); } else { IncMinutes(); } } if (ButtonMinuteFlag == HIGH) { if (millis() - OneButtonTimer > 1300) { if (millis() - TwoButtonTimer > 100) { if (AlarmSet == HIGH) { IncAlarmMinutes(); } else { IncMinutes(); } TwoButtonTimer = millis(); } } } ThreeButtonTimer = millis(); } else { if (digitalRead(HourButton) == LOW && digitalRead(MinuteButton) && (digitalRead(AlarmButton))) { if (ButtonMinuteFlag == LOW && ButtonHourFlag == LOW && ButtonAlarmFlag == LOW ) { ButtonHourFlag = HIGH; if (AlarmSet == HIGH) { IncAlarmHour(); } else { IncHour(); } } if (ButtonHourFlag == HIGH) { if (millis() - OneButtonTimer > 1300) { if (millis() - TwoButtonTimer > 100) { if (AlarmSet == HIGH) { IncAlarmHour(); } else { IncHour(); } TwoButtonTimer = millis(); } } } ThreeButtonTimer = millis(); } else { if (digitalRead(AlarmButton) == LOW && digitalRead(MinuteButton) && digitalRead(HourButton)) { if (ButtonMinuteFlag == LOW && ButtonHourFlag == LOW && ButtonAlarmFlag == LOW ) { ButtonAlarmFlag = HIGH; tone(PinBuzzer, 2000, 100);// resonance frequency buzzer AlarmOn = LOW; clock.isAlarm1(LOW); clock.clearAlarm1(); } if (ButtonAlarmFlag == HIGH && AlarmSet == LOW) { if (millis() - OneButtonTimer > 1300) { AlarmSet = HIGH; TwoButtonTimer = millis(); tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } } if (ButtonAlarmFlag == HIGH && AlarmSet == HIGH) { if (millis() - TwoButtonTimer > 1300) { TwoButtonTimer = millis(); if (clock.isArmed1()) { al = clock.getAlarm1(); clock.setAlarm1(al.day, al.hour, al.minute, 0, DS3231_MATCH_H_M_S, LOW); } else { al = clock.getAlarm1(); clock.setAlarm1(al.day, al.hour, al.minute, 0, DS3231_MATCH_H_M_S, HIGH); } tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } } ThreeButtonTimer = millis(); } else { OneButtonTimer = millis(); TwoButtonTimer = millis(); } } if (AlarmSet == HIGH && millis() - ThreeButtonTimer > 5000) { AlarmSet = LOW; tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } if (digitalRead(MinuteButton) && ButtonMinuteFlag) ButtonMinuteFlag = LOW; if (digitalRead(HourButton) && ButtonHourFlag) ButtonHourFlag = LOW; if (digitalRead(AlarmButton) && ButtonAlarmFlag) ButtonAlarmFlag = LOW; } } void IncMinutes() { dt = clock.getDateTime(); Minute = dt.minute + 1; if (Minute >= 60) Minute = 0; clock.setDateTime(dt.year, dt.month, dt.day, dt.hour, Minute, 0); tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } void IncAlarmMinutes() { al = clock.getAlarm1(); Minute = al.minute + 1; if (Minute >= 60) Minute = 0; clock.setAlarm1(al.day, al.hour, Minute, 0, DS3231_MATCH_H_M_S, HIGH); tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } void IncHour() { dt = clock.getDateTime(); Hour = dt.hour + 1; if (Hour >= 24) Hour = 0; clock.setDateTime(dt.year, dt.month, dt.day, Hour, dt.minute, 0); tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } void IncAlarmHour() { al = clock.getAlarm1(); Hour = al.hour + 1; if (Hour >= 24) Hour = 0; clock.setAlarm1(al.day, Hour, al.minute, 0, DS3231_MATCH_H_M_S, HIGH); tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } void LED_WriteTime() { dt = clock.getDateTime(); Minute = dt.minute; Hour = dt.hour; if (dt.second % 2 == 0) Colon = HIGH; else Colon = LOW; if (Hour > 9) LED_WriteDigit(1, Hour / 10, 0); LED_WriteDigit(2, Hour % 10, 0);//Colon if (Minute < 10) LED_WriteDigit(3, 0, Colon); else LED_WriteDigit(3, Minute / 10, Colon); LED_WriteDigit(4, Minute % 10, Colon);//clock.isArmed1() } void LED_WriteAlarm() { dt = clock.getDateTime(); al = clock.getAlarm1(); Minute = al.minute; Hour = al.hour; if (dt.second % 2 == 0) Colon = HIGH; else Colon = LOW; if (Hour > 9) LED_WriteDigit(1, Hour / 10, 0); LED_WriteDigit(2, Hour % 10, AlarmSet); if (Minute < 10) LED_WriteDigit(3, 0, 0); else LED_WriteDigit(3, Minute / 10, 0); LED_WriteDigit(4, Minute % 10, clock.isArmed1()); } void LED_WriteTemp() { float Temp = clock.readTemperature(); LED_WriteDigit(1, 10, 1); int Temp1 = (Temp * 10) / 100; LED_WriteDigit(2, Temp1, 1); int Temp2 = ((Temp * 10) - (Temp1 * 100)) / 10; LED_WriteDigit(3, Temp2, 0); LED_WriteDigit(4, (Temp * 10) - (Temp1 * 100) - (Temp2 * 10), 1); } void LED_WriteDigit(byte Digit, byte Value, byte Colon) { for (byte DigCount = 0; DigCount < 4; ++DigCount) { digitalWrite(LedDigit[DigCount], ActivateDigit[Digit - 1][DigCount]); } for (byte SegCount = 0; SegCount < 7; ++SegCount) { digitalWrite(LedSigment[SegCount], ActivateSegments[Value][SegCount]); delayMicroseconds(100); digitalWrite(LedSigment[SegCount], 0); }// Change if Anode if (Colon) { digitalWrite(LedColon, HIGH); // Change if Anode delayMicroseconds(100); digitalWrite(LedColon, LOW); } }CommonAnode
#include <Wire.h> #include <DS3231.h> DS3231 clock; RTCDateTime dt; RTCAlarmTime al; boolean AlarmOn = LOW; boolean AlarmSound = LOW; boolean Colon = LOW; boolean ButtonMinuteFlag = LOW; boolean ButtonHourFlag = LOW; boolean ButtonAlarmFlag = LOW; boolean AlarmSet = LOW; long OneButtonTimer; long TwoButtonTimer; long ThreeButtonTimer; long AlarmTimer; long CheckTimer; byte LedDigit[4] = {5, 4, 3, 2};// Led Pin Digit, Digit2, Digit3, Digit4, Led Pin byte LedSigment[7] = {A0, A1, A2, 9, 8, 7, 6};// Led Pin A, B, C, D, E, F, G byte LedColon = 13;// Led Pin Colon byte MinuteButton = 12;// Button Minute Pin byte HourButton = 11;// Button Hour Pin byte AlarmButton = 10;// Alarm Button Pin byte PinBuzzer = A3;// Buzzer Pin byte Second; byte Minute; byte Hour; byte Day; byte Month; byte Year; byte ActivateDigit[4][4] = { {1, 0, 0, 0}, // First digit is on // Change if Anode {0, 1, 0, 0}, // Second digit is on // Change if Anode {0, 0, 1, 0}, // Third digit is on // Change if Anode {0, 0, 0, 1}};// Fourth digit is on // Change if Anode byte ActivateSegments[11][7] = { { 0, 0, 0, 0, 0, 0, 1 }, // = 0 // Change if Anode { 1, 0, 0, 1, 1, 1, 1 }, // = 1 // Change if Anode { 0, 0, 1, 0, 0, 1, 0 }, // = 2 // Change if Anode { 0, 0, 0, 0, 1, 1, 0 }, // = 3 // Change if Anode { 1, 0, 0, 1, 1, 0, 0 }, // = 4 // Change if Anode { 0, 1, 0, 0, 1, 0, 0 }, // = 5 // Change if Anode { 0, 1, 0, 0, 0, 0, 0 }, // = 6 // Change if Anode { 0, 0, 0, 1, 1, 1, 1 }, // = 7 // Change if Anode { 0, 0, 0, 0, 0, 0, 0 }, // = 8 // Change if Anode { 0, 0, 0, 0, 1, 0, 0 }, // = 9 // Change if Anode { 1, 1, 1, 0, 0, 0, 0 }}; // = ("t") // Change if Anode void setup() { clock.begin(); pinMode (LedColon, OUTPUT); pinMode (PinBuzzer, OUTPUT); pinMode (MinuteButton, INPUT_PULLUP); pinMode (HourButton, INPUT_PULLUP); pinMode (AlarmButton, INPUT_PULLUP); for (byte a = 0; a < 4; ++a) { pinMode (LedDigit[a], OUTPUT); } for (byte b = 0; b < 7; ++b) { pinMode (LedSigment[b], OUTPUT); } } void loop() { if (clock.isArmed1()) { if (clock.isAlarm1()) { AlarmTimer = millis(); AlarmOn = HIGH; } } if (AlarmOn) { if (dt.second % 2 == 0) tone(PinBuzzer, 2000, 100); if (millis() - AlarmTimer > 120000) { AlarmOn = LOW; } } if (AlarmSet == HIGH) LED_WriteAlarm(); else { if (millis() - CheckTimer > 400) { dt = clock.getDateTime(); CheckTimer = millis(); } if ((dt.minute % 10) == 0 && dt.second >= 10 && dt.second < 30) { LED_WriteTemp(); } else LED_WriteTime(); } if (digitalRead(MinuteButton) == LOW && digitalRead(HourButton) && (digitalRead(AlarmButton))) { if (ButtonMinuteFlag == LOW && ButtonHourFlag == LOW && ButtonAlarmFlag == LOW ) { ButtonMinuteFlag = HIGH; if (AlarmSet == HIGH) { IncAlarmMinutes(); } else { IncMinutes(); } } if (ButtonMinuteFlag == HIGH) { if (millis() - OneButtonTimer > 1300) { if (millis() - TwoButtonTimer > 100) { if (AlarmSet == HIGH) { IncAlarmMinutes(); } else { IncMinutes(); } TwoButtonTimer = millis(); } } } ThreeButtonTimer = millis(); } else { if (digitalRead(HourButton) == LOW && digitalRead(MinuteButton) && (digitalRead(AlarmButton))) { if (ButtonMinuteFlag == LOW && ButtonHourFlag == LOW && ButtonAlarmFlag == LOW ) { ButtonHourFlag = HIGH; if (AlarmSet == HIGH) { IncAlarmHour(); } else { IncHour(); } } if (ButtonHourFlag == HIGH) { if (millis() - OneButtonTimer > 1300) { if (millis() - TwoButtonTimer > 100) { if (AlarmSet == HIGH) { IncAlarmHour(); } else { IncHour(); } TwoButtonTimer = millis(); } } } ThreeButtonTimer = millis(); } else { if (digitalRead(AlarmButton) == LOW && digitalRead(MinuteButton) && digitalRead(HourButton)) { if (ButtonMinuteFlag == LOW && ButtonHourFlag == LOW && ButtonAlarmFlag == LOW ) { ButtonAlarmFlag = HIGH; tone(PinBuzzer, 2000, 100);// resonance frequency buzzer AlarmOn = LOW; clock.isAlarm1(LOW); clock.clearAlarm1(); } if (ButtonAlarmFlag == HIGH && AlarmSet == LOW) { if (millis() - OneButtonTimer > 1300) { AlarmSet = HIGH; TwoButtonTimer = millis(); tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } } if (ButtonAlarmFlag == HIGH && AlarmSet == HIGH) { if (millis() - TwoButtonTimer > 1300) { TwoButtonTimer = millis(); if (clock.isArmed1()) { al = clock.getAlarm1(); clock.setAlarm1(al.day, al.hour, al.minute, 0, DS3231_MATCH_H_M_S, LOW); } else { al = clock.getAlarm1(); clock.setAlarm1(al.day, al.hour, al.minute, 0, DS3231_MATCH_H_M_S, HIGH); } tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } } ThreeButtonTimer = millis(); } else { OneButtonTimer = millis(); TwoButtonTimer = millis(); } } if (AlarmSet == HIGH && millis() - ThreeButtonTimer > 5000) { AlarmSet = LOW; tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } if (digitalRead(MinuteButton) && ButtonMinuteFlag) ButtonMinuteFlag = LOW; if (digitalRead(HourButton) && ButtonHourFlag) ButtonHourFlag = LOW; if (digitalRead(AlarmButton) && ButtonAlarmFlag) ButtonAlarmFlag = LOW; } } void IncMinutes() { dt = clock.getDateTime(); Minute = dt.minute + 1; if (Minute >= 60) Minute = 0; clock.setDateTime(dt.year, dt.month, dt.day, dt.hour, Minute, 0); tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } void IncAlarmMinutes() { al = clock.getAlarm1(); Minute = al.minute + 1; if (Minute >= 60) Minute = 0; clock.setAlarm1(al.day, al.hour, Minute, 0, DS3231_MATCH_H_M_S, HIGH); tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } void IncHour() { dt = clock.getDateTime(); Hour = dt.hour + 1; if (Hour >= 24) Hour = 0; clock.setDateTime(dt.year, dt.month, dt.day, Hour, dt.minute, 0); tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } void IncAlarmHour() { al = clock.getAlarm1(); Hour = al.hour + 1; if (Hour >= 24) Hour = 0; clock.setAlarm1(al.day, Hour, al.minute, 0, DS3231_MATCH_H_M_S, HIGH); tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } void LED_WriteTime() { dt = clock.getDateTime(); Minute = dt.minute; Hour = dt.hour; if (dt.second % 2 == 0) Colon = HIGH; else Colon = LOW; if (Hour > 9) LED_WriteDigit(1, Hour / 10, 0); LED_WriteDigit(2, Hour % 10, 0); if (Minute < 10) LED_WriteDigit(3, 0, Colon); else LED_WriteDigit(3, Minute / 10, Colon); LED_WriteDigit(4, Minute % 10, Colon);;//clock.isArmed1() } void LED_WriteAlarm() { dt = clock.getDateTime(); al = clock.getAlarm1(); Minute = al.minute; Hour = al.hour; if (dt.second % 2 == 0) Colon = HIGH; else Colon = LOW; if (Hour > 9) LED_WriteDigit(1, Hour / 10, 0); LED_WriteDigit(2, Hour % 10, AlarmSet); if (Minute < 10) LED_WriteDigit(3, 0, 0); else LED_WriteDigit(3, Minute / 10, 0); LED_WriteDigit(4, Minute % 10, clock.isArmed1()); } void LED_WriteTemp() { float Temp = clock.readTemperature(); LED_WriteDigit(1, 10, 0); int Temp1 = (Temp * 10) / 100; LED_WriteDigit(2, Temp1, 0); int Temp2 = ((Temp * 10) - (Temp1 * 100)) / 10; LED_WriteDigit(3, Temp2, 0); LED_WriteDigit(4, (Temp * 10) - (Temp1 * 100) - (Temp2 * 10), 1); } void LED_WriteDigit(byte Digit, byte Value, byte Colon) { for (byte DigCount = 0; DigCount < 4; ++DigCount) { digitalWrite(LedDigit[DigCount], ActivateDigit[Digit - 1][DigCount]); } for (byte SegCount = 0; SegCount < 7; ++SegCount) { digitalWrite(LedSigment[SegCount], ActivateSegments[Value][SegCount]); delayMicroseconds(100); digitalWrite(LedSigment[SegCount], 1); }// Change if Anode if (Colon) { digitalWrite(LedColon, LOW); // Change if Anode delayMicroseconds(100); digitalWrite(LedColon, HIGH); } }Индикатор 0.56", зеленый, с ОА такой
попробую предоставленую Вами CommonAnode и потом отпишусь.
Пробовал два типа индикатора. Везде восьмёрки после включения. На 13 пине светодиод мигает - точки работают. Должно ведь без кнопок работать ?! На всякий случай подключил кнопку и попробовал.
Подключение ведь такое: 5v - button - пин:12(или 11,10) - 10k resistor - gnd.
Может не правильно предварительно модуль DS3231 прошил ? Брал из примеров библиотеки.
Раньше делал такие варианты и они работали.
http://arduino.ru/forum/programmirovanie/chasy-na-7-segmentnom-led-indikatore-nuzhna-pomoshch
http://arduino-project.net/led-chasy-na-arduino/
но там сервису никакого нету и будильника. Ну и без модуля реального времени.
Вот такой еще проект нашел. Вполне рабочий.
http://arduinotehniq.blogspot.com/2014/09/manual-adjust-for-rtc-clock-with.html
Если 13 мигает знать часы идут, похоже я скетчи местами спутал. Где анод там катод и наоборот, исправил. Кнопки просто на корпус, зуммер через сопротивление.
не знаю как включенный будильник обозначить.
Неспешным (1 - 1/2 Гц) миганием самой правой точки (возе единиц минут)???
На этом индикаторе только две в центре точки, активны. В оригинале последняя горит при активном.
Там же вроде на картинке видны десятичные точки возле цифр. Они что, не горят? Я имел в виду такой точкой помигать.
Где анод там катод и наоборот, исправил.
Теперь все скетчи правильно выше предоставлены - CommonCathode - для катода, CommonAnode - для анода. Теперь все заработало. Только на моем индикаторе точки мигают после 3 и 4 цифр одновременнно. Где, в каком месте поправить ? И для меня наверное лучше в первой половине суток, чтобы в переди нолик был. Минуты, часы кнопками правильно выставляються. Будильник, озвучка - все нармально работает.
сравни с первоначальным вариантом, корекция нуля так же в скетче есть надо просто её удалить.
if(Hour > 9) LED_WriteDigit(1, Hour / 10, 0);
изменить на
LED_WriteDigit(1, Hour / 10, 0);точки есть а диодов под ними нет, китайцы........
сравни с первоначальным вариантом, корекция нуля так же в скетче есть надо просто её удалить.
изменить на
LED_WriteDigit(1, Hour / 10, 0);Спасибо. Всё получилось. Нолик в переди появился. А в каком месте править, чтобы точку передвинуть чтобы была после второго знака. А то у меня сейчас секундные импульсы(точки) мигают после третей и четвертой цифр вместе. :(
Выкладываю мной исправленный рабочий вариант скеча! Замечания принимаются.
//Common Anode #include <Wire.h> #include <DS3231.h> DS3231 clock; RTCDateTime dt; RTCAlarmTime al; boolean AlarmOn = LOW; boolean AlarmSound = LOW; boolean Colon = LOW; boolean ButtonMinuteFlag = LOW; boolean ButtonHourFlag = LOW; boolean ButtonAlarmFlag = LOW; boolean AlarmSet = LOW; long OneButtonTimer; long TwoButtonTimer; long ThreeButtonTimer; long AlarmTimer; long CheckTimer; byte LedDigit[4] = {3, 4, 5, 2}; // Led Pin Digit, Digit2, Digit3, Digit4, Led Pin byte LedSigment[7] = {A0, A1, A2, 9, 8, 7, 6}; // Led Pin A, B, C, D, E, F, G byte LedColon = 13; // Led Pin Colon byte MinuteButton = 12; // Button Minute Pin byte HourButton = 11; // Button Hour Pin byte AlarmButton = 10; // Alarm Button Pin byte PinBuzzer = A3; // Buzzer Pin byte Second; byte Minute; byte Hour; byte Day; byte Month; byte Year; byte ActivateDigit[4][4] = { {1, 0, 0, 0}, // First digit is on // Change if Cathode {0, 1, 0, 0}, // Second digit is on // Change if Cathode {0, 0, 1, 0}, // Third digit is on // Change if Cathode {0, 0, 0, 1} // Fourth digit is on // Change if Cathode }; byte ActivateSegments[11][7] = { { 0, 0, 0, 0, 0, 0, 1 }, // = 0 // Change if Cathode { 1, 0, 0, 1, 1, 1, 1 }, // = 1 // Change if Cathode { 0, 0, 1, 0, 0, 1, 0 }, // = 2 // Change if Cathode { 0, 0, 0, 0, 1, 1, 0 }, // = 3 // Change if Cathode { 1, 0, 0, 1, 1, 0, 0 }, // = 4 // Change if Cathode { 0, 1, 0, 0, 1, 0, 0 }, // = 5 // Change if Cathode { 0, 1, 0, 0, 0, 0, 0 }, // = 6 // Change if Cathode { 0, 0, 0, 1, 1, 1, 1 }, // = 7 // Change if Cathode { 0, 0, 0, 0, 0, 0, 0 }, // = 8 // Change if Cathode { 0, 0, 0, 0, 1, 0, 0 }, // = 9 // Change if Cathode { 1, 1, 1, 0, 0, 0, 0 } // = ("t") // Change if Cathode }; void setup() { clock.begin(); pinMode (LedColon, OUTPUT); pinMode (PinBuzzer, OUTPUT); pinMode (MinuteButton, INPUT_PULLUP); pinMode (HourButton, INPUT_PULLUP); pinMode (AlarmButton, INPUT_PULLUP); for (byte a = 0; a < 4; ++a) { pinMode (LedDigit[a], OUTPUT); } for (byte b = 0; b < 7; ++b) { pinMode (LedSigment[b], OUTPUT); } } void loop() { if (clock.isArmed1()) { if (clock.isAlarm1()) { AlarmTimer = millis(); AlarmOn = HIGH; } } if (AlarmOn) { if (dt.second % 2 == 0) tone(PinBuzzer, 2000, 100); if (millis() - AlarmTimer > 60000) //მაღვიძარას ხანგრძლიობა { AlarmOn = LOW; } } if (AlarmSet == HIGH) LED_WriteAlarm(); else { if (millis() - CheckTimer > 400) { dt = clock.getDateTime(); CheckTimer = millis(); } if ((dt.minute % 10) == 0 && dt.second >= 10 && dt.second < 30) //აჩვენებს ტემპერატურას { LED_WriteTemp(); } else LED_WriteTime(); } if (digitalRead(MinuteButton) == LOW && digitalRead(HourButton) && (digitalRead(AlarmButton))) { if (ButtonMinuteFlag == LOW && ButtonHourFlag == LOW && ButtonAlarmFlag == LOW ) { ButtonMinuteFlag = HIGH; if (AlarmSet == HIGH) { IncAlarmMinutes(); } else { IncMinutes(); } } if (ButtonMinuteFlag == HIGH) { if (millis() - OneButtonTimer > 1300) { if (millis() - TwoButtonTimer > 100) { if (AlarmSet == HIGH) { IncAlarmMinutes(); } else { IncMinutes(); } TwoButtonTimer = millis(); } } } ThreeButtonTimer = millis(); } else { if (digitalRead(HourButton) == LOW && digitalRead(MinuteButton) && (digitalRead(AlarmButton))) { if (ButtonMinuteFlag == LOW && ButtonHourFlag == LOW && ButtonAlarmFlag == LOW ) { ButtonHourFlag = HIGH; if (AlarmSet == HIGH) { IncAlarmHour(); } else { IncHour(); } } if (ButtonHourFlag == HIGH) { if (millis() - OneButtonTimer > 1300) { if (millis() - TwoButtonTimer > 100) { if (AlarmSet == HIGH) { IncAlarmHour(); } else { IncHour(); } TwoButtonTimer = millis(); } } } ThreeButtonTimer = millis(); } else { if (digitalRead(AlarmButton) == LOW && digitalRead(MinuteButton) && digitalRead(HourButton)) { if (ButtonMinuteFlag == LOW && ButtonHourFlag == LOW && ButtonAlarmFlag == LOW ) { ButtonAlarmFlag = HIGH; tone(PinBuzzer, 2000, 100); // resonance frequency buzzer AlarmOn = LOW; clock.isAlarm1(LOW); clock.clearAlarm1(); } if (ButtonAlarmFlag == HIGH && AlarmSet == LOW) { if (millis() - OneButtonTimer > 1300) { AlarmSet = HIGH; TwoButtonTimer = millis(); tone(PinBuzzer, 2000, 100); // resonance frequency buzzer } } if (ButtonAlarmFlag == HIGH && AlarmSet == HIGH) { if (millis() - TwoButtonTimer > 1300) { TwoButtonTimer = millis(); if (clock.isArmed1()) { al = clock.getAlarm1(); clock.setAlarm1(al.day, al.hour, al.minute, 0, DS3231_MATCH_H_M_S, LOW); } else { al = clock.getAlarm1(); clock.setAlarm1(al.day, al.hour, al.minute, 0, DS3231_MATCH_H_M_S, HIGH); } tone(PinBuzzer, 2000, 100); // resonance frequency buzzer } } ThreeButtonTimer = millis(); } else { OneButtonTimer = millis(); TwoButtonTimer = millis(); } } if (AlarmSet == HIGH && millis() - ThreeButtonTimer > 5000) { AlarmSet = LOW; tone(PinBuzzer, 2000, 100); // resonance frequency buzzer } if (digitalRead(MinuteButton) && ButtonMinuteFlag) ButtonMinuteFlag = LOW; if (digitalRead(HourButton) && ButtonHourFlag) ButtonHourFlag = LOW; if (digitalRead(AlarmButton) && ButtonAlarmFlag) ButtonAlarmFlag = LOW; } } void IncMinutes() { dt = clock.getDateTime(); Minute = dt.minute + 1; if (Minute >= 60) Minute = 0; clock.setDateTime(dt.year, dt.month, dt.day, dt.hour, Minute, 0); tone(PinBuzzer, 2000, 100); // resonance frequency buzzer } void IncAlarmMinutes() { al = clock.getAlarm1(); Minute = al.minute + 1; if (Minute >= 60) Minute = 0; clock.setAlarm1(al.day, al.hour, Minute, 0, DS3231_MATCH_H_M_S, HIGH); tone(PinBuzzer, 2000, 100); // resonance frequency buzzer } void IncHour() { dt = clock.getDateTime(); Hour = dt.hour + 1; if (Hour >= 24) Hour = 0; clock.setDateTime(dt.year, dt.month, dt.day, Hour, dt.minute, 0); tone(PinBuzzer, 2000, 100); // resonance frequency buzzer } void IncAlarmHour() { al = clock.getAlarm1(); Hour = al.hour + 1; if (Hour >= 24) Hour = 0; clock.setAlarm1(al.day, Hour, al.minute, 0, DS3231_MATCH_H_M_S, HIGH); tone(PinBuzzer, 2000, 100); // resonance frequency buzzer } void LED_WriteTime() { dt = clock.getDateTime(); Minute = dt.minute; Hour = dt.hour; if (dt.second % 2 == 0) Colon = HIGH; else Colon = LOW; if (Hour > 9) LED_WriteDigit(1, Hour / 10, Colon); LED_WriteDigit(2, Hour % 10, Colon); //Colon if (Minute < 10) LED_WriteDigit(3, 0, 0); else LED_WriteDigit(3, Minute / 10, 0); LED_WriteDigit(4, Minute % 10, clock.isArmed1()); //clock.isArmed1() } void LED_WriteAlarm() { dt = clock.getDateTime(); al = clock.getAlarm1(); Minute = al.minute; Hour = al.hour; if (dt.second % 2 == 0) Colon = HIGH; else Colon = LOW; if (Hour > 9) LED_WriteDigit(1, Hour / 10, 0); LED_WriteDigit(2, Hour % 10, AlarmSet); if (Minute < 10) LED_WriteDigit(3, 0, 0); else LED_WriteDigit(3, Minute / 10, 0); LED_WriteDigit(4, Minute % 10, clock.isArmed1()); } void LED_WriteTemp() { float Temp = clock.readTemperature(); LED_WriteDigit(1, 10, 0); int Temp1 = (Temp * 10) / 100; LED_WriteDigit(2, Temp1, 0); int Temp2 = ((Temp * 10) - (Temp1 * 100)) / 10; LED_WriteDigit(3, Temp2, 0); LED_WriteDigit(4, (Temp * 10) - (Temp1 * 100) - (Temp2 * 10), 1); } void LED_WriteDigit(byte Digit, byte Value, byte Colon) { for (byte DigCount = 0; DigCount < 4; ++DigCount) { digitalWrite(LedDigit[DigCount], ActivateDigit[Digit - 1][DigCount]); } for (byte SegCount = 0; SegCount < 7; ++SegCount) { digitalWrite(LedSigment[SegCount], ActivateSegments[Value][SegCount]); delayMicroseconds(100); digitalWrite(LedSigment[SegCount], 1); // Change if Cathode } if (Colon) { digitalWrite(LedColon, LOW); // Change if Cathode delayMicroseconds(100); digitalWrite(LedColon, HIGH); // Change if Cathode } }//Common Cathode #include <Wire.h> #include <DS3231.h> DS3231 clock; RTCDateTime dt; RTCAlarmTime al; boolean AlarmOn = LOW; boolean AlarmSound = LOW; boolean Colon = LOW; boolean ButtonMinuteFlag = LOW; boolean ButtonHourFlag = LOW; boolean ButtonAlarmFlag = LOW; boolean AlarmSet = LOW; long OneButtonTimer; long TwoButtonTimer; long ThreeButtonTimer; long AlarmTimer; long CheckTimer; byte LedDigit[4] = {3, 4, 5, 2}; // Led Pin Digit, Digit2, Digit3, Digit4, Led Pin byte LedSigment[7] = {A0, A1, A2, 9, 8, 7, 6}; // Led Pin A, B, C, D, E, F, G byte LedColon = 13; // Led Pin Colon byte MinuteButton = 12; // Button Minute Pin byte HourButton = 11; // Button Hour Pin byte AlarmButton = 10; // Alarm Button Pin byte PinBuzzer = A3; // Buzzer Pin byte Second; byte Minute; byte Hour; byte Day; byte Month; byte Year; byte ActivateDigit[4][4] = { {0, 1, 1, 1}, // First digit is on // Change if Anode {1, 0, 1, 1}, // Second digit is on // Change if Anode {1, 1, 0, 1}, // Third digit is on // Change if Anode {1, 1, 1, 0} // Fourth digit is on // Change if Anode }; byte ActivateSegments[11][7] = { { 1, 1, 1, 1, 1, 1, 0 }, // = 0 // Change if Anode { 0, 1, 1, 0, 0, 0, 0 }, // = 1 // Change if Anode { 1, 1, 0, 1, 1, 0, 1 }, // = 2 // Change if Anode { 1, 1, 1, 1, 0, 0, 1 }, // = 3 // Change if Anode { 0, 1, 1, 0, 0, 1, 1 }, // = 4 // Change if Anode { 1, 0, 1, 1, 0, 1, 1 }, // = 5 // Change if Anode { 1, 0, 1, 1, 1, 1, 1 }, // = 6 // Change if Anode { 1, 1, 1, 0, 0, 0, 0 }, // = 7 // Change if Anode { 1, 1, 1, 1, 1, 1, 1 }, // = 8 // Change if Anode { 1, 1, 1, 1, 0, 1, 1 }, // = 9 // Change if Anode { 0, 0, 0, 1, 1, 1, 1 } // = ("t") // Change if Anode }; void setup() { clock.begin(); pinMode (LedColon, OUTPUT); pinMode (PinBuzzer, OUTPUT); pinMode (MinuteButton, INPUT_PULLUP); pinMode (HourButton, INPUT_PULLUP); pinMode (AlarmButton, INPUT_PULLUP); for (byte a = 0; a < 4; ++a) { pinMode (LedDigit[a], OUTPUT); } for (byte b = 0; b < 7; ++b) { pinMode (LedSigment[b], OUTPUT); } } void loop() { if (clock.isArmed1()) { if (clock.isAlarm1()) { AlarmTimer = millis(); AlarmOn = HIGH; } } if (AlarmOn) { if (dt.second % 2 == 0) tone(PinBuzzer, 2000, 100); if (millis() - AlarmTimer > 60000) //მაღვიძარას ხანგრძლიობა { AlarmOn = LOW; } } if (AlarmSet == HIGH) LED_WriteAlarm(); else { if (millis() - CheckTimer > 400) { dt = clock.getDateTime(); CheckTimer = millis(); } if ((dt.minute % 10) == 0 && dt.second >= 10 && dt.second < 30) //აჩვენებს ტემპერატურას { LED_WriteTemp(); } else LED_WriteTime(); } if (digitalRead(MinuteButton) == LOW && digitalRead(HourButton) && (digitalRead(AlarmButton))) { if (ButtonMinuteFlag == LOW && ButtonHourFlag == LOW && ButtonAlarmFlag == LOW ) { ButtonMinuteFlag = HIGH; if (AlarmSet == HIGH) { IncAlarmMinutes(); } else { IncMinutes(); } } if (ButtonMinuteFlag == HIGH) { if (millis() - OneButtonTimer > 1300) { if (millis() - TwoButtonTimer > 100) { if (AlarmSet == HIGH) { IncAlarmMinutes(); } else { IncMinutes(); } TwoButtonTimer = millis(); } } } ThreeButtonTimer = millis(); } else { if (digitalRead(HourButton) == LOW && digitalRead(MinuteButton) && (digitalRead(AlarmButton))) { if (ButtonMinuteFlag == LOW && ButtonHourFlag == LOW && ButtonAlarmFlag == LOW ) { ButtonHourFlag = HIGH; if (AlarmSet == HIGH) { IncAlarmHour(); } else { IncHour(); } } if (ButtonHourFlag == HIGH) { if (millis() - OneButtonTimer > 1300) { if (millis() - TwoButtonTimer > 100) { if (AlarmSet == HIGH) { IncAlarmHour(); } else { IncHour(); } TwoButtonTimer = millis(); } } } ThreeButtonTimer = millis(); } else { if (digitalRead(AlarmButton) == LOW && digitalRead(MinuteButton) && digitalRead(HourButton)) { if (ButtonMinuteFlag == LOW && ButtonHourFlag == LOW && ButtonAlarmFlag == LOW ) { ButtonAlarmFlag = HIGH; tone(PinBuzzer, 2000, 100); // resonance frequency buzzer AlarmOn = LOW; clock.isAlarm1(LOW); clock.clearAlarm1(); } if (ButtonAlarmFlag == HIGH && AlarmSet == LOW) { if (millis() - OneButtonTimer > 1300) { AlarmSet = HIGH; TwoButtonTimer = millis(); tone(PinBuzzer, 2000, 100); // resonance frequency buzzer } } if (ButtonAlarmFlag == HIGH && AlarmSet == HIGH) { if (millis() - TwoButtonTimer > 1300) { TwoButtonTimer = millis(); if (clock.isArmed1()) { al = clock.getAlarm1(); clock.setAlarm1(al.day, al.hour, al.minute, 0, DS3231_MATCH_H_M_S, LOW); } else { al = clock.getAlarm1(); clock.setAlarm1(al.day, al.hour, al.minute, 0, DS3231_MATCH_H_M_S, HIGH); } tone(PinBuzzer, 2000, 100); // resonance frequency buzzer } } ThreeButtonTimer = millis(); } else { OneButtonTimer = millis(); TwoButtonTimer = millis(); } } if (AlarmSet == HIGH && millis() - ThreeButtonTimer > 5000) { AlarmSet = LOW; tone(PinBuzzer, 2000, 100); // resonance frequency buzzer } if (digitalRead(MinuteButton) && ButtonMinuteFlag) ButtonMinuteFlag = LOW; if (digitalRead(HourButton) && ButtonHourFlag) ButtonHourFlag = LOW; if (digitalRead(AlarmButton) && ButtonAlarmFlag) ButtonAlarmFlag = LOW; } } void IncMinutes() { dt = clock.getDateTime(); Minute = dt.minute + 1; if (Minute >= 60) Minute = 0; clock.setDateTime(dt.year, dt.month, dt.day, dt.hour, Minute, 0); tone(PinBuzzer, 2000, 100); // resonance frequency buzzer } void IncAlarmMinutes() { al = clock.getAlarm1(); Minute = al.minute + 1; if (Minute >= 60) Minute = 0; clock.setAlarm1(al.day, al.hour, Minute, 0, DS3231_MATCH_H_M_S, HIGH); tone(PinBuzzer, 2000, 100); // resonance frequency buzzer } void IncHour() { dt = clock.getDateTime(); Hour = dt.hour + 1; if (Hour >= 24) Hour = 0; clock.setDateTime(dt.year, dt.month, dt.day, Hour, dt.minute, 0); tone(PinBuzzer, 2000, 100); // resonance frequency buzzer } void IncAlarmHour() { al = clock.getAlarm1(); Hour = al.hour + 1; if (Hour >= 24) Hour = 0; clock.setAlarm1(al.day, Hour, al.minute, 0, DS3231_MATCH_H_M_S, HIGH); tone(PinBuzzer, 2000, 100); // resonance frequency buzzer } void LED_WriteTime() { dt = clock.getDateTime(); Minute = dt.minute; Hour = dt.hour; if (dt.second % 2 == 0) Colon = HIGH; else Colon = HIGH; if (Hour > 9) LED_WriteDigit(1, Hour / 10, 0); LED_WriteDigit(2, Hour % 10, Colon); //Colon if (Minute < 10) LED_WriteDigit(3, 0, 0); else LED_WriteDigit(3, Minute / 10, 0); LED_WriteDigit(4, Minute % 10, clock.isArmed1()); //clock.isArmed1() } void LED_WriteAlarm() { dt = clock.getDateTime(); al = clock.getAlarm1(); Minute = al.minute; Hour = al.hour; if (dt.second % 2 == 0) Colon = HIGH; else Colon = LOW; if (Hour > 9) LED_WriteDigit(1, Hour / 10, 0); LED_WriteDigit(2, Hour % 10, AlarmSet); if (Minute < 10) LED_WriteDigit(3, 0, 0); else LED_WriteDigit(3, Minute / 10, 0); LED_WriteDigit(4, Minute % 10, clock.isArmed1()); } void LED_WriteTemp() { float Temp = clock.readTemperature(); LED_WriteDigit(1, 10, 1); int Temp1 = (Temp * 10) / 100; LED_WriteDigit(2, Temp1, 1); int Temp2 = ((Temp * 10) - (Temp1 * 100)) / 10; LED_WriteDigit(3, Temp2, 0); LED_WriteDigit(4, (Temp * 10) - (Temp1 * 100) - (Temp2 * 10), 1); } void LED_WriteDigit(byte Digit, byte Value, byte Colon) { for (byte DigCount = 0; DigCount < 4; ++DigCount) { digitalWrite(LedDigit[DigCount], ActivateDigit[Digit - 1][DigCount]); } for (byte SegCount = 0; SegCount < 7; ++SegCount) { digitalWrite(LedSigment[SegCount], ActivateSegments[Value][SegCount]); delayMicroseconds(100); digitalWrite(LedSigment[SegCount], 0); // Change if Anode } if (Colon) { digitalWrite(LedColon, HIGH); // Change if Anode delayMicroseconds(100); digitalWrite(LedColon, LOW); // Change if Anode } }Здрасте, а какую библиотеку часов используете?
https://github.com/jarzebski/Arduino-DS3231
Благодарю. А скетчем, где дополнительный экран не поделитесь? В чем там нюансы?
В данныймомент переписываю его, там экран из десяти модулей 8х8, вот и все нюансы, как только допишу выложу, можктк присоединится к этой группе в вк. https://vk.com/electronicsprojects
Привет всем!
У меня индикатор такой. Как видно, две точки Colon (DP2 и DP3) работают с разными Digit (Dig4 и Dig3, соответственно).
В коде из #29, в "void LED_WriteTime()" я изменил:
DP3 засветился. А DP2 никак не получается зажечь.
Знающие, поделитесь фрагментами кода, как зажечь DP2 вместе с DP3, а также заставить их мигать с частотой 1 Гц.
UPD:
Удалось задействовать DP2, взяв кусок кода из топика, и даже обе DP замигали. Но частота мигания 0,5 Гц.
Поэтому вопрос о мигании DP с частотой 1 Гц остается актуальным.
Также наблюдается слабое свечение сегментов. Замеры показали ток 1 мА на сегмент без использования ограничивающего резистора. Отсюда еще вопрос: где в коде можно изменить яркость свечения сегментов?
Уважаемый ЕвгенийП! У меня есть несколько вопросов к Вам. Могли бы Вы вызвать меня по скайпу beldom2000.
Пишите здесь. Какие секреты-то?
Писать много придётся.
Здравствуйте! Подскажите,какая индикация (статическая,динамическая)используется в данном коде?
Типа динамическая. Но, именно "типа"
А где можно найти вариант с статической индикацией? В интернете перерыл множество примеров, но все только с динамической индикацмей. Не удается подключить светодиодное табло для изготовления больших часов.
Коллеги!
Прошу пояснить - применялись ли в конструкциях часов токоограничительные резисторы в цепях дисплея и какого номинала?
Применялись, 47ом.
Стаическая индикация имеет иной код и он проще.
помогите, кто обладает.
нужно изменить время индикации температуры, раз в 10 минут это слишком.
помогите, кто обладает.
нужно изменить время индикации температуры, раз в 10 минут это слишком.
вроде в 97 строке.
спасибо UILLIS, проглядел. там так в коментах и написано, только на грузинском.
поправил, раз в минуту. стало информативнее.
добавить-бы есче анимацию....
поделюсь своими часиками на интересном дисплейчике - Vacuum Fluorescent Display Module VAF1613
питается от зарядника телефона 5 вольт жрет 1,5А. на борту ДС-ДС преобразователь с 5 до 12 вольт стоит для питания дисплея
собрана вся из модулей! плата ЛУТ для красоты соединений (не люблю сопли и макетки)
на борту так же датчик температуры влажности, синхронизация времени идет по GPS если нету спутников то с RTC (которое так же синхронизируется с GPS пока есть сигнал)
Фотки: https://yapx.ru/u/Gok7g
на первом снимке SAT-6 означает что видно 6 спутников и синхронизация времени идет от ЖПС, если не видно спутников то будет написано RTC
допиливать можно до бесконечности (кнопочки датчики будильники,фотодатчик для изменения яркости дисплея в ночное время, матерные слова на дисплее писать тоже можно), например к часам на ин-14 я в качестве будильника МП3 модуль подключил на флешку гимн закачал.. вполне патриотично)))
Собрал несколько часиков на VFD индикаторах:
https://youtu.be/ZjMJv97twpY
Вот что получилось внутри часиков, всё собрано на макетке потому как лень ЛУТ делать:
Показывают время, дату, температуру, влажность, давление, есть будильник по дням недели.
Код для ардуино кому интересно:
#define CLOCK 11 //SH_CP 11 74СН #define DATA 13 //DS 14 74СН #define LATCH 12 //ST_CP 12 74СН #define BRIGHTNESS 13 //яркость индикаторов 1-14 #define bt0 A3 #define bt1 A2 #define bt2 A1 #define btA A0 #define ALRM_S 8 #define ALRM_Z 10 //#define ALRM_S A6 #include <EEPROM.h> #include <iarduino_RTC.h> iarduino_RTC time(RTC_DS3231); //#include <LM75A.h> //LM75A lm75a_sensor(false, //A0 LM75A pin state // false, //A1 LM75A pin state // false); //A2 LM75A pin state #include <Adafruit_BMP280.h> Adafruit_BMP280 bmp; #include "DHT.h" #define DHTPIN 9 #define DHTTYPE DHT21 // DHT 21 (AM2301) DHT dht(DHTPIN, DHTTYPE); byte curIndi=0; byte indiDimm[16] = {BRIGHTNESS,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS, BRIGHTNESS,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS}; byte indiCounter[16]; byte digit[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //буфер для вывода значений на экран bool dot[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // где рисовать точку byte digit_old[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //старое содержимое сегментов для эффектов смены цифр byte digit_i[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // счётчики для эффектов на сегментах unsigned long digit_mill[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // для функции эффекта смены цифры byte digitEf[] = {B01111111, B00111111, B00111101, B00011101, B00011100, B00011000, B00001000, B00000000};//для эффекта смены цифр byte _size=0; // для функции бегущей строки bool scroll=1;// для функции бегущей строки, активена бегущая строка или нет unsigned long mill=0;// для функции бегущей строки unsigned long mill0=0;//для функций изменения яркости unsigned long millB=0;// для обработки кнопок byte valSc = 120;//скорость бегущей строки byte _tmscr=0;//для функции бегущей строки, счётчик выведенных символов String tmpTP;//буфер для температуры, влажности, давления byte mod = 1;// режим отображения bool getTP=0; // флаг о том были ли получены данные с датчиков или нужно ли очистить буфер bool Dimm=0; //для функций изменения яркости int _gTP = 0;//буфер для хранения данных с датчиков byte _tm=0;//буфер для записи промежуточных значений byte timeCR = 30;// для корреции хода bool _tCR=1;//для коррекции хода byte alarm_0_w = B00111110; byte alarm_0_h = 7; byte alarm_0_m = 0; float temperature = 0;//буфер для показаний с датчиков //String _e = "2718281828459045"; //String _pi = "3141592653589793"; String _wk = "SUNMONTUEWEDTHUFRISAT";//для функции отображения дня недели byte num[10]={ // ABCDEFG B01111110,//0 B00110000,//1 B01101101,//2 B01111001,//3 B00110011,//4 B01011011,//5 B01011111,//6 B01110000,//7 B01111111,//8 B01111011,//9 }; byte efnt[30]={ B01110111, //A B00011111, //b B01001110, //C B00111101, //d B01001111, //E B01000111, //F B01011110, //G B00010111, //h B00110000, //I B00111000, //J B01010111, //k B00001110, //L B01010101, //m B00010101, //n B00011101, //o B01100111, //P B01110011, //q B00000101, //r B01011011, //S B00001111, //t B00011100, //u B00111110, //V B00111111, //w B00110111, //X B00111011, //y B01101101, //Z B00000001, //- B01000000, //= B00001000, //_(*) B01100011, //^ // 0b10000000, //. }; void setup() { for(byte i=0; i<8; i++){ pinMode(i,OUTPUT); } pinMode(CLOCK, OUTPUT); pinMode(DATA, OUTPUT); pinMode(LATCH, OUTPUT); // pinMode(ALRM_I, OUTPUT); pinMode(ALRM_Z, OUTPUT); digitalWrite(ALRM_Z, HIGH); pinMode(bt0, INPUT_PULLUP); pinMode(bt1, INPUT_PULLUP); pinMode(bt2, INPUT_PULLUP); pinMode(btA, INPUT); pinMode(ALRM_S, INPUT_PULLUP); TCCR2B = (TCCR2B & B11111000) | 1; // делитель 1 TCCR2A |= (1 << WGM21); // включить CTC режим для COMPA TIMSK2 |= (1 << OCIE2A); // включить прерывания по совпадению COMPA //delay(100); time.begin(); if(EEPROM.read(1)>5){ // проверяем есть ли чего в памяти, если нет записываем значения по умолчанию EEPROM.write(0, timeCR); EEPROM.write(1, mod); EEPROM.write(2, alarm_0_w); EEPROM.write(3, alarm_0_h); EEPROM.write(4, alarm_0_m); }else{ timeCR = EEPROM.read(0); mod = EEPROM.read(1); alarm_0_w = EEPROM.read(2); alarm_0_h = EEPROM.read(3); alarm_0_m = EEPROM.read(4); }; bitWrite(alarm_0_w, 7 , 0); // if(alarm_0_w >0 && digitalRead(ALRM_S)==HIGH){ // digitalWrite(ALRM_I, LOW); // }else{ // digitalWrite(ALRM_I, HIGH); // } time.period(1000); bmp.begin(); /* Default settings from datasheet. */ bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Operating Mode. */ Adafruit_BMP280::SAMPLING_X2, /* Temp. oversampling */ Adafruit_BMP280::SAMPLING_X16, /* Pressure oversampling */ Adafruit_BMP280::FILTER_X16, /* Filtering. */ Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */ } void sendStr6(String _st){// вывод строки for(byte i = 0; i<16; i++){ if(_st[i]>47 && _st[i]<58){ digit[15-i]=num[_st[i]-48]; }else if(_st[i]>64 && _st[i]<91){ digit[15-i]=efnt[(_st[i]-65)]; }else if(_st[i]==45){ digit[15-i]=(efnt[26]); }else if(_st[i]==61){ digit[15-i]=(efnt[27]); }else if(_st[i]==42){ digit[15-i]=(efnt[28]); }else if(_st[i]==94){ digit[15-i]=(efnt[29]); }else{digit[15-i]=0; } } } void sndStr(String _lst){ // бегущая строка _size=_lst.length(); if(_size>16 && scroll==1){ _lst=" "+_lst; if(millis()- mill > valSc+20){ _tmscr++;mill=millis(); } sendStr6( (String)_lst[_tmscr]+ (String)_lst[_tmscr+1]+ (String)_lst[_tmscr+2]+ (String)_lst[_tmscr+3]+ (String)_lst[_tmscr+4]+ (String)_lst[_tmscr+5]+ (String)_lst[_tmscr+6]+ (String)_lst[_tmscr+7]+ (String)_lst[_tmscr+8]+ (String)_lst[_tmscr+9]+ (String)_lst[_tmscr+10]+ (String)_lst[_tmscr+11]+ (String)_lst[_tmscr+12]+ (String)_lst[_tmscr+13]+ (String)_lst[_tmscr+14]+ (String)_lst[_tmscr+15] ); if(_tmscr>_size+14){ scroll=0;_tmscr=0; }//mill0=millis(); }else{ sendStr6(_lst); } } void dSP(byte _a, byte _n){//функция для плавной смены цифры с эффектами(6 эффектов) //delay(5); if(millis()-digit_mill[_a]>30){ if(mod<10){ if(_n!=digit_old[_a]){ digit_i[_a] = random(6)<<5; } if((_n!=digit_old[_a]||digit_i[_a]>0)){ digit_old[_a]=_n; switch((digit_i[_a]>>5)){ case 0: if((digit_i[_a]&B00011111)<8){ digit[_a]=digit[_a]>>1; indiDimm[_a]--; digit_i[_a]++; }else if((digit_i[_a]&B00011111)<16){ digit[_a]=_n>>(15-(digit_i[_a]&B00011111)); indiDimm[_a]++; digit_i[_a]++; }else{ digit_i[_a]=0; digit[_a]=_n; } break; case 1: if((digit_i[_a]&B00011111)<BRIGHTNESS){ //digit[_a]=digit[_a]>>1; indiDimm[_a]--; digit_i[_a]++; }else if((digit_i[_a]&B00011111)<BRIGHTNESS*2){ digit[_a]=_n; indiDimm[_a]++; //delay(1); digit_i[_a]++; }else if((digit_i[_a]&B00011111)!=0){ digit_i[_a]=0; digit[_a]=_n; } break; case 2: if((digit_i[_a]&B00011111)<8){ digit[_a]=digit[_a]&(~digitEf[(7-(digit_i[_a]&B00011111))]); digit_i[_a]++; }else if((digit_i[_a]&B00011111)<16){ digit[_a]=_n&(~digitEf[(digit_i[_a]&B00011111)-8]); digit_i[_a]++; }else{ digit_i[_a]=0; digit[_a]=_n; } break; case 3: if((digit_i[_a]&B00011111)<8){ digit[_a]=digit[_a]&(digitEf[(digit_i[_a]&B00011111)]); digit_i[_a]++; }else if((digit_i[_a]&B00011111)<16){ digit[_a]=_n&(digitEf[(15-(digit_i[_a]&B00011111))]); digit_i[_a]++; }else{ digit_i[_a]=0; digit[_a]=_n; } break; case 4: if((digit_i[_a]&B00011111)<8){ digit[_a]=digit[_a]&(~digitEf[(7-(digit_i[_a]&B00011111))]); digit_i[_a]++; }else if((digit_i[_a]&B00011111)<16){ digit[_a]=_n&(digitEf[(15-(digit_i[_a]&B00011111))]); digit_i[_a]++; }else{ digit_i[_a]=0; digit[_a]=_n; } break; case 5: if((digit_i[_a]&B00011111)<BRIGHTNESS){ //digit[_a]=digit[_a]>>1; indiDimm[_a]--; digit_i[_a]++; }else if((digit_i[_a]&B00011111)<BRIGHTNESS*2+1){ digit[_a]=_n;//>>(15-digit_i[_a]); indiDimm[_a]++; //delay(1); digit_i[_a]++; }else if((digit_i[_a]&B00011111)!=0){ digit_i[_a]=0; digit[_a]=_n; } break; default: digit[_a]=_n; indiDimm[_a]=BRIGHTNESS; } }else{ indiDimm[_a]=BRIGHTNESS; digit[_a]=_n; } }else if(mod>10){ digit[_a]=_n; indiDimm[_a]=BRIGHTNESS; } digit_mill[_a]=millis();} } void dotSet(int _d){// рисуем точки в заданной позиции if(millis()-millB < 300&& mod<9){ for(byte i=0; i<8; i++){ if(i==8-mod){ dot[i]=1; }else{ dot[i]=0; } } }else{ for(byte i=0; i<16; i++){dot[i]=bitRead(_d, i);} } } void digitTD(byte _c, byte _d, byte _y, byte _b, byte _x){// рисуем 8м цифр if(Dimm == 1){ dimm_off(_x, 8); Dimm=0; } digit[_x+7] = num[_c/10]; digit[_x+6] = num[_c%10]; digit[_x+5] = num[_d/10]; digit[_x+4] = num[_d%10]; digit[_x+3] = num[_y/10]; digit[_x+2] = num[_y%10]; digit[_x+1] = num[_b/10]; digit[_x+0] = num[_b%10]; if(Dimm ==0){ dimm_on(_x, 8); } } void digitTD2(byte _y, byte _b, byte _x){ // рисуем 4е цифры digit[_x+3] = num[_y/10]; digit[_x+2] = num[_y%10]; digit[_x+1] = num[_b/10]; digit[_x+0] = num[_b%10]; } void dimm_off(byte _a, byte _b){ // яркость сегментов в 0 for(byte i = 0; i<_b; i++){ indiDimm[i+_a]=0; } } void _dimm_off(byte _a, byte _b){ // плавное уменьшение яркости if(Dimm == 1 && millis()-mill0>70) { for(byte i =0; i<_b; i++){ if(indiDimm[i+_a]>0){ indiDimm[i+_a]--; } }mill0=millis(); } } void dimm_on(byte _a, byte _b){ // плавное увеличение яркости if(Dimm == 0 && millis()-mill0>70) { for(byte i =0; i<_b; i++){ if(indiDimm[i+_a]<BRIGHTNESS){ indiDimm[i+_a]++; }//delay(2); }mill0=millis(); } } void digitTD3(byte _a, byte _b, byte _c, byte _x){ // отображение времени dSP(_x+7,num[_a/10]); dSP(_x+6,num[_a%10]); dSP(_x+4,num[_b/10]); dSP(_x+3,num[_b%10]); dSP(_x+1,num[_c/10]); dSP(_x+0,num[_c%10]); if(millis()/1000%10<5){ digit[_x+5] = 0b01000000>>(millis()/1000%6); digit[_x+2] = 0b01000000>>(millis()/100%6); }else{ digit[_x+5] = 0b00000001<<(millis()/1000%3*3); digit[_x+2] = 0b00000001<<((millis()-500)/1000%3*3); } } void keyR(){ // чтение кнопок + - if(digitalRead(bt0)==LOW && millis()-millB>300){mod++;scroll=1;_tmscr=0;millB=millis();getTP=0;} if(digitalRead(bt2)==LOW && millis()-millB>300){mod--;scroll=1;_tmscr=0;millB=millis();getTP=0;} } int _keyH(int i){//читаем кнопку + if(millis() - millB > 200){ if(digitalRead(bt0)==LOW){ millB = millis(); i++; } } return i; } int _keyL(int i){//читаем кнопку - if(millis() - millB > 200){ if(digitalRead(bt2)==LOW){ millB = millis(); i--; } } return i; } int _sm(int i, int a){ //значение в диапазоне 0-a if(i>=a){ i-=a; }else if(i<0){ i+=a; } return i; } bool _keyS(){//чтение кнопки ОК if(millis() - millB > 300){ if(digitalRead(bt1)==LOW){ scroll=1;_tmscr=0;millB=millis(); return true; }else{return false;} }else{return false;} } void _timeCR(){ // функция для коррекции времени, увеличивает или уменьшает на заданное количество секунд раз в сутки if(time.Hours == 3 && time.minutes == 15 && time.seconds == 30 && _tCR==1){ _tCR=0; if(timeCR <31){ time.settime(time.seconds-(30-timeCR), time.minutes, time.Hours); }else{ time.settime(time.seconds+(timeCR-30), time.minutes, time.Hours); } }else if(time.Hours == 3 && time.minutes == 16 && _tCR==0){ _tCR=1; } } void alarm(){ // функция будильника if (/*millis() - millB < 200 || */digitalRead(btA)==HIGH){ //bitWrite(alarm_0_w, 7 , 1);//alarm_0_w=0; digitalWrite(ALRM_Z, HIGH); } // if(digitalRead(ALRM_S)==HIGH){ // digitalWrite(ALRM_I, LOW); // }else{ // digitalWrite(ALRM_I, HIGH); // } if(alarm_0_w > 0 && digitalRead(ALRM_S)==LOW){ if(bitRead(alarm_0_w, 7)==0 && bitRead(alarm_0_w, time.weekday)==1 && alarm_0_h==time.Hours && alarm_0_m == time.minutes && time.seconds < 58){ if (/*millis() - millB < 200 || */digitalRead(btA)==HIGH){ bitWrite(alarm_0_w, 7 , 1);//alarm_0_w=0; } if(millis()/64%8<3){ digitalWrite(ALRM_Z, HIGH); }else{ analogWrite(ALRM_Z, 128); } }else if(alarm_0_h==time.Hours && alarm_0_m == time.minutes && time.seconds > 58){ digitalWrite(ALRM_Z, HIGH); alarm_0_w = EEPROM.read(2); } }//else{digitalWrite(ALRM_Z, HIGH); } } void clr(){ // очистка буфера, установка яркости по умолчанию if(getTP==0){ for(byte i=0; i<16; i++){ digit[i]=0; indiDimm[i]=BRIGHTNESS; }getTP=1; } } void prnt_wk(byte _x, byte _w){ //выводим день недели _x позиция, _w день недели 0-7("SUN MON TUE WED THU FRI SAT") for(byte i=0; i<3; i++){ digit[_x-i]= efnt[(_wk[(_w*3)+i]-65)]; } } void prnt_thp(){ // выводим температуру влажность давление в одну строку temperature = dht.readTemperature(); _gTP= temperature*10; if(_gTP>=10){ tmpTP=(String)((_gTP))+"^C"; }else if(_gTP>=0){ tmpTP=(String)((_gTP))+"^C"; }else if(_gTP<=(-1)){ tmpTP="0"+(String)((_gTP))+"^C"; }else if(_gTP>(-99)){ tmpTP=(String)((_gTP))+"^C"; }else { tmpTP=(String)((_gTP))+"^C"; } temperature = dht.readHumidity(); tmpTP= tmpTP +" H"+(String)((int)temperature); _gTP=bmp.readPressure()/133.3+8; tmpTP= tmpTP+" "+(String)((int)(_gTP))+"MHG"; dimm_on(0,15); dotSet(0b0100000000000000); sendStr6(tmpTP); } void loop() { alarm(); _timeCR(); switch(mod){ case 0: mod = 4; break; case 1: keyR(); if(_keyS()==true){mod=10;} time.gettime(); if(millis() - millB < 300){ //dotSet(B00100100); if(millis()/100%16<8){ dotSet(B1<<millis()/50%16); }else{ dotSet(0b1000000000000000>>millis()/50%16); } digitTD(millis()/1000000%100,millis()/10000%10,millis()/100%100,millis()%100,8); digitTD(millis()/1000000%100,millis()/10000%10,millis()/100%100,millis()%100,0); getTP=0; for(byte i=0; i<16; i++){ digit_old[i]=B0; } }else if(millis() - millB < 25000) { clr(); //digitTD3(time.Hours,time.minutes,time.seconds,4); if(digitalRead(btA) == HIGH){ prnt_thp(); // prnt_wk(15, time.weekday); // digit[11]=0; // digit[12]=0; // digitTD3(time.Hours,time.minutes,time.seconds,3); }else{ for(byte i=0;i<3;i++){ digit[15-i]=0; } digit[4]=0; digit[3]=0; digit[2]=0; digit[1]=0; digit[0]=0; digitTD3(time.Hours,time.minutes,time.seconds,5); dotSet(B00000000); //getTP=0; } } else{ millB = millis()-300; for(byte i=0; i<16; i++){ digit_old[i]=0; } } break; case 2: keyR(); if(_keyS()==true){mod=10;} time.gettime(); if(millis() - millB < 300){ if(millis()/100%16<8){ dotSet(B1<<millis()/50%16); }else{ dotSet(0b1000000000000000>>millis()/50%16); } digitTD(millis()/1000000%100,millis()/10000%10,millis()/100%100,millis()%100,8); digitTD(millis()/1000000%100,millis()/10000%10,millis()/100%100,millis()%100,0); getTP=0; for(byte i=0; i<16; i++){ digit_old[i]=B0; } }else if(millis() - millB < 1500) { sndStr(" TIME"); dotSet(B00000000); }else if(millis() - millB < 4500){ //clr(); digitTD3(time.Hours,time.minutes,time.seconds,1); dotSet(B00000000); }else if(millis() - millB < 6000){ sndStr(" DATA"); dotSet(B00000000); Dimm=1; }else if(millis() - millB < 9000){ digitTD(time.day,time.month,20,time.year,1); dotSet(B10100000<<(millis()/500%2*16)); }else{ millB = millis()-300; for(byte i=0; i<16; i++){ digit_old[i]=0; } } break; case 3: keyR(); if(_keyS()==true){mod=10;} time.gettime(); if(millis() - millB < 300){ //dotSet(B00100100); if(millis()/100%16<8){ dotSet(B1<<millis()/50%16); }else{ dotSet(0b1000000000000000>>millis()/50%16); } digitTD(millis()/1000000%100,millis()/10000%10,millis()/100%100,millis()%100,8); digitTD(millis()/1000000%100,millis()/10000%10,millis()/100%100,millis()%100,0); getTP=0; for(byte i=0; i<16; i++){ digit_old[i]=B0; } }else if(millis() - millB < 3500) { digitTD3(time.Hours,time.minutes,time.seconds, 0); digitTD(time.day,time.month,20,time.year,8); if(millis()/100%10<5){ //dotSet(0b0000000101010000); dotSet(0b0101000100000000); }else{ //dotSet(0b0000000001010000); dotSet(0b0101000000000000); } }else if(millis() - millB < 5500){ dotSet(0b0000000000000000); sndStr("T^C VLAZHNOST MMHG"); // sndStr("T^C HUMIDIT MMHG"); // }else if(millis() - millB < 5550){ // // _dimm_off(0,15); // for(byte i =0; i<15; i++){ // indiDimm[i]=0;} // Dimm = 0; // }else if(millis() - millB < 6200){ // prnt_thp(); }else if(millis() - millB < 9500){ // dimm_on(0,15); prnt_thp(); }else if(millis() - millB < 11500){ dotSet(B0); Dimm=1; for(byte i=0; i<8; i++){ digit_old[i]=B0; } scroll=1; getTP=0; sndStr(" DATA TIME"); }else{ _tmscr=0; scroll=1; getTP=0; millB = millis()-300; for(byte i=0; i<16; i++){ digit_old[i]=0; } } break; case 4: keyR(); if(_keyS()==true){mod=10;} time.gettime(); if(millis() - millB < 300){ if(millis()/100%16<8){ dotSet(B1<<millis()/50%16); }else{ dotSet(0b1000000000000000>>millis()/50%16); } digitTD(millis()/1000000%100,millis()/10000%10,millis()/100%100,millis()%100,8); digitTD(millis()/1000000%100,millis()/10000%10,millis()/100%100,millis()%100,0); getTP=0; for(byte i=0; i<16; i++){ digit_old[i]=B0; } }else if(millis() - millB < 1000){ clr(); sndStr(" TIME"); dotSet(B00000000); }else if(millis() - millB < 4500){ digitTD3(time.Hours,time.minutes,time.seconds,1); dotSet(B00000000); scroll=1; }else if(millis() - millB < 5500){ clr(); sndStr(" DATA"); dotSet(B00000000); Dimm=1; }else if(millis() - millB < 8500){ digitTD(time.day,time.month,20,time.year,1); dotSet(B10100000<<(millis()/500%2*16)); scroll=1; getTP=0; }else if(millis() - millB < 9500){ sndStr("TEMPERATURA"); dotSet(B00000000); if(!getTP){ getTP=1; temperature = dht.readTemperature(); _gTP= ((int)(temperature*10)); } if(_gTP>99){ tmpTP="TEMPERATURA "+(String)(_gTP)+"^C"; }else if(_gTP>=10){ tmpTP="TEMPERATURA "+(String)((_gTP))+"^C"; }else if(_gTP>=0){ tmpTP="TEMPERATURA 0"+(String)((_gTP))+"^C"; }else if(_gTP<=(-1)){ tmpTP="TEMPERATURA "+(String)((_gTP))+"^C"; }else if(_gTP>(-99)){ tmpTP="TEMPERATURA "+(String)((_gTP))+"^C"; }else { tmpTP="TEMPERATURA "+(String)((_gTP))+"^C"; } //_tm=0; dimm_off(0,5); }else if(millis() - millB < 12500){ _tmscr=0; //scroll=1; getTP=0; sendStr6(tmpTP); dotSet(B00000100); dimm_on(0,5); }else if(millis() - millB < 13500){ sndStr("VLAZHNOST H"); dotSet(B0); if(!getTP){ getTP=1; _gTP=dht.readHumidity(); } tmpTP="VLAZHNOST H-"+(String)((int)(_gTP)); dimm_off(0,2); }else if(millis() - millB < 16500){ _tmscr=0; sendStr6(tmpTP); dimm_on(0,3); //dotSet(B10000); getTP=0; }else if(millis() - millB < 17500){ sndStr("DAVLENIE "); dotSet(B0); if(!getTP){ getTP=1; _gTP=bmp.readPressure()/133.3+8; } tmpTP="DAVLENIE "+(String)((int)(_gTP))+"MMHG"; dimm_off(0,7); }else if(millis() - millB < 20500){ _tmscr=0; sendStr6(tmpTP); dimm_on(0,7); dotSet(B10000); getTP=0; }else{ millB = millis()-300; for(byte i=0; i<16; i++){ digit_old[i]=0; } } break; case 9: mod= 15; break; case 10: sndStr("TIME SETUP"); dotSet(B00000000); keyR(); if(_keyS()==true){mod=20;} break; case 11: sndStr("DATA SETUP"); dotSet(B00000000); keyR(); if(_keyS()==true){mod=30;} break; case 12: sndStr("CORRECT TIME"); dotSet(B00000000); keyR(); if(_keyS()==true){mod=40;} break; case 13: sndStr("MODE START"); dotSet(B00000000); keyR(); if(_keyS()==true){_tm=EEPROM.read(1)-1;mod=50;} break; case 14: sndStr("MODE ALARM"); dotSet(B00000000); keyR(); if(_keyS()==true){_tm=0;mod=60;sendStr6("SMTWTFS OK");} break; case 15: sndStr(" EXIT"); keyR(); if(_keyS()==true){mod=1;} dotSet(B00000000); break; case 16: mod = 10; break; case 20: if(millis()/50%10<5){ digit[7] = B00000000; digit[6] = B00000000; dotSet(B11000000); }else{ digitTD3(time.Hours,time.minutes,time.seconds,0); dotSet(B00000000); } time.Hours=_sm(_keyH(int(time.Hours)),24); time.Hours=_sm(_keyL(int(time.Hours)),24); if(_keyS()==true){mod++;} break; case 21: if(millis()/50%10<5){ digit[3] = B00000000; digit[4] = B00000000; dotSet(B00011000); }else{dotSet(B00000000); digitTD3(time.Hours,time.minutes,time.seconds,0);} time.minutes=_sm(_keyH(int(time.minutes)),60); time.minutes=_sm(_keyL(int(time.minutes)),60); if(_keyS()==true){mod++;} break; case 22: if(millis()/50%10<5){ digit[0] = B00000000; digit[1] = B00000000; dotSet(B00000011); }else{dotSet(B00000000); digitTD3(time.Hours,time.minutes,time.seconds,0);} time.seconds=_sm(_keyH(int(time.seconds)),60); time.seconds=_sm(_keyL(int(time.seconds)),60); if(_keyS()==true){mod++;} break; case 23: time.settime(time.seconds, time.minutes, time.Hours); mod=10; break; case 30: if(millis()/50%10<5){ digit[7] = B00000000; digit[6] = B00000000; dotSet(B11000000); }else{dotSet(B0000); digitTD(time.day,time.month,20,time.year,0);} time.day=_sm(_keyH(int(time.day)),32); time.day=_sm(_keyL(int(time.day)),32); if(_keyS()==true){mod++;} break; case 31: //digitTD(time.day,time.month); if(millis()/50%10<5){ digit[5] = B00000000; digit[4] = B00000000; dotSet(B00110000); }else{dotSet(B0000); digitTD(time.day,time.month,20,time.year,0);} time.month=_sm(_keyH(int(time.month)),13); time.month=_sm(_keyL(int(time.month)),13); if(_keyS()==true){mod++;} break; case 32: if(millis()/50%10<5){ digit[1] = B00000000; digit[0] = B00000000; dotSet(B00001111); }else{dotSet(B00000000); digitTD(time.day,time.month,20,time.year,0);} time.year=_sm(_keyH(int(time.year)),100); time.year=_sm(_keyL(int(time.year)),100); if(_keyS()==true){mod++;} break; case 33: if(millis()/50%10<5){ digit[11] = B00000000; digit[10] = B00000000; digit[9] = B00000000; digit[8] = B00000000; dotSet(B01010000); }else{dotSet(B01010000); //digitTD(time.day,time.month,20,time.year,0); prnt_wk(10,time.weekday); } time.weekday=_sm(_keyH(int(time.weekday)),7); time.weekday=_sm(_keyL(int(time.weekday)),7); if(_keyS()==true){mod++;} break; case 34: time.settime(-1, -1, -1, time.day, time.month, time.year, time.weekday); mod=11; break; case 40: if(timeCR<30){ sendStr6("CORRECT TIME-"+(String)(30-timeCR)); }else{ sendStr6("CORRECT TIME "+(String)(timeCR-30)); } dotSet(B0000); timeCR=_sm(_keyH(int(timeCR)),59); timeCR=_sm(_keyL(int(timeCR)),59); if(_keyS()==true){mod++;} break; case 41: EEPROM.write(0, timeCR); mod=12; break; case 50: sendStr6("MODE * "+(String)(_tm+1)); dotSet(B10000000>>_tm); _tm=_sm(_keyH(int(_tm)),4); _tm=_sm(_keyL(int(_tm)),4); if(_keyS()==true){mod++;} break; case 51: EEPROM.write(1, (_tm+1)); _tm=0; mod=13; break; case 60: if(millis()/100%10<5){ if(_tm==7){ indiDimm[6] = 2; indiDimm[7] = 2; }else{ indiDimm[15-_tm] = 2; } }else{ for(byte i=0; i<8; i++){ indiDimm[i+8]=BRIGHTNESS ; } indiDimm[6] = BRIGHTNESS; indiDimm[7] = BRIGHTNESS; } digitTD2(alarm_0_h, alarm_0_m, 0); dotSet((alarm_0_w<<9)+4); _tm=_sm(_keyH(int(_tm)),8); _tm=_sm(_keyL(int(_tm)),8); // if(alarm_0_w >0){ // digitalWrite(ALRM_I, LOW); // }else{ // digitalWrite(ALRM_I, HIGH); // } if(_keyS()==true){ if(_tm == 7){ mod = 61; //EEPROM.write(2, alarm_0_w); for(byte i=0; i<16; i++){indiDimm[i]=BRIGHTNESS ;} }else{ bitWrite(alarm_0_w, 6-_tm, !bitRead(alarm_0_w,6-_tm)); } } break; case 61: digitTD2(alarm_0_h, alarm_0_m, 0); if(millis()/100%10<5){ indiDimm[3] = BRIGHTNESS; indiDimm[2] = BRIGHTNESS; }else{ indiDimm[3] = 2; indiDimm[2] = 2; } alarm_0_h=_sm(_keyH(int(alarm_0_h)),24); alarm_0_h=_sm(_keyL(int(alarm_0_h)),24); if(_keyS()==true){ mod=62; indiDimm[3] = BRIGHTNESS; indiDimm[2] = BRIGHTNESS; // EEPROM.write(3, alarm_0_h); } break; case 62: digitTD2(alarm_0_h, alarm_0_m, 0); if(millis()/100%10<5){ indiDimm[1] = BRIGHTNESS; indiDimm[0] = BRIGHTNESS; }else{ indiDimm[1] = 2; indiDimm[0] = 2; } alarm_0_m=_sm(_keyH(int(alarm_0_m)),60); alarm_0_m=_sm(_keyL(int(alarm_0_m)),60); if(_keyS()==true){ mod=63; indiDimm[1] = BRIGHTNESS; indiDimm[0] = BRIGHTNESS; //EEPROM.write(4, alarm_0_m); } break; case 63: bitWrite(alarm_0_w, 7 , 0); EEPROM.write(2, alarm_0_w); EEPROM.write(3, alarm_0_h); EEPROM.write(4, alarm_0_m); mod = 14; break; default: mod = 1; } } ISR(TIMER2_COMPA_vect) { // вывод на экран в перывании indiCounter[curIndi]++; // счётчик индикатора if (indiCounter[curIndi] >= indiDimm[curIndi]){ // если достигли порога диммирования //PORTB = B00011000;// выключить текущую цифру PORTD = B00000000; // выключить сегменты //digitalWrite(LATCH, LOW); // shiftOut(DATA, CLOCK, LSBFIRST, B00000000); // shiftOut(DATA, CLOCK, LSBFIRST, B00000000); //digitalWrite(LATCH, HIGH); PORTB &= ~ (1<<4); shiftout(B00000000); shiftout(B00000000); PORTB |= (1<<4); } if (indiCounter[curIndi] > 15) { // достигли порога в X единиц indiCounter[curIndi] = 0; // сброс счетчика цифры if (++curIndi >= 16) curIndi = 0; // смена сетки if (indiDimm[curIndi] > 0) { PORTD = digit[curIndi]+(dot[curIndi]<<7);//B10000000; if(curIndi<8){ //PORTB = B00001000+curIndi; //digitalWrite(LATCH, LOW); // shiftOut(DATA, CLOCK, LSBFIRST, (B10000000>>curIndi)); // shiftOut(DATA, CLOCK, LSBFIRST, B00000000); //digitalWrite(LATCH, HIGH); PORTB &= ~(1<<4); shiftout(B10000000>>curIndi); shiftout(B00000000); PORTB |= (1<<4); }else if(curIndi>7){ //PORTB = B00010000+(curIndi-B00001000); //digitalWrite(LATCH, LOW); // shiftOut(DATA, CLOCK, LSBFIRST, B00000000); // shiftOut(DATA, CLOCK, LSBFIRST, (B10000000>>(curIndi-8))); //digitalWrite(LATCH, HIGH); PORTB &= ~ (1<<4); shiftout(B00000000); shiftout(B10000000>>(curIndi-8)); PORTB |= (1<<4); } } } } void shiftout(byte _byte){ // более быстрый вывод чем shiftOut for (byte i=0; i<8; i++) { if(bitRead(_byte, i)) PORTB |= (1<<5); else PORTB &= ~(1<<5); //clock PORTB |= (1<<3); PORTB &= ~(1<<3); } }Может кто посоветовать недорогой доступный VFD экраньчик с 14-16 сегментными символами на 16 разрядов? на алиэкспрессе VAF1613 не находится.
Схему надо, для подкрепления интереса.