Ви не увійшли.
Тільки на початку вивчення, маю задачку.
перший сценарій з механічними кнопками реалізував
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)
Неактивний
Хотілося
Як мінімум почитайте про millis. З delay нічого з вашого хотіння не вийде
Пробував. Тоді втрачаю точність, частота невідповідна
// ************************************
// * Настраиваем таймер времени *
// ************************************
TIMSK1 = 0x01; // включенно глобальное прерывание переполнения таймера
TCCR1A = 0x00;
TCNT1 = 0x0BDC; // установить начальное значение для удаления ошибки времени (регистр бит-бит)
TCCR1B = 0x04; // запуск таймера / установка часов
}
// ********************************************************************
// функция учета времени
// ********************************************************************
ISR(TIMER1_OVF_vect) { TCNT1=0x0BDC; secund++; }
// функция вызывается с интервалом в одну секунду
// ====================================================================
Неактивний
renoshnik пише:ISR(TIMER1_OVF_vect) { TCNT1=0x0BDC; secund++; }
Таке правильно робити через режим CTC.
Мені з віком, туговато даються ці регістри якщо пожате як, буду вдячний...
Неактивний
#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 нульові, піни працюють у звичайному режимі.
Неактивний
#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 нульові, піни працюють у звичайному режимі.
дякую !
Неактивний