Помогите разобраться. Избавиться от Delay.

Тема в разделе "Arduino & Shields", создана пользователем filatov.max74, 10 июл 2017.

  1. filatov.max74

    filatov.max74 Нуб

    Собрали термистер с LCD Дисплеем. Верхняя строка "Temperature: ". Необходимо сделать ее бегущей.
    autoscroll почему-то не работает.
    сделал так:
    Код (C++):

    #include <math.h>
    #include <LiquidCrystal.h>
    #include <string.h>
    #define TERMIST_B 4300
    #define VIN 5.0

    LiquidCrystal lcd(13, 12, 11, 10, 9, 8);

    void setup()
    {
    lcd.begin(16, 2);
      lcd.setCursor(0, 0);

    }

    void loop()
    {

    float voltage = analogRead(A0) * VIN / 1023.0;
    float r1 = voltage / (VIN - voltage);
    float temperature;

    temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273;

    lcd.setCursor(1, 1);
    lcd.print(temperature, 3);
    lcd.print("C");


    char string[50] = "Temperature: ";
    int razmer = strlen(string);

      for (int i = 15; i > 0; i--)
          {
          lcd.setCursor(i,0);
          lcd.print(string);
          delay(500);
          }
     
      for (int in = 0; in <= razmer; in++)
      {
      lcd.setCursor(0,0);
      lcd.print(string);
     
          for(int j = 0; j < razmer; j++)
          {
            if (string[j+1] == '\0')
            {
               string[j] = ' ';
            }
            else
            string[j] = string[j+1];
          }

       delay(500);
      }
    }

     
    Помогите, пожалуйста, разобраться и избавиться от delay. Важно, чтобы термистер работал без остановок и показывал температуру в реальном времени. Из-за delay значения обновляются раз в несколько секунд...
     
  2. railmisaka

    railmisaka Гик

    Если я правильно понял, то код с delay делает ваш собственный автоскролл?

    В таком случае, попробуйте печать температуры (а можно и печать слова "температура" с автоскроллом) вынести в функцию и использовать эту библиотеку.
     
  3. filatov.max74

    filatov.max74 Нуб

    Да, это собственный автоскролл. Работает корректно. Не совсем понимаю как работать с этой библиотекой. Хотелось бы избавиться от delay с помощью millis(), но не знаю как это сделать. Прошу помощи.
     
  4. railmisaka

    railmisaka Гик

    Удалить код опроса и вывода температуры из loop (пусть там только автоскролл).
    Добавить такой код.

    Код (C++):
    #include <TimedAction.h>

    TimedAction timedAction = TimedAction(10, printTemp);

    volatile LiquidCrystal lcd(13, 12, 11, 10, 9, 8);

    void printTemp() {
      float voltage = analogRead(A0) * VIN / 1023.0;
      float r1 = voltage / (VIN - voltage);
      float temperature;

      temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273;
     
      lcd.setCursor(1, 1);
      lcd.print(temperature, 3);
      lcd.print("C");
    }
    Этот код будет опрашивать датчик температуры и выводить ее на экран каждый 10мс. Получается не совсем реалтайм, но может этого хватит?
    (Единственно, я немного сомневаюсь относительно volatile LiquidCrystal и интервала вызова в 10мс.)

    Буквально вчера создал ветку, там описан другой подход, как раз с помощью функции millis().
    Я еще не оформил код, как там написано, но сам подход вполне рабочий.
    Хотя, конечно, автоскролл будет сделать не так уж просто как по мнею
     
  5. filatov.max74

    filatov.max74 Нуб

    Это подключаемая библиотека, а хочется обойтись стандартными средствами. К тому же, задача не такая уж и сложная. Нужно всего лишь организовать первую строку так, чтобы она бегала и была читаемой, а вторая строчка показывала значения термометра в реальном времени. Ну или хотя бы задержка была не такой большой. Но главное условие - нельзя использовать delay.
     
  6. railmisaka

    railmisaka Гик

    К чему избегать подключения библиотеки? Впрочем, дело ваше.

    В верхнем посте ветки я описал подход, позволяющий организовать "совместную параллельность".
    В той же ветке есть ссылки на решения от @DetSimen
     
  7. filatov.max74

    filatov.max74 Нуб

    Простите, но я новичок и мне не очень понятно то, что вы описываете в своих статьях.
     
  8. qwone

    qwone Гик

    Вот и плохо что вы новичок. Обычно новички ложно считают, что на Ардуине "низкий уровень входа". И программировать может даже некомпитентный человек. Это верно пока он запускает демоскетчи. Но только проект чуть усложнится и все. Дальше надо учить все - и даташиты и язык программирования Си -> Cи++ ->