Счетчик времени за 10 импульсов с прерываниями

Тема в разделе "Arduino & Shields", создана пользователем tschernenko, 11 авг 2017 в 12:57.

  1. b707

    b707 Гик

    Молодец Вася, ты правда СУПЕР.
    Проблема в том, что ошибок в этом коде значительно больше.
    Что касается деления, проще записать так:
    float qwerty = (oldTime - newTime)/1000.0;
     
    CYITEP_BAC9I нравится это.
  2. tschernenko

    tschernenko Нуб

    Оно не записывает в переменные, дополнил в код
    Код (C++):
    //#define irDiod 2 // приемник на 2 пине
    //int nom = 10; // количество импульсов
    int val = 1; //переменная для хранения импульсов
    float oldTime = 0;
    float newTime = 0;
    float qwerty= 0;

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

    void loop() {
      if (digitalRead(2) == HIGH && val == 1)
      {
        float oldTime = millis();
        val++;
      }
      if (digitalRead(2) == HIGH && val < 10)
      {
        val++;
      }
      else if (val == 10)
      {
        float newTime = millis();
      }
      qwerty = float(newTime - oldTime)/1000;
      Serial.print("qwerty:   ");
      Serial.println(qwerty);
      Serial.print("val:    ");
      Serial.println(val);
      Serial.print("oldTime:   ");
      Serial.println(oldTime);
      Serial.print("newTime:   ");
      Serial.println(newTime);
      delay(1000);
    }
     
     

    Вложения:

  3. b707

    b707 Гик

    маленький совет - кмк, правильнее будет весь вывод включить в else if (val == 10), чтобы данные выводились только после десятого отсчета
     
    CYITEP_BAC9I и tschernenko нравится это.
  4. b707

    b707 Гик

    Да. кстати, на тему "не записывает в переменные" - зачем в циклах ЗАНОВО переопределяете переменные? - потому и не записывает
     
    CYITEP_BAC9I нравится это.
  5. tschernenko

    tschernenko Нуб

    Да вы были правы
    Но теперь другая проблема.После подачи одного импульса, он сам докручивает до 10.
    Код (C++):
    //#define irDiod 2 // приемник на 2 пине
    //int nom = 10; // количество импульсов
    int val = 0; //переменная для хранения импульсов
    float oldTime = 0;
    float newTime = 0;
    float qwerty = 0;

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

    void loop() {
      if (digitalRead(2) == HIGH && val == 1)
      {
        float oldTime = millis();
        val=val+1;
        Serial.print("oldTime:   ");
        Serial.println(oldTime);
      }
      if (digitalRead(2) == HIGH && val < 10)
      {
        val=val+1;
      }
      else if (val == 10)
      {
        float newTime = millis();
        qwerty = (newTime - oldTime) / 1000;
       
        Serial.print("qwerty:   ");
        Serial.println(qwerty);
       
        Serial.print("newTime:   ");
        Serial.println(newTime);
        delay(1000);
      }
      //Serial.print("val:    ");
      //Serial.println(val);
    }
     
  6. tschernenko

    tschernenko Нуб

    Вот с сериала данные
     

    Вложения:

  7. tschernenko

    tschernenko Нуб

    Я параллельно кнопке поставил конденсаторы. Это не могу быть дребезги.
     
  8. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    таки я не гуру, но сдается мне, что вы считаете циклы во время нажатия). надо добавить всетаки LOW наверное. HIGH + LOW это и будет один импульс причем начало первого хая) бертся за отсчет времени. хай или лоу 10 как конец отсчета. да и еще, определенно стоит добавить в скетч инициализацию вашей кнопки или что у вас там и прописать в сетапе что она делает INPUT или OUTPUT). скорее всего первое наверное). я так думаю.
    (тихо молчу про внешние прерывания)
     
  9. tschernenko

    tschernenko Нуб

    До внешних прерываний скоро наверное доберемся)
     
  10. b707

    b707 Гик

    tschernenko, слушайте СуперВасю, он дело говорит. Надо ловить не только нажатия, но и отпускания кнопки, иначе Вы не отличите 10 коротких нажатий от одного длинного
     
    tschernenko нравится это.
  11. Airbus

    Airbus Оракул

    Если Вы такой умный если Вы такой Супер программист то чего же не поправили ничего ни в одном ни во втором скетче?Или нет идей?Советы давать все мастера мы все из Страны Советов.
    Сделал на прерываниях и по нарастанию уровня (и по спаду тоже пробовал) - чтоб отловить ОДИН импульс.
    Код (C++):
    int val = 0; //переменная для хранения импульсов
    float oldTime = 0;
    float newTime = 0;
    float qwerty= 0;
    void setup()
    {
      attachInterrupt(0, count, RISING);
      Serial.begin(9600);
    }
    void loop()
    {
      if (val == 1)
      {
        float oldTime = millis();
         }
    if (val == 10)
    {
    float newTime = millis();
    qwerty = float(newTime - oldTime)/1000;
    Serial.print("qwerty:   ");
    Serial.println(qwerty);
    val = 0;}
                }
    void count()
    {
       val++;
    }
    Всё равно выдаёт число 30-50 и это только при касании чем нибудь до 2 пина. По моему это дребезг. Будет ли он на фотодиоде? Не думаю хотя можно в loop внести антидребезг.Вообщем пробуйте и отписывайтесь.
     
  12. AlexU

    AlexU Гуру

    Он самый. Можно в обработчик прерывания добавить программное подавление дребезга при помощи функции 'millis()' (антидеребезг вносится именно в обработчик прерывания, а не в функцию 'loop()') или нужно бороться с дребезгом аппаратно.
    Если фронт нарастает плавно, то скорее будет.
     
  13. Airbus

    Airbus Оракул

    AlexU поправь мой скетч плиз если не трудно?Мне некогда-улетаю.Буду благодарен)))
     
  14. AlexU

    AlexU Гуру

    Код (C++):
    int val = 0; //переменная для хранения импульсов
    float oldTime = 0;
    float newTime = 0;
    float qwerty = 0;

    void setup() {
        pinMode(2, INPUT);
        attachInterrupt(0, count, RISING);
        Serial.begin(9600);
    }

    void loop() {
        if (val == 1) {
            oldTime = millis();
        }
        if (val == 10) {
            float newTime = millis();
            qwerty = float(newTime - oldTime) / 1000;
            Serial.print("qwerty:   ");
            Serial.println(qwerty);
            val = 0;
        }
    }

    // задерджка для подавления дребезга; зависит от частоты импульсов;
    #define BOUNCE_DELAY 200
    unsigned long last = 0;

    void count() {
        unsigned long current = millis();
        if ((current - last) > BOUNCE_DELAY) {
            last = current;
            val++;
        }
    }
     
     
    CYITEP_BAC9I и Airbus нравится это.