3 семи сегментных индикатора без сдвигового регистра.

triada13
Offline
Зарегистрирован: 04.01.2013

Доброе время суток.

Подскажите можно ли заставить работать индикаторы по следующему алгоритму:

1. последовательно по часовой стрелке загораются 6 сегментов 1 индикатора, тем самым образуя цифру 0.

2. первый индикатор остается вкл.

Последовательно по часовой стрелке загораются 6 сегментов 2 индикатора, тем самым образуя цифру 0.

3. первый и второй индикаторы остаются вкл.

Последовательно по часовой стрелке загораются 6 сегментов 3 индикатора, тем самым образуя цифру 0.

4. все три индикатора светятся.

Последовательно по часовой стрелке гаснут 6 сегментов 1 индикатора. Второй и третий индикаторы светятся.

5. Последовательно по часовой стрелке гаснут 6 сегментов 2 индикатора. Третий индикатор светится.

6. Последовательно по часовой стрелке гаснут 6 сегментов 3 индикатора.  Переход на пункт первый.

Пауза между зажиганием сегментов 100 ms, пауза между зажиганием индикаторов 50 ms.

Вот схема подключения:

Вот примерный код:

int ledPin;
int ledPanel;

void setup() 
{
  pinMode(ledPin,  OUTPUT);
  pinMode(ledPanel, OUTPUT);
 
  Serial.begin(9600);
  
}

void loop() 
{
 for (ledPanel=8; ledPanel<10; ledPanel++)
  {
   digitalWrite(ledPanel, HIGH);
   cikleOn();
   Serial.print("LedPanelON: ");
   Serial.println(ledPanel);
   delay(100);
  }
  
  for (ledPin=8; ledPin<10; ledPin++)
  {
   digitalWrite(ledPanel, LOW);
   cikleOff();
   Serial.print("LedPanelOFF: ");
   Serial.println(ledPanel);
   delay(100);
  }
  
}

void cikleOn()
{
  for (ledPin=2; ledPin<8; ledPin++)
  {
   digitalWrite(ledPin, LOW);
   Serial.print("LedPinON: ");
   Serial.println(ledPin);
   delay(100);
  }
}

void cikleOff()
{
  for (ledPin=2; ledPin<8; ledPin++)
  {
   digitalWrite(ledPin, HIGH);
   Serial.print("LedPinOFF: ");
   Serial.println(ledPin);
   delay(100);
  }
  
}

 

msng
Offline
Зарегистрирован: 07.06.2012

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

triada13
Offline
Зарегистрирован: 04.01.2013

что значит динамическую? это когда часто часто моргает? По поводу delay согласен.

msng
Offline
Зарегистрирован: 07.06.2012

с delay не получится то что хотите... примеры есть типа мигаем светодиодом без delay

да динамическая это когда часто моргает

 

 

triada13
Offline
Зарегистрирован: 04.01.2013

Хорошо сначало уберу делэй.

triada13
Offline
Зарегистрирован: 04.01.2013

delay вроде убрал, но что то мне поведение кода не нравится, а как исправить незнаю. Народ подскажите в какую сторону думать.

код:

int ledPin;
int ledPanel;
long previousMillis = 0;
//long previousMillis2 = 0;// здесь будет храниться время последнего изменения состояния светодиода
long interval1 = 5000;
//long interval2 = 500;      // интервал мигания в миллисекундах
 

void setup() 
{
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
 
  Serial.begin(9600);
  
}

void loop() 
{

 for (ledPanel=8; ledPanel<=10; ledPanel++)
  {
   digitalWrite(ledPanel, HIGH);
   cikleOn();
   Serial.print("LedPanelON: ");
   Serial.println(ledPanel);
   iterval();
   //  delay(100);
  }


 iterval();

  for (ledPanel=8; ledPanel<=10; ledPanel++)
  {
   digitalWrite(ledPanel, LOW);
   cikleOff();
   Serial.print("LedPanelOFF: ");
   Serial.println(ledPanel);
   iterval();
   //delay(100);
  }
  
 
}

void iterval()
{
  if (millis() - previousMillis > interval1)
 { 
  previousMillis = millis();   
 }
}

void cikleOn()
{
   
   for (ledPin=2; ledPin<8; ledPin++)
   {
    digitalWrite(ledPin, LOW);
    Serial.print("LedPinON: ");
    Serial.println(ledPin);
    iterval();
    // delay(100);
   }
}

void cikleOff()
{
   for (ledPin=2; ledPin<8; ledPin++)
   {
    digitalWrite(ledPin, HIGH);
    Serial.print("LedPinOFF: ");
    Serial.println(ledPin);
    iterval();
    //delay(100);
   }
}

 

msng
Offline
Зарегистрирован: 07.06.2012

вы не избавились от delay

вам надо разобратся с этим примером....

воткните в дуньку два диода и помигайте ими поочередно без delay

а лучше воткнуть диоды между двумя выходами через резистор (как у вас)

triada13
Offline
Зарегистрирован: 04.01.2013

Как не избавился? Все delay закоментированы. Или я что то не так понимаю?

msng
Offline
Зарегистрирован: 07.06.2012

вам надо чтоб в такой-то промежуток времени (if(currentMillis - previousMillis > interval)) какието выходы были в hi а другие в low

 

triada13
Offline
Зарегистрирован: 04.01.2013

Я пробовал оборачивать код в оператор if с. millis, но у меня не получилось. при компиляции ошибка выскакивала.

triada13
Offline
Зарегистрирован: 04.01.2013

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

Народ подскажите плиз куда рыть, вот код:


//const int ledPin =  13;      // номер выхода, подключенного к светодиоду
int ledPin;
int ledPanel;
//long previousMillis = 0;
//long interval1 = 50;
unsigned long currentMillis;


//int ledState = LOW;             // этой переменной устанавливаем состояние светодиода 
long previousMillis = 0;        // храним время последнего переключения светодиода

long interval = 1000;           // интервал между включение/выключением светодиода (1 секунда)

void setup() 
{
  Serial.begin(9600);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
}


void loop()
{
  // здесь будет код, который будет работать постоянно
  // и который не должен останавливаться на время между переключениями свето
  currentMillis = millis();
 
  //проверяем не прошел ли нужный интервал, если прошел то
  if(currentMillis - previousMillis > interval) 
  {
    // сохраняем время последнего переключения
    previousMillis = currentMillis;  

    for (ledPanel=8; ledPanel<=10; ledPanel++)
     {
      digitalWrite(ledPanel, HIGH);
      cikleOn();
      Serial.print("LedPanelON: ");
      Serial.println(ledPanel);
     }
  }
  
  if(currentMillis - previousMillis > interval) 
  {
    // сохраняем время последнего переключения
    previousMillis = currentMillis;  
    for (ledPanel=8; ledPanel<=10; ledPanel++)
     {
       digitalWrite(ledPanel, LOW);
       cikleOff();
       Serial.print("LedPanelOFF: ");
       Serial.println(ledPanel);
       //iterval();
       //delay(100);
     }
  }  
  
}

void cikleOn()
{
  if(currentMillis - previousMillis > interval) 
  {
    //previousMillis = currentMillis;  
   
   for (ledPin=2; ledPin<=7; ledPin++)
   {
    digitalWrite(ledPin, LOW);
    Serial.print("LedPinON: ");
    Serial.println(ledPin);
    //iterval();
    // delay(100);
   }
  }
}

void cikleOff()
{
  if(currentMillis - previousMillis > interval) 
  {
    //previousMillis = currentMillis;  
   for (ledPin=2; ledPin<=7; ledPin++)
   {
    digitalWrite(ledPin, HIGH);
    Serial.print("LedPinOFF: ");
    Serial.println(ledPin);
    //iterval();
    //delay(100);
   }
  }
}
triada13
Offline
Зарегистрирован: 04.01.2013

Судя по сериал монитору почемуто не отрабатывается как положено цикл for в функциях cikleOn и cikleOff с положенным интервалом.

LedPanelON: 8
LedPanelON: 9
LedPanelON: 10
LedPanelON: 8
LedPanelON: 9
LedPanelON: 10
LedPanelON: 8
LedPanelON: 9
LedPanelON: 10
LedPanelON: 8
LedPanelON: 9
LedPanelON: 10