chruttli
21.08.2019, 20:01
Hallo Zusammen
Ich beschäftige mich mit einem ESP-32 und einem Display (ArduiTouch). Die Ansteuerung klappt wunderbar. Auch das Darstellen von Bildern funktioniert super.
Ich hatte nun die Idee, dass ich die Bilder über einen Index von einer Methode bekommen kann.
Zur Erklärung: Ich bekomme von einem Wetterdienst einen Index mitgeteilt, welches Wettersymbol heute dargestellt werden soll.
Aus diesem Grund habe ich mir eine Methode "getImage" geschrieben, welche mir nebst dem Image auch noch die Höhe, Breite und eine Bezeichnung gibt.
uint16_t sonne[] PROGMEM = {
0x0861, 0x1082, 0x10a2, 0x18c3, 0x18e3, 0x2104, 0x2124
};
uint16_t wolke[] PROGMEM = {
0x0000, 0x0020, 0x0020, 0x0020, 0x0020, 0x0841
};
void getImage(int idx, int &width, int &height, String &text, uint16_t* img) {
width = 0;
height = 0;
text = "";
switch (idx) {
case 1:
img = sonne;
width = 68;
height =52;
text = "Sonne";
break;
case 2:
img = wolke;
width = 105;
height =51;
text = "Wolke";
break;
}
}
void loop() {
// sonstiger Code zum Holen des Indexes vom Wetterdienst, usw.
// ...
int idx = 1;
// Passendes Bild von meiner Methode liefern lassen
uint16_t* img;
int width = 0;
int height = 0;
String text = "";
getImage(idx, width, height, text, img);
// Bild zeichnen (so funktionierts, da das Bild "sonne" direkt übergeben wird und nicht aus der Methode kommt
display.drawRGBBitmap(20, 85, sonne, height, width);
// Bild zeichnen (so stürzt es ab, da mit der Variable img etwas nicht stimmt)
display.drawRGBBitmap(20, 85, img, height, width);
// Logik für die Pause bis zum Wetterwechsel...
// ...
}
Ich verstehe, dass ich irgendein Problem mit der Variable / Pointer "img" mache. Ich finde nur die Lösung nicht.
Wo muss ich ein * durch ein & oder irgendwie was anderes ersetzen :-P
Die Variablen width, height und text werden korrekt gefüllt und können auch problemlos ausgegeben werden.
Die Methode "drawRGBBitmap" der Adafruit GFX-Library hat folgende Signatur:
void drawRGBBitmap(int16_t x, int16_t y, uint16_t *pcolors, int16_t w, int16_t h);
//@param x Top left corner horizontal coordinate. //@param y Top left corner vertical coordinate. //@param pcolors Pointer to 16-bit array of pixel values. //@param w Width of bitmap in pixels. //@param h Height of bitmap in pixels.
Ich hoffe ihr versteht was ich gerne möchte und könnt mir helfen.
Als Ausgabe beim Absturz auf dem seriellen Monitor erhalte ich folgendes:
Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.
Core 1 register dump:
PC : 0x400850e1 PS : 0x00060630 A0 : 0x80121300 A1 : 0x3ffb1d00
A2 : 0x3ffc0bd4 A3 : 0x00000000 A4 : 0x000000be A5 : 0x00000000
A6 : 0x0000000f A7 : 0x3ff65000 A8 : 0x3ff65000 A9 : 0x00000000
A10 : 0x00000000 A11 : 0x00000000 A12 : 0x00000030 A13 : 0x00000010
A14 : 0x000000bc A15 : 0x00000040 SAR : 0x0000001c EXCCAUSE: 0x0000001c
EXCVADDR: 0x00000000 LBEG : 0x400014fd LEND : 0x4000150d LCOUNT : 0xffffffff
Anschliessend startet der Controller neu.
Liebe Grüsse
Chruttli
Ich beschäftige mich mit einem ESP-32 und einem Display (ArduiTouch). Die Ansteuerung klappt wunderbar. Auch das Darstellen von Bildern funktioniert super.
Ich hatte nun die Idee, dass ich die Bilder über einen Index von einer Methode bekommen kann.
Zur Erklärung: Ich bekomme von einem Wetterdienst einen Index mitgeteilt, welches Wettersymbol heute dargestellt werden soll.
Aus diesem Grund habe ich mir eine Methode "getImage" geschrieben, welche mir nebst dem Image auch noch die Höhe, Breite und eine Bezeichnung gibt.
uint16_t sonne[] PROGMEM = {
0x0861, 0x1082, 0x10a2, 0x18c3, 0x18e3, 0x2104, 0x2124
};
uint16_t wolke[] PROGMEM = {
0x0000, 0x0020, 0x0020, 0x0020, 0x0020, 0x0841
};
void getImage(int idx, int &width, int &height, String &text, uint16_t* img) {
width = 0;
height = 0;
text = "";
switch (idx) {
case 1:
img = sonne;
width = 68;
height =52;
text = "Sonne";
break;
case 2:
img = wolke;
width = 105;
height =51;
text = "Wolke";
break;
}
}
void loop() {
// sonstiger Code zum Holen des Indexes vom Wetterdienst, usw.
// ...
int idx = 1;
// Passendes Bild von meiner Methode liefern lassen
uint16_t* img;
int width = 0;
int height = 0;
String text = "";
getImage(idx, width, height, text, img);
// Bild zeichnen (so funktionierts, da das Bild "sonne" direkt übergeben wird und nicht aus der Methode kommt
display.drawRGBBitmap(20, 85, sonne, height, width);
// Bild zeichnen (so stürzt es ab, da mit der Variable img etwas nicht stimmt)
display.drawRGBBitmap(20, 85, img, height, width);
// Logik für die Pause bis zum Wetterwechsel...
// ...
}
Ich verstehe, dass ich irgendein Problem mit der Variable / Pointer "img" mache. Ich finde nur die Lösung nicht.
Wo muss ich ein * durch ein & oder irgendwie was anderes ersetzen :-P
Die Variablen width, height und text werden korrekt gefüllt und können auch problemlos ausgegeben werden.
Die Methode "drawRGBBitmap" der Adafruit GFX-Library hat folgende Signatur:
void drawRGBBitmap(int16_t x, int16_t y, uint16_t *pcolors, int16_t w, int16_t h);
//@param x Top left corner horizontal coordinate. //@param y Top left corner vertical coordinate. //@param pcolors Pointer to 16-bit array of pixel values. //@param w Width of bitmap in pixels. //@param h Height of bitmap in pixels.
Ich hoffe ihr versteht was ich gerne möchte und könnt mir helfen.
Als Ausgabe beim Absturz auf dem seriellen Monitor erhalte ich folgendes:
Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.
Core 1 register dump:
PC : 0x400850e1 PS : 0x00060630 A0 : 0x80121300 A1 : 0x3ffb1d00
A2 : 0x3ffc0bd4 A3 : 0x00000000 A4 : 0x000000be A5 : 0x00000000
A6 : 0x0000000f A7 : 0x3ff65000 A8 : 0x3ff65000 A9 : 0x00000000
A10 : 0x00000000 A11 : 0x00000000 A12 : 0x00000030 A13 : 0x00000010
A14 : 0x000000bc A15 : 0x00000040 SAR : 0x0000001c EXCCAUSE: 0x0000001c
EXCVADDR: 0x00000000 LBEG : 0x400014fd LEND : 0x4000150d LCOUNT : 0xffffffff
Anschliessend startet der Controller neu.
Liebe Grüsse
Chruttli