Помогите заменить библиотеку OLED_I2C на U8GLIB

Igoreck
Offline
Зарегистрирован: 01.03.2017

Помогите заменить библиотеку OLED_I2C которая очень большая по обьему на U8GLIB.

  #include <OLED_I2C.h>
  OLED  myOLED(SDA, SCL, 1);
  extern uint8_t SmallFont[]; 
  volatile int encoderPin1 = 2;      
  volatile int encoderPin2 = 3;      
  volatile int MSB ;
  volatile int LSB ;
  volatile int encoded = 0 ;
  volatile int lastEncoded = 0;
  volatile int sum  ;
  volatile int a = 0;
  volatile int b = 0;
  volatile int c = 0;
  volatile int d = 0;
  volatile int encoderValue = 0;
  byte menuPos = 1;
  long val;
  long val_old = 0; 
  int i = 0;
void setup(){
      Serial.begin (9600);
      myOLED.begin();
      myOLED.clrScr();
      myOLED.setFont(SmallFont);
      
      pinMode(encoderPin1, INPUT);
      pinMode(encoderPin2, INPUT);
      pinMode(4, INPUT);    // Kнопка "Mеню"
      
      digitalWrite(encoderPin1, HIGH);
      digitalWrite(encoderPin2, HIGH);
      digitalWrite(4, HIGH);
      
      attachInterrupt(0, updateEncoder, CHANGE);
      attachInterrupt(1, updateEncoder, CHANGE);
}
void loop(){
    MainScreen();
    if(!digitalRead(4)){
      delay(200);Menu();
      }
//    if(c==1){
//      c=0;Serial.println(encoderValue);
//      }
}                     
void updateEncoder(){  
  MSB = digitalRead(encoderPin1);
  LSB = digitalRead(encoderPin2);
  encoded = (MSB << 1) |LSB; 
  sum  = (lastEncoded << 2) | encoded;
    if(encoded==0b0000){
      if(a==0){
        encoderValue = encoderValue+d; c=1; a=1; b=0;
        }
      }
    if(encoded==0b0011){
      if(b==0){
        encoderValue = encoderValue+d; c=1; b=1; a=0;
        }
      }
    if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011){
        d=+1;
      }
    if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000){
        d=-1;
      } 
  lastEncoded = encoded;
}
void MainScreen() {
  myOLED.clrScr();
  //myOLED.invertText(true);
  myOLED.print("MainScreen", CENTER, 20);
  //myOLED.invertText(false);
  myOLED.printNumI(encoderValue, CENTER, 40);
  myOLED.update();
}
void Menu(){  
  for (i=0; i<=500; i++){
    val = encoderValue;
   //***************************** Выбор позиции в меню ***********************          
                if(val > val_old){                
                       menuPos = menuPos + 1;
                       val_old = val;
                        }
                       if(menuPos > 6){
                          menuPos = 1;
                        }                       
                if(val < val_old){
                       menuPos = menuPos - 1;
                       val_old = val;
                        }                     
                      if(menuPos < 1){
                      menuPos = 6;
                        }
        switch(menuPos){
  //***************  устанавливаем курсор согласно позиции в меню  ***************
            case 1:
              myOLED.clrScr();             
              //myOLED.print(">", 0, 0);
              myOLED.invertText(true);              
              myOLED.print("Alarm", 10, 0);
              myOLED.invertText(false);         
              myOLED.print("Time", 10, 10);         
              myOLED.print("Setting", 10, 20);
              myOLED.print("Setting2", 10, 30);
              myOLED.print("Setting3", 10, 40);        
              myOLED.print("back", 10, 50);  
            if (menuPos == 1 && !digitalRead(4)) MenuSetAlarm();    
               break;                              
            case 2:
              myOLED.clrScr();                             
              //myOLED.print(">", 0, 10);
              myOLED.print("Alarm", 10, 0);
              myOLED.invertText(true);        
              myOLED.print("Time", 10, 10);
              myOLED.invertText(false); 
              myOLED.print("Setting", 10, 20);
              myOLED.print("Setting2", 10, 30);
              myOLED.print("Setting3", 10, 40);       
              myOLED.print("back", 10, 50);   
              if (menuPos == 2 && !digitalRead(4)) MenuSetTime();
               break;
            case 3:
              myOLED.clrScr();                      
              //myOLED.print(">", 0, 20);             
              myOLED.print("Alarm", 10, 0);         
              myOLED.print("Time", 10, 10);
              myOLED.invertText(true);         
              myOLED.print("Setting", 10, 20);
              myOLED.invertText(false);
              myOLED.print("Setting2", 10, 30);
              myOLED.print("Setting3", 10, 40);          
              myOLED.print("back", 10, 50);   
              if (menuPos == 3 && !digitalRead(4)) MenuSetting();
               break; 
             case 4:
              myOLED.clrScr();                      
              //myOLED.print(">", 0, 30);             
              myOLED.print("Alarm", 10, 0);         
              myOLED.print("Time", 10, 10);         
              myOLED.print("Setting", 10, 20);
              myOLED.invertText(true); 
              myOLED.print("Setting2", 10, 30);
              myOLED.invertText(false);
              myOLED.print("Setting3", 10, 40);         
              myOLED.print("back", 10, 50);   
              if (menuPos == 4 && !digitalRead(4)) MenuSetting();
               break; 
             case 5:
              myOLED.clrScr();                      
              //myOLED.print(">", 0, 40);             
              myOLED.print("Alarm", 10, 0);         
              myOLED.print("Time", 10, 10);         
              myOLED.print("Setting", 10, 20);
              myOLED.print("Setting2", 10, 30);
              myOLED.invertText(true); 
              myOLED.print("Setting3", 10, 40);
              myOLED.invertText(false);          
              myOLED.print("back", 10, 50);   
              if (menuPos == 5 && !digitalRead(4)) MenuSetting();
               break;                     
            case 6:
              myOLED.clrScr();             
              //myOLED.print(">", 0, 50);     
              myOLED.print("Alarm", 10, 0);   
              myOLED.print("Time", 10, 10);  
              myOLED.print("Setting", 10, 20);
              myOLED.print("Setting2", 10, 30);
              myOLED.print("Setting3", 10, 40);
              myOLED.invertText(true);        
              myOLED.print("back", 10, 50);
              myOLED.invertText(false);   
            }    
          myOLED.update();     
      if (!digitalRead(4) && menuPos == 6){break;}
         } 
  delay (150);     
}
void MenuSetTime(){  
    for (i=0; i<=500; i++){
    myOLED.clrScr();            
    myOLED.print("MenuSetTime", CENTER, 20);
    myOLED.update();
    if(!digitalRead(4)){break;}
  }
}
void MenuSetAlarm(){
  for (i=0; i<=500; i++){
  myOLED.clrScr();            
  myOLED.print("MenuSetAlarm", CENTER, 20);
  myOLED.update();
  if(!digitalRead(4)){break;}
  }
}
void MenuSetting(){
//  for (i=0; i<=500; i++){
//  myOLED.clrScr();            
//  myOLED.print("MenuSetting", CENTER, 20);
//  myOLED.update();
//  if(!digitalRead(4)){break;}
//  }
}
void MenuSetting2(){
  
}
void MenuSetting3(){
  
}

 

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

Igoreck, я ж вам ваш ужасный switch переписал на 50 строк короче - что ж вы его за собой таскаете?  Зачем я старался?

Igoreck
Offline
Зарегистрирован: 01.03.2017

Прошу прощения не тот код, вот он:

  #include <OLED_I2C.h>
  const char string_1[] PROGMEM = "Alarm";
  const char string_2[] PROGMEM = "Time";
  const char string_3[] PROGMEM = "Setting";
  const char string_4[] PROGMEM = "Setting2";
  const char string_5[] PROGMEM = "Setting3";
  const char string_6[] PROGMEM = "back";
  const char * menu_table[] ={string_1,string_2,string_3,string_4,string_5,string_6};

  OLED  myOLED(SDA, SCL, 1);
  extern uint8_t SmallFont[];
  #define encoderPin1  2
  #define encoderPin2  3
  byte MSB ;
  byte LSB ;
  byte encoded = 0 ;
  byte lastEncoded = 0;
  byte sum;  
  byte a = 0;
  byte b = 0;
  byte c = 0;
  volatile int d = 0;
  volatile int encoderValue = 0;
  byte menuPos = 1;
  byte val;
  byte val_old = 0; 
  int i = 0;
void setup(){
    Serial.begin (9600);
    myOLED.begin();
    myOLED.clrScr();
    myOLED.setFont(SmallFont);
     
    DDRD &= ~(1<<2); 
    DDRD &= ~(1<<3); 
    PORTD |= 1<<2;   
    PORTD |= 1<<3;    
    PORTD |= 1<<4;   //    pinMode(4, INPUT);    // Kнопка "Mеню"                 
    DDRD &= ~(1<<4); //    digitalWrite(4, HIGH);
    
    attachInterrupt(0, updateEncoder, CHANGE);
    attachInterrupt(1, updateEncoder, CHANGE);  

}
void loop(){
     MainScreen();
    if(!(PIND & 1<<4)){
      
      delay(200);
      Menu();
      }

      
}
void printMenu (byte invertLine) {
  byte i;
  myOLED.clrScr();     
  for (i = 0; i < 6; i++ )
   {if (i == (invertLine - 1)) myOLED.invertText(true);
    myOLED.print((const __FlashStringHelper *) menu_table[i] , 10, i*10); 
    if (i == (invertLine - 1)) myOLED.invertText(false);   } 
  myOLED.update();   
} 
void updateEncoder(){
  MSB = digitalRead(encoderPin1);
  LSB = digitalRead(encoderPin2);
  encoded = (MSB << 1) |LSB; 
  sum  = (lastEncoded << 2) | encoded;
    if(encoded==0b0000){
      if(a==0){
        encoderValue = encoderValue+d; c=1; a=1; b=0;
        }
      }
    if(encoded==0b0011){
      if(b==0){
        encoderValue = encoderValue+d; c=1; b=1; a=0;
        }
      }
    if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011){
        d=+1;
      }
    if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000){
        d=-1;
      } 
  lastEncoded = encoded;
}
void MainScreen() {
  myOLED.clrScr();  
  myOLED.print("MainScreen", CENTER, 20);  
  myOLED.printNumI(encoderValue, CENTER, 40);
  myOLED.update();
}
void Menu(){  
  for (i=0; i<=500; i++){
    val = encoderValue;
   //***************************** Выбор позиции в меню ***********************          
                if(val > val_old){                
                       menuPos = menuPos + 1;
                       val_old = val;
                        }
                       if(menuPos > 6){
                          menuPos = 1;
                        }                       
                if(val < val_old){
                       menuPos = menuPos - 1;
                       val_old = val;
                        }                     
                      if(menuPos < 1){
                      menuPos = 6;
                        }
      printMenu(menuPos); 
      if (!(PIND & 1<<4)) {
          switch  (menuPos) {
          case 1: MenuSetAlarm();break;
          case 2: MenuSetTime();break;
          case 3: MenuSetting();break;
          case 4: MenuSetting2();break;
          case 5: MenuSetting3();break;
          case 6: MainScreen();break;
        }
      }
  }
}
void MenuSetTime(){  
    for (i=0; i<=500; i++){
    myOLED.clrScr();            
    myOLED.print("MenuSetTime", CENTER, 20);
    myOLED.update();
    if(!(PIND & 1<<4)){break;}
  }
}
void MenuSetAlarm(){
  for (i=0; i<=500; i++){
  myOLED.clrScr();            
  myOLED.print("MenuSetAlarm", CENTER, 20);
  myOLED.update();
  if(!(PIND & 1<<4)){break;}
  }
}
void MenuSetting(){
  
}
void MenuSetting2(){
  
}
void MenuSetting3(){
  
}

 

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

Igoreck - а в чему у вас проблема? Я когда компилирую ваш скетч, у меня занято примерно 1350 байт оперативки - что не так и много.

Igoreck
Offline
Зарегистрирован: 01.03.2017

b707 пишет:

Igoreck - а в чему у вас проблема? Я когда компилирую ваш скетч, у меня занято примерно 1350 байт оперативки - что не так и много.

Понимаете, дело в том, что я собираю устройство типа метеостанции, и хочу прикрутить дозиметр, короче "все в одном". Но так как мой гомнокод с библиотекой OLED_I2C получается (92%), то боюсь мне не хватит места для дозиметра.

 

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

Igoreck пишет:

b707 пишет:

Igoreck - а в чему у вас проблема? Я когда компилирую ваш скетч, у меня занято примерно 1350 байт оперативки - что не так и много.

Понимаете, дело в том, что я собираю устройство типа метеостанции, и хочу прикрутить дозиметр, короче "все в одном". Но так как мой гомнокод с библиотекой OLED_I2C получается (92%), то боюсь мне не хватит места для дозиметра.

 

а где там 92% ? - у меня дай бог 70... Или этот код - не полный?

Igoreck
Offline
Зарегистрирован: 01.03.2017

Да он не полный.

Нехочу позорится своим быдлокодом.

Пожалуйста помогите сопоставить U8glib вместо OLED_I2C.

Библиотека https://github.com/olikraus/U8glib_Arduino