Собрали термистер с 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 значения обновляются раз в несколько секунд...
Если я правильно понял, то код с delay делает ваш собственный автоскролл? В таком случае, попробуйте печать температуры (а можно и печать слова "температура" с автоскроллом) вынести в функцию и использовать эту библиотеку.
Да, это собственный автоскролл. Работает корректно. Не совсем понимаю как работать с этой библиотекой. Хотелось бы избавиться от delay с помощью millis(), но не знаю как это сделать. Прошу помощи.
Удалить код опроса и вывода температуры из 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(). Я еще не оформил код, как там написано, но сам подход вполне рабочий. Хотя, конечно, автоскролл будет сделать не так уж просто как по мнею
Это подключаемая библиотека, а хочется обойтись стандартными средствами. К тому же, задача не такая уж и сложная. Нужно всего лишь организовать первую строку так, чтобы она бегала и была читаемой, а вторая строчка показывала значения термометра в реальном времени. Ну или хотя бы задержка была не такой большой. Но главное условие - нельзя использовать delay.
К чему избегать подключения библиотеки? Впрочем, дело ваше. В верхнем посте ветки я описал подход, позволяющий организовать "совместную параллельность". В той же ветке есть ссылки на решения от @DetSimen
Вот и плохо что вы новичок. Обычно новички ложно считают, что на Ардуине "низкий уровень входа". И программировать может даже некомпитентный человек. Это верно пока он запускает демоскетчи. Но только проект чуть усложнится и все. Дальше надо учить все - и даташиты и язык программирования Си -> Cи++ ->