Работа с библиотекой U8glib
- Войдите на сайт для отправки комментариев
Пнд, 09/12/2019 - 18:36
Всем привет!
Создаю один проект с OLED дисплеем и библиотекой U8glib. Не могу понять как вывести на дисплей значение переменной.
float db = 3,52;
u8g.drawStr( 0, 22, db);
Выдает ошибку. Пробовал так:
u8g.drawStr( 0, 22, char(db));
Тоже не принимает. Как правильно вывести значение переменной типа float и int?
Уважаемый, а ошибка, которую выдают это огромный секрет?
А по хорошему - учите преобразование числа в строку:
itoa (int data, char* string, int radix); // преобразование int
ltoa (long data, char* string, int radix); // преобразование long
Ну по чему же, нет. Просто ошибка одна и та же: несоответствие типа данных.
Вот ошибка если написать так 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&)'Везде результат одинаков - несоответствие типа принимаемой переменной.
Нашел простое решение без преобразования переменных:
float db = 2,56; u8g.setPrintPos(0, 22); u8g.print( db,2); u8g.print(" dB");Везде результат одинаков - несоответствие типа принимаемой переменной.
ну так вы весь вывод читайте. Оно же вам ясно говорит - формат вызова функции drawStr вот такой
- то есть третим аргументом функции должна быть C-style string - или иначе говоря, массив символов
А вы эту функцию методолм тыка пытаетесь одолеть - суете ей то char, то String, то float...
Подставьте правильный аршумент и все заработает
Советую мигрировать на u8g2
Сегодня полдня ловил ошибку с пропаданием ШИМа в скетче с u8g - причина оказалась простой, но в данной версии неизлечимой.
А вот это что, по Вашему, означает?
floatdb = 2,56;b707, в том то и дело, какой аргумент правильный??? Я не нашел простого решения кроме как перевода переменной из одного формата в другой (через промежуточную переменную). И все это занимает не меньше 4-х строк.
ЕвгенийП, к кому вопрос?
sadman41, пробовал я u8g2. Простой пример "Hello World!", на 10 строчек, съедает 75% оперативки (Атмега328)... Как-то сильно жирно...
ЕвгенийП, к кому вопрос?
А тому, кто это написал. Я думал. что к Вам, но если это писали не Вы, то извините.
Я написал, в качестве примера. Просто не понял ваш вопрос, по этому переспросил. А что не так с записью? Есть неправильно написал, то скажите что не так.
Откуда мне знать правильно на написана или нет? Вы же игнорируете мой вопрос и не хотите мне сказать что Вы хотели написать. Если бы сказали, то был бы смысл продолжать разговор.
Хочу на дисплей вывести значение переменной типа float. С десятичными, 2 знака после запятой. Это мне нужно на данный момент.
Так же интересно как выводить переменные типа int.
Один из вариантов решения я написал выше. Но все же интересно как правильно это делать.
sadman41, пробовал я u8g2. Простой пример "Hello World!", на 10 строчек, съедает 75% оперативки (Атмега328)... Как-то сильно жирно...
u8g
#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
#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% всяко.
Вы не поняли моего вопроса.
Вопрос простой: что означает эта строка?
Разве в ней есть что-нибудь про дисплей? Можете объяснить нормальными словами, что написано в этой строке?
ЕвгенийП, вы задаете вопрос, но не полностью.. вот весь мой код:
#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
вы задаете вопрос, но не полностью..
Я задаю вопрос полностью. В коде сообщения #3 первая строка выглядит как:
floatdb = 2,56;я всего лишь прошу Вас объяснить что Вы имели в виду? Что написано в этой строке? Что здесь делается? Вы можете ответить? Нет - ну и не надо, это же не мне в конце концов нужно.
Оператор запятая. Я и забыл про такое)
floatdb = 2,56;я всего лишь прошу Вас объяснить что Вы имели в виду? Что написано в этой строке? Что здесь делается? Вы можете ответить? Нет - ну и не надо, это же не мне в конце концов нужно.
b707, в том то и дело, какой аргумент правильный??? .
ну вот же компилятор вам пишет - const char*
И я вам выше написал, что это называется c-style string. Вам не знакомо это понятие? - так найдите в гугле описание и почитайте. Если написано char* - не надо пытать передавать туда int float или еще чего - все равно не прокатит
sadman41, Хм... может от типа дисплея это зависит? У меня пример тот же, только тип дисплея SSD1306 128x64 I2C
Не HelloWorld, но всё же разница незначительна и не 75% занято - однозначно.
floatdb = 2,56;я всего лишь прошу Вас объяснить что Вы имели в виду? Что написано в этой строке?
Прежде, чем отвечать, попробуйте запустить вот это
void setup() { Serial.begin(57600); float db = 2,56; Serial.println(db); } void loop() {}floatdb = 2,56;я всего лишь прошу Вас объяснить что Вы имели в виду? Что написано в этой строке?
Отвечу за него. Ничего не написано в этой строке. Если правую часть выражения взять в скобки - rvalue становится 56. Иначе - ошибка во всех моих компиляторах. Потому что присваивание приоритетнее запятой.
Так ото ж!