Работа с библиотекой U8glib

forfrends
Offline
Зарегистрирован: 24.02.2015

Всем привет!

Создаю один проект с OLED дисплеем и библиотекой U8glib. Не могу понять как вывести на дисплей значение переменной.

float db = 3,52;
u8g.drawStr( 0, 22, db);

Выдает ошибку. Пробовал так:

u8g.drawStr( 0, 22, char(db));

Тоже не принимает. Как правильно вывести значение переменной типа float и int?

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Уважаемый, а ошибка, которую выдают это огромный секрет?

А по хорошему - учите преобразование числа в строку:

itoa (int data, char* string, int radix);     // преобразование int

ltoa (long data, char* string, int radix);  // преобразование long

forfrends
Offline
Зарегистрирован: 24.02.2015

Ну по чему же, нет. Просто ошибка одна и та же: несоответствие типа данных.
Вот ошибка если написать так u8g.drawStr( 0, 22, String(db)):

E:\Home Made\Создать\Arduino Sound Meter\simple_sound\simple_sound.ino: In function 'void draw()':

simple_sound:12:35: error: no matching function for call to 'U8GLIB_SSD1306_128X64::drawStr(int, int, String)'

In file included from E:\Home Made\Создать\Arduino Sound Meter\simple_sound\simple_sound.ino:1:0:

C:\Users\�����\Documents\Arduino\libraries\U8glib\src/U8glib.h:171:16: note: candidate: u8g_uint_t U8GLIB::drawStr(u8g_uint_t, u8g_uint_t, const char*)

     u8g_uint_t drawStr(u8g_uint_t x, u8g_uint_t y, const char *s) { return u8g_DrawStr(&u8g, x, y, s); }

                ^~~~~~~

C:\Users\�����\Documents\Arduino\libraries\U8glib\src/U8glib.h:171:16: note:   no known conversion for argument 3 from 'String' to 'const char*'

C:\Users\�����\Documents\Arduino\libraries\U8glib\src/U8glib.h:201:16: note: candidate: u8g_uint_t U8GLIB::drawStr(u8g_uint_t, u8g_uint_t, const __FlashStringHelper*)

     u8g_uint_t drawStr(u8g_uint_t x, u8g_uint_t y, const __FlashStringHelper *s) { return u8g_DrawStrP(&u8g, x, y, (u8g_pgm_uint8_t *)s); }

                ^~~~~~~

C:\Users\�����\Documents\Arduino\libraries\U8glib\src/U8glib.h:201:16: note:   no known conversion for argument 3 from 'String' to 'const __FlashStringHelper*'

Несколько библиотек найдено для "U8glib.h"
 Используется: C:\Users\Игорь\Documents\Arduino\libraries\U8glib
exit status 1
no matching function for call to 'U8GLIB_SSD1306_128X64::drawStr(int, int, String)'

Вот ошибка если написать так u8g.drawStr( 0, 22, char(db)):
 

E:\Home Made\Создать\Arduino Sound Meter\simple_sound\simple_sound.ino: In function 'void draw()':

simple_sound:12:33: error: no matching function for call to 'drawStr(int, int, char)'

In file included from E:\Home Made\Создать\Arduino Sound Meter\simple_sound\simple_sound.ino:1:0:

C:\Users\�����\Documents\Arduino\libraries\U8glib\src/U8glib.h:171:16: note: candidate: u8g_uint_t U8GLIB::drawStr(u8g_uint_t, u8g_uint_t, const char*) <near match>

     u8g_uint_t drawStr(u8g_uint_t x, u8g_uint_t y, const char *s) { return u8g_DrawStr(&u8g, x, y, s); }

                ^~~~~~~

C:\Users\�����\Documents\Arduino\libraries\U8glib\src/U8glib.h:171:16: note:   conversion of argument 3 would be ill-formed:

C:\Users\�����\Documents\Arduino\libraries\U8glib\src/U8glib.h:201:16: note: candidate: u8g_uint_t U8GLIB::drawStr(u8g_uint_t, u8g_uint_t, const __FlashStringHelper*) <near match>

     u8g_uint_t drawStr(u8g_uint_t x, u8g_uint_t y, const __FlashStringHelper *s) { return u8g_DrawStrP(&u8g, x, y, (u8g_pgm_uint8_t *)s); }

                ^~~~~~~

C:\Users\�����\Documents\Arduino\libraries\U8glib\src/U8glib.h:201:16: note:   conversion of argument 3 would be ill-formed:

Несколько библиотек найдено для "U8glib.h"
 Используется: C:\Users\Игорь\Documents\Arduino\libraries\U8glib
exit status 1
no matching function for call to 'drawStr(int, int, char)'

Вот ошибка если просто попытаться вывести переменную: u8g.drawStr( 0, 22, db):


E:\Home Made\Создать\Arduino Sound Meter\simple_sound\simple_sound.ino: In function 'void draw()':

simple_sound:12:27: error: no matching function for call to 'U8GLIB_SSD1306_128X64::drawStr(int, int, float&)'

In file included from E:\Home Made\Создать\Arduino Sound Meter\simple_sound\simple_sound.ino:1:0:

C:\Users\�����\Documents\Arduino\libraries\U8glib\src/U8glib.h:171:16: note: candidate: u8g_uint_t U8GLIB::drawStr(u8g_uint_t, u8g_uint_t, const char*)

     u8g_uint_t drawStr(u8g_uint_t x, u8g_uint_t y, const char *s) { return u8g_DrawStr(&u8g, x, y, s); }

                ^~~~~~~

C:\Users\�����\Documents\Arduino\libraries\U8glib\src/U8glib.h:171:16: note:   no known conversion for argument 3 from 'float' to 'const char*'

C:\Users\�����\Documents\Arduino\libraries\U8glib\src/U8glib.h:201:16: note: candidate: u8g_uint_t U8GLIB::drawStr(u8g_uint_t, u8g_uint_t, const __FlashStringHelper*)

     u8g_uint_t drawStr(u8g_uint_t x, u8g_uint_t y, const __FlashStringHelper *s) { return u8g_DrawStrP(&u8g, x, y, (u8g_pgm_uint8_t *)s); }

                ^~~~~~~

C:\Users\�����\Documents\Arduino\libraries\U8glib\src/U8glib.h:201:16: note:   no known conversion for argument 3 from 'float' to 'const __FlashStringHelper*'

Несколько библиотек найдено для "U8glib.h"
 Используется: C:\Users\Игорь\Documents\Arduino\libraries\U8glib
exit status 1
no matching function for call to 'U8GLIB_SSD1306_128X64::drawStr(int, int, float&)'

Везде результат одинаков - несоответствие типа принимаемой переменной.

forfrends
Offline
Зарегистрирован: 24.02.2015

Нашел простое решение без преобразования переменных:

float db = 2,56;
u8g.setPrintPos(0, 22);
u8g.print( db,2);
u8g.print(" dB");

 

b707
Offline
Зарегистрирован: 26.05.2017

forfrends пишет:

Везде результат одинаков - несоответствие типа принимаемой переменной.

ну так вы весь вывод читайте. Оно же вам ясно говорит - формат вызова функции drawStr вот такой

U8GLIB::drawStr(u8g_uint_t, u8g_uint_t, const char*)

- то есть третим аргументом функции должна быть C-style string - или иначе говоря, массив символов

А вы эту функцию методолм тыка пытаетесь одолеть - суете ей то char, то String, то float...

Подставьте правильный аршумент и все заработает

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Советую мигрировать на u8g2

Сегодня полдня ловил ошибку с пропаданием ШИМа в скетче с u8g - причина оказалась простой, но в данной версии неизлечимой.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А вот это что, по Вашему, означает?

float db = 2,56;

forfrends
Offline
Зарегистрирован: 24.02.2015

b707, в том то и дело, какой аргумент правильный??? Я не нашел простого решения кроме как перевода переменной из одного формата в другой (через промежуточную переменную). И все это занимает не меньше 4-х строк.

ЕвгенийП, к кому вопрос?

sadman41, пробовал я u8g2. Простой пример "Hello World!", на 10 строчек, съедает 75% оперативки (Атмега328)... Как-то сильно жирно...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

forfrends пишет:

ЕвгенийП, к кому вопрос?

А тому, кто это написал. Я думал. что к Вам, но если это писали не Вы, то извините.

forfrends
Offline
Зарегистрирован: 24.02.2015

Я написал, в качестве примера. Просто не понял ваш вопрос, по этому переспросил. А что не так с записью? Есть неправильно написал, то скажите что не так.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Откуда мне знать правильно на написана или нет? Вы же игнорируете мой вопрос и не хотите мне сказать что Вы хотели написать. Если бы сказали, то был бы смысл продолжать разговор.

forfrends
Offline
Зарегистрирован: 24.02.2015

Хочу на дисплей вывести значение переменной типа float. С десятичными, 2 знака после запятой. Это мне нужно на данный момент.

Так же интересно как выводить переменные типа int.

Один из вариантов решения я написал выше. Но все же интересно как правильно это делать.

sadman41
Offline
Зарегистрирован: 19.10.2016

forfrends пишет:

sadman41, пробовал я u8g2. Простой пример "Hello World!", на 10 строчек, съедает 75% оперативки (Атмега328)... Как-то сильно жирно...

u8g

Sketch uses 5586 bytes (18%) of program storage space. Maximum is 30720 bytes.
Global variables use 239 bytes (11%) of dynamic memory, leaving 1809 bytes for local variables. Maximum is 2048 bytes.
#include <U8glib.h>

U8GLIB_ST7920_128X64_1X u8g(10);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17

void setup(void) {
}


void loop(void) {
  // picture loop
  u8g.setFont(u8g_font_unifontr);
  u8g.firstPage();
  do {
    u8g.drawStr( 0, 22, "Hello World!");
  } while ( u8g.nextPage() );
  delay(1000);
}

U8g2

Sketch uses 8576 bytes (27%) of program storage space. Maximum is 30720 bytes.
Global variables use 555 bytes (27%) of dynamic memory, leaving 1493 bytes for local variables. Maximum is 2048 bytes.
#include <U8glib.h>

U8GLIB_ST7920_128X64_1X u8g(10);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17

void setup(void) {
}

void loop(void) {
  // picture loop
  u8g.setFont(u8g_font_unifontr);
  u8g.firstPage();
  do {
    u8g.drawStr( 0, 22, "Hello World!");
  } while ( u8g.nextPage() );
  delay(1000);
}

Больше, конечно (шрифты, может, разные), но не 75% всяко.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы не поняли моего вопроса.

Вопрос простой: что означает эта строка?

Разве в ней есть что-нибудь про дисплей? Можете объяснить нормальными словами, что написано в этой строке?

forfrends
Offline
Зарегистрирован: 24.02.2015

ЕвгенийП, вы задаете вопрос, но не полностью.. вот весь мой код:

#include "U8glib.h"

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST);   // Fast I2C / TWI 
 
const int sampleWindow = 50;                              // Sample window width in mS (50 mS = 20Hz)
unsigned int sample;
float db;

void draw(void) {
    u8g.setPrintPos(0, 22);
    u8g.print( db,2);
    u8g.print(" dB");
    
    for(int x =5;x<114;x=x+6){                            //draw scale
      u8g.drawLine(x, 32, x, 27);
    }
    u8g.drawRFrame(0, 32, 120, 20, 6);
    int r = map(db,0,120,1,120);                           //set bar graph for width of screen
    u8g.drawRBox(1, 33, r, 18, 6);
}
 
void setup() 
{
   u8g.setFont(u8g_font_unifont);
}
 
void loop() 
{
   unsigned long startMillis= millis();  // Start of sample window
   unsigned int peakToPeak = 0;   // peak-to-peak level
   unsigned int signalMax = 0;
   unsigned int signalMin = 1024;
 
   // collect data for 50 mS
   while (millis() - startMillis < sampleWindow)
   {
      sample = analogRead(A0);
      if (sample < 1024)  // toss out spurious readings
      {
         if (sample > signalMax)
         {
            signalMax = sample;  // save just the max levels
         }
         else if (sample < signalMin)
         {
            signalMin = sample;  // save just the min levels
         }
      }
   }
   peakToPeak = signalMax - signalMin;  // max - min = peak-peak amplitude

   db = map(peakToPeak,200,1024,20,120);             //calibrate for deciBels
    
    u8g.firstPage();  
    do {
        draw();
    } while( u8g.nextPage() );
}

sadman41, Хм... может от типа дисплея это зависит? У меня пример тот же, только тип дисплея SSD1306 128x64 I2C

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

forfrends пишет:

вы задаете вопрос, но не полностью.. 

Я задаю вопрос полностью. В коде сообщения #3 первая строка выглядит как:

float db = 2,56;

я всего лишь прошу Вас объяснить что Вы имели в виду? Что написано в этой строке? Что здесь делается? Вы можете ответить? Нет - ну и не надо, это же не мне в конце концов нужно.

Schwarz78
Offline
Зарегистрирован: 19.01.2019

Оператор запятая. Я и забыл про такое)

qwone
qwone аватар
Онлайн
Зарегистрирован: 03.07.2016

ЕвгенийП пишет:
Я задаю вопрос полностью. В коде сообщения #3 первая строка выглядит как:

float db = 2,56;

я всего лишь прошу Вас объяснить что Вы имели в виду? Что написано в этой строке? Что здесь делается? Вы можете ответить? Нет - ну и не надо, это же не мне в конце концов нужно.

Во по этой причине я согласен иметь 100 ошибок в своей программе чем 1 такого проверяльщика ошибок.

b707
Offline
Зарегистрирован: 26.05.2017

forfrends пишет:

b707, в том то и дело, какой аргумент правильный??? .


ну вот же компилятор вам пишет - const char*
И я вам выше написал, что это называется c-style string. Вам не знакомо это понятие? - так найдите в гугле описание и почитайте. Если написано char* - не надо пытать передавать туда int float или еще чего - все равно не прокатит

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

qwone пишет:
Во по этой причине я согласен иметь 100 ошибок в своей программе чем 1 такого проверяльщика ошибок.
Я всегда стараюсь навести человека на ошибку, чтобы он обнаружил её сам, а не тупо подсказать. Некоторым людям это важно для самоуважения. Ну, а что до Вас, так Вы и имеете именно то, на что согласны. Так что все получают то, чего хотят. С наступающим новым годом!

sadman41
Offline
Зарегистрирован: 19.10.2016

forfrends пишет:

sadman41, Хм... может от типа дисплея это зависит? У меня пример тот же, только тип дисплея SSD1306 128x64 I2C

Не HelloWorld, но всё же разница незначительна и не 75% занято - однозначно.

static U8G2_SSD1306_128X64_NONAME_1_HW_I2C display(U8G2_R2, /* reset=*/ U8X8_PIN_NONE);
 
Sketch uses 22668 bytes (73%) of program storage space. Maximum is 30720 bytes.
Global variables use 1021 bytes (49%) of dynamic memory, leaving 1027 bytes for local variables. Maximum is 2048 bytes.
 
static U8G2_ST7920_128X64_1_HW_SPI display(U8G2_R2, /* CS=*/ 8, /* reset=*/ 7);
 
Sketch uses 22274 bytes (72%) of program storage space. Maximum is 30720 bytes.
Global variables use 925 bytes (45%) of dynamic memory, leaving 1123 bytes for local variables. Maximum is 2048 bytes.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ЕвгенийП пишет:

float db = 2,56;

я всего лишь прошу Вас объяснить что Вы имели в виду? Что написано в этой строке? 

Прежде, чем отвечать, попробуйте запустить вот это

void setup() {
	Serial.begin(57600);
	float db = 2,56;
	Serial.println(db);
}
void loop() {}
Schwarz78
Offline
Зарегистрирован: 19.01.2019

ЕвгенийП пишет:

float db = 2,56;

я всего лишь прошу Вас объяснить что Вы имели в виду? Что написано в этой строке? 

Отвечу за него. Ничего не написано в этой строке. Если правую часть выражения взять в скобки - rvalue становится 56. Иначе - ошибка во всех моих компиляторах. Потому что присваивание приоритетнее запятой.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так ото ж!