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

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

  1. tschernenko

    tschernenko Нуб

    Привет друзья)

    Нужно написать скетч, для подсчета времени за сколько прошло 10 импульсов, с прерываниями, на 2 пине Нано и вывести в Serial

    На других форумах начали говорить одни типы, что нужно сделать на pulseIn(), другие что нужно использовать millis(), и после этого начался срач и некто не помог, и не показал примеры как это можно было бы сделать:(

    Может кто-то делал такое, или знает как сделать?
    Спасибо за помощь)
     
  2. rkit

    rkit Гуру

    Можно и так и так. Только с чего вы решили, что кто-то должен это сделать за вас? Читайте как эти функции работают,и разбирайтесь.
     
  3. tschernenko

    tschernenko Нуб

    Согласен с вами, но не понятно как это реализовать:oops:
    как сказать контроллеру что-бы он включил секундомер и начал считать импульсы?
     
  4. rkit

    rkit Гуру

    "Согласен, но читать как функции работают не буду."
     
    b707 нравится это.
  5. tschernenko

    tschernenko Нуб

    Вот так я собрал схему
     

    Вложения:

  6. tschernenko

    tschernenko Нуб

    Там стоит ик диод и ик излучатель
     
  7. Karabas

    Karabas Гик

    По первому импульсу запомнить значение millis(), по десятому взять текущее значение millis() и вычесть первое, затем разделить на 1000 это и будет ваше время в секундах.
     
  8. tschernenko

    tschernenko Нуб

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

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

    void loop() {
      if (irDiod == HIGH && val == 1)
      {
        unsigned long oldTime = millis();
        val++;
      }
      else if (irDiod == HIGH && val < nom)
      {
        val++;
      }
      else if (val == nom)
      {
        unsigned long newTime = millis();
      }
      unsigned long qwerty = oldTime - newTime;
      Serial.println(qwerty);
      delay(100);
    }
     
    Я наверное вас не правильно понял, загрузил а оно не работает. Можете посмотреть что не так?
     
  9. tschernenko

    tschernenko Нуб

    но это пока только разницу я хочу вывести
     
  10. rkit

    rkit Гуру

    2 никогда не будет равно HIGH
     
  11. tschernenko

    tschernenko Нуб

    Нет, у меня когда нет импульса это будет 0 а когда есть будет 1
     
  12. rkit

    rkit Гуру

    Еще раз. Ваш код сравнивает число 2 со значением HIGH.
     
  13. Airbus

    Airbus Оракул

    А не читает со 2 пина А так?
    Код (C++):

    int val = 0; //переменная для хранения импульсов
    unsigned long oldTime = 0;
    unsigned long newTime = 0;
    unsigned long qwerty= 0;
    void setup()
    {
      Serial.begin(9600);//Запустим UART
    }

    void loop() {
      if (digitalRead(2) == HIGH && val == 1) //Если на Пине 2 есть первый импульс
      {
        oldTime = millis();//Запускаем таймер
           }
         val++;//Добавляем в копилку
         if (val == 10) // фиксируем время
         {
        newTime = millis();
        qwerty = (oldTime - newTime)/1000; // считаем что вышло
        Serial.println(qwerty);
         }
        delay(1000);
       // val = 0;//если надо обнуляем?
          }
     
    Последнее редактирование: 11 авг 2017
  14. tschernenko

    tschernenko Нуб

    Нет увы но не работает:(
    нужно еще искать в чем проблема
     
  15. tschernenko

    tschernenko Нуб

    Выдает нолики в порту
     

    Вложения:

  16. b707

    b707 Гик

    В чем проблема? - скетч неправильно написан. Попытайтесь разобраться со своим первым скетчем, он потенциально был лучше этого, последнего. Если, конечно, вы его писали сами, а не стырили где-то в инете
     
  17. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    вечер добрый
    попробуйте так
    Код (C++):
    float qwerty= 0;
    Код (C++):
     qwerty = float(oldTime - newTime)/1000;
    или возможно так
    Код (C++):
     qwerty = float((oldTime - newTime)/1000);
    вероятная причина ноликов понятна, но лень искать в книжке раздел про целочисленное деление. попробуйте, может сработает
    а вот исче.
    разве
    Код (C++):
    qwerty = (oldTime - newTime)/1000;
    ??????
    а не
    Код (C++):
    qwerty = (newTime -oldTime )/1000;
    вроде newTime будет больше так его значение получается после получения импульсов
     
    Последнее редактирование: 11 авг 2017
    b707 нравится это.
  18. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    и исче в этом коде вроде считается только HIGH сигнала? а как же LOW? чтоб понять что сигнала был а сейчас пауза между сигналами. я так думаю
     
    b707 нравится это.
  19. 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.println(qwerty);
      Serial.println(val);
      delay(100);
    }
     
     

    Вложения:

  20. tschernenko

    tschernenko Нуб

    да вы правы, ошибка была