Не удается включать светодиод интервалами

Доброго времени суток, товарищи.
Не получается добавить RGB светодиод, который бы изменял свои цвета по таймеру.
Хотелось бы, сделать так:
с начала цикла скетча светодиод горел одним цветом, затем когда на 4 разрядном 7 сегментном индикаторе счетчик достигал определенного значения, допустим 20, менял свой цвет и т.д
Пытался писать с помощью библиотек ТМ1637, но как выяснилось моим пытливым умом, этот сея девайс существенно отличается.
До этого мне удавалось достичь результатов, которые приводили к отказу индикатора вовсе обрабатывать функцию “таймера”, но при этом статично горел светодиод, затем было исправлено, но тем не менее не добился искомого результата. Текущий скетч упорно отказывается обрабатывать простую команду “если…иначе”.

#include <TimerOne.h>
int a = 7;
int b = 3;
int c = 4;
int d = 5;
int e = 6;
int f = 2;
int g = 8;
int p = 9;
int d4 = A1;
int d3 = A2;
int d2 = A3;
int d1 = A4;
long n = 0; 
int x = 100;
int del = 5;
int count = 0;
int rled = 11;
int gled = 9;
int bled = 10;
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(rled, OUTPUT);
  pinMode(gled, OUTPUT);
  pinMode(bled, OUTPUT);

  Timer1.initialize(100000);
  Timer1.attachInterrupt( add );
}

 
void loop()
{
  clearLEDs();
  pickDigit(0); //включаем первую цифру
  pickNumber((n/1000)); //значение тысячи
  delay(del); //пауза 5мс
 
  clearLEDs();
  pickDigit(1); //включаем вторую цифру
  pickNumber((n%1000)/100); //значение сотни
  delay(del); //пауза 5мс
 
  clearLEDs();
  pickDigit(2); //включаем третью цифру
  pickNumber(n%100/10); //значение десятки
  delay(del); //пауза 5мс
 
  clearLEDs();
  pickDigit(3); //включаем четвертую цифру
  pickNumber(n%10); //значение единицы
  delay(del); //пауза 5мс
  rgb();
}
 
// определение разряда
void pickDigit(int x)
{  
  digitalWrite(d1, HIGH);
  digitalWrite(d2, HIGH);
  digitalWrite(d3, HIGH);
  digitalWrite(d4, HIGH);
 
  switch(x)
  {
    case 0: 
    digitalWrite(d1, LOW); //включаем d1
    break;
    case 1: 
    digitalWrite(d2, LOW); //включаем d2
    break;
    case 2: 
    digitalWrite(d3, LOW); //включаем d3
    break;
    default: 
    digitalWrite(d4, LOW); //включаем d4
    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 clearLEDs()
{
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
 
}
 
// вывод 0
void zero()
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, LOW);
}
 
// вывод 1
void one()
{
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
}
 
// вывод 2
void two()
{
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}
  
// вывод 3
void three()
{
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}
 
// вывод 4
void four()
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, HIGH);
}
 
// вывод 5
void five()
{
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}
  
// вывод 6
void six()
{
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}
 
// вывод 7
void seven()
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, LOW);
}
 
// вывод 8
void eight()
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}
 
// вывод 9
void nine()
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}
void rgb()
{
 if (count <= 20);
 digitalWrite(gled, HIGH);
 else
 digitalWrite(gled, LOW);
}

// счетчик
void add()
{
  count ++;
  if(count == 10)
  {
    count = 0;
    n++;
    if(n == 10000)
    {
      n = 0;
    }
  }
}
}

ничего не замечаете?

Замечаю, что это не верно, хотелось бы понять как правильно его включить в скетч.

что, неужто в упор не видите?
Точку с запятой уберите после условия

Исправлено

#include <TimerOne.h>
int a = 7;
int b = 3;
int c = 4;
int d = 5;
int e = 6;
int f = 2;
int g = 8;
int p = 9;
int d4 = A1;
int d3 = A2;
int d2 = A3;
int d1 = A4;
long n = 0; 
int x = 100;
int del = 5;
int count = 0;
int rled = 11;
int gled = 9;
int bled = 10;
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(rled, OUTPUT);
  pinMode(gled, OUTPUT);
  pinMode(bled, OUTPUT);

  Timer1.initialize(100000);
  Timer1.attachInterrupt( add );
}

 
void loop()
{
  clearLEDs();
  pickDigit(0); //включаем первую цифру
  pickNumber((n/1000)); //значение тысячи
  delay(del); //пауза 5мс
 
  clearLEDs();
  pickDigit(1); //включаем вторую цифру
  pickNumber((n%1000)/100); //значение сотни
  delay(del); //пауза 5мс
 
  clearLEDs();
  pickDigit(2); //включаем третью цифру
  pickNumber(n%100/10); //значение десятки
  delay(del); //пауза 5мс
 
  clearLEDs();
  pickDigit(3); //включаем четвертую цифру
  pickNumber(n%10); //значение единицы
  delay(del); //пауза 5мс
  rgb();
}
 
// определение разряда
void pickDigit(int x)
{  
  digitalWrite(d1, HIGH);
  digitalWrite(d2, HIGH);
  digitalWrite(d3, HIGH);
  digitalWrite(d4, HIGH);
 
  switch(x)
  {
    case 0: 
    digitalWrite(d1, LOW); //включаем d1
    break;
    case 1: 
    digitalWrite(d2, LOW); //включаем d2
    break;
    case 2: 
    digitalWrite(d3, LOW); //включаем d3
    break;
    default: 
    digitalWrite(d4, LOW); //включаем d4
    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 clearLEDs()
{
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
 
}
 
// вывод 0
void zero()
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, LOW);
}
 
// вывод 1
void one()
{
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
}
 
// вывод 2
void two()
{
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}
  
// вывод 3
void three()
{
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}
 
// вывод 4
void four()
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, HIGH);
}
 
// вывод 5
void five()
{
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}
  
// вывод 6
void six()
{
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}
 
// вывод 7
void seven()
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, LOW);
}
 
// вывод 8
void eight()
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}
 
// вывод 9
void nine()
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}
void rgb()
{
 if (count <= 20)
 digitalWrite(gled, HIGH);
 else
 digitalWrite(gled, LOW);
}

// счетчик
void add()
{
  count ++;
  if(count == 10)
  {
    count = 0;
    n++;
    if(n == 10000)
    {
      n = 0;
    }
  }
}

Это ,безусловно, замечательно, что благодаря вашей внимательности скетч относительно работает, но дойдя до нужной “отметки” в 20 RGB светодиод не отключается, несмотря на условие.

потому что он никогда не доходит до двадцати

Такое впечатление, что этот код вы где-то передрали и даже не прочитали толком.

1 лайк

Уж не сарказм ли это?
Вы пришли сюда за помощью - вам помогли - а вы еще и недовольны?
Кто виноват, что ВАШ скетч не работает? - может я? или это компания ардуино не выполнила свои обязательства? :slight_smile:

Вообще-то такие глупые ошибки вы должны были увидеть сами.

Я возможно не так выразился, имелось в виду, что при возникновении на самом счетчике индикатора, про который ранее говорилось, светодиод прекратит свою работу. Я не до конца понимаю как связать счет таймера и светодиод, а данные строки, на которые вы ссылаетесь были лишь попыткой, которая не увенчалась успехом.

Были они попыткой или нет - однако со “строками, на которые я ссылаюсь” - светодиод у вас никогда не переключится.
Поменяйте в строке 275 число 10 на, например, 40 - и светодиод начнет мигать.

Действительно, мигает, однако так же замедляется ход таймера, т.к строка 275 изначально задавала его.

Сделайте выводы и поменяйте, как надо.

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

Вы имеете в виду, обратить внимание на функцию самого счетчика?

Вы понимаете, почему исправление 10 на 40 поменяло работу кода? Если нет - разберитесь. Тогда вы сможете поменять другие константы и настроить работу таймера как вам надо.

Я пытаюсь вникнуть в суть самого кода, но я никак не могу сообразить, как правильно прописать, чтобы при определенном числе на счетчике прервалось свечение RGB светодиода с переходом в другой цвет. Ломаю голову над этим весь вечер, но никак не могу прийти к верному решению данного вопроса.

Это сильно!

Т.е, что вы хотите этим сказать? Какую смысловую нагрузку вы задаете? И каким образом мне это поможет?

А сам то не понял разве? Почитай книшку какую по С++

Именно то, что сказал.

Вы не понимаете по-русски? Как же Вы надеетесь понять ответы на свои вопросы?

Не знаю. У меня появилось желание высказать свою эмоциональную оценку, я высказал. Нельзя?