Как передать изменяющееся значение на графический дисплей с помощью Arduino?
Я использую графический дисплей EA DOGM132-5, они также предоставили библиотеку для Arduino, так что все красиво и просто. В библиотеке есть функция для простой передачи строки на ЖК-дисплей.
void dog_7565R::string(byte column, byte page, const byte *font_adress, const char *str)
{
unsigned int pos_array; //Позиция символьных данных в массиве памяти
byte x, y, column_cnt, width_max; // временный столбец и адрес страницы, couloumn_cnt и width_max используются, чтобы оставаться внутри области отображения
byte start_code, last_code, width, page_height, bytes_p_char; //информация о шрифте, необходимая для расчета
const char *string;
start_code = pgm_read_byte(&font_adress[2]); //получить первый определенный символ
last_code = pgm_read_byte(&font_adress[3]); //получить последний определенный символ
width = pgm_read_byte(&font_adress[4]); // ширина в пикселях одного символа
page_height = pgm_read_byte(&font_adress[6]); //количество страниц на символ
bytes_p_char = pgm_read_byte(&font_adress[7]); //байт на символ
if(type != DOGM132 && page_height + page > 8) // оставаться внутри области отображения
page_height = 8 - page;
else if(type == DOGM132 && page_height + page > 4)
page_height = 4 - page;
// Строка отображается символ за символом. Если шрифт имеет более одной страницы,
//сначала печатается верхняя страница, затем следующая страница и так далее
for(y = 0; y < page_height; y++)
{
position(column, page+y); // устанавливаем начальную позицию и страницу
column_cnt = column; //сохраняем столбец для отображения последней проверки столбца
string = str; // временный указатель на начало строки для печати
digitalWrite(p_a0, HIGH);
digitalWrite(p_cs, LOW);
while(*string != 0)
{
if((byte)*string < start_code || (byte)*string > last_code) // проверяем правильность данных
string++;
else
{
// вычисляем положение символа ascii в массиве шрифтов
//байты для заголовка + (ascii - startcode) * байты на символ)
pos_array = 8 + (unsigned int)(*string++ - start_code) * bytes_p_char;
pos_array += y*width; // получаем точечный шаблон для части символа для печати
if(type != DOGM132 && column_cnt + width > 128) // оставаться внутри области отображения
width_max = 128-column_cnt;
else if(type == DOGM132 && column_cnt + width > 132)
width_max = 132-column_cnt;
else
width_max = width;
for(x=0; x < width_max; x++) //выводим всю строку
{
spi_out(pgm_read_byte(&font_adress[pos_array+x]));
//spi_out(pgm_read_byte(&font_adress[pos_array+x])); // шрифт двойной ширины (жирный)
}
}
}
digitalWrite(p_cs, HIGH);
}
}
Поэтому я просто использую функцию в скетче с нужными мне переменными, и я могу легко показать строку, но я хочу показать изменяющееся значение, например, показание температуры Tc.
int ThermistorPin = 0;
int Vo;
float R1 = 10000;
float logR2, R2, T, Tc, Tf;
float c1 = 1.009249522e-03, c2 = 2.378405444e-04, c3 = 2.019202697e-07;
Vo = analogRead(ThermistorPin);
R2 = R1 * (1023.0 / (float)Vo - 1.0);
logR2 = log(R2);
T = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
Tc = T - 273.15;
Но строковая функция не поддерживает переменные. Может ли кто-нибудь помочь мне настроить строковую функцию, чтобы она принимала переменные, или, возможно, предложить лучший способ?
@Austris Balodis, 👍0
2 ответа
Лучший ответ:
Вы не упомянули, как преобразовать значение Tc
с плавающей запятой в строку перед передачей его в dog_7565R::string
, но если вы используете sprintf()
, по умолчанию Arduino имеет поддержку sprintf()
для отключения с плавающей запятой, есть способ включить ее, если вы используете Platform.io IDE, но это не работает для Arduino IDE.
Одним из обходных путей является использование функции dtostrf()
, доступной в avr-libc, которая доступна в Arduino:
dtostrf(floatvar, StringLengthIncDecimalPoint, numVarsAfterDecimal, charbuf);
dtostrf()
преобразует число с плавающей запятой в строку переменного тока.
float Tc = T - 273.15;
char floatString[6];
dtostrf(Tc, 4, 2, floatString);
Это превратит значение типа 32,15
в строку "32,15"
.
Сначала необходимо преобразовать значение с плавающей запятой в строку, а затем передать полученную строку функции dog_7565R::string()
.
Похоже, что стандартный sprintf()
, предоставляемый Arduino, не поддерживает формат %f
для чисел с плавающей запятой, поэтому вам, возможно, придется найти другой способ его преобразования или напишите свою собственную функцию преобразования.
- Отобразить изображение с SD-карты на ЖК-дисплей ILI9486
- ST7735s 1.8" SPI 128x160 TFT Модуль - Белый экран
- Мне нужна помощь в создании меню с использованием библиотеки u8g2
- Команда SPI против данных?
- Как использовать SPI на Arduino?
- Печать string and integer LCD
- Как увеличить скорость записи на SD-карту в Ардуино
- Как отобразить символ º на ЖК-дисплее?
dtostrf()
устарела, поэтому я не включил ее в свой ответ., @selectstriker2Спасибо, у меня работает функция dtostrf(), возможно позже я найду другое решение, но пока у меня есть именно то, что я хотел!, @Austris Balodis
@selectstriker2 Я не знаю, что
dtrostrf()
устарела? Он определенно не отмечен как устаревший в [документации avr-libs](https://nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#ga060c998e77fb5fc0d3168b3ce8771d42), и он даже реализован в ARM-версии [ArduinoCore -samd](https://github.com/arduino/ArduinoCore-samd/blob/master/cores/arduino/avr/dtostrf.c) для обратной совместимости., @hcheunghttps://github.com/arduino/ArduinoCore-API/issues/103 и https://github.com/arduino/ArduinoCore-API/tree/master/api/deprecated-avr-comp/avr, @selectstriker2
@selectstriker2 Я думаю, вы неправильно поняли это, когда вы используете эти функции, раньше для их использования нужно было явно писать
#include <avr/xxx.h>
, теперь это не так. Что сделала Arduino, так это включила в состав Arduino Core-API те, которые все платформы должны соответствовать и реализовать в качестве своего ядра, например, ESP32/8266 или STM32, см. , он также помечен как «устаревший» [эти файлы](https://github.com/arduino/ArduinoCore-API/tree/master/api/deprecated), слово «устаревший» вводит в заблуждение, оно просто перемещено., @hcheungЭто имело бы больше смысла. Я давно не работал с Arduino, и все, что я недавно искал, говорило, что оно устарело., @selectstriker2