U8glib对oled的简单测试程序很慢

时间:2014-07-08 16:09:59

标签: c arduino

我正在尝试在arduino以太网上使用u8glib,在第一阶段我需要以一种非常漂亮的方式显示一个简单的倒计时。测试是否可以及时管理显示器。

我必须以毫秒为单位测量变化,比如30ms,因此我需要倒计时在大约50 / 100ms内改变1个单位。

这是oled http://www.seeedstudio.com/wiki/Grove_-_OLED_Display_1.12%22

现在我正在尝试使用U8glib,因为它集成了很多字体,而且似乎有很好的记录。

但最大的问题是:倒计时,没有睡觉,太慢了!按1秒的顺序改变1秒。 我错了什么?我需要更换库吗?

由于

这是代码

#include "U8glib.h"

U8GLIB_SSD1327_96X96_GR u8g(U8G_I2C_OPT_NONE);  // I2C

#define MAX_VAL  200
#define MAX_VAL1 250
#define MAX_VAL2 350
#define MAX_VAL3 450
#define MAX_VAL4 500

int current_max_val  = MAX_VAL1;
int currentBB = current_max_val;

char bb_n[4] = {0,0,0,0};
int bb_level = 4;


static int last_bb_n = current_max_val;

void draw(void) {

  int sizev = u8g.getStrWidth(bb_n);
  u8g.drawStr( (48 - (sizev/2)),60,bb_n);

  for(int i=0;i<bb_level;i++){  
    u8g.drawTriangle((i*10)+0,90, (i*10)+10,90, (i*10)+5,85);
  }
  last_bb_n = currentBB;
  u8g.drawHLine(0,20, 96);
  u8g.drawHLine(0,70, 96);
}

void setup(void) {

  // flip screen, if required
  //u8g.setRot180();

  // set SPI backup if required
  //u8g.setHardwareBackup(u8g_backup_avr_spi);

  // assign default color value
  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);
  }
  u8g.setFont(u8g_font_gdb30);
}

void loop(void) {
  // picture loop
  u8g.firstPage(); 
  count();

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

}

void count(){
  if(currentBB == 0){
   currentBB = current_max_val; 
  }

  itoa(currentBB,bb_n,10);

  if(currentBB >= ((current_max_val/4)*3)){
    bb_level = 4;
  }else if((currentBB < ((current_max_val/4)*3)) && (currentBB >= (current_max_val/4)*2)){
    bb_level = 3;
  }else if((currentBB < ((current_max_val/4)*2))  && (currentBB >= (current_max_val/4))){
    bb_level = 2;
  }else if(currentBB < (current_max_val/4)){
    bb_level = 1;
  }else{
    bb_level = 0;
  }

  currentBB--;

1 个答案:

答案 0 :(得分:1)

优化的一些想法:

  1. 使用U8GLIB_SSD1327_96X96_2X_GR
  2. 将sizev设为全局变量,并以count()
  3. 计算其值

    奥利弗