Хитрый таймер!

Oksymoron
Offline
Зарегистрирован: 28.01.2017

Доброе время суток!!! Прошу помощи в корректировки кода, идея такова при нажатии и удержании PIN_BUTTON1,  analogOutPin2 становиться HIGH на время outputValue, после чего код останавливается и ждет повторного нажатия PIN_BUTTON1, но у меня получился только блинк при удержании PIN_BUTTON1. Прошу Вашей помощи!!!

const int analogInPin1 = A0;   // потенциометр к A0
const int analogOutPin1 = 13;  // светодиод на выводе 13
const int analogOutPin2 = 12;  // светодиод на выводе 12
const int PIN_BUTTON1 = 2;     // кнопка 1

uint32_t myTimer;             // таймер
int sensorValue = 0;          // значения от потенциометра
int outputValue = 0;          // значения для PWM
int buttonState = 0;          // переменная кнопки



void setup() {
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);   
  Serial.begin(9600);
}

void loop() {
  buttonState = digitalRead(PIN_BUTTON1);
      sensorValue = analogRead(analogInPin1);
      outputValue = map(sensorValue, 0, 1023, 100, 3000);
  // печатаем результаты в Serial Monitor
  Serial.print("sensor = ");
  Serial.print(sensorValue);
  Serial.print("\t output = ");
  Serial.println(outputValue);
if (buttonState == HIGH) {
  if (millis() - myTimer >= outputValue) {
    myTimer = millis(); // сбросить таймер
        digitalWrite(analogOutPin2, HIGH);
        delay(1);
  } else {
    // иначе выключаем светодиод
    digitalWrite(analogOutPin2, LOW);
    
}
}
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Непонятно, как возможно повторное нажатие на кнопку, которую еще не отпустили.

Oksymoron
Offline
Зарегистрирован: 28.01.2017

Извините...как только отпустили кнопку код должен ждать следующего нажатия.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ваша ошибка в том, что Вы пытаетесь оттолкнуться от состояния кнопки, тогда как нужно отслеживать не само состояние, а переход из одного состояния в другое.

И, кстати, осталось непонятным, почему в исходном сообщении Вы пишете о нажатии и удержании.

Oksymoron
Offline
Зарегистрирован: 28.01.2017

Это только часть кода(начало), надо чтобы таймер начинал отсчет именно когда кнопка удерживается и значение менялось на LOW даже если время вышло но кнопка нажата. Когда время вышло но кнопка нажата надо ожидать следующего нажатия и удержания.

sadman41
Offline
Зарегистрирован: 19.10.2016

Не следующего нажатия, а отпускания и последующего нажатия с удержанием. 

andriano на это и выводит - если вы сумеете описать все действия формальным языком, когда все детали операции будут вербализованы, а не домысливаться - тогда и сможете перевести свой алгоритм в исходный код. А до того времени ничего и не получится, ибо МК не собирается гадать, что вы за картинку  у себя в голове нарисовали.  

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Oksymoron пишет:

Это только часть кода(начало), надо чтобы таймер начинал отсчет именно когда кнопка удерживается и значение менялось на LOW даже если время вышло но кнопка нажата. Когда время вышло но кнопка нажата надо ожидать следующего нажатия и удержания.

Еще раз:

andriano пишет:

Непонятно, как возможно повторное нажатие на кнопку, которую еще не отпустили.

Oksymoron, Вы уж распишите подробно, что при каких условиях должно происходить. Пока Вы путаетесь в показаниях, ничего сделать невозможно.

Гриша
Offline
Зарегистрирован: 27.04.2014

еще один подход к решению задачи: если вы смотрели ДШ на какой нить лог элемент там часто встречается картинка график с логикой работы по шкале времени ну или таблица истинности. В вашем случае нужно нарисовать логику работы, а потом составить таблицу истинности - будет значительно проще, как для написания , так и для понимания.

Oksymoron
Offline
Зарегистрирован: 28.01.2017

Все понял. Проблема в отслеживании состояния кнопки, а если её не отслеживается, а как ещё можно остановить ход выполнения программы по условию?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Остановить выполнение программы нельзя. Но можно сделать так, чтобы работающая программа не совершала никаких полезных действий.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Oksymoron пишет:
как ещё можно остановить ход выполнения программы по условию?

По простому: 

while(условие) ; 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andriano пишет:

Остановить выполнение программы нельзя. 

Почему нельзя? Закрыть прерывания и завалиться спать в режиме POWER_DOWN. Это разве не "остановить"?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ЕвгенийП пишет:

andriano пишет:

Остановить выполнение программы нельзя. 

Почему нельзя? Закрыть прерывания и завалиться спать в режиме POWER_DOWN. Это разве не "остановить"?

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вот про последнее не надо - мы люди законопослушные и нам ст. 223.1 УК тут нафиг не нужна.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Хорошо, мы по простому

while(условие) abort();

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Oksymoron пишет:

Доброе время суток!!! Прошу помощи в корректировки кода, идея такова при нажатии и удержании PIN_BUTTON1,  analogOutPin2 становиться HIGH на время outputValue, после чего код останавливается и ждет повторного нажатия PIN_BUTTON1, но у меня получился только блинк при удержании PIN_BUTTON1. Прошу Вашей помощи!!!


Может так

const int analogInPin1 = A0;   // потенциометр к A0
const int analogOutPin1 = 13;  // светодиод на выводе 13
const int analogOutPin2 = 12;  // светодиод на выводе 12
const int PIN_BUTTON1 = 2;     // кнопка 1
bool f_button = 0;

uint32_t myTimer;             // таймер
int sensorValue = 500;          // значения от потенциометра
int outputValue = 0;          // значения для PWM
int buttonState = 0;          // переменная кнопки



void setup() {
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(2, INPUT);
  Serial.begin(9600);
}

void loop() {
  buttonState = digitalRead(PIN_BUTTON1);
  sensorValue = analogRead(analogInPin1);
  outputValue = map(sensorValue, 0, 1023, 100, 3000);
  // печатаем результаты в Serial Monitor
  Serial.print("sensor = ");
  Serial.print(sensorValue);
  Serial.print("\t output = ");
  Serial.println(outputValue);

  if (buttonState == HIGH && f_button == 0) {
    f_button = 1;
    myTimer = millis(); // таймер
    digitalWrite(analogOutPin2, HIGH);
  }

  if (millis() - myTimer >= outputValue && f_button==1) {
    digitalWrite(analogOutPin2, LOW);
  }

  if (f_button == 1 && buttonState == LOW) f_button = 0;
}

 

Oksymoron
Offline
Зарегистрирован: 28.01.2017

БОЛЬШОЕ СПАСИБО!!! То что надо...еще рас спасибо!!!