Вывод на дисплей с SSD1306
- Войдите на сайт для отправки комментариев
Сб, 03/02/2018 - 16:10
Доброго времени суток, у меня проблема с выводом числовых значений. Имею Arduino UNO и китайский олед дисплей 128х64.
С выводом текста проблем не возникает, внутри скечая получаю массив данных с ПК.
Использую библиотеку U8glib.h для работы с дисплеем.
Пытаюсь за текстом вывести значение из массива, int вывод не воспринимает, перевожу в массив char, ошибок скетч не выдает, но и данных на дисплей тоже...
u8g.drawStr( 0, 14, "CPU load"); String cpul = String(PCdata[2]); char cpuload[10]; dtostrf(PCdata[0], 10, 0, cpuload); u8g.drawStr( 80, 14, cpuload); u8g.drawStr( 100, 14, "%");
Уже после сохранения сообщения заметил что в приведенном отрывке кода использую разные ячейки из масиива, но это ошибка только в одной из 4х строк и на работоспособность не повлияла
Уже поменял код, но почему то до сих пор не выводит значение, на подобном скетче с двухстрочным дисплеем данные выводятся. Постоянно получаю 0.
void loop() { //get dats from PC parsing(); // graphic commands u8g.setFont(u8g_font_unifont); //u8g.setFont(u8g_font_osb21); u8g.drawStr( 0, 14, "CPU load"); u8g.setPrintPos(80, 14); u8g.print(PCdata[2]); u8g.drawStr( 100, 14, "%"); u8g.drawStr( 0, 30, "CPU temp"); u8g.setPrintPos(80, 30); u8g.print(PCdata[0]); u8g.drawStr( 100, 30, "C"); u8g.drawStr( 0, 46, "GPU load"); u8g.setPrintPos(80, 46); u8g.print(PCdata[3]); u8g.drawStr( 100, 46, "%"); u8g.drawStr( 0, 62, "GPU temp"); u8g.setPrintPos(80, 62); u8g.print(PCdata[1]); u8g.drawStr( 100, 62, "C"); // rebuild the picture after some delay delay(50); }Библиотека U8GLib? Почитайте в документации к ней, как должен выглядеть код вывода на экран. Подсказка: там должен быть цикл специальный.
С использованием цикла
u8g.firstPage(); do { draw(); } while( u8g.nextPage() );ситуация не меняется, ардуинка мигает что данные идут, но вывод их не происходит
Я уже грешил, что у меня не срабатывает парсинг с сериалпорта, точнее от него значения до цикла вывода не доводятся, пробовал переносить парсинг внутрь рисовалки, но изменений никаких, все значения выводятся нулями. Исам то парсинг рабочий, на двухстрочном дисплее я все эти данные вывожу... И уже обсмотрелся примеров из библиотеки и из интернетов.
#include <U8glib.h> #include <TimerOne.h> //display U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // I2C / TWI char inData[82]; // массив входных значений (СИМВОЛЫ) int PCdata[20]; // массив численных значений показаний с компьютера byte index = 0; String string_convert; unsigned long timeout, uptime_timer, plot_timer; boolean updateDisplay_flag, updateTemp_flag, timeOut_flag = 1; byte plotLines[] = {0, 1, 4, 5, 6, 7}; // 0-CPU temp, 1-GPU temp, 2-CPU load, 3-GPU load, 4-RAM load, 5-GPU memory uint8_t draw_state = 0; void draw(void){ // graphic commands u8g.setFont(u8g_font_unifont); //u8g.setFont(u8g_font_6x10); //u8g.setFont(u8g_font_osb21); u8g.drawStr( 0, 14, "CPU load"); u8g.setPrintPos(80, 14); u8g.print(PCdata[2]); u8g.drawStr( 110, 14, "%"); u8g.drawStr( 0, 30, "CPU temp"); u8g.setPrintPos(80, 30); u8g.print(PCdata[0]); u8g.drawStr( 110, 30, "C"); u8g.drawStr( 0, 46, "GPU load"); u8g.setPrintPos(80, 46); u8g.print(PCdata[3]); u8g.drawStr( 110, 46, "%"); u8g.drawStr( 0, 62, "GPU temp"); u8g.setPrintPos(80, 62); u8g.print(PCdata[1]); u8g.drawStr( 110, 62, "C"); } void setup() { if ( u8g.getMode() == U8G_MODE_R3G3B2 ) { u8g.setColorIndex(255); // white } else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) { u8g.setColorIndex(3); // max intensity } else if ( u8g.getMode() == U8G_MODE_BW ) { u8g.setColorIndex(1); // pixel on } else if ( u8g.getMode() == U8G_MODE_HICOLOR ) { u8g.setHiColorByRGB(255,255,255); } } void loop() { parsing(); u8g.firstPage(); do { draw(); } while( u8g.nextPage() ); // rebuild the picture after some delay //delay(50); } void parsing() { while (Serial.available() > 0) { char aChar = Serial.read(); if (aChar != 'E') { inData[index] = aChar; index++; inData[index] = '\0'; } else { char *p = inData; char *str; index = 0; String value = ""; while ((str = strtok_r(p, ";", &p)) != NULL) { string_convert = str; PCdata[index] = string_convert.toInt(); index++; } index = 0; updateDisplay_flag = 1; updateTemp_flag = 1; } timeout = millis(); timeOut_flag = 1; } }DmitryFeniks - ну если не работает u8g.print() - тогда выводите через u8g.drawStr() - оно же у вас работает?
Перевод в char делу не помогает, я постоянно наблюдаю вот такой вывод в любом случае:
проведите эксперимент - выведите заведомо известное значение:
если выведется CPU load 55 % - значит проблема вовсе не в дисплее, а в получениее или обработке данных
такс... это была глупейшая ошибка... я общался с портом, но не указал в сетапе