Например TDA7294

Форум РадиоКот • Просмотр темы - Проблема-кнопка, простая, да не очень
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Ср июл 02, 2025 02:18:27

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Проблема-кнопка, простая, да не очень
СообщениеДобавлено: Пн июл 03, 2017 12:23:59 
Родился

Зарегистрирован: Пн июл 03, 2017 12:16:17
Сообщений: 1
Рейтинг сообщения: 0
народ, беда, помогите разобраться

if (timer != timerPress) не срабатывает эта строка
&& timer <= (timerPress + 300) и эта часть
код и монитор порта прилогаю
версия arduino IDE 1.8.2

есть светодиод (полевик и набор из 20 шт 5730)
хочу управлять им и с пульта и с кнопки поэтому там button пульт будет задействован позже.
на пульте есть неиспользуемая кнопка... она сделана для других стран
я уже пробовал ее - работает код получен и прочее

СУТЬ! при нажатии на кнопку длительностью меньше 300 миллисекунд включает val = 255 - подаем на светодиод
при повторном нажатии меньше 300 миллисекунд подает val = 0
при удержании с выключенного положения больше 300 миллисекунд начинает прибавлять значение val (скажем прибавили до 180)
при нажатии менее 300 мс val=0
при длительном нажатии начинает убавлять(скажем 150) совсем не светит почти
и при длительном нажатии опять начинает прибавлять...

гладко было было на бумаге, да вот чет не ожидал что так сразу спотыкаться начну... всем спасибо за конструктивные ответы
Спойлер
Код:
int val = 0; // создаем переменную регулировки и определяем её значение
boolean button = false; // нажатие кнопки (пульта или клацалки)
boolean flag = false; // сработка кнопки
unsigned long timer = 0; // таймер с момента включения
unsigned long timerPress = 0; // таймер удержания кнопки
int gatePin = 3; // указываем пин который будем управлять затвором
int buttonPin = 5; // указываем пин кнопки
int regim = 0; // режим
int trend = 1; //направление переключения режимов в большую или меньшую сторону


void setup() {
  pinMode(buttonPin, INPUT);
  Serial.begin(9600);
}

void loop() {
  timer = millis();

  button = digitalRead(buttonPin);

  // нажатие кнопки
  if (button == true) //если кнопка нажата ...
  {
    flag = true; //поднимаем флаг
 if (timer != timerPress) // и если таймеры не равны
    {
      timerPress = timer; //  то таймеру нажатия присваивается значение таймера
    }
  }
  //отпускание кнопки
  if (button == false && regim == 0 && flag == true && timer < (timerPress + 300)) // если кнопка отжата и режим 0 и таймер меньше таймера нажатия на 300 мс
  {
    flag = false; // опускаем флаг
    regim  = 255; // режим равен 255
  }
  if (button == false && regim == 255 && flag == true && timer < (timerPress + 300) ) // если кнопка отжата и режим 255 и таймер меньше таймера нажатия на 300 мс
  {
    flag = false; // опускаем флаг
    regim  = 0; // режим равен 0
  }
  // ружимы
  if (regim == 0) {
    val = 0;
  }
  if (regim == 1) {
    val = 180;
  }
  if (regim == 2) {
    val = 180;
  }
  if (regim == 3) {
    val = 190;
  }
  if (regim == 4) {
    val = 200;
  }
  if (regim == 5) {
    val = 200;
  }
  if (regim == 6) {
    val = 210;
  }
  if (regim == 7) {
    val = 220;
  }
  if (regim == 8) {
    val = 230;
  }
  if (regim == 9) {
    val = 240;
  }
  if (regim == 10) {
    val = 255;
  }
  //вывод значения
  analogWrite(gatePin , val);
  //вывод в монитор
  Serial.print(" timer-");
  Serial.print (timer);
  Serial.print(" timerPress-");
  Serial.print (timerPress);
  Serial.print(" button-");
  Serial.print (button);
  Serial.print(" flag-");
  Serial.print (flag);
  Serial.print(" val-");
  Serial.println(val);
  //делея тут не будет в итоге
  delay(10);
}



это получаю в монитор порта
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема-кнопка, простая, да не очень
СообщениеДобавлено: Пн июл 03, 2017 16:48:41 
Друг Кота

Карма: 49
Рейтинг сообщений: 544
Зарегистрирован: Чт фев 20, 2014 18:57:55
Сообщений: 19488
Рейтинг сообщения: 0
if (timer != timerPress) не срабатывает эта строка

Это ненужное условие, что то там у вас не то если такое требуется.
В целом для начала нужно разобраться с антидребезгом, иначе можно не понять в программе проблема или в железе (если вы конечно не в протеусе это гоняете).

_________________
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема-кнопка, простая, да не очень
СообщениеДобавлено: Вт июл 04, 2017 04:30:40 
Друг Кота
Аватар пользователя

Карма: 51
Рейтинг сообщений: 2108
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 6998
Откуда: Сердце Пармы
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (2)
сделай опрос кнопки регулярным (через определенное время, допустим 30мс, например по прерыванию таймера)
если (кнопка нажата) - {приращай переменную (только следи чтобы за пределы возможности переменной не выросла, например: если (х<250) то х++; сдесь же можно проверить и длинное нажатие если (х=100) выставляем соотв флаг}
иначе /*при отпущенной кнопке */ {проверяй состояние переменной: х<6 дребезг (ни чего не делаем), 5<х<100 короткое нажатие (выставляем соотв. флаг), после проверки переменную сбрасываем в 0};
в коде самой программы иногда поглядываем на флаги и если видим что установлен — выполняем соотв. действие и сбрасываем.
п.с. длинное нажатие тоже можно проверять при отпущенной кнопке: х>99 длинное. (выставляем соотв флаг)
,но тогда оно и срабатывать будет только при отпускании кнопки.
п.с.2: если действие длинного нажатия нужно продолжительное — в самой программе сбрасываем флаг если переменная==0
если нужно цикличное действие — при достижении мах (не обязательно 250) переменную сбрасываем в значение сработки длинного нажатия 100.

_________________
Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y