Помогите заменить библиотеку OLED_I2C на U8GLIB
- Войдите на сайт для отправки комментариев
Пт, 16/02/2018 - 12:47
Помогите заменить библиотеку 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(){
}
Igoreck, я ж вам ваш ужасный switch переписал на 50 строк короче - что ж вы его за собой таскаете? Зачем я старался?
Прошу прощения не тот код, вот он:
#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(){ }Igoreck - а в чему у вас проблема? Я когда компилирую ваш скетч, у меня занято примерно 1350 байт оперативки - что не так и много.
Igoreck - а в чему у вас проблема? Я когда компилирую ваш скетч, у меня занято примерно 1350 байт оперативки - что не так и много.
Понимаете, дело в том, что я собираю устройство типа метеостанции, и хочу прикрутить дозиметр, короче "все в одном". Но так как мой гомнокод с библиотекой OLED_I2C получается (92%), то боюсь мне не хватит места для дозиметра.
Igoreck - а в чему у вас проблема? Я когда компилирую ваш скетч, у меня занято примерно 1350 байт оперативки - что не так и много.
Понимаете, дело в том, что я собираю устройство типа метеостанции, и хочу прикрутить дозиметр, короче "все в одном". Но так как мой гомнокод с библиотекой OLED_I2C получается (92%), то боюсь мне не хватит места для дозиметра.
а где там 92% ? - у меня дай бог 70... Или этот код - не полный?
Да он не полный.
Нехочу позорится своим быдлокодом.
Пожалуйста помогите сопоставить U8glib вместо OLED_I2C.
Библиотека https://github.com/olikraus/U8glib_Arduino