Опрос кнопки

Megawollt
Offline
Зарегистрирован: 06.12.2015

Сильно не пинать, я меньше недели с ардуиной

Нужно увеличивать и уменьшать значение переменной двумя кнопками(больше и меньше),

но при нажатии значение увеличивается сразу на 12. Что не так?

Вот фрагмент кода

void loop(){
 
if (digitalRead(UP) ==HIGH) { //Адрес больше 
    ADR++; 
  delay(1000); 
  } 
if (digitalRead(DN) ==HIGH) { //Адрес меньше
     ADR--;
  delay(1000); 
  } 
  if (ADR > 505){ //Перевод значения из 513 в 1
  ADR==1;
 
Последний иф должен переводить значение из 506 в 1 и тоже не работает :(
Araris
Offline
Зарегистрирован: 09.11.2012

Во-первых, приведите весь скетч.

Во-вторых, вставляйте код так, как описано здесь - http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

Ну и в-третьих, не ADR==1;, а ADR=1;, почитайте про разницу между = и ==.

P.S. На фразы "Сильно не пинать, я меньше недели с ардуиной" здесь обычно никто внимания не обращает ))).

Megawollt
Offline
Зарегистрирован: 06.12.2015

Изменение не принесло результата. Про код понял, но думаю весь вставлять смысла особо нет

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Megawollt пишет:

Изменение не принесло результата. Про код понял, но думаю весь вставлять смысла особо нет

перечитайте ещё раз #1
покажите ВЕСЬ код

bankir_1986
Offline
Зарегистрирован: 23.03.2015

Но и отвечать по куску выложенного кода тоже смысла нет - как вы узнали что на увеличивает сразу на 12 и не переводит значение в 1? Нужнажа схема и скетч.

У вас кнопки как подключены? Может из-зи дребезга такая величина?

Megawollt
Offline
Зарегистрирован: 06.12.2015

Ок. Извините.

Вот весь код. Многие пункты отключены, чтобы разобраться с этой проблемой

//#include <lib_dmx.h>       //Библиотека обработки DMX
//#define    DMX512     (0)  //Режим DMX  
#define UP (2)             //Вывод кнопки +
#define DN (4)             //Вывод кнопки -
 int ADR=1;   
 void setup() 
{
 //Режимы кнопок задачи адреса
 pinMode(UP, INPUT);
 pinMode(DN, INPUT);
 digitalWrite(UP, LOW);
 digitalWrite(DN, LOW);
 Serial.begin(9600);
 //ArduinoDmx0.set_tx_channels(8);   //Количество каналов передачи DMX
 //ArduinoDmx0.init_tx(DMX512);        

 //Плавное включение подсветки
 int PWMpin = 3;                   //Вывод питания подсветки
 for (int i=0; i <= 255; i++){
      analogWrite(PWMpin, i);    
      delay(20); }
} 

void loop(){

if (digitalRead(UP) ==HIGH) { //Адрес больше 
    ADR++; 
  delay(1000); 
  } 
if (digitalRead(DN) ==HIGH) { //Адрес меньше
     ADR--;
  delay(1000); 
  } 
  if (ADR > 505){ //Перевод значения из 513 в 1
  ADR=1;
  }
  Serial.println(ADR);
  return;
//  ArduinoDmx0.set_tx_address(ADR);  //Стартовый адрес
  
  //Задержка для устаканивания дребезга контактов
//  ArduinoDmx0.TxBuffer[0] = scale(analogRead(0)); 
  delay (20);                                                
//  ArduinoDmx0.TxBuffer[1] = scale(analogRead(1)); 
  delay (20);                                                 
//  ArduinoDmx0.TxBuffer[2] = scale(analogRead(2)); 
  delay (20);                                                 
//  ArduinoDmx0.TxBuffer[3] = scale(analogRead(3)); 
  delay (20);                                                 
//  ArduinoDmx0.TxBuffer[4] = scale(analogRead(4)); 
  delay (20);                                                 
//  ArduinoDmx0.TxBuffer[5] = scale(analogRead(5)); 
  delay (20); 
//  ArduinoDmx0.TxBuffer[6] = scale(analogRead(6)); 
  delay (20);                                                 
//  ArduinoDmx0.TxBuffer[7] = scale(analogRead(7)); 
  delay (20); 
 } 


uint8_t scale(uint16_t value) // scale values from 10 bits to 8 bits
{
  if(value > 1023) // test for 10 bits limit
    value = 1023;
    
  return (value >> 2); // scale
}  //end scale()

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

что за плата у тибя ? как подключены кнопки ?
...в UNO такого нету - digitalWrite(UP, LOW); , только digitalWrite(UP, HIGH);
строка 38 к чему относится ?

Megawollt
Offline
Зарегистрирован: 06.12.2015

Плата нано.

Строка 38 это возврат для отладки работы кнопки. Не дает выполнять дальнейший код

Araris
Offline
Зарегистрирован: 09.11.2012

Строки 63-64 можно убрать - analogRead() ВСЕГДА возвращает integer значение от 0 до 1023.

И всё же, как подключены кнопки ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Megawollt пишет:

Плата нано.

Строка 38 это возврат для отладки работы кнопки. Не дает выполнять дальнейший код

для этого есть более мирные способы....

Megawollt
Offline
Зарегистрирован: 06.12.2015

Хорошо, спасибо.

Кнопки просто с +5в на вывод 2 и 4 соотв.

bankir_1986
Offline
Зарегистрирован: 23.03.2015

строки 9-12, ничего не напутано?

Araris
Offline
Зарегистрирован: 09.11.2012

Замените digitalWrite(UP, LOW); на digitalWrite(UP, HIGH); и digitalWrite(DN, LOW); на digitalWrite(DN, HIGH);, как намекает уважаемый SU-27-16. Кнопки - к пину и земле. Тогда они будут программно "подтянуты".

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

int PWMpin = 3;                   //Вывод питания подсветки
...это в область дефайнов лучшееее перенести

подключи кнопки - GND и пин , и чуть переделай скетч :) , так проще...
строки 26 и 30 - сравнивать с LOW !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
а щас - кнопка на VCC и пин.... а пин стянут ВНЕШНИМ резистором к GND ? см. #6

есть два варианта подключения кнопки :)

bankir_1986
Offline
Зарегистрирован: 23.03.2015

http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku

Скажу честно, я не так давно этим увлечен, но почитайте начало данной ссылки и у вас все получится. Поверьте - на себе проверял.

std
Offline
Зарегистрирован: 05.01.2012

О, новая волна. Ладно. Думаю, ещё гонения от Клапауциев последуют.

Ну а я порву шаблон. Как говорится, истинный учитель готов снизойти до незнания ученика, чтобы вместе с ним вновь совершить восхождение к Знанию. Может плюсики в карму заработаю, и найдётся сенсей, который соизволит поднатаскать в доту. А то в пабликах обзывают "russian retard"...

Поехали.

Афтар, вы же DMX делаете? Честно говоря странно, откуда сразу 12, delay() защищает в любом случае. Дребезг пофигу. Отсутствие флага нажатой кнопки (в том смысле что кнопку уже жмут) тоже пофигу, delay() не должно позволять набраться 12 меньше чем за 12 секунд, а это уже заметно на глаз. Странно, почему это не происходит.

Неважно, вот тут есть приёмник со всеми печеньками типа кнопок, экрана и запоминания своего адреса.

Там написано:

unsigned long last_btn=millis();                // buttons press timestamps
(...)
      btn_up=digitalRead(UPPIN);
      btn_down=digitalRead(DOWNPIN);

а дальше:

    if(!btn_up && millis()-last_btn>=KEYSPEED){   // move DMX up
      last_btn=millis();
      dmxaddr+=deltadmx;
      if(dmxaddr>512) dmxaddr=1;
      processmovestep();
    }
    if(!btn_down && millis()-last_btn>=KEYSPEED){ // move DMX down
      last_btn=millis();
      dmxaddr-=deltadmx;
      if(dmxaddr<1) dmxaddr=512;
      processmovestep();
    }

Это называется blink without delay. Функция processmovestep() изменяет deltadmx, то есть если жать долго, то мотаются единицы, потом десятки и так далее. Это пока делать не нужно. Пока заведите переменную типа unsigned long с исходным значением millis() и внутри условия сработавшей кнопки надо его обновлять. Условие содержит два факта, кнопку жмут (digitalWrite(BTN)==HIGH) и что время прошлого нажатия больше чем некая скорость KEYSPEED, допустим 200. Или 1000 как у вас.

Тащемта можно было бы просто написать кусок скетча и кинуть, типа, пробуйте. Но это не способствует обучению.

Ещё есть тема "класс титановый велосипед для кнопки", там есть схема как подключать кнопку:

- во-первых, к минусу. А вместо INPUT будет INPUT_PULLUP.

- во-вторых, к ней ещё прилагается резистор 1-10k на плюс (если не писали PULLUP), резистор 100R-1k последовательно (увеличивает ресурс) и самое важное - конденсатор 0.1 мкФ (глушит помеху). 

Можно попробовать эти варианты и отписаться о результатах. Но: Araris прав, в коде есть ещё что-то, что даёт такой эффект. Я вижу условие, там написано: как только единица - сработать и 1000 мс ждать. +12 не будет, никак, от слова ваапшэ. Так не бывает.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Araris ,  "уважаемый SU-27-16" - не зли миня , Алиса !

Araris
Offline
Зарегистрирован: 09.11.2012

Дааа лааадно, это всего лишь фигура речи такая. Больше не буду.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

+12 не будет, никак, от слова ваапшэ. Так не бывает.
...дребезг пересчитал , видимо :)

Megawollt
Offline
Зарегистрирован: 06.12.2015

Std Спасибо. DMX наше все. Буду пробовать

А почему последний цикл ИФ не работает, я так и не понял

Подскажите, а?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Megawollt пишет:

А почему последний цикл ИФ не работает, я так и не понял

крайний цикл ? дык , покажи код крайний....
...в авиации за фразу "последний вылет" и за последствия сразу дают ЗВЕЗДУ :(

Megawollt
Offline
Зарегистрирован: 06.12.2015

Написал вот так. 

Работает

if (digitalRead(UP) ==LOW) { //Адрес больше 
    delay(190);
    ADR++; 
   } 
if (digitalRead(DN) ==LOW) { //Адрес меньше
    delay(190);
    ADR--;
   } 
  if(ADR>512){ //Перевод значения из 513 в 1
  ADR=1;
  }
  else if(ADR<1){ //Перевод 0 в 1
  ADR++;
  }

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

весь код - желательно всегда ( есть чекБокс = свернуть код )

из кода исходного - int ADR=1;   жмёмь два раза кнопку "-" - сколько будет ADR ?
...нужна защита , если у тибя не алгоритм - прыгать от мин к макс

нууу , и в комменте лучше написать "увеличить-уменьшить адрес" :)-

Megawollt
Offline
Зарегистрирован: 06.12.2015

ADR будет 1. С минимума на максимум не перепрыгивает

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Megawollt пишет:

ADR будет 1. С минимума на максимум не перепрыгивает

пробовал попробывать ? в сериал-мониторе пропиши и посмотри....
ладно... это твои проблемы...

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

оооооой ! пардон....
из #21 строки 12 и 13 - защита....

строки 02 и 06 можно прописать одной ( если нужно ) - в строке 08А

строки 09....14 можно заменить на http://arduino.ru/Reference/Constrain

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

if ( digitalRead( UP ) == LOW )
лучше прописать как
if LOW == digitalRead( UP ) )

маленький секрет от великого и ужасного KISOFT !
:)

 

Megawollt
Offline
Зарегистрирован: 06.12.2015

Спасибо. А в чем разница?
И можно ли использовать вход aref для замера напряжения батарейки?

std
Offline
Зарегистрирован: 05.01.2012

А я пишу if(!digitalRead(UP)), т. к. набирать три буквы слова LOW сильно впадлу :)

Megawollt пишет:
можно ли использовать вход aref для замера напряжения батарейки?

AREF это для питания, а замерять надо выводами A0-A5. Только при условии что на AREF будет ровно 5, и не меньше. Если упадёт меньше 5, то будет показывать что батарейка полная, а по факту не факт...

Megawollt
Offline
Зарегистрирован: 06.12.2015

Тогда облом. Все входы заняты

std
Offline
Зарегистрирован: 05.01.2012

Кнопок 4? Тогда их можно повесить на 3 провода, через сдвиговый регистр (74hc165). Освободившимся выводом АЦП мерить батарейку. Если там не переменные резисторы, ессно.

Megawollt
Offline
Зарегистрирован: 06.12.2015

Там предполагается две кнопки для задачи DMX адреса, 8 фейдеров, которые занимают все аналоговые входы контроллера и дисплей(какой либо, чтобы отображать 3 цифры стартового адреса).

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