Как передать изменяющееся значение на графический дисплей с помощью 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;

Но строковая функция не поддерживает переменные. Может ли кто-нибудь помочь мне настроить строковую функцию, чтобы она принимала переменные, или, возможно, предложить лучший способ?

, 👍0


2 ответа


Лучший ответ:

0

Вы не упомянули, как преобразовать значение 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".

,

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) для обратной совместимости., @hcheung

https://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


0

Сначала необходимо преобразовать значение с плавающей запятой в строку, а затем передать полученную строку функции dog_7565R::string().

Похоже, что стандартный sprintf(), предоставляемый Arduino, не поддерживает формат %f для чисел с плавающей запятой, поэтому вам, возможно, придется найти другой способ его преобразования или напишите свою собственную функцию преобразования.

,