Семисегментный индикатор

Семисегментный индикатор — это индикатор, позволяющий отображать цифровую информацию. Чаще всего состоит из 7 светодиодов. Иногда добавляют точку, для чего в индикаторе присутствует дополнительный восьмой светодиод, как в нашем случае.

Ниже представлен пример использования такого индикатора совместно с Arduino nano.

Данный индикатор имеет 10 выводов по пять с каждой стороны. Средний вывод обоих сторон — общая земля. Остальные выводы соответствуют сегментам индикатора.

Так как такие индикаторы состоят из обычных светодиодов, при подаче на них 5 вольт, светодиоды могут перегореть. Поэтому, сегменты чаще всего подключаются к портам Arduino через сопротивления. Для простоты схемы, иногда подключают общее сопротивление к выводу земли. Однако такой вид подключения имеет один недостаток — яркость свечения зависит от количество одновременно включенных сегментов.

Приведенный ниже пример позволяет избежать этот недостаток, при этом не усложнив схему. Все выводы подключаются к цифровым портам Arduino, в том числе и вывод земли индикатора. При этом, чтобы не испортить светодиоды в индикаторе, на вывод земли подается ШИМ-сигнал, равная примерно половине мощности. При таком подключении, из-за быстрого включения-выключения светодиодов, они не успевают перегреться и испортиться. При этом яркость свечения уже мало зависит от количество одновременно включенных сегментов.

Ниже приведена программа, которая отображает все цифры по-очереди:

//Выключить все сегменты индикатора
void VV(){
  for (int i=2; i<12; i++)//Цикл по всем портам
    digitalWrite(i,0);//Выключение портов
}
void setup() {
  pinMode(9,1);
  analogWrite(9,125);
  //Используем 9-й порт в качестве общей земли
}
void odin(){//Отображение единицы в индикаторе
  VV();//Выключение всех сегментов
  pinMode(2,1);
  digitalWrite(2,1);//Включение нужных сегментов
  pinMode(6,1);
  digitalWrite(6,1);
}
void dva(){//Отображение двойки в индикаторе
  VV();
  pinMode(7,1);
  digitalWrite(7,1);
  pinMode(6,1);
  digitalWrite(6,1);
  pinMode(5,1);
  digitalWrite(5,1);
  pinMode(3,1);
  digitalWrite(3,1);
  pinMode(11,1);
  digitalWrite(11,1);
}
void tri(){//Отображение тройки в индикаторе
  VV();
  sem();//Сначала включаем семерку
  pinMode(11,1);//затем недостающие до тройки сегменты
  digitalWrite(11,1) ;//Такой метод сокращает код программы
  pinMode(3,1);
  digitalWrite(3,1) ;
}
void chetyre(){//Отображение четверки в индикаторе
  VV();
  odin(); 
  pinMode(8,1);
  digitalWrite(8,1) ;
  pinMode(11,1);
  digitalWrite(11,1) ;
} 
void pyat(){//Отображение пятерки в индикаторе
  VV();
  pinMode(7,1);
  digitalWrite(7,1) ;
  pinMode(8,1);
  digitalWrite(8,1) ;
  pinMode(11,1);
  digitalWrite(11,1) ;
  pinMode(3,1);
  digitalWrite(3,1) ;
  pinMode(2,1);
  digitalWrite(2,1) ;
} 
void shest(){//Отображение шестерки в индикаторе
  VV();    
  pyat(); 
  pinMode(5,1);
  digitalWrite(5,1) ;
}
void sem(){//Отображение семерки в индикаторе
  VV();
  odin();
  pinMode(7,1);
  digitalWrite(7,1);
}
void vosem(){//Отображение восьмерки в индикаторе
  VV();
  shest();    
  digitalWrite(6,1);
}
void devyt(){//Отображение девятки в индикаторе
  VV();    
  vosem();
  digitalWrite(5,0);
  
}
void nol(){//Отображение нуля в индикаторе
  VV();  
  vosem();
  digitalWrite(11,0);
}
int d=300;
void loop() {
  odin();//Отображение единицы
  delay(d);//Задержка в d мс.
  dva();//отображение двойки
  delay(d);//и т.д...
  tri();
  delay(d);
  chetyre();
  delay(d);
  pyat();
  delay(d);
  shest();
  delay(d);
  sem();
  delay(d);
  vosem();
  delay(d);
  devyt();
  delay(d);
  nol();
  delay(d); 
}

В данном примере реализованы функции, отображающие соответствующие цифры на индикаторе. А в основном цикле (void loop()) эти функции вызываются один за другим с задержкой заданной переменной d.

Выражаю благодарность автору данного примера Хасиевой Алине за разработку программы.