аналоговый порт, чтение без задержки.

Тема в разделе "Arduino & Shields", создана пользователем REm, 26 май 2018.

  1. REm

    REm Гик

    Возможно ли читать данные с порта, без delay, но строго циклично по времени?
    Дёргать ногу умею и практически постоянно использую, но вот опрос аналогового сигнала применить не могу.
     
  2. Daniil

    Daniil Гуру

    На сколько строго?
    Если в loop вписать
    Код (C++):
    if время с последнего опроса > Т
    то считать данные
    сохранить время последнего опроса
    то получится опрашивать вывод мк в цикле и без delay, НО если есть другие процедуры, которые работают в loop, то они могут внести задержку.
    Более правильный вариант это использовать таймер, но в таком случае было бы правильнее написать ещё свою процедуру чтения вывода (digital.read написана неоптимально для скорости).

    Извиняюсь, не сразу вычитал, что проблема с аналоговым выводом.
    В принципе, всё выше остаётся в силе с добавкой, что отцифровка тоже занимает время. Если сигнал меняется медленно по отношению к времени измерения АЦП и время преобразования АЦП сравнимо с вашим периодом Т, то готовность АЦП можно использовать как таймер.
     
    Последнее редактирование: 26 май 2018
  3. REm

    REm Гик

    Я не ясно выразил мысль, с аналогового только чтение.
    Грубо говоря, я не могу совместить

    Код (C++):
    { // БЕЗ DELAY
      // здесь будет код, который будет работать постоянно
      // и который не должен останавливаться на время между переключениями свето
      unsigned long currentMillis = millis();

      //проверяем не прошел ли нужный интервал, если прошел то
      if(currentMillis - previousMillis > interval) {
        // сохраняем время последнего переключения
        previousMillis = currentMillis;
        // если светодиод не горит, то зажигаем, и наоборот
        if (ledState == LOW)
          ledState = HIGH;
        else
          ledState = LOW;
        // устанавливаем состояния выхода, чтобы включить или выключить светодиод
        digitalWrite(ledPin, ledState);
      }
    }
     
    и опрос датчика


    Код (C++):
      uint16_t lux = lightMeter.readLightLevel();
      Serial.print("Light: ");
      Serial.print(lux);
      Serial.println(" lx");


    // стандартный люксометр.
     
  4. Airbus

    Airbus Радиохулиган Модератор

    А в чем проблема?Он у Вас и так будет опрашиваться циклично в loop.Если есть еще действия в loop то плюс время на их выполнение-несколько микросекунд.Это для Вас критично?Здесь код не асинхронный поэтому по другому никак.
     
  5. REm

    REm Гик

    мне нужно набрать пакет данных, и далее использовать эти данные, как калибровку, а поступающие в процессе работы, как выявление предела (максимально и минимального).
    ---
    Должно быть я совсем загнался.
     
  6. Airbus

    Airbus Радиохулиган Модератор

    Вопрос был
    Всё просто
    Код (C++):
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
    int analogInput = 0;//номер пина с которого читаем
    float value = 0.0;
    float volt = 0.0; //значение в вольтах
    void setup()
    {
       pinMode(analogInput, INPUT);
       lcd.begin(16, 2);
       }
    void loop()
    {
       value = analogRead(analogInput);//читаем значение на А0
       volt = (value * 5.0) / 1024.0; //преобразуем в вольты если надо
       lcd.setCursor(0, 1); //курсор на место
       lcd.print("INPUT V= "); //выводим текст
       lcd.print(volt); //и значение
                }
    В void loop() можно оставить только value = analogRead(analogInput);//читаем значение на А0
    а потом с этим value делать всё что угодно.Всё будет выполнятся в цЫкле loop.Или я не понял вопроса?
     
    REm нравится это.
  7. Airbus

    Airbus Радиохулиган Модератор

    Можно изчо короче
    Код (C++):
    int analogInput = 0;//номер пина с которого читаем
    float value = 0.0;
    float volt = 0.0; //значение в вольтах
    void setup()
    {
       pinMode(analogInput, INPUT);
      Serial.begin(9600);
       }
    void loop()
    {
       value = analogRead(analogInput);//читаем значение на А0
       Serial.println(value);//и выводим в порт
                }
     
    REm нравится это.
  8. a1000

    a1000 Гуру

    Так у вас уже как-бы всё есть. Код переключения светодиода без delay есть. Его можно немного упростить используя логические операции.
    Код (C++):
    { // БЕЗ DELAY
      // здесь будет код, который будет работать постоянно
      // и который не должен останавливаться на время между переключениями свето
      unsigned long currentMillis = millis();

      //проверяем не прошел ли нужный интервал, если прошел то
      if(currentMillis - previousMillis > interval) {
        // сохраняем время последнего переключения
        previousMillis = currentMillis;
        // переключаем светодиод
        ledState = !ledState;
        digitalWrite(ledPin, ledState);
      }
    }
     
    Ну а место, куда вставить кусок кода для опроса датчика зависит от необходимой вам логики работы. Возможны три варианта:
    1. Датчик опрашивается при каждом прохождении цикла loop.
    2. Датчик опрашивается одновременно с переключением светодиода.
    3. Датчик опрашивается по своей задержке.
     
    REm нравится это.
  9. REm

    REm Гик

    Товарищи, спасибо всем, кто откликнулся!
    Не буду вводить вас в заблуждение, пока не работает железка, думать о начинке бессмысленно (а для меня и вредно).
    Заменю датчик или хотя бы на фоторезистор изменю схему, напишу хоть сколько нибудь алгоритма, и в случае лёгкой контузии подниму тему вновь.
     
  10. Airbus

    Airbus Радиохулиган Модератор

    Не так страшен delay как его боятся.На самом деле это отличный инструмент на своем месте.Когда надо чтоб железака замерла и не шеволилась.При регистрации в GSM сети например или антидребезг.
     
    REm нравится это.
  11. REm

    REm Гик

    согласен, в большинстве случаев задержка не сильно влияет на работу. Но всё же, лучше не замораживать в данном устройстве.
     
  12. Airbus

    Airbus Радиохулиган Модератор

    Объясните почему?Delay такая же операция как и любая другая которую Вы будете делать в коде-обработка считанного результата в Вашем случае.Да и нет delay в тех примерах что я вам показал.
     
  13. REm

    REm Гик

    Я в общем имел ввиду о задержки. Но в данном детекторе лучше вообще отказаться, по сути, я возлагаю ответственность на обнаружение искрения и искрообразования в камере.
     
  14. parovoZZ

    parovoZZ Гуру

    Выбираем режим сна и уходим в SLEEP. В Delay железяка работает и шумит в АЦП. Хотя, для некоторых методов оцифровывания сигнала это даже полезно.