Вопрос по коду для простых часов на семисегментном индикатор

Kruppa
Offline
Зарегистрирован: 18.12.2015

Добрый день!

Прошу подсказать, что я сделал не так, никак не могу понять...

Есть семисегментный индикатор, отдельно выводить разные цифры - получается, а вот чередовать - нет

Сам код


int i;
void setup() {
  // put your setup code here, to run once:
pinMode(2,OUTPUT);  //Вывод + на 1 сегмент
pinMode(3,OUTPUT);  // Вывод + на 2 сегмент

pinMode(7,OUTPUT); //Выводы на индиакторы сегментов
pinMode(8,OUTPUT);//Выводы на индиакторы сегментов
pinMode(9,OUTPUT);//Выводы на индиакторы сегментов
pinMode(10,OUTPUT);//Выводы на индиакторы сегментов
pinMode(11,OUTPUT);//Выводы на индиакторы сегментов
pinMode(12,OUTPUT);//Выводы на индиакторы сегментов
pinMode(13,OUTPUT);//Выводы на индиакторы сегментов

i=0;//Счетчик

}

void loop()
{

click1(); //отключаем второй сегмент и включаем первый
  if(i<500){
            ONE(); // Пишем цифру 1, 
            }
    if((i>=500)&&(i<1000));
            {
              TWO(); // Через некоторое время - 2
             
             }
    if ((i>=1000)&&(i<1500))
            {
              THREE(); // А теперь - три
            
            }
    if(i>=1500)   // Обнуляем счетчик
            {
            i=0;
            }

click2(); // Выключаем первый сегмент и включаем второй
TWO(); // пишем цифру 2


i=i+1; // Добавляем единицу счетчику 
}




void click1()
{
  delay(2);
  digitalWrite(2, HIGH);
  digitalWrite(3, LOW);
}
void click2()
{
  delay(2);
  digitalWrite(2, LOW);
  digitalWrite(3, HIGH);
}

void ONE()
{
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
digitalWrite(7, LOW);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
}


void TWO()
{
  digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(7, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
}
void THREE()
{
  digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(7, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
}

 

Kruppa
Offline
Зарегистрирован: 18.12.2015
Kruppa
Offline
Зарегистрирован: 18.12.2015

Вот даташит...

https://yadi.sk/d/a3chks5RyDLn4

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А зачем Вы в строке 42 выводите двойку и всё своё "чередование" ею затираете?

И, кстати, 500 - это очень мало по времени. Сделайте хотя бы 10000 (как раз int хватит).

Kruppa
Offline
Зарегистрирован: 18.12.2015

500 я взял, т.к. мне была нужна секунда. Там же два раза  delay по 1, следовательно, когда 500 раз они повторятся, будет 1000, т.е. секуда.

Строка 42 включает цифру второго сегмента ( их же там 4)

Но она же не обнуляет счетчик... или я что-то не понимаю? 

Так как у всех четырех частей/сегментов общий плюс, то включать их можно только  циклически, с минимальным интервалом (чтоб мерцание не было заметно глазу).

 

Kruppa
Offline
Зарегистрирован: 18.12.2015

Да, в delay изначально была единица)))

Kruppa
Offline
Зарегистрирован: 18.12.2015

Поменял код, заменив счетчик на millis();

 

int i;
int  t;

void setup() {
  // put your setup code here, to run once:
pinMode(2,OUTPUT);  //Вывод + на 1 сегмент
pinMode(3,OUTPUT);  // Вывод + на 2 сегмент

pinMode(7,OUTPUT); //Выводы на индиакторы сегментов
pinMode(8,OUTPUT);//Выводы на индиакторы сегментов
pinMode(9,OUTPUT);//Выводы на индиакторы сегментов
pinMode(10,OUTPUT);//Выводы на индиакторы сегментов
pinMode(11,OUTPUT);//Выводы на индиакторы сегментов
pinMode(12,OUTPUT);//Выводы на индиакторы сегментов
pinMode(13,OUTPUT);//Выводы на индиакторы сегментов

i=0;
t=0;
}

void loop()
{

t=(millis()-i);

click1(); //отключаем второй сегмент и включаем первый
  if(t<1000){
            ONE(); // Пишем цифру 1, 
            }
    if((t>=1000)&&(i<2000));
            {
              TWO(); // Через некоторое время - 2
             
             }
    if ((t>=2000)and(i<3000))
            {
              THREE(); // А теперь - три
            
            }
    if(t>=3000)   // Обнуляем счетчик
            {
            i=millis();
            t=0;
            }

click2(); // Выключаем первый сегмент и включаем второй
TWO(); // пишем цифру 2


}




void click1()
{
  delay(10);
  digitalWrite(2, HIGH);
  digitalWrite(3, LOW);
}
void click2()
{
  delay(10);
  digitalWrite(2, LOW);
  digitalWrite(3, HIGH);
}

void ONE()
{
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
digitalWrite(7, LOW);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
}


void TWO()
{
  digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(7, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
}
void THREE()
{
  digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(7, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
}

Теперь картина еще интереснее.

Показывает 1, потом 3 (в первом сегменте, во втором, как и планировал по коду, пока только единица).

потом длинная пауза, секунд 20.

потом 1 (две секунды) 3 ...(повторяется раз 10) и опять длинная пауза...

 

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

Kruppa пишет:

Есть семисегментный индикатор, отдельно выводить разные цифры - получается, а вот чередовать - нет

чередовать - это как?

у тебя же подключен один индиктор(сюдя по коду)... или это подлючены параллельно два индикатора?

если так, то на эти два, параллельно подключенных индикатора возможно вывести только две одинаковые цифры.

Kruppa
Offline
Зарегистрирован: 18.12.2015

Один четырехразрядный.

Разные цифры получается ставить в разные разряды.

А вот чередовать цифры в одном разряде,  не получается.  Что-то делаю не так с кодом

Kruppa
Offline
Зарегистрирован: 18.12.2015

На все четыре разряда общие плюсы.

Поэтому,  цифры должны включаться и выключаться попеременно. Иначе не получится включить в разных разрядах разные цифры.

Т.е. сперва горит первый разряд, другие выключены. 

Потом второй, первый,  третий и четвертый выключены и т.п.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

http://www.cohesivecomputing.co.uk/hackatronics/arduino-multi-function-shield/part-3/

/* 
Пример использования 4-х значного 7-ми сегментного индикатора на многофункциональной плате
 Multi_function_Shield
2х МС74НС595 АD ->4 семисегментных индикатора
QA1-1;QB1-2;QC1-3;QD1-4;QE1-NC;QF1-NC;QG1-NC;QH1-NC
QA2-a;QB2-b;QC2-c;QD2-d;QE2-e; QF2-f; QG2-g; QH2-h
      DATA  ->8  (Data_pin)
       CLK  ->7  (CLK_pin)
     LATCH  ->4  (LATCH_pin)
*/
//#1 счетчик
uint8_t Count; // счетчик
//#2
const int Latch_pin=4;
const int CLK_pin  =7;
const int Data_pin =8;
// матрица цифр 0 to 9 
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};
// матрица выбора знакоместа 1 to 4 
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};
// Вывод числа на экран
void WriteNumber(int Number) {
  WriteNumberToSegment(0 , Number / 1000);
  WriteNumberToSegment(1 , (Number / 100) % 10);
  WriteNumberToSegment(2 , (Number / 10) % 10);
  WriteNumberToSegment(3 , Number % 10);
}
// запись нужного числа (0-9) в нужную позицию(1-4) 
void WriteNumberToSegment(byte Segment, byte Value){
  digitalWrite(Latch_pin,0); 
  shiftOut(Data_pin, CLK_pin, MSBFIRST, SEGMENT_MAP[Value]);
  shiftOut(Data_pin, CLK_pin, MSBFIRST, SEGMENT_SELECT[Segment] );
  digitalWrite(Latch_pin,1);    
}

void setup ()  {
  //#1
  Count = 0;
  //#2
  pinMode(Latch_pin,OUTPUT);
  pinMode(CLK_pin,OUTPUT);
  pinMode(Data_pin,OUTPUT); 
}
void loop(){
  static uint32_t MILLIS ;
  MILLIS = millis() ;
  //#1   100 милисек счетчик 
  static uint32_t future1 = 0 ;
    if (MILLIS >= future1)   {
    future1 = MILLIS + 100 ;
    Count++;
    if(Count > 9999) Count = 0;
    }
  //#2 непрерывно дисплей
  WriteNumber(Count);
}

 

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

Kruppa пишет:

Один четырехразрядный.

Разные цифры получается ставить в разные разряды.

дык, не получается - получается рулить анодами разрядов. если аноды не отключать во всех разрядах будет одна цифра.

Kruppa пишет:

А вот чередовать цифры в одном разряде,  не получается.  Что-то делаю не так с кодом

ну, я тоже не вижу 4-х переменных разрядов и условий их индикации типо: светим 1-й разряд - анод в нужное положение, сегменты в нужное положение... и тд. 2-й разряд... 4-й разряд

Kruppa
Offline
Зарегистрирован: 18.12.2015

Почему нет?

Я же сделал функции ckick1 и click2 для первого и второго разрядов (для 3 и 4 пока не делал)

 

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

Kruppa пишет:

Почему нет?

Я же сделал функции ckick1 и click2 для первого и второго разрядов (для 3 и 4 пока не делал)

а это кто будет делать?

Клапауций 234 пишет:

сегменты в нужное положение... и тд. 2-й разряд... 4-й разряд

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

*!!! у тебя там путаница в названиях сущностей, возможно поэтому запутался?

pinMode(7,OUTPUT); //Выводы на индиакторы сегментов

pinMode(2,OUTPUT);  //Вывод + на 1 сегмент

сегменты - это рисочки разряда из которых строится цифра.

разряд - это 7-мь сегментов(не будем считать точки пока), физически расположенные в одном разряде.

pinMode(2,OUTPUT);  //Вывод + на 7-мь сегментов

Kruppa
Offline
Зарегистрирован: 18.12.2015

Да, виноват,  неправильно написал. 

2 и 3 вывод на управляющие аноды разрядов,а не сегменты...

Kruppa
Offline
Зарегистрирован: 18.12.2015

Когда меняю одну цифру на другую в одном сегменте (при этом другой сегмент статичен) всё работает.

Как только цифр уже больше двух(в одном ссегменте), пытаюсь посчитать секунды,  начинается какая-то свисто-пляска.

 

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

та намутил ты с переключалкой цифр - не будет она у тебя работать

так попробуй


unsigned long stop = millis();
unsigned long start = stop;

void loop() {
stop = millis();
if (stop - start > 1000) {start = stop;
// что-то делаем каждые 1000 миллисекунд
}
}

или подключи к балалайке пару кнопок - будет проще кнопками цифры переключать

Kruppa
Offline
Зарегистрирован: 18.12.2015

Спасибо!! Так теперь работает! Клапауций просто гений!)