#1 Програмування Arduino » Прерывание по таймеру » 2019-12-23 18:53:01

Seryoga
відповідей: 5

Подскажите как сделать прерывание по таймеру так чтобы диоды загорались и тухли по очередно c интервалам 0,8сек

int led1 = 2;
int led2 = 3;
int led3 = 4;
int led4 = 5;
int led5 = 6;
int led6 = 7;

volatile unsigned long int timerLED1;       
                                            
unsigned long int timePreview = 0;  
bool LEDOn = 0; 
 
ISR (TIMER0_COMPA_vect) 
{
    timerLED1++;        
    if(timerLED1 - timePreview >= 800) 
    {                                    
      timePreview = timerLED1;           
     
      digitalWrite(led1, 1);
          
    }  
    
}
void setup() 
{
      
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led6, OUTPUT);
  
  TCCR0A |= (1 << WGM01);              
  OCR0A = 0xF9;                       
  TIMSK0 |= (1 << OCIE0A);            
  TCCR0B |= (1 << CS01) | (1 << CS00); 
  sei();                               
}
void loop() 
{
  
}

#2 Re: Програмування Arduino » 4 разрядный 7 сегментный индикатор » 2019-10-19 17:53:43

Kaka пише:

Ну, так и вперёд!

Ты смысл-то динамической индикации понимаешь? Как она вообще работает? Если да, то всё, что нужно ты уже умеешь, теперь делай.

Как сделаешь, я могу рассказать тебе как это делается правильно на самом деле.

Намудри так намудрил теперь попробую оптимизирувать спасибо за помощь

int anodPins[] = {A1, A2, A3, A4};
int segmentsPins[] = {5, 6, 7, 8, 9, 10, 11, 12};

void setup() {
  for (int i = 0; i < 4; i++) {
    pinMode(anodPins[i], OUTPUT);
  }
  for (int i = 0; i < 8; i++) {
    pinMode(segmentsPins[i], OUTPUT);
  }
}

int seg0[] = {1, 1, 1, 1, 1, 1, 0, 0};
int seg1[] = {0, 1, 1, 0, 0, 0, 0, 0}; //Цифра 1
int seg2[] = {1, 1, 0, 1, 1, 0, 1, 0}; //Цифра 2
int seg3[] = {1, 1, 1, 1, 0, 0, 1, 0}; //Цифра 3
int seg4[] = {0, 1, 1, 0, 0, 1, 1, 0}; //Цифра 4
int seg5[] = {1, 0, 1, 1, 0, 1, 1, 0}; //Цифра 5
int seg6[] = {1, 0, 1, 1, 1, 1, 1, 0}; //Цифра 6
int seg7[] = {1, 1, 1, 0, 0, 0, 0, 0}; //Цифра 7
int seg8[] = {1, 1, 1, 1, 1, 1, 1, 0}; //Цифра 8
int seg9[] = {1, 1, 1, 1, 0, 1, 1, 0}; //Цифра 9

void loop() {
  
  int i = 0;
  

    for (int k = 0; k < 8; k++) {
      digitalWrite(segmentsPins[k], ((seg1[k] == 1) ? LOW : HIGH));  
    }
     
    digitalWrite(anodPins[i], HIGH); // Подали напряжение на анод - все индикаторы загорелись
    delay(1); // Дали паузу глазу воспринять 
    digitalWrite(anodPins[i], LOW); // Сняли напряжение с анода, чтобы переключение катодов не вызывали мерцание

int a = 1;
  

    for (int k = 0; k < 8; k++) {
      digitalWrite(segmentsPins[k], ((seg2[k] == 1) ? LOW : HIGH));  
    }
     
    digitalWrite(anodPins[a], HIGH); // Подали напряжение на анод - все индикаторы загорелись
    delay(1); // Дали паузу глазу воспринять 
    digitalWrite(anodPins[a], LOW);

    int c = 2;
  

    for (int k = 0; k < 8; k++) {
      digitalWrite(segmentsPins[k], ((seg3[k] == 1) ? LOW : HIGH));  
    }
     
    digitalWrite(anodPins[c], HIGH); // Подали напряжение на анод - все индикаторы загорелись
    delay(1); // Дали паузу глазу воспринять 
    digitalWrite(anodPins[c], LOW);

    int x = 3;
  

    for (int k = 0; k < 8; k++) {
      digitalWrite(segmentsPins[k], ((seg4[k] == 1) ? LOW : HIGH));  
    }
     
    digitalWrite(anodPins[x], HIGH); // Подали напряжение на анод - все индикаторы загорелись
    delay(1); // Дали паузу глазу воспринять 
    digitalWrite(anodPins[x], LOW);
 
}

#3 Re: Програмування Arduino » 4 разрядный 7 сегментный индикатор » 2019-10-19 14:02:08

Kaka пише:

Попробуй сделать i (в int i = 0;) единицей или двойкой, посмотри, что будет

уже 0=равен первой цифре 1=второй 2=третий 3=четвертой

#4 Re: Програмування Arduino » 4 разрядный 7 сегментный индикатор » 2019-10-19 11:26:03

Kaka пише:

Хорошо, не выводи пока. Просто убери цикл. Вывелась только одна первая цифра? Если да, попробуй вывести вторую.

Немного понял теперь могу вывести только одну цифру теперь буду думать как несколько вывисти

int anodPins[] = {A1, A2, A3, A4};
int segmentsPins[] = {5, 6, 7, 8, 9, 10, 11, 12};

void setup() {
  for (int i = 0; i < 4; i++) {
    pinMode(anodPins[i], OUTPUT);
  }
  for (int i = 0; i < 8; i++) {
    pinMode(segmentsPins[i], OUTPUT);
  }
}

int seg0[] = {1, 1, 1, 1, 1, 1, 0, 0};
int seg1[] = {0, 1, 1, 0, 0, 0, 0, 0}; //Цифра 1
int seg2[] = {1, 1, 0, 1, 1, 0, 1, 0}; //Цифра 2
int seg3[] = {1, 1, 1, 1, 0, 0, 1, 0}; //Цифра 3
int seg4[] = {0, 1, 1, 0, 0, 1, 1, 0}; //Цифра 4
int seg5[] = {1, 0, 1, 1, 0, 1, 1, 0}; //Цифра 5
int seg6[] = {1, 0, 1, 1, 1, 1, 1, 0}; //Цифра 6
int seg7[] = {1, 1, 1, 0, 0, 0, 0, 0}; //Цифра 7
int seg8[] = {1, 1, 1, 1, 1, 1, 1, 0}; //Цифра 8
int seg9[] = {1, 1, 1, 1, 0, 1, 1, 0}; //Цифра 9

void loop() {
  
  int i = 0;

    for (int k = 0; k < 8; k++) {
      digitalWrite(segmentsPins[k], ((seg1[k] == 1) ? LOW : HIGH));
    }
    digitalWrite(anodPins[i], HIGH); // Подали напряжение на анод - все индикаторы загорелись
    delay(1); // Дали паузу глазу воспринять 
    digitalWrite(anodPins[i], LOW); // Сняли напряжение с анода, чтобы переключение катодов не вызывали мерцание
  
}

#5 Re: Програмування Arduino » 4 разрядный 7 сегментный индикатор » 2019-10-18 23:05:46

Kaka пише:

Ну, если понял, то что тебе мешает выводить разные числа? Убирай нахрен цикл вывода одного и того же в 4 разряда (строку for (int i = 0; i < 4; i++) { и соответствующую закрывающую скобку) и выводи сначала одну цифру. потом также вторую, потом также третью. Что мешает?

И да, кстати, во всех твоих примерах последним идёт 0. Надеюсь, ты пробовал делать его 1 и знаешь что при этом получается.

блин не выходит либо я дибил либо не так собрал

#6 Re: Програмування Arduino » 4 разрядный 7 сегментный индикатор » 2019-10-18 22:24:35

Kaka пише:

Ты сделал, что я сказал?  Сделай, покажи мне как ты выводишь 2222, тогда поговорим. Просто покаж вывод.

Пока ты этого не сделаешь, даже не думай, что ты что-то понял. Ничего ты не понял.

я понял ка это
     A, B, C, D, E, F, G,DP - распиновка сегментов
  {1, 1, 1, 1, 1, 1, 0, 0} //Цифра 0
  {0, 1, 1, 0, 0, 0, 0, 0}, //Цифра 1
  {1, 1, 0, 1, 1, 0, 1, 0}, //Цифра 2
  {1, 1, 1, 1, 0, 0, 1, 0}, //Цифра 3
  {0, 1, 1, 0, 0, 1, 1, 0}, //Цифра 4
  {1, 0, 1, 1, 0, 1, 1, 0}, //Цифра 5
  {1, 0, 1, 1, 1, 1, 1, 0}, //Цифра 6
  {1, 1, 1, 0, 0, 0, 0, 0}, //Цифра 7
  {1, 1, 1, 1, 1, 1, 1, 0}, //Цифра 8
  {1, 1, 1, 1, 0, 1, 1, 0}  //Цифра 9
только как водить число с разными елементами

#7 Re: Програмування Arduino » 4 разрядный 7 сегментный индикатор » 2019-10-18 22:09:03

Kaka пише:

В строке

int seg[] = {0, 1, 1, 0, 0, 0, 0, 0};

Меняй 0 на 1 и смотри, что получается. Когда тебе покажется, что понял, попробуй вывести 2222, потом 3333. Когда это сделаешь, дальше легче пойдёт.

Меняй только эту строку. Разберись с нею досконально!

это я понял мне как вести чтобы числа были разные к примеру 1234 или 9321

#8 Програмування Arduino » 4 разрядный 7 сегментный индикатор » 2019-10-18 19:48:59

Seryoga
відповідей: 12

на данный момент скетч выводит на индикатор 1111 помогите исправить та чтобы выводил 12.21

int anodPins[] = {A1, A2, A3, A4};
int segmentsPins[] = {5, 6, 7, 8, 9, 10, 11, 12};

void setup() {
  for (int i = 0; i < 4; i++) {
    pinMode(anodPins[i], OUTPUT);
  }
  for (int i = 0; i < 8; i++) {
    pinMode(segmentsPins[i], OUTPUT);
  }
}

int seg[] = {0, 1, 1, 0, 0, 0, 0, 0}; 

void loop() {
  
  for (int i = 0; i < 4; i++) {
    for (int b = 0; b < 8; b++) {
      digitalWrite(segmentsPins[b], ((seg[b] == 1) ? LOW : HIGH));
    }
    digitalWrite(anodPins[i], HIGH);
    delay(1);
    digitalWrite(anodPins[i], LOW);
  }
}

#10 Re: Програмування Arduino » Кнопка реверс » 2019-09-28 14:34:48

ard125 пише:

а в обратном направлении тогда как они должны загораться и гаснуть?

8,87,876,765,654,543,432,321,21,1

#11 Re: Програмування Arduino » Кнопка реверс » 2019-09-28 14:06:31

ard125 пише:

а гаснуть как должны?

Да 1.12.123.234.345.456.567.678.78.8. и потом наборот я сделал только в одну сторону int i = 2;
int PIN_BUTTON = 10;
void setup()

{
  Serial.begin(9600);
  for(i=2; i<10; i++)
  pinMode(i, OUTPUT);

}


void  loop()
{
  int buttonState = digitalRead(PIN_BUTTON);
  Serial.println(buttonState);
  if (!buttonState) {
    delay(50);
    return;
  }

  digitalWrite(2, 1); 
  delay(1000);
  digitalWrite(3, 1); 
  delay(1000);
  digitalWrite(4, 1); 
  delay(1000);
  digitalWrite(5, 1);
  digitalWrite(2, 0);   
  delay(1000);
  digitalWrite(6, 1);
  digitalWrite(3, 0);   
  delay(1000);
  digitalWrite(7, 1);
  digitalWrite(4, 0);   
  delay(1000);
  digitalWrite(8, 1);
  digitalWrite(5, 0);   
  delay(1000);
  digitalWrite(9, 1);
  digitalWrite(6, 0);   
  delay(1000);
  digitalWrite(7, 0);   
  delay(1000);
  digitalWrite(8, 0);   
  delay(1000);
  digitalWrite(9, 0);   
  delay(1000);
}

#12 Програмування Arduino » Кнопка реверс » 2019-09-28 13:56:47

Seryoga
відповідей: 8

Нужен скетч так чтобы при первом нажатии кнопки диоды загорались в по порядку 1-8 при втором нажатии наоборот 8-1

Підвал форуму