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

Не надо кусками, почитайте книжки по C++, там есть все, структурированно и последовательно

1 лайк

Вот такое придумал, в протеусе вроде бы работает

unsigned long t_dbnc;
bool dbnc=false;
uint8_t tmp;

void setup() {
  //port на вход
DDRA=0x00;
PORTA=0xFF;
 //port на вход
DDRB=0XFF;
PORTB=0x00;
}

void loop() {
if(PINA!=0XFF && !dbnc)
{
  dbnc=true;
  t_dbnc=millis();
  tmp=(PINA^=0xFF);
  if(tmp==PINB)PORTB=0x00;
  else{PORTB=0x00;PORTB=tmp;}
}
if(millis()-t_dbnc>=60 && dbnc)dbnc=false;
}

1 лайк

Скажите, какие камеры вы собираетесь или уже используете?
имею некоторый опыт, аналоговые камеры не равно WebUsb камерам, реле там ВООБЩЕ незяя.
есть аналоговые мультиплексоры, либо USB хабы, даже MEGA256 не понадобится.

но вижу у Вас пока проблема, кнопки обработать … подожду…

Да это для стенда аналоговых cvbs камер.

Не могу понять что за функция и откуда такова взялась =) Все учебники пересмотрел.

так вы комментарии в коде читайте:

Сказано же - функцию нужно написать, в учебниках ее нет

2 лайка

Это что то на богатом =) Выглядит круто. Регистры еще не понял. оно просто бы понималось когда ты в деле это увидишь.

Открывается новая ветка =) НАПИСАНИЕ ФУНКЦИИ =))))))))))))))))

Ничего не круто просто идея: 8 входов управляют 8 выходами значит почти напрямую пишем из входного регистра в выходной прикручивая подавление дребезга, самое полезное - возможность считывать состояние регистров вне зависимости от режима порта вход или выход.
Так же полезное [http://codius.ru/articles/Arduino_ускоряем_работу_платы_Часть_2_Аналого_цифровой_преобразователь_АЦП_и_analogRead]
там в 1 ой части по работе с регистрами
А здесь прикручен контроль нжатия только одной кнопки.

Спойлер


unsigned long t_dbnc;
bool dbnc=false;
uint8_t tmp;

void setup() {
  //port на вход
DDRA=0x00;
PORTA=0xFF;
 //port на вход
DDRB=0XFF;
PORTB=0x00;
}
bool chk( uint8_t dbl_chk)
{uint8_t cnt=0;
for( uint8_t ii=0;ii<=7;ii++)
{if(!dbl_chk&(1<<ii))cnt++;
if(cnt>1)return false;
}
return true;
}

void loop() {
if(PINA!=0XFF && !dbnc)
{ if(chk(PINA))
{
  dbnc=true;
  t_dbnc=millis();
  tmp=(PINA^=0xFF);
  if(tmp==PINB)PORTB=0x00;
  else{PORTB=0x00;PORTB=tmp;}
} 
}
if(millis()-t_dbnc>=60 && dbnc)dbnc=false;
}


1 лайк

Ну это вы уже совсем… ))

uint8_t buttonRead (uint8_t pin) {    // По порядку: возвращаемый тип (uint8_t), название функции (buttonRead), аргумент функции (pin) типа uint8_t
  uint8_t state; // Переменная для чтения состояния pin

  // Тут пишем код, как мы читаем состояние pin в переменную state (и, желательно, - подавляем дребезг контактов кнопки)

  return state; // возвращаем результирующее значение
} // Всё, вся функция ))

У вас код, фактически, уже написан. Просто нужно оформить его как функцию.

1 лайк

Это я когда 12 лет назад пришёл работать авто электриком и смотрел на все эти провода и думал о Господи что это все такое. А теперь такой да все же очень понятно =) здесь такая же история. Сначала ничего не понятно, а потом как понятно =д

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

Это уже на выбор.
Кто-то любит только программно подавлять (так дешевле, не нужно тратиться на дополнительные компоненты), кто-то предпочитает подавлять физически, а есть такие “личности”, что и то и другое используют (ШОБ НАВЕРНЯКА :smiley: )

Меня сбивает с толку в коде uint8_t потому что почему то во многих примерах написания функций используют int, но она же занимает больше памяти.

Используется тот тип данных, который нужен в конкретном случае. Где-то uint8_t, где-то int, а где-то и double (прости, господи ))

Конкретно по состоянию кнопок - тут можно получить только два значения - 0 или 1, т.е. int здесь не нужен абсолютно

Потому что три буквы “int” набирать быстрее, чем uint8_t, да и удобнее - регистр переключать не надо.
А на разницу в расходовании памяти в очень многих программах пофиг.

Примерно так ? или я вообще ничего не понял =) понял все , но не совсем понимаю как в этой функции мы читаем все пины. Что определяет с каких пинов читать?

И какую роль играет аргумент?
я Так понял что uint8_t buttonRead (в скобках задаются параметры передаваемы в функцию?) кто такой PIN откуда взялся =)

Это номер пина кнопки, которая проверяется

Именно так!
Функция - это часть (кусок) кода, который можно использовать много раз описав (написав) его лишь один раз.
Передавая в качестве аргумента (pin) номер пина можно считать все пины, что требуются для конкретного случая.

Например, для того чтобы считать состояние пина номер 2 - вызываем buttonRead(2), а для 6го - buttonRead(6) и так далее…

Вообще говоря - это же элементарные вещи в программировании (переменная, константа, функция, цикл, условный переход, безусловный переход и тп). Почитайте на досуге для саморазвития.

ЗЫ: В случае приведенной вами функции (только с чтением номера пина функцией digitalRead теряется смысл, проще просто digitalRead вызывать, но для саморазвития - полезно знать).