Вывод на дисплей с SSD1306

DmitryFeniks
Offline
Зарегистрирован: 03.02.2018

Доброго времени суток, у меня проблема с выводом числовых значений. Имею 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, "%");

 

DmitryFeniks
Offline
Зарегистрирован: 03.02.2018

Уже после сохранения сообщения заметил что в приведенном отрывке кода использую разные ячейки из масиива, но это ошибка только в одной из 4х строк и на работоспособность не повлияла

DmitryFeniks
Offline
Зарегистрирован: 03.02.2018

Уже поменял код, но почему то до сих пор не выводит значение, на подобном скетче с двухстрочным дисплеем данные выводятся. Постоянно получаю 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);
}

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Библиотека U8GLib? Почитайте в документации к ней, как должен выглядеть код вывода на экран. Подсказка: там должен быть цикл специальный.

DmitryFeniks
Offline
Зарегистрирован: 03.02.2018

С использованием цикла

u8g.firstPage();  
  do {
    draw();
  } while( u8g.nextPage() );

ситуация не меняется, ардуинка мигает что данные идут, но вывод их не происходит

DmitryFeniks
Offline
Зарегистрирован: 03.02.2018

Я уже грешил, что у меня не срабатывает парсинг с сериалпорта, точнее от него значения до цикла вывода не доводятся, пробовал переносить парсинг внутрь рисовалки, но изменений никаких, все значения выводятся нулями. Исам то парсинг рабочий, на двухстрочном дисплее я все эти данные вывожу... И уже обсмотрелся примеров из библиотеки и из интернетов.

#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;
  }
}

 

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

DmitryFeniks - ну если не работает u8g.print() - тогда выводите через u8g.drawStr() - оно же у вас работает?

char cc[5];

u8g.drawStr( 0, 14, "CPU load");
sprintf(cc,"%d %%",PCdata[2]); 
u8g.drawStr( 80, 14, cc);

 

DmitryFeniks
Offline
Зарегистрирован: 03.02.2018

Перевод в char делу не помогает, я постоянно наблюдаю вот такой вывод в любом случае:

CPU load 0 %
CPU temp 0 C
GPU load 0 %
GPU temp 0 C
 
Все еще подозреваю что данные не доходят до цикла отрисовки, но не понимаю почему...
b707
Offline
Зарегистрирован: 26.05.2017

проведите эксперимент - выведите заведомо известное значение:

char cc[5];
int value = 55;
u8g.drawStr( 0, 14, "CPU load");
sprintf(cc,"%d %%", value); 
u8g.drawStr( 80, 14, cc);

если выведется CPU load 55 % - значит проблема вовсе не в дисплее, а в получениее или обработке данных

DmitryFeniks
Offline
Зарегистрирован: 03.02.2018

такс... это была глупейшая ошибка... я общался с портом, но не указал в сетапе

Serial.begin(9600);