Оптимизировать скетч
- Войдите на сайт для отправки комментариев
Вс, 22/05/2022 - 23:01
Всем привет. Собрал часы по аналогии с STC15W404AS, с перевернутым одним индикатором. Код рабочий, но хотелось бы его уменьшить. Сможете подсказать, что и как изменить???? Т нщн одтн мелкий вопрос: как заставить мигать точки раз в секунду. Если как есть у меня, то вся индикация ломается, т.к. delay задерживает работу МК. СПАСИБО
#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>
#include <TimerOne.h>
//заняты все цифровые пины от 5 до 12
int a = 6;
int b = 7;
int c = 8;
int d = 9;
int e = 10;
int f = 11;
int g = 12;
int p = 13;
int d4 = 5;
int d3 = 4;
int d2 = 3;
int d1 = 2;
int del = 3;
int n;
int hm_hour;
int hm_minute;
void setup()
{
//пины на вывод
pinMode(d1, OUTPUT);
pinMode(d2, OUTPUT);
pinMode(d3, OUTPUT);
pinMode(d4, OUTPUT);
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(p, OUTPUT);
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(p, HIGH);
}
void en_doted(){
digitalWrite(p, LOW);
digitalWrite(d2, LOW);
digitalWrite(d3, LOW);
delay(10);
digitalWrite(p, HIGH);
digitalWrite(d2, HIGH);
digitalWrite(d3, HIGH);
}
void loop()
{
tmElements_t tm;
if (RTC.read(tm))
{
hm_hour = tm.Hour;
hm_minute = tm.Minute;
}
// n = 1234;
n = hm_hour *100 + hm_minute;
clearLEDs();
pickDigit(0); //включаем первую цифру
pickNumber((n/1000)); //значение тысячи
delay(del); //пауза 5мс
clearLEDs();
pickDigit(1); //включаем вторую цифру
pickNumber((n%1000)/100); //значение сотни
delay(del); //пауза 5мс
clearLEDs();
pickDigit(2); //включаем третью цифру
if (hm_minute>10){
pickNumberADD(n%100/10);
delay(del);
}
else
{
pickNumber(n%100/10); //значение десятки
delay(del); //пауза 5мс
}
clearLEDs();
pickDigit(3); //включаем четвертую цифру
pickNumber(n%10); //значение единицы
delay(del); //пауза 5мс
}
// определение разряда
void pickDigit(int x)
{
digitalWrite(d1, HIGH);
digitalWrite(d2, HIGH);
digitalWrite(d3, HIGH);
digitalWrite(d4, HIGH);
switch(x)
{
case 0:
digitalWrite(d1, LOW); //включаем d1
digitalWrite(d2, HIGH); //включаем d1
digitalWrite(d3, HIGH); //включаем d1
digitalWrite(d4, HIGH); //включаем d1
break;
case 1:
digitalWrite(d1, HIGH); //включаем d1
digitalWrite(d2, LOW); //включаем d1
digitalWrite(d3, HIGH); //включаем d1
digitalWrite(d4, HIGH); //включаем d1
break;
case 2:
digitalWrite(d1, HIGH); //включаем d1
digitalWrite(d2, HIGH); //включаем d1
digitalWrite(d3, LOW); //включаем d1
digitalWrite(d4, HIGH); //включаем d1
break;
default:
digitalWrite(d1, HIGH); //включаем d1
digitalWrite(d2, HIGH); //включаем d1
digitalWrite(d3, HIGH); //включаем d1
digitalWrite(d4, LOW); //включаем d1
break;
}
}
// определение символа (цифры)
void pickNumber(int x)
{
switch(x)
{
default:
zero();
break;
case 1:
one();
break;
case 2:
two();
break;
case 3:
three();
break;
case 4:
four();
break;
case 5:
five();
break;
case 6:
six();
break;
case 7:
seven();
break;
case 8:
eight();
break;
case 9:
nine();
break;
}
}
// определение символа (цифры)
void pickNumberADD(int x)
{
switch(x)
{
default:
zero();
break;
case 1:
one_one();
break;
case 2:
two();
break;
case 3:
three_three;
break;
case 4:
four_four();
break;
case 5:
five();
break;
case 6:
six_six();
break;
case 7:
seven_seven();
break;
case 8:
eight();
break;
case 9:
nine_nine();
break;
}
}
// очистка
void clearLEDs()
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(p, HIGH);
}
// вывод 0
void zero()
{
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
}
// вывод 1
void one()
{
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
// вывод 2
void two()
{
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
}
// вывод 3
void three()
{
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
}
// вывод 4
void four()
{
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
// вывод 5
void five()
{
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
// вывод 6
void six()
{
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
// вывод 7
void seven()
{
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
// вывод 8
void eight()
{
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
// вывод 9
void nine()
{
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
//Перевернутый сегмент
// вывод 11
void one_one()
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
delay(1);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
}
// вывод 33
void three_three()
{
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
// вывод 44
void four_four()
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
// вывод 66
void six_six()
{
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
// вывод 77
void seven_seven()
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
}
// вывод 99
void nine_nine()
{
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
Оптимизировать на предмет чего?
Мигание описано в статье "Blink без delay".
Нужно в loop проверять изменилось ли время секунд в RTC, и если изменилось, взводить флаг горящей точки, и через миллис засекать 500мс.
Прошло 500мс - скидываем флаг, снова проверяем время с RTC на изменение.
А в выводе цифр если флаг взведен, то включаем точки, нет - выключаем.
Это с минимальными переделками.
Нужно в loop проверять изменилось ли время секунд в RTC, и если изменилось, взводить флаг горящей точки, и через миллис засекать 500мс.
Прошло 500мс - скидываем флаг, снова проверяем время с RTC на изменение.
А в выводе цифр если флаг взведен, то включаем точки, нет - выключаем.
Это с минимальными переделками.
Так наверное понял, буду пробовать
Длина строчек кода. delay переделаю на millis. Спасибо
Длина строчек кода. delay переделаю на millis. Спасибо
Да в том коде, что в первом сообщении, можно delay и оставить.
Там они короткие. Если переписывать, то нужно структуру кода менять.
Если переделывать, для отображения цифр в loop нужно одно условие с миллис. Заходить в условие каждые 5мс (5мс*4=20мс вывод всего содержимого индикатора).
В этом условии гасим предыдущую выведенную цифру, инкрементируем позицию (по маске 3), чтобы не проверять выход за границы индикатора, и зажигаем новую, из буфера. Индекс у нас есть, это позиция.
Так, чтобы цифра осталась включенной до следующего попадания в IF. Погасим ее на следующем входе через 5мс, и зажжем следующую.
Пока правьте точку в loop, там всего один if с миллис нужен на 500мс. если работает - пусть так работает.
Длина строчек кода.
для оптимизации длины кода я бы переписал вывод цифр. Вместо кучи почти одинаковых процедур one() two() three() написать одну процедуру зажигания сегментов, а номера зажигаемых сегментов передавать ей как параметр.
Номера зажигаемых сегментов можно кодировать битами в байте и сложить в массив. Код в итоге уменьшиться раз в пять.
Посмотрите примеры других семисегментных часов на ардуино, это все давно отработано.
Строки с 75 по 103, какое-то излишнее усложнение.
Перевернутый сегмент - это чего такое?
Перевернутый сегмент - это такой способ сформировать двоеточие. Только переделывать под него код - это изврат, все решается перекомутацией контактов сегмента