6-разрядные 7-сегментные часы
У меня есть 6-значный 7-сегментный, ds3231 и arduino uno, но у меня неверный код. У меня 4-значный 7-сегментный код. Я хочу правильно. Кто мне поможет?
#include "SevSeg.h"
#include <DS3231.h>
DS3231 rtc(SDA, SCL);
Time t;
SevSeg Display;
const int hrs_set = A0;
const int min_set = A1;
const int ledPin = A3;
unsigned int number = 0;
const long interval = 500;
unsigned long startMillis;
unsigned long currentMillis;
unsigned long previousMillis = 0;
unsigned int Hour = 0;
unsigned int hrs_var = 0;
unsigned int min_var = 0;
int ledState = LOW;
void setup()
{
rtc.begin();
pinMode(ledPin, OUTPUT);
pinMode(hrs_set, INPUT_PULLUP);
pinMode(min_set, INPUT_PULLUP);
byte numDigits = 4;
byte digitPins[] = {10, 11, 12, 13};
byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8, 9};
bool resistorsOnSegments = false;
bool updateWithDelays = false;
byte hardwareConfig = COMMON_CATHODE;
bool leadingZeros = true;
bool disableDecPoint = true;
Display.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments, updateWithDelays, leadingZeros, disableDecPoint);
Display.setBrightness(100);
}
void loop()
{
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval)
{
previousMillis = currentMillis;
if (ledState == LOW)
{
ledState = HIGH;
}
else
{
ledState = LOW;
}
digitalWrite(ledPin, ledState);
}
t = rtc.getTime();
Hour = t.hour;
hrs_var = t.hour;
min_var = t.min;
if (t.hour > 12)
{
if (t.hour == 13) Hour = 1;
if (t.hour == 14) Hour = 2;
if (t.hour == 15) Hour = 3;
if (t.hour == 16) Hour = 4;
if (t.hour == 17) Hour = 5;
if (t.hour == 18) Hour = 6;
if (t.hour == 19) Hour = 7;
if (t.hour == 20) Hour = 8;
if (t.hour == 21) Hour = 9;
if (t.hour == 22) Hour = 10;
if (t.hour == 23) Hour = 11;
}
else
{
if (t.hour == 0) Hour = 12;
}
number = Hour * 100 + t.min;
Display.setNumber(number);
Display.refreshDisplay();
if (digitalRead(hrs_set) == LOW)
{
hrs_var += 1;
if (hrs_var > 23) hrs_var = 0;
rtc.setTime(hrs_var, min_var, 0);
for (int i = 0; i < 1000; i ++)
{
Display.setNumber(number);
Display.refreshDisplay();
}
}
if (digitalRead(min_set) == LOW)
{
min_var += 1;
if (min_var >= 60) min_var = 0;
rtc.setTime(hrs_var, min_var, 0);
for (int i = 0; i < 1000; i ++)
{
Display.setNumber(number);
Display.refreshDisplay();
}
}
}
1 ответ
▲ 1
Вы не задали вопрос, поэтому допустим любой ответ.
Я сделал предположение, что вы хотите знать, как упростить код.
if (t.hour > 12)
{
if (t.hour == 13) Hour = 1;
if (t.hour == 14) Hour = 2;
if (t.hour == 15) Hour = 3;
if (t.hour == 16) Hour = 4;
if (t.hour == 17) Hour = 5;
if (t.hour == 18) Hour = 6;
if (t.hour == 19) Hour = 7;
if (t.hour == 20) Hour = 8;
if (t.hour == 21) Hour = 9;
if (t.hour == 22) Hour = 10;
if (t.hour == 23) Hour = 11;
}
Можно заменить
if (t.hour > 12)
{
Hour = t.hour - 12;
}
Что может быть однострочным.
if (t.hour > 12) Hour = t.hour - 12;
,
@jsotola
Смотрите также:
- Как объявить массив переменного размера (глобально)
- Программирование Arduino с использованием Python, а не C/C ++
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Как справиться с rollover millis()?
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Можно ли сделать несколько функций loop() с помощью Arduino Uno?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- устаревшее преобразование из строковой константы в 'char*'
Я хочу исправить этот код для 6-значного 7-сегментного дисплея часов., @Gocha Vashakidze
Вам нужно добавить больше информации. В чем именно проблема с вашим кодом? Вы получали сообщения об ошибках? Какого поведения вы ожидали и что произошло на самом деле? Как вы все подключили (схема подключения или схемы)? Пожалуйста, добавьте все это к своему вопросу, отредактировав его, а не комментируя под своим вопросом., @chrisl
Если ваш 6-значный дисплей подобен 4-значному дисплею, для которого предназначен этот код, начните с подключения дисплея, но оставьте две цифры секунд неподключенными. Когда у вас есть программа часов и дисплей, работающий в «4-значном режиме», назначьте два контакта Uno цифрам секунд и измените параметры в коде, чтобы они соответствовали. Другим подходом было бы создание минимальной программы, которая просто пытается написать, скажем, «123456» на вашем дисплее. Как только это сработает, интегрируйте код в существующую программу., @6v6gt