Часы, будильник, термометр. На ARDUINO NANO, DS3231.

DarkGenius
Offline
Зарегистрирован: 09.07.2015

Часы, будильник, термометр. На 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);
  }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Красиво. Цвета на картинке поплыли или индикатор дйствительно розовый? Если розовый, дайте пожалуйста ссылку, где брали такой.

DarkGenius
Offline
Зарегистрирован: 09.07.2015

Поплыли.

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

подскажите, плз, как заменить DS3231 на DS1302 в этом скетче?

 

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

ЕвгенийП пишет:

Красиво. Цвета на картинке поплыли или индикатор дйствительно розовый? Если розовый, дайте пожалуйста ссылку, где брали такой.

немного поиграя с напряжением можно поиграть с оттенком свечения, только осторожно)

DarkGenius
Offline
Зарегистрирован: 09.07.2015

заменить библиотеку и управляющие команды, у меня ds1302 нету не чем помочь не могу. Да и хуже она значительно.

yucan
Offline
Зарегистрирован: 20.04.2015

karl2233 пишет:

подскажите, плз, как заменить DS3231 на DS1302 в этом скетче?

 

На АЛИ как буханка хлеба стоит!

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

я видел, спасибо.

но есть трудности - 1302 у мну есть, а  с Али я не смогу получить ближайшее (хз сколько - год, може меньше) время.

так что пытаюсь слепить и говна и палок =)

DarkGenius, спасибо! хоть понятно куда копать.

spa-sam
Offline
Зарегистрирован: 14.12.2012

Делаю часы на WS2812B, с внешним беспроводным термометром. Так же хочу прикрутить IR пульт и сделать функцию лампы настроения ( с этим пока туго т.к. не уживаются пульт и эти светодиоды из-за ограничения по "таймингам", если кто пробовал, то посоветуйте куда копать.)

Использую библ. Adafruit_GFX, Adafruit_NeoMatrix, Adafruit_NeoPixel

DarkGenius
Offline
Зарегистрирован: 09.07.2015

На максах дополнительный дисплей реализовал.
https://youtu.be/IJ8PPtEiprQ

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

подскажите, пожалуйста, что означает в строке 221

LED_WriteDigit(4, Minute % 10, clock.isArmed1());

"clock.isArmed1()"?  смотрю в библиотеках(скачал уже штук пять) для этого RTC и не вижу такой команды.

или подскажите, плз, какая команда соответствует из библиотеки DS1302?

суть простая - пытаюсь авторский скетч переделать под DS1302

 

DarkGenius
Offline
Зарегистрирован: 09.07.2015

статус будильника, включен\выключен

karl2233
karl2233 аватар
Offline
Зарегистрирован: 05.07.2015

ага!

"я догадался, что 0,5 и 0,5 это литр, да постеснялся сказать"(с)

спасибо DarkGenius!

 

UPD. не подскажешь где библиотеку 3231 брал?

пытаюсь разобраться с командами, что б заменить на 1302, но все библиотеки которые мне попадаются не имеют команд, которые в скетче.

UPD1. сам спросил, сам ответил =) вот библиотека

UPD2. всё-таки 1302 это "г" на палочке - создание будильника целый геморр

vasylll
Offline
Зарегистрирован: 27.12.2013

У меня почему то не идет ... горят одни восьмёрки. Скетч загрузился без ошибок. индикатор - общий анод. DS3231 предварительно тоже проверял из образцов. В мониторе все показывает нормально. Три раза пересобирал на макетке, думал ошибка. Но всё одно и то же. :(

vasylll
Offline
Зарегистрирован: 27.12.2013

Да все есть в самом начале. Повторю еще раз, чтоб рядом было.

Подключение к индикатору и кнопки:

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

 

      
DarkGenius
Offline
Зарегистрирован: 09.07.2015

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


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

 

vasylll
Offline
Зарегистрирован: 27.12.2013

Индикатор  0.56", зеленый, с ОА такой

попробую  предоставленую Вами CommonAnode и потом отпишусь.

vasylll
Offline
Зарегистрирован: 27.12.2013

Пробовал два типа индикатора. Везде восьмёрки после включения. На 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/

но там сервису никакого нету и будильника. Ну и без модуля реального времени.

 

vasylll
Offline
Зарегистрирован: 27.12.2013

Вот такой еще проект нашел. Вполне рабочий.

http://arduinotehniq.blogspot.com/2014/09/manual-adjust-for-rtc-clock-with.html

DarkGenius
Offline
Зарегистрирован: 09.07.2015

Если 13 мигает знать часы идут, похоже я скетчи местами спутал. Где анод там катод и наоборот, исправил. Кнопки просто на корпус, зуммер через сопротивление.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DarkGenius пишет:

 не знаю как включенный будильник обозначить.

Неспешным (1 - 1/2 Гц) миганием самой правой точки (возе единиц минут)???

DarkGenius
Offline
Зарегистрирован: 09.07.2015

На этом индикаторе только две в центре точки, активны. В оригинале последняя горит при активном.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Там же вроде на картинке видны десятичные точки возле цифр. Они что, не горят? Я имел в виду такой точкой помигать.

vasylll
Offline
Зарегистрирован: 27.12.2013

DarkGenius пишет:

Где анод там катод и наоборот, исправил.

Теперь все скетчи правильно  выше предоставлены - CommonCathode - для катода, CommonAnode - для анода.  Теперь все заработало. Только на моем индикаторе точки мигают после 3 и 4 цифр одновременнно. Где, в каком месте поправить ? И для меня наверное лучше в первой половине суток, чтобы в переди нолик был. Минуты, часы кнопками правильно выставляються. Будильник, озвучка - все нармально работает.

DarkGenius
Offline
Зарегистрирован: 09.07.2015

сравни с первоначальным вариантом, корекция нуля так же в скетче есть надо просто её удалить.
if (Hour > 9) LED_WriteDigit(1, Hour / 10, 0);
изменить на 
LED_WriteDigit(1, Hour / 10, 0);

DarkGenius
Offline
Зарегистрирован: 09.07.2015

точки есть а диодов под ними нет, китайцы........

vasylll
Offline
Зарегистрирован: 27.12.2013

DarkGenius пишет:

сравни с первоначальным вариантом, корекция нуля так же в скетче есть надо просто её удалить.
изменить на 
LED_WriteDigit(1, Hour / 10, 0);

Спасибо. Всё получилось. Нолик в переди появился.  А в каком месте править, чтобы точку передвинуть чтобы была после второго знака. А то у меня сейчас секундные импульсы(точки) мигают после третей и четвертой цифр вместе. :(

pepino
Offline
Зарегистрирован: 13.07.2015

Выкладываю мной исправленный рабочий вариант скеча! Замечания принимаются.

 
 
pepino
Offline
Зарегистрирован: 13.07.2015
//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
  }
}

 

pepino
Offline
Зарегистрирован: 13.07.2015
//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
  }
}

 

kraiv
Offline
Зарегистрирован: 02.12.2015

Здрасте, а какую библиотеку часов используете?

DarkGenius
Offline
Зарегистрирован: 09.07.2015
kraiv
Offline
Зарегистрирован: 02.12.2015

Благодарю. А скетчем, где дополнительный экран не поделитесь? В чем там нюансы?

DarkGenius
Offline
Зарегистрирован: 09.07.2015

В данныймомент переписываю его, там экран из десяти модулей 8х8, вот и все нюансы, как только допишу выложу, можктк присоединится к этой группе в вк. https://vk.com/electronicsprojects

Tverd_Hrendricson
Offline
Зарегистрирован: 12.04.2016

Привет всем!

У меня индикатор такой. Как видно, две точки Colon (DP2 и DP3) работают с разными Digit (Dig4 и Dig3, соответственно).

В коде из #29, в "void LED_WriteTime()" я изменил:

LED_WriteDigit(2, Hour % 10, Colon);          //Colon

на

LED_WriteDigit(2, Hour % 10, 0);

а также:

else LED_WriteDigit(3, Minute / 10, 0);

на

else LED_WriteDigit(3, Minute / 10, Colon); // Colon (DP3)

DP3 засветился. А DP2 никак не получается зажечь.

Знающие, поделитесь фрагментами кода, как зажечь DP2 вместе с DP3, а также заставить их мигать с частотой 1 Гц.

UPD:

Удалось задействовать DP2, взяв кусок кода из топика, и даже обе DP замигали. Но частота мигания 0,5 Гц.

Поэтому вопрос о мигании DP с частотой 1 Гц остается актуальным.

Также наблюдается слабое свечение сегментов. Замеры показали ток 1 мА на сегмент без использования ограничивающего резистора. Отсюда еще вопрос: где в коде можно изменить яркость свечения сегментов?

biopack
Offline
Зарегистрирован: 27.08.2017

Уважаемый ЕвгенийП! У меня есть несколько вопросов к Вам. Могли бы Вы вызвать меня по скайпу beldom2000.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Пишите здесь. Какие секреты-то?

biopack
Offline
Зарегистрирован: 27.08.2017

Писать много придётся.

OlegV
Offline
Зарегистрирован: 26.11.2016

Здравствуйте! Подскажите,какая индикация (статическая,динамическая)используется в данном коде?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Типа динамическая. Но, именно "типа"

OlegV
Offline
Зарегистрирован: 26.11.2016

А где можно найти вариант с статической индикацией? В интернете перерыл множество примеров, но все только с динамической индикацмей. Не удается подключить светодиодное табло для изготовления больших часов. 

forter
Offline
Зарегистрирован: 01.02.2018

Коллеги!

Прошу пояснить - применялись ли в конструкциях часов токоограничительные резисторы в цепях дисплея и какого номинала?

DarkGenius
Offline
Зарегистрирован: 09.07.2015

Применялись, 47ом.

DarkGenius
Offline
Зарегистрирован: 09.07.2015

Стаическая индикация имеет иной код и он проще.

ИВАН.И
Offline
Зарегистрирован: 02.03.2020

помогите, кто обладает.

нужно изменить время индикации температуры, раз в 10 минут это слишком.

Ulliss
Offline
Зарегистрирован: 16.09.2019

ИВАН.И пишет:

помогите, кто обладает.

нужно изменить время индикации температуры, раз в 10 минут это слишком.

вроде в 97 строке.

ИВАН.И
Offline
Зарегистрирован: 02.03.2020

спасибо UILLIS, проглядел. там так в коментах и написано, только на грузинском.

поправил, раз в минуту. стало информативнее. 

ИВАН.И
Offline
Зарегистрирован: 02.03.2020

добавить-бы есче анимацию....

mrWang
Offline
Зарегистрирован: 19.03.2017

поделюсь своими часиками на интересном дисплейчике - Vacuum Fluorescent Display Module VAF1613

питается от зарядника телефона 5 вольт жрет 1,5А. на борту ДС-ДС преобразователь с 5 до 12 вольт стоит для питания дисплея

собрана вся из модулей! плата ЛУТ для красоты соединений (не люблю сопли и макетки)

на борту так же датчик температуры влажности, синхронизация времени идет по GPS если нету спутников то с RTC (которое так же синхронизируется с GPS пока есть сигнал)

Фотки: https://yapx.ru/u/Gok7g

на первом снимке SAT-6 означает что видно 6 спутников и синхронизация времени идет от ЖПС, если не видно спутников то будет написано RTC

 

допиливать можно до бесконечности (кнопочки датчики будильники,фотодатчик для изменения яркости дисплея в ночное время, матерные слова на дисплее писать тоже можно), например к часам на ин-14 я в качестве будильника МП3 модуль подключил на флешку гимн закачал.. вполне патриотично)))

 

 

 

xplp
Offline
Зарегистрирован: 21.12.2012

Собрал несколько часиков на 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 не находится.

DarkGenius
Offline
Зарегистрирован: 09.07.2015

Схему надо, для подкрепления интереса.