Оптимизировать скетч

maksmkv
Offline
Зарегистрирован: 07.04.2013

Всем привет. Собрал часы по аналогии с 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);
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Оптимизировать на предмет чего?

Мигание описано в статье "Blink без delay".

SergeiL
SergeiL аватар
Offline
Зарегистрирован: 05.11.2018

Нужно в loop проверять изменилось ли время секунд в RTC, и если изменилось, взводить флаг горящей точки, и через миллис засекать 500мс. 

Прошло 500мс - скидываем флаг, снова проверяем время с RTC на изменение.

А в выводе цифр если флаг взведен, то включаем точки, нет - выключаем.

Это с минимальными переделками. 

maksmkv
Offline
Зарегистрирован: 07.04.2013

SergeiL пишет:

Нужно в loop проверять изменилось ли время секунд в RTC, и если изменилось, взводить флаг горящей точки, и через миллис засекать 500мс. 

Прошло 500мс - скидываем флаг, снова проверяем время с RTC на изменение.

А в выводе цифр если флаг взведен, то включаем точки, нет - выключаем.

Это с минимальными переделками. 

Так  наверное понял, буду пробовать 

maksmkv
Offline
Зарегистрирован: 07.04.2013

sadman41 пишет:
Оптимизировать на предмет чего? Мигание описано в статье "Blink без delay".

Длина  строчек кода. delay переделаю на millis. Спасибо

SergeiL
SergeiL аватар
Offline
Зарегистрирован: 05.11.2018

maksmkv пишет:

Длина  строчек кода. delay переделаю на millis. Спасибо

Да в том коде, что в первом сообщении, можно delay и оставить. 

Там они короткие. Если переписывать, то нужно структуру кода менять.

Если переделывать, для отображения цифр в loop нужно одно условие с миллис. Заходить в условие каждые 5мс (5мс*4=20мс вывод всего содержимого индикатора).

В этом условии гасим предыдущую выведенную цифру, инкрементируем позицию (по маске 3), чтобы не проверять выход за границы индикатора, и зажигаем новую, из буфера. Индекс у нас есть, это позиция.

Так, чтобы цифра осталась включенной до следующего попадания в IF. Погасим ее на следующем входе через 5мс, и зажжем следующую.  

Пока правьте точку в loop, там всего один if с миллис нужен на 500мс. если работает - пусть так работает. 

b707
Offline
Зарегистрирован: 26.05.2017

maksmkv пишет:

Длина  строчек кода.

для оптимизации длины кода я бы переписал вывод цифр. Вместо кучи почти одинаковых процедур one() two() three() написать одну процедуру зажигания сегментов, а номера зажигаемых сегментов передавать ей как параметр.

Номера зажигаемых сегментов можно кодировать битами в байте и сложить в массив. Код в итоге уменьшиться раз в пять.

Посмотрите примеры других семисегментных часов на ардуино, это все давно отработано.

fogary
Offline
Зарегистрирован: 05.03.2016

Строки с 75 по 103, какое-то излишнее усложнение.

Перевернутый сегмент - это чего такое?

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Перевернутый сегмент - это такой способ сформировать двоеточие. Только переделывать под него код - это изврат, все решается перекомутацией контактов сегмента