Селектор камер

Всех приветсвую и заранее спасибо.
Не программист совсем сел вот прошло 1 час накатал скетч который преследует следующую цель. Скажем так устройтво переключает видео сигнал с 8 камер на один канал по нажатию кнопок. Задача от Ардуинки в общем такая 8 входов кнопок и 8 выходов . Нажал на 1 нопку активировался 1 канал . Нажал на него опять выключился. Если включен к примеру первый ты нажал 4 то первый выключился и 4 включился , далее нажал на 4 он выкл. Схема простая вот что у меня получилось и оно работает ‘’'unsigned long last_press;
boolean but1_flag = 0;
boolean butt1;
boolean led1_flag = 0;
boolean but2_flag = 0;
boolean butt2;
boolean led2_flag = 0;
int but1 = 7;
int led1 = 8;
int but2 = 10;
int led2 = 9;
void setup() {
pinMode (but1, INPUT);
pinMode (led1, OUTPUT);
pinMode (but2, INPUT);
pinMode (led2, OUTPUT);

}

void loop() {

// Включаем первый светодиод
butt1 = !digitalRead (but1);
if (butt1 == 1 && but1_flag == 0 && millis() - last_press > 200) {
but1_flag = 1;
led1_flag = !led1_flag;
digitalWrite(led1, led1_flag);

}
// Выключаем первый светодиод
if (butt1 == 0 && but1_flag == 1){
but1_flag = 0;
last_press = millis();
if (digitalRead(led2)== HIGH)
digitalWrite(led2, LOW);
}
butt2 = !digitalRead (but2);
if (butt2 == 1 && but2_flag == 0 && millis() - last_press > 200 ) {
but2_flag = 1;
led2_flag = !led2_flag;
digitalWrite(led2, led2_flag);

}
if (butt2 == 0 && but2_flag == 1){
but2_flag = 0;
last_press = millis();
if (digitalRead(led1)== HIGH)
digitalWrite(led1, LOW);
}
}
‘’’
проблема в следующем что когда включен канал 1 нажатие кнопки второго канала сначала выключает 1 канал и второе нажатие включает второй канал. Вроде как ничего но хотелось бы идеала. Подскажите что я делаю в коде не так и может что то можно пофиксить =) Только учусь результат этого кода это всего 1 час проведенного мною времени за этим делом.

Обратные апострафы находятся на кнопке с буквой Ё (и должны располагаться на отдельных строчках).

1 лайк

ПОнял ошибку. Как я могу отредактировать данную тему?

Нажми на карандашик, если его нет - просто добавь код постом ниже.

1 лайк
boolean but1_flag = 0;
boolean butt1;
boolean led1_flag = 0;
boolean but2_flag = 0;
boolean butt2;
boolean led2_flag = 0;
int but1 = 7;
int led1 = 8;
int but2 = 10;
int led2 = 9;
void setup() {
 pinMode (but1, INPUT);
 pinMode (led1, OUTPUT);
 pinMode (but2, INPUT);
 pinMode (led2, OUTPUT);


}

void loop() {
 
 // Включаем первый светодиод
butt1 = !digitalRead (but1);
if (butt1 == 1 && but1_flag == 0  && millis() - last_press > 200) {
  but1_flag = 1;
   led1_flag = !led1_flag;
  digitalWrite(led1, led1_flag);
  
}
// Выключаем первый светодиод
if (butt1 == 0 && but1_flag == 1){
  but1_flag = 0;
 last_press = millis();
 if (digitalRead(led2)== HIGH)
   digitalWrite(led2, LOW);
}
butt2 = !digitalRead (but2);
if (butt2 == 1 && but2_flag == 0  && millis() - last_press > 200 ) {
  but2_flag = 1;
    led2_flag = !led2_flag;
   digitalWrite(led2, led2_flag);
   
  
}
if (butt2 == 0 && but2_flag == 1){
  but2_flag = 0;
last_press = millis();
if (digitalRead(led1)== HIGH)
  digitalWrite(led1, LOW);
}
}

Я подобное делал для управление реле.
Честно скажу - в голову не пришло бы делать так как у вас.
Я решал задачу разбив на подзадачи:

  1. Прочесть состояния кнопок
  2. Если какая-либо кнопка нажата - установить соответствующие флаги
  3. Записать значения флагов в порт.
    Этот алгоритм на Attiny13 пару лет работает отлично!

Понятно излагаю?
Если успею перед уходом - набросаю пример для двух кнопок и двух диодов…

1 лайк

Да по факту на каналах реле и будут стоять. Техническая обвязка для меня вообще не проблема =) мало времени заниматься программровнием хотя очень хочется и интересно. То что вы предложили мне и хотелось но не могу понять как сразу читать состояние нескольких кнопок . Если есть возможно просто пример на примере двух этого будет достаточно как на большее колличество растянуть я пойму =)

Читай состояния кнопок в отдельную переменную.
Для каждой кнопки - своя переменная.

Это не истина в одном лице, но у меня всего 3 реле было и меня устроило и так.
В твоем случае с 8 реле, наверное, есть более изящное решение (имею ввиду реализацию по коду, скорее всего - через массивы будет проще):

Для примера (код не полный, как пример)
// Номера пинов:
#define button_one  5
#define button_two  6
#define led_one     7
#define led_two     8

// Переменные состояния кнопок
uint8_t button_one_state, button_two_state;

void setup() {
  pinMode (button_one, INPUT_PULLUP);
  pinMode (button_two, INPUT_PULLUP);
  pinMode (led_one, OUTPUT);
  pinMode (led_two, OUTPUT);
}

void loop() {

  // Читаем состояния кнопок:
  button_one_state = buttonRead(button_one); // В функции buttonRead() выполняется чтение пина и возвращает его значение (эту функцию нужно написать отдельно)
  button_two_state = buttonRead(button_two);

  // Опеределяем что нужно выключить, а что нужно включить
  if (button_one_state) {
    button_one_state = !digitalRead(button_one);
    button_two_state = LOW;
  }

  if (button_two_state) {
    button_one_state = LOW;
    button_two_state = !digitalRead(button_two);
  }

  // А это третий пункт:
  digitalWrite(led_one, button_one_state);
  digitalWrite(led_two, button_two_state);
}
1 лайк

Спасибо за базу. Буду её сейчас мысленно прорабатывать чтобы каждый шаг понять. С переменными так то интереснее получается. Я их видел но как это работает не понимал. Сейчас вот вижу и уже более понятно становится.

Получается что uint8_t может считывать как состояния LOW & HIGH как и значения от 0 - 255 типа если делать кнопки резистивными ?

Конечно, ведь в ардуино LOW равен нулю, а HIGH равен единице ))

На сколько понял uint8_t это тот же byte.

Вообще, что за плата у вас? У Nano (на Atmega328) 10 битный АЦП (от 0 до 1023) и поэтому нужно использовать тип uint16_t

Да

Тестирую сие дело на ATMEGA 2560 , Потом подгоняю под что то более маленькое. Последний раз что то делал брал С++ из скетча и заливал в attiny85 =) прикольно было =) Потом загрузчик научилс туда заливать чтобы digispark получить =)

  1. Читаем кнопки.
  2. Если какая-то кнопка нажата - инвертируем состояние ее выхода. Остальные выходы скопом выключаем.

Весь код получается строчек 15, причем независимо от числа кнопок, хоть сотню

1 лайк

Собственно этот алгоритм и реализован у меня. Просто при количестве реле в 3 шт не стал заморачиваться с массивами (о чем выше и писал).

получается что #define ты обозначаешь переменные , а потом uint8_t указываешь ряд переменных. Не могу понять чем #define от int отличается. И что если #define заменить на byte если это одно и тоже ?

#define - это не переменная !!!

Почитай: Arduino define: описание, примеры | РобоТехника18

Можно и переменные использовать, но это не логично - память ОЗУ будет использована неправильно.

1 лайк

Так это уже не на ночь глядя понимать =) Блин спасибо за столько инфы =) завтра на чистую голову буду все осваивать. Больше от Вас узнал и понял чем по всему интернету кусками информацию хватал =)