Ich versuche schon seit vielen Stunden hinter einen seltsamen Effekt zu kommen, oder genauer, das Problem zu lösen:
ich habe im PROGMEN mehrere Symbole abgelegt, die ich auf einem 128x64 OLED-Display anzeige, je nach Bedarf. ich benutze dazu die SSD1306_minimal lib, abgeändert von TinyWire auf die Wire . Nun wollte ich einige der Symbole gruppieren , so dass ich sie mittels Index anzeigen kann.
Das Problem: gebe ich den Index direkt als Zahl im Sketch an, wird das dazugehörige Symbol korrekt dargestellt. Ersetze ich die Zahl jedoch durch eine Byte, Int, Uint8 oder 16 - Variable, derich den Wert ich NICHT direkt als Zahl zugewiesen habe, sondern z.B. wia analogRead(A1) eingelesen habe, wird das Symbol nicht mehr korekt dargestellt. Es ist, als ob der Wert der Variablen nicht korekt bei der getFlash Funktion in der Library ankommt.
die tests laufen auf einem Uno-Clone. die IDE ist die 1.8.13. das ZielSystem ist ein Attiny167 , soll es zumindest werden, wenn ich mit dem Flash hinkomme.
kompiler-Warnungen bekomme ich keine, mit ausnahme, dass in der ssd1306 lib die Variable für die I2C- Adresse nicht benutzt, jedoch deklariert ist, der Autor hat die I2C Adresse direkt für die 128x64er reingeschrieben - , warnungen sind aber in der IDE aktiviert.
hier mein Sketch: (nur das Notwendigste)
#include <Wire.h>
#include <SSD1306_minimal_wire.h>
//byte array of bitmap 20x8 <eBat voll>
const unsigned char img_eBat02[] PROGMEM = { 0x7f, 0x5d, 0x5d, 0x5d,
0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x4d,
0x45, 0x51, 0x59, 0x5d, 0x41, 0x7f, 0x3e, 0x3e,
};
//byte array of bitmap 20x8 <eBat halb>
const unsigned char img_eBat01[] PROGMEM = { 0x7f, 0x5d, 0x5d, 0x5d,
0x5d, 0x5d, 0x5d, 0x5d, 0x4d, 0x45, 0x41, 0x41,
0x41, 0x41, 0x41, 0x41, 0x41, 0x7f, 0x3e, 0x3e,
};
//byte array of bitmap 20x8 <eBat leer>
const unsigned char img_eBat00[] PROGMEM = { 0x7f, 0x5d, 0x5d, 0x4d,
0x45, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
0x41, 0x41, 0x41, 0x41, 0x41, 0x7f, 0x3e, 0x3e,
};
const unsigned char *const img_eBat[] PROGMEM = {img_eBat00, img_eBat01, img_eBat02};
uint16_t cap1(){
uint16_t capacity = 3 - (1024/700);
return capacity;
}
uint16_t cap2(){
uint16_t capaci = map(analogRead(A1),0,1023,0,3);
return capaci;
}
void mainScreen(){
uint16_t eBat = 3 - (1024/700);
uint16_t eCap1 = cap1();
uint16_t eCap2 = cap2();
oled.drawImage( img_eBat[2], 106, 0, 20, 1 ); // funktioniert, das Symbol wird
// korrekt angezeigt
oled.drawImage( img_eBat[eBat], 106, 0, 20, 1 ); // funktioniert, das Symbol wird
// korrekt angezeigt egal ob eBat lokal oder global definiert ist
oled.drawImage( img_eBat[eCap1], 106, 0, 20, 1 ); // funktioniert, das Symbol wird
// korrekt angezeigt
oled.drawImage( img_eBat[eCap2], 106, 0, 20, 1 ); // funktioniert NICHT!
// das Symbol wird NICHT korrekt angezeigt! obwohl eCap2 den Wert 2 hat
// (oder zu haben scheint)???
}
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
so sieht die getFlash in der lib aus:
SSD1306Minimal.h
unsigned char getFlash( const unsigned char * mem, unsigned int idx );
SSD1306Minimal.cpp
unsigned char SSD1306_Mini::getFlash( const unsigned char * mem, unsigned int idx ){
unsigned char data= pgm_read_byte( &(mem[idx]) );
return data;
}
und hier noch die Funktion drawImage:
ssd1306Minimal.h
// draw an image with defined x,y position and width,height definition
void drawImage( const unsigned char * img, unsigned char col, unsigned char row, unsigned char w, unsigned char h );
ssd1306Minimal.cpp
void SSD1306_Mini::drawImage( const unsigned char * img, unsigned char col, unsigned char row, unsigned char w, unsigned char h ){
unsigned int i, data;
clipArea( col, row, w, h);
for (i=0;i< (w*h);i++){
data= getFlash( img, i);
Wire.beginTransmission(SlaveAddress);
Wire.write(GOFi2cOLED_Data_Mode); // data mode
Wire.write( data );
Wire.endTransmission();
}
}
ich hoffe es kan mir jemand auf die Sprünge helfen, wie ich die Variable korrekt übergeben muss, ohne sie als konstante zu definieren, denn die Variable muss eben variabel sein.