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

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