Вывод аналогового входа на LCD16x2

Обсуждаем Arduino, Raspberry Pi и другие электронные компоненты и проекты DIY
Ответить
Гена
Сообщения: 6
Зарегистрирован: 20 дек 2013, 11:44

Вывод аналогового входа на LCD16x2

Сообщение Гена »

Подскажите, как избавиться от такой проблемы:
Например, вывожу на дисплей показания потенциометра в порядке убывания. При переходе со 100 на 99, показывает не 99, а 990 :(
то есть 3 знак остается. как так?
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

Re: Вывод аналогового входа на LCD16x2

Сообщение Mr.Kubikus »

Привет! Покажите ваш код. Без исходников сложно ответить.
С уважением, Григорий
GitHub FB ВК
Гена
Сообщения: 6
Зарегистрирован: 20 дек 2013, 11:44

Re: Вывод аналогового входа на LCD16x2

Сообщение Гена »

и кстати тут после OFF при переключении на ON на дисплее появляется ONF, то есть старые символы не стираются
если писать в цикле lcd.clear(); то дисплей мигает
и как сделать, чтобы например на дисплее какие-то знаки мигали (то есть при достижении уровня, это значение мигает)?
Спасибо :)

Код: Выделить всё

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


int PotPin = 0;    // The potentiometer is connected to
                      // analog pin 0
                      
int ledPin = 13;      

void setup() {
   lcd.begin(16, 2);
 
}
pinMode(ledPin, OUTPUT);

void loop() {
  // read the potentiometer on A0:
  int sensorReading = analogRead(PotPin);

  int Value = map(sensorReading, 0, 1023, 0, 253);


  lcd.setCursor (5, 0);
  lcd.print(sensorReading);

  lcd.setCursor(5, 1);

  lcd.print(Value);


if value > 1000 
{
lcd.setCursor(12, 1);
lcd.Print("ON")

}
else
{
lcd.setCursor(12, 1);
lcd.Print("OFF")
}

}
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

Re: Вывод аналогового входа на LCD16x2

Сообщение Mr.Kubikus »

Эту задачу можно решить путем предварительной очистки знакоместа под цифры. Для этого можно делать вывод трех пробелов:

Код: Выделить всё

lcd.setCursor (5, 0);
lcd.print("   "); // Выводим три пробела для очистки поля
lcd.print(sensorReading);
С уважением, Григорий
GitHub FB ВК
Гена
Сообщения: 6
Зарегистрирован: 20 дек 2013, 11:44

Re: Вывод аналогового входа на LCD16x2

Сообщение Гена »

Так дисплей будет писать сигнал после пробелов, а не на их месте?!
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

Re: Вывод аналогового входа на LCD16x2

Сообщение Mr.Kubikus »

Значит надо возвращать курсор в нужную позицию:

Код: Выделить всё

lcd.setCursor (5, 0);
lcd.print("   "); // Выводим три пробела для очистки поля
lcd.setCursor (5, 0);
lcd.print(sensorReading);
С уважением, Григорий
GitHub FB ВК
Тима
Сообщения: 131
Зарегистрирован: 16 ноя 2012, 21:03

Re: Вывод аналогового входа на LCD16x2

Сообщение Тима »

Если чистить пробелами и потом на его место выводить значения, экран моргает!
Я решил эту проблему выводом после значения двух пробелов. Это если будет выводиться трехзначное число, если четырехзначное - надо 3 пробела.
Последний раз редактировалось Тима 22 дек 2013, 22:25, всего редактировалось 1 раз.
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

Re: Вывод аналогового входа на LCD16x2

Сообщение Mr.Kubikus »

Тоже хороший вариант. В стандартной библиотеке для языка C есть функция printf, которая позволяет выводить форматированный текст. С её помощью можно было организовать вывод значения в поле фиксированной ширины.
С уважением, Григорий
GitHub FB ВК
Гена
Сообщения: 6
Зарегистрирован: 20 дек 2013, 11:44

Re: Вывод аналогового входа на LCD16x2

Сообщение Гена »

Можно ли чуть подробнее для чайника ?:)
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

Re: Вывод аналогового входа на LCD16x2

Сообщение Mr.Kubikus »

printf — обобщённое название семейства функций, используемых для форматного вывода — вывода значений разных типов, отформатированных согласно заданному шаблону. Этот шаблон определяется составленной по специальным правилам строкой (форматной строкой). Функция printf и её производные являются частью стандартной библиотеки Си++.

Запись форматированной строки в строку без ограничения по размеру строки
int sprintf( char *s, const char *format, ... );

Параметры:
format — строка форматирования (формат описан ниже)
s — строка для помещения результата работы функции

Пример использования для Arduino:

Код: Выделить всё

char msg[10]; // Строка, в которую будем помещать результат выполнения printf
int  value = 0; // Переменная для экспериментов

void setup() {
}

void loop() {

  value = 5;  
  sprintf(msg, "%03d", value); // Запишет в msg строку "005"

  value = 55;  
  sprintf(msg, "%03d", value); // Запишет в msg строку "055"

  value = 555;  
  sprintf(msg, "%03d", value); // Запишет в msg строку "555"
  
}
Более подробно на википедии
С уважением, Григорий
GitHub FB ВК
Ответить