Оптимизировать скетч
- Войдите на сайт для отправки комментариев
Вс, 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, какое-то излишнее усложнение.
Перевернутый сегмент - это чего такое?
Перевернутый сегмент - это такой способ сформировать двоеточие. Только переделывать под него код - это изврат, все решается перекомутацией контактов сегмента