#1 2023-08-01 23:12:24

Fire159
Учасник
Зареєстрований: 2023-08-01
Повідомлень: 2

Потрібна допомога. два леди та дві кнопки., а можливо і більше)))

Тільки на початку вивчення, маю задачку.

перший сценарій з механічними кнопками реалізував
const int LED_PIN_1 = 10; // Пін для підключення першого світлодіоду (LED1)
const int LED_PIN_2 = 9; // Пін для підключення другого світлодіоду (LED2)
const int BUTTON_PIN_1 = 6; // Пін для підключення першої кнопки
const int BUTTON_PIN_2 = 5; // Пін для підключення другої кнопки

void setup() {
  pinMode(LED_PIN_1, OUTPUT);
  pinMode(LED_PIN_2, OUTPUT);
  pinMode(BUTTON_PIN_1, INPUT_PULLUP); // Встановлення піна з підтягувальним резистором
  pinMode(BUTTON_PIN_2, INPUT_PULLUP); // Встановлення піна з підтягувальним резистором
}

void loop() {
  // Керування першим ледом (LED1)
  if (digitalRead(BUTTON_PIN_1) == LOW) {
    digitalWrite(LED_PIN_1, HIGH); // Увімкнути LED1, якщо кнопка 1 натиснута
  } else {
    digitalWrite(LED_PIN_1, LOW); // Вимкнути LED1, якщо кнопку 1 відпущено
  }

  // Керування другим ледом (LED2)
  if (digitalRead(BUTTON_PIN_2) == LOW) {
    digitalWrite(LED_PIN_2, HIGH); // Увімкнути LED2, якщо кнопка 2 натиснута
  } else {
    digitalWrite(LED_PIN_2, LOW); // Вимкнути LED2, якщо кнопку 2 відпущено
  }
}


други сценарій є проблема або на апаратному або на програмному:

#include <IRremote.h>

const int IR_RECEIVE_PIN = 11; // Пін, на який підключений приймач IR
const int LED_PIN_1 = 10; // Пін для підключення першого світлодіоду (LED)
const int LED_PIN_2 = 9; // Пін для підключення другого світлодіоду (LED)

IRrecv irrecv(IR_RECEIVE_PIN);
decode_results results;

int frequencies[] = {1000, 500, 333, 250, 200, 166, 142, 125, 111, 100};
int currentFrequencyIndex_alternate = 0;
int currentFrequencyIndex_together = 0;
boolean alternateMode = true; // По замовчуванню - поперемінний режим мигання

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn(); // Включення приймача IR
  pinMode(LED_PIN_1, OUTPUT);
  pinMode(LED_PIN_2, OUTPUT);
}

void loop() {
  if (irrecv.decode(&results)) {
    unsigned int buttonCode = results.value; // Отримання коду кнопки

    // Виведення коду кнопки на монітор
    Serial.print("Received button code: 0x");
    Serial.println(buttonCode, HEX);

    // Перевірка, чи кнопка належить діапазону частот для поперемінного режиму (1 Герц - 10 Герц)
    if (buttonCode >= 0x1841 && buttonCode <= 0x184A) {
      currentFrequencyIndex_alternate = buttonCode - 0x1841; // Встановлення індексу частоти для поперемінного режиму
      alternateMode = true; // Включення поперемінного режиму мигання
    }

    // Перевірка, чи кнопка належить діапазону частот для режиму одночасного світіння (1 Герц - 10 Герц)
    if (buttonCode >= 0x1041 && buttonCode <= 0x104A) {
      currentFrequencyIndex_together = buttonCode - 0x1041; // Встановлення індексу частоти для режиму одночасного світіння
      alternateMode = false; // Вимкнення поперемінного режиму мигання
    }

    // Режим постійного світіння обох ледів при натисканні жовтої кнопки
    if (buttonCode == 0x1872 || buttonCode == 0x1072) {
      alternateMode = false;
      currentFrequencyIndex_alternate = -1; // Встановлення індексу постійного світіння
      currentFrequencyIndex_together = -1; // Встановлення індексу постійного світіння
    }

    // Режим світіння 1 секунда першого леда, пауза 1 секунда, другого 1 секунда
    if (buttonCode == 0x1877 || buttonCode == 0x1077) {
      alternateMode = false;
      currentFrequencyIndex_alternate = -2; // Встановлення індексу паузи 1 секунда
      currentFrequencyIndex_together = -2; // Встановлення індексу паузи 1 секунда
    }

    // Режим світіння 1 секунда першого леда, пауза 2 секунда, другого 1 секунда
    if (buttonCode == 0x1876 || buttonCode == 0x1076) {
      alternateMode = false;
      currentFrequencyIndex_alternate = -3; // Встановлення індексу паузи 2 секунди
      currentFrequencyIndex_together = -3; // Встановлення індексу паузи 2 секунди
    }

    irrecv.resume(); // Підготовка до наступного прийому сигналу
  }

  // Мигання поперемінно з заданою частотою або виконання іншого режиму
  if (alternateMode) {
    digitalWrite(LED_PIN_1, HIGH);
    digitalWrite(LED_PIN_2, LOW);
    delay(frequencies[currentFrequencyIndex_alternate] / 2);
    digitalWrite(LED_PIN_1, LOW);
    digitalWrite(LED_PIN_2, HIGH);
    delay(frequencies[currentFrequencyIndex_alternate] / 2);
  } else if (currentFrequencyIndex_together >= 0) {
    digitalWrite(LED_PIN_1, HIGH);
    digitalWrite(LED_PIN_2, HIGH);
    delay(frequencies[currentFrequencyIndex_together]);
    digitalWrite(LED_PIN_1, LOW);
    digitalWrite(LED_PIN_2, LOW);
    delay(frequencies[currentFrequencyIndex_together]);
  } else if (currentFrequencyIndex_alternate == -1 || currentFrequencyIndex_together == -1) {
    digitalWrite(LED_PIN_1, HIGH);
    digitalWrite(LED_PIN_2, HIGH);
  } else if (currentFrequencyIndex_alternate == -2 || currentFrequencyIndex_together == -2) {
    digitalWrite(LED_PIN_1, HIGH);
    delay(1000);
    digitalWrite(LED_PIN_1, LOW);
    delay(1000);
    digitalWrite(LED_PIN_2, HIGH);
    delay(1000);
    digitalWrite(LED_PIN_2, LOW);
    delay(1000);
  } else if (currentFrequencyIndex_alternate == -3 || currentFrequencyIndex_together == -3) {
    digitalWrite(LED_PIN_1, HIGH);
    delay(1000);
    digitalWrite(LED_PIN_1, LOW);
    delay(2000);
    digitalWrite(LED_PIN_2, HIGH);
    delay(1000);
    digitalWrite(LED_PIN_2, LOW);
    delay(1000);
  }
}

Хотілося на пульті та мабуть краще все таки на клавіатурі 4*4.


є два режми: почергове та одночасне  мигання з заданою чатотою (від 1Герца до 8Герц)

наприклад кнопка 1 - 1Гц 2 - 2Гц і так далі а кнопка
* - перемикає між почерговим та одночасним морганням не змінюючи частоту...

також булоб непогано індикацію (1,2,3 і..) частоти

Остання редакція Fire159 (2023-08-01 23:13:40)

Неактивний

#2 2023-08-02 12:53:04

Васятко
Гість

Re: Потрібна допомога. два леди та дві кнопки., а можливо і більше)))

Fire159 пише:

Хотілося

Як мінімум почитайте про millis. З delay нічого з вашого хотіння не вийде

#3 2023-08-02 13:42:06

Fire159
Учасник
Зареєстрований: 2023-08-01
Повідомлень: 2

Re: Потрібна допомога. два леди та дві кнопки., а можливо і більше)))

Пробував. Тоді втрачаю точність, частота невідповідна

Неактивний

#4 2023-08-02 20:02:09

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Потрібна допомога. два леди та дві кнопки., а можливо і більше)))

Fire159 пише:

Пробував. Тоді втрачаю точність, частота невідповідна

// ************************************			
// * Настраиваем таймер времени *
// ************************************	
  TIMSK1 = 0x01; 		// включенно глобальное прерывание переполнения таймера
  TCCR1A = 0x00; 		
  TCNT1 = 0x0BDC; 		// установить начальное значение для удаления ошибки времени (регистр бит-бит)
  TCCR1B = 0x04; 		// запуск таймера / установка часов    
	}
//	********************************************************************
//	функция учета времени
//	********************************************************************	
ISR(TIMER1_OVF_vect) { TCNT1=0x0BDC; secund++; }	
// функция вызывается с интервалом в одну секунду
//	====================================================================  

Неактивний

#5 2023-08-02 21:51:48

Honey
Учасник
З Київ
Зареєстрований: 2020-09-26
Повідомлень: 415

Re: Потрібна допомога. два леди та дві кнопки., а можливо і більше)))

renoshnik пише:

ISR(TIMER1_OVF_vect) { TCNT1=0x0BDC; secund++; }

Таке правильно робити через режим CTC.

Неактивний

#6 2023-08-03 09:51:46

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Потрібна допомога. два леди та дві кнопки., а можливо і більше)))

Honey пише:
renoshnik пише:

ISR(TIMER1_OVF_vect) { TCNT1=0x0BDC; secund++; }

Таке правильно робити через режим CTC.

Мені з віком, туговато даються ці регістри  roll   якщо пожате як, буду вдячний...

Неактивний

#7 2023-08-03 11:31:49

Honey
Учасник
З Київ
Зареєстрований: 2020-09-26
Повідомлень: 415

Re: Потрібна допомога. два леди та дві кнопки., а можливо і більше)))

#define TIMER_FREQ_HZ 1
void timer_init(void) {
  ICR1   = (62500 / TIMER_FREQ_HZ) - 1;
  TCCR1A = (2 << WGM10);
  TCCR1B = (3 << WGM12) | (4 << CS10); // 16MHz/256=62500
  TIMSK1 = (1 << TOIE1);
}
ISR(TIMER1_OVF_vect) { secund++; }

По таблиці з даташиту це WGM mode 14 = Fast PWM, але працює так само як mode 12 = CTC, плюс додатково смикає OVF_vect. Не звертайте увагу, що це Fast PWM, - поки біти COM1xn нульові, піни працюють у звичайному режимі.

Неактивний

#8 2023-08-03 11:34:42

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Потрібна допомога. два леди та дві кнопки., а можливо і більше)))

Honey пише:
#define TIMER_FREQ_HZ 1
void timer_init(void) {
  ICR1   = (62500 / TIMER_FREQ_HZ) - 1;
  TCCR1A = (2 << WGM10);
  TCCR1B = (3 << WGM12) | (4 << CS10); // 16MHz/256=62500
  TIMSK1 = (1 << TOIE1);
}
ISR(TIMER1_OVF_vect) { secund++; }

По таблиці з даташиту це WGM mode 14 = Fast PWM, але працює так само як mode 12 = CTC, плюс додатково смикає OVF_vect. Не звертайте увагу, що це Fast PWM, - поки біти COM1xn нульові, піни працюють у звичайному режимі.

дякую !

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

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