Jump to content

lesthegrngo

Members
  • Posts

    1245
  • Joined

  • Last visited

Everything posted by lesthegrngo

  1. Just a note to inform you all that while you can run the scrolling OLED altimeter on the same Nano as you can for the altimeter or other gauge, my advice is don't - it makes both items very laggy, slow to respond plus when I tried it you got the very occasional glitch that we were trying to eradicate. Having a separate Nano for the scrolling Altimeter is the way to go Cheers Les
  2. I do't think that there are any 'best' methods - a quick look at what people have achieved on this forum shows that any of those methods, plus a few more all work, with the necessary application of thought and skill and patience. I am lucky enough to possess all three of those, plus a basic desktop milling machine and lathe, and I've been able to make stuff I never dreamed of However a combination of a CNC router and laser cutter / engraver is responsible for 95% of my stuff. Used correctly they can do many things. My basic method for making a panel is to use the CNC router to make a backplate (normally from MDF) using the CNC router, then make a PCB to fit the electronics, again with the CNC router, and make the fascia from painted acrylic sheet laser engraved and cut. I use my 3d printer for some jobs, but most panels are a collection of flat surfaces and a little ingenuity can make some complicated shapes on the router. For info I have the K40 type laser cutter, a 3040 CNC router (get the biggest one you can afford) and a Lulzbot Mini 3D printer, which in my opinion is a bit too small Hope this helps Les
  3. Gents, I'm very happy to report that it works perfectly. I had an old instance running alongside the modified version for both the Baro Alt and the Altimeter, on the 64 x 32 and 128 x 64 resolutions respectively, and while the old version continued to glitch frequently, the new version behaved beautifully. A brilliant piece of work, gents, I take my hat off to you both If you want the 128 x 64 version of the scrolling altimeter sketch and .h library, let me know Thanks again for all your hard work on this Les
  4. Guys, will give it a go first thing in the morning, fingers crossed Cheers Les
  5. Fantastic stuff, wish I could do more than just cheer from the sidelines! Les
  6. maybe it would be best to start with a non scrolling sketch, like this one? #define DCSBIOS_DEFAULT_SERIAL #include <DcsBios.h> #include <Arduino.h> #include <U8g2lib.h> #include <Wire.h> //U8G2_SSD1306_128X64_ALT0_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); U8G2_SSD1306_64X32_1F_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); char* displayString = "----"; DcsBios::Int16Buffer altPressure0Buffer(0x1086); DcsBios::Int16Buffer altPressure1Buffer(0x1088); DcsBios::Int16Buffer altPressure2Buffer(0x108a); DcsBios::Int16Buffer altPressure3Buffer(0x108c); void setup() { u8g2.begin(); DcsBios::setup(); } void loop() { DcsBios::loop(); if (altPressure0Buffer.hasUpdatedData()) { displayString[3] = mapeo(altPressure0Buffer.getData()); } if (altPressure1Buffer.hasUpdatedData()) { displayString[2] = mapeo(altPressure1Buffer.getData()); } if (altPressure2Buffer.hasUpdatedData()) { displayString[1] = mapeo(altPressure2Buffer.getData()); } if (altPressure3Buffer.hasUpdatedData()) { displayString[0] = mapeo(altPressure3Buffer.getData()); } u8g2.clearBuffer(); u8g2.setFont(u8g2_font_fub20_tn ); u8g2.setCursor(0, 24); u8g2.print(displayString); u8g2.sendBuffer(); delay (5); } char mapeo(unsigned int valor){ if (valor < 6553) { return '0'; } if (valor < 13107) { return '1'; } if (valor < 19660) { return '2'; } if (valor < 26214) { return '3'; } if (valor < 32767) { return '4'; } if (valor < 39321) { return '5'; } if (valor < 45874) { return '6'; } if (valor < 52428) { return '7'; } if (valor < 58981) { return '8'; } return '9' ; } This glitches when you are flying Cheers Les
  7. I certainly don't want to put you off doing an empiric test, especially if you are able to actually record the data output from DCS, as it would clear up once an for all whether it was a corrupted DCS data stream or not. We'd certainly appreciate the help and feedback, However, I did some tests with a number of things, including a monitor that showed me the DCS output and it appeared, at least visually, to be stable, which is why we are suspecting the interaction within the Arduino. But with the limited knowledge I have, it may be that it wasn't up to scratch. As for the gauge jittering, I have encountered that before too, on other sketches. One was traced to a dry joint on a stepper motor, which for all the world looked like a perfect joint, but in reality was an intermittent contact. Another couple were with the EasyDriver boards, which when swapped for another board cured the problem - whether it was a contact in the headers or a problem with the EasyDriver itself, I can't say for sure, but I started swapping to A4988 driver boards and found them to be more reliable, more robust, and also give a much smoother gauge action. All the jittery gauges have been eliminated by hardware fixes. But it's not impossible that the DCS output is at least contributory so we welcome anything you can find out. Cheers for the assistance, it's appreciated! Les
  8. Ha, literally just asked whether you had this issue on your on build thread! Thanks for the input, we will certainly post it here if we find out what it is Cheers Les
  9. Thanks Middlefart Both No1SonUK and I are trying to resolve the funny glitching that happens with OLEDs using sketches that we and yourself have devised. We have to ask, do you notice it, and if you do, do you have any explanation or even better, fix, for it? We've been wracking our brains for a cure for our OLED's sketches, but so far are not making any significant progress - as you can see from the four page thread on it. If you are able to help, in any way, we would be grateful for your input! Cheers Les
  10. I just hope that the dreaded RS485 system doesn't creep into this ....! Good luck, I will help with what I can but the coding is beyond my skills. However I do have an abundance of hardware, so can test things if you give me the info Cheers Les
  11. Another update - this is bugging me and it's become a bit obsessive I'm afraid! I made another instance of the Baro Alt display, but this time using a Mega, so basically two identical sketches pulling from the same source, the only difference being the use of a Mega rather than a Nano. My reasoning was maybe it would eliminate memory constraints. In flight, they both glitch, but here's the thing - they glitch differently, at different times and totally out of synch. I did the same for the Altimeter scrolling display - same result, both glitching but in different ways at different times. So whatever is happening, it's happening inside the Arduino and OLED Not sure where we go from here..... Les
  12. Here's the TISL codewheel sketch I discussed above #define DCSBIOS_DEFAULT_SERIAL #include <DcsBios.h> #include <Arduino.h> #include <U8g2lib.h> #include <Wire.h> //#include "XBM.h" //64x32 XBM format U8G2_SSD1306_64X32_1F_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); static const unsigned char c24_0[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x17, 0xFD, 0x3F, 0x00, 0x00, 0x00, 0xC0, 0x7F, 0x00, 0xC0, 0x7F, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0xE0, 0x0F, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0xC0, 0x7F, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x02, 0xF8, 0x7F, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const unsigned char c24_1[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xE4, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xFE, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x07, 0xF0, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x80, 0x0F, 0xF8, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0x07, 0xF8, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0x0F, 0xF8, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xE0, 0x07, 0xF0, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xFE, 0x03, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xC0, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const unsigned char c24_2[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const unsigned char c24_3[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xC3, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x81, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x7E, 0x00, 0xFF, 0xFF, 0xFF, 0x03, 0x78, 0x00, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0x0F, 0xFC, 0x00, 0xF8, 0x01, 0xFF, 0xFF, 0xFF, 0x0F, 0xF8, 0x00, 0xF0, 0x07, 0xFF, 0xFF, 0xFF, 0x07, 0xF8, 0x01, 0xF0, 0x07, 0xFF, 0xFF, 0xFF, 0x03, 0xF8, 0x03, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0xC0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x7F, 0x80, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x7F, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7F, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const unsigned char c24_4[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x7F, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x00, 0x80, 0x0F, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x03, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x7E, 0xF8, 0x03, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0x3F, 0xF0, 0x07, 0x80, 0x07, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x0F, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x0F, 0x80, 0x07, 0x00, 0x00, 0x80, 0x0F, 0x80, 0x1F, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x3F, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x7E, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0xFE, 0xC1, 0x07, 0x00, 0x00, 0x00, 0x7E, 0x00, 0xFC, 0xC3, 0x0F, 0x00, 0x00, 0x00, 0xFE, 0x07, 0xF8, 0x8F, 0x07, 0x00, 0x00, 0x00, 0xFE, 0x0F, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xF8, 0x0F, 0xE0, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x80, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0xFE, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const unsigned char c24_5[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x1F, 0x00, 0x00, 0x0E, 0x00, 0x00, 0xC0, 0xFF, 0x7F, 0x00, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0xF8, 0xFF, 0xFF, 0x03, 0x80, 0x0F, 0xF0, 0x03, 0xFC, 0xFF, 0xFF, 0x07, 0x00, 0x1F, 0xF0, 0x07, 0xFC, 0xE1, 0xF0, 0x07, 0x80, 0x0F, 0xF0, 0x0F, 0xFE, 0x00, 0xE0, 0x0F, 0x00, 0x1F, 0xF0, 0x1F, 0x3E, 0x00, 0xC0, 0x1F, 0x00, 0x1F, 0xF0, 0x3F, 0x3F, 0x00, 0x80, 0x1F, 0x80, 0x0F, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0x3F, 0x00, 0x1F, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0xFE, 0x80, 0x0F, 0xF0, 0xFD, 0x1F, 0x00, 0x00, 0xFC, 0x80, 0x1F, 0xF0, 0xF9, 0x1F, 0x00, 0x00, 0xFC, 0x03, 0x0F, 0xF0, 0xE1, 0x1F, 0x00, 0x00, 0xF8, 0x07, 0x1F, 0xF0, 0xC0, 0x1F, 0x00, 0x0F, 0xF0, 0x9F, 0x0F, 0xF0, 0x81, 0x1F, 0x00, 0x1F, 0xC0, 0xFF, 0x0F, 0xF0, 0x01, 0x1F, 0x00, 0x1F, 0xC0, 0xFF, 0x1F, 0xF0, 0x01, 0x04, 0x00, 0x1F, 0x00, 0xFF, 0x0F, 0xF0, 0x01, 0x00, 0x80, 0x0F, 0x00, 0xFC, 0x1F, 0xF0, 0x01, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x0F, 0xE0, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const unsigned char c24_6[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x7F, 0xC0, 0x1F, 0xFE, 0x03, 0x00, 0x00, 0x00, 0xFF, 0xE0, 0x0F, 0xF0, 0x03, 0x00, 0x00, 0x00, 0xFF, 0xE1, 0x03, 0xE0, 0x07, 0x00, 0x00, 0x00, 0xFF, 0xF3, 0x03, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x01, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x01, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0xDF, 0xFF, 0x01, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x9F, 0xFF, 0x01, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x01, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x01, 0x80, 0x07, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x01, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x1F, 0xF0, 0x01, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x0F, 0x40, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0xFC, 0x03, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x80, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const unsigned char c24_7[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xF8, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xFC, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x80, 0x7F, 0xF8, 0x07, 0x00, 0x00, 0xA0, 0xF9, 0xC1, 0x0F, 0xE0, 0x07, 0x00, 0x00, 0xF8, 0xFF, 0xE3, 0x0F, 0xC0, 0x0F, 0x00, 0x00, 0xF8, 0xFF, 0xE7, 0x07, 0x80, 0x0F, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0x03, 0x80, 0x0F, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0x03, 0x80, 0x1F, 0x00, 0x00, 0x60, 0xF9, 0xFF, 0x03, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x03, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0xF0, 0xFC, 0x03, 0x00, 0x1F, 0xF0, 0x07, 0x00, 0xF0, 0xF8, 0x03, 0x80, 0x0F, 0xF0, 0x3F, 0x00, 0xF0, 0xF0, 0x03, 0x80, 0x0F, 0xF0, 0xFF, 0x01, 0xF0, 0xE0, 0x03, 0xC0, 0x0F, 0xE0, 0xFF, 0x0F, 0xF0, 0x80, 0x00, 0xE0, 0x0F, 0x80, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0xF0, 0x07, 0x00, 0xFC, 0xFF, 0xF3, 0x00, 0x00, 0xFE, 0x03, 0x00, 0xE0, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const unsigned char c24_8[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE6, 0xAF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0xD5, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x07, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x3F, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xC1, 0x07, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xCF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const unsigned char c24_9[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x00, 0x65, 0xBF, 0x01, 0x30, 0x00, 0xFC, 0xFF, 0x80, 0xFF, 0xFF, 0x07, 0x78, 0x00, 0xFE, 0xE0, 0x80, 0xFF, 0xFF, 0x0F, 0xF8, 0x00, 0x3F, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x78, 0x00, 0x3F, 0x00, 0x80, 0xFF, 0xFF, 0x07, 0xF8, 0x00, 0x1F, 0x00, 0x00, 0x59, 0x7F, 0x02, 0xF8, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0xF8, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0xF8, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x78, 0x80, 0x0F, 0x00, 0x03, 0x00, 0x3F, 0x00, 0xF8, 0x80, 0x0F, 0x00, 0x1F, 0x00, 0x1E, 0x00, 0xF8, 0x80, 0x0F, 0x00, 0xFF, 0x00, 0x1F, 0x00, 0xF8, 0x48, 0x1F, 0x00, 0xFF, 0x0F, 0x1F, 0x00, 0xF8, 0xFF, 0x3F, 0x00, 0xFF, 0x7F, 0x3F, 0x00, 0xF8, 0xFF, 0x3F, 0x80, 0xFE, 0xFF, 0x1F, 0x00, 0xF8, 0xFF, 0x3F, 0xC0, 0xF0, 0xFF, 0x1F, 0x00, 0xF8, 0xFF, 0x3F, 0xC0, 0x00, 0xFF, 0x1F, 0x00, 0x80, 0x59, 0x05, 0xC0, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const unsigned char c24_10[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x06, 0xC0, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x1F, 0xF8, 0x03, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x0F, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x07, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x01, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x1F, 0xF0, 0x01, 0x80, 0x07, 0x00, 0x00, 0x00, 0x1F, 0xF0, 0x01, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x1F, 0xF0, 0x01, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x1F, 0xF0, 0x01, 0x80, 0x07, 0x00, 0x00, 0x00, 0x1F, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0x1F, 0xF4, 0x03, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x07, 0xE0, 0x07, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x07, 0xF0, 0x03, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x07, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x07, 0xF8, 0x01, 0x00, 0x00, 0x00, 0x98, 0x9A, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const unsigned char c24_11[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xC0, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0xFE, 0xF7, 0xC0, 0x1F, 0xF8, 0x03, 0x30, 0x00, 0x7E, 0x80, 0xE0, 0x0F, 0xF0, 0x03, 0xF8, 0x00, 0x3F, 0x00, 0xE0, 0x03, 0xC0, 0x07, 0xF8, 0x00, 0x1F, 0x00, 0xE0, 0x03, 0xC0, 0x07, 0xF8, 0x01, 0x1F, 0x00, 0xF0, 0x01, 0xC0, 0x0F, 0xF0, 0x03, 0x1F, 0x00, 0xF0, 0x01, 0x80, 0x07, 0xF0, 0x87, 0x0F, 0x00, 0xF0, 0x01, 0x80, 0x0F, 0xE0, 0x8F, 0x0F, 0x00, 0xF0, 0x01, 0x80, 0x0F, 0xC0, 0x9F, 0x0F, 0x00, 0xF0, 0x01, 0x80, 0x07, 0x80, 0x7F, 0x1F, 0x00, 0xF0, 0x01, 0xC0, 0x0F, 0x00, 0xFF, 0x1F, 0x00, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0xFE, 0x3F, 0x00, 0xFF, 0x07, 0xE0, 0x07, 0x00, 0xFC, 0x7F, 0x80, 0xFF, 0x07, 0xF0, 0x03, 0x00, 0xF0, 0xFF, 0xC0, 0xFF, 0x07, 0xF8, 0x03, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x07, 0xF8, 0x01, 0x00, 0x80, 0xFF, 0xFF, 0x99, 0x02, 0xF8, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const unsigned char c24_12[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x7F, 0xFD, 0x03, 0x00, 0x00, 0x00, 0x04, 0xC0, 0x0F, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x07, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x3F, 0xE0, 0x03, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0x7E, 0xE0, 0x03, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xFE, 0xF0, 0x01, 0x80, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0xF1, 0x01, 0x80, 0x0F, 0x00, 0x00, 0x00, 0xF8, 0xE3, 0x01, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x03, 0x80, 0x07, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x03, 0xC0, 0x07, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x07, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x0F, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x1F, 0xF8, 0x03, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const unsigned char c24_13[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x01, 0xF0, 0x07, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0xF0, 0x3F, 0x00, 0x00, 0x80, 0xFF, 0xFD, 0x07, 0xF0, 0xFF, 0x03, 0x00, 0x80, 0x1F, 0xE0, 0x07, 0xF0, 0xFF, 0x1F, 0x00, 0xC0, 0x0F, 0xC0, 0x0F, 0xF0, 0xFF, 0xFF, 0x00, 0xC0, 0x07, 0x80, 0x0F, 0xF0, 0xF9, 0xFF, 0x07, 0xE0, 0x07, 0x80, 0x0F, 0xF0, 0xE1, 0xFF, 0x3F, 0xC0, 0x07, 0x80, 0x1F, 0xF0, 0x01, 0xFF, 0xFF, 0xE1, 0x03, 0x00, 0x1F, 0xF0, 0x01, 0xF0, 0xFF, 0xE3, 0x03, 0x00, 0x1F, 0xF0, 0x01, 0x80, 0xFF, 0xE7, 0x03, 0x00, 0x1F, 0xF0, 0x01, 0x00, 0xFC, 0xDF, 0x07, 0x80, 0x0F, 0xF0, 0x01, 0x00, 0xE0, 0xFF, 0x07, 0x80, 0x0F, 0xF0, 0x01, 0x00, 0x00, 0xFF, 0x0F, 0xC0, 0x0F, 0xF0, 0x01, 0x00, 0x00, 0xFF, 0x1F, 0xE0, 0x0F, 0xF0, 0x00, 0x00, 0x00, 0xFC, 0x3F, 0xF8, 0x07, 0xF0, 0x01, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0x03, 0xF0, 0x01, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x03, 0xF0, 0x01, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const unsigned char c24_14[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x80, 0xCF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0F, 0xFE, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x80, 0x0F, 0xF8, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x80, 0x0F, 0x80, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x80, 0x0F, 0x00, 0xFC, 0xFF, 0x03, 0x00, 0x00, 0x80, 0x0F, 0x00, 0xE0, 0xFF, 0x07, 0x00, 0x00, 0x80, 0x0F, 0x00, 0x00, 0xFF, 0x07, 0x00, 0x00, 0x80, 0x0F, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const unsigned char c24_15[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x0F, 0xFC, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x1F, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0xC0, 0xBF, 0xFF, 0x7F, 0xFF, 0x3F, 0x00, 0x00, 0xC0, 0x0F, 0xFC, 0x0F, 0xFF, 0xFF, 0x01, 0x00, 0xE0, 0x07, 0xF8, 0x03, 0xF0, 0xFF, 0x0F, 0x00, 0xE0, 0x03, 0xF0, 0x03, 0xC0, 0xFF, 0x7F, 0x00, 0xE0, 0x03, 0xF0, 0x03, 0x00, 0xFC, 0xFF, 0x07, 0xE0, 0x03, 0xF0, 0x01, 0x00, 0xE0, 0xFF, 0x1F, 0xE0, 0x03, 0xF0, 0x01, 0x00, 0x00, 0xFF, 0x3F, 0xE0, 0x03, 0xF0, 0x03, 0x00, 0x00, 0xF8, 0x3F, 0xE0, 0x07, 0xF0, 0x03, 0x00, 0x00, 0x80, 0x1F, 0xC0, 0x07, 0xF8, 0x07, 0x00, 0x00, 0x00, 0x1E, 0xC0, 0x1F, 0xFE, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const unsigned char c24_16[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x7F, 0xF8, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFD, 0xFF, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x3F, 0xF0, 0x1F, 0xF8, 0x03, 0x00, 0x00, 0x80, 0x1F, 0xE0, 0x0F, 0xE0, 0x03, 0x00, 0x00, 0x80, 0x1F, 0xC0, 0x0F, 0xE0, 0x03, 0x00, 0x00, 0x80, 0x0F, 0xC0, 0x0F, 0xE0, 0x07, 0x00, 0x00, 0x80, 0x0F, 0xC0, 0x07, 0xC0, 0x07, 0x00, 0x00, 0x80, 0x0F, 0xC0, 0x07, 0xC0, 0x07, 0x00, 0x00, 0x80, 0x0F, 0xC0, 0x0F, 0xE0, 0x07, 0x00, 0x00, 0x80, 0x1F, 0xC0, 0x0F, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x1F, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x7F, 0xF8, 0x3F, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFC, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x7F, 0xF8, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x0F, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const unsigned char c24_17[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0xFE, 0x07, 0x00, 0x3F, 0xF0, 0x1F, 0x00, 0x80, 0xFF, 0x1F, 0x00, 0x7F, 0xF8, 0x3F, 0x00, 0xC0, 0xFF, 0xFF, 0x00, 0xFF, 0xFE, 0xFF, 0x00, 0xE0, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0x01, 0xF0, 0x9F, 0xFF, 0x07, 0xFD, 0xFF, 0xFE, 0x01, 0xF0, 0x03, 0xFC, 0x0F, 0xF0, 0x1F, 0xF0, 0x03, 0xF8, 0x01, 0xF8, 0x3F, 0xE0, 0x1F, 0xE0, 0x03, 0xF8, 0x00, 0xF0, 0x7F, 0xC0, 0x0F, 0xE0, 0x03, 0xF8, 0x00, 0xF0, 0xFF, 0xC0, 0x0F, 0xE0, 0x07, 0x7C, 0x00, 0xF0, 0xFF, 0xC0, 0x07, 0xC0, 0x07, 0x7C, 0x00, 0xE0, 0xFB, 0xC0, 0x07, 0xC0, 0x07, 0x7C, 0x00, 0xE0, 0xF3, 0xC0, 0x0F, 0xC0, 0x07, 0xFC, 0x00, 0xE0, 0xE3, 0xC0, 0x0F, 0xE0, 0x03, 0x7C, 0x00, 0xF0, 0xC1, 0xE0, 0x1F, 0xF0, 0x03, 0xFC, 0x00, 0xF0, 0xC1, 0xF8, 0x3F, 0xF8, 0x03, 0xF8, 0x01, 0xF8, 0x81, 0xFF, 0xFF, 0xFF, 0x01, 0xF8, 0x01, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xF0, 0x07, 0xFE, 0x00, 0xFF, 0xFC, 0x7F, 0x00, 0xE0, 0xFF, 0x7F, 0x00, 0x7F, 0xF8, 0x3F, 0x00, 0xC0, 0xFF, 0x3F, 0x00, 0x0F, 0xE0, 0x0F, 0x00, 0x80, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const unsigned char c24_18[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xF9, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x80, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x80, 0x0F, 0x00, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xC0, 0x0F, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0xFE, 0x1F, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0xBE, 0x3F, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x3E, 0x3F, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x3F, 0x7E, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x1E, 0xFC, 0x00, 0x00, 0x00, 0x80, 0x0F, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x80, 0x1F, 0xF8, 0x01, 0x00, 0x00, 0x80, 0x1F, 0xC0, 0x0F, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x7F, 0xE0, 0x0F, 0xF0, 0x03, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x07, 0xE0, 0x03, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x03, 0xC0, 0x01, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const unsigned char c24_19[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0x1F, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x7F, 0xFF, 0x3F, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0x01, 0x00, 0xE0, 0xFF, 0xA1, 0xFF, 0x00, 0xFF, 0x07, 0x00, 0xF0, 0x1F, 0x00, 0xF0, 0x00, 0xFE, 0x0F, 0x00, 0xF8, 0x03, 0x00, 0xC0, 0x00, 0xFE, 0x1F, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7F, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7E, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFC, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xF8, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xF8, 0x01, 0xF8, 0x03, 0x00, 0xC0, 0x00, 0x3F, 0xF0, 0x03, 0xF8, 0x07, 0x00, 0xF0, 0x80, 0x1F, 0xE0, 0x07, 0xF0, 0xBF, 0x00, 0xFE, 0xC0, 0x1F, 0xE0, 0x07, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xC0, 0x07, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x80, 0x03, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x01, 0x00, 0xF8, 0xFF, 0x1F, 0xFF, 0x01, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x01, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; const unsigned char* aBitmaps[] = { //array of pointers to PROGMEM c24_0, c24_1, c24_2, c24_3, c24_4, c24_5, c24_6, c24_7, c24_8, c24_9, c24_10, c24_11, c24_12, c24_13, c24_14, c24_15, c24_16, c24_17, c24_18, c24_19 }; void onTislCode2Change(unsigned int newValue) //simpler with array index { u8g2.clearBuffer(); u8g2.drawXBMP( 0, 0, 64, 32, aBitmaps[newValue]); //direct from PROGMEM u8g2.sendBuffer(); } DcsBios::IntegerBuffer tislCode2Buffer(0x111a, 0x1f00, 8, onTislCode2Change); void setup() { u8g2.begin(); DcsBios::setup(); } void loop() { DcsBios::loop(); } As far as I can tell this does not glitch. I also modified Middlefart's scrolling sketch to do the fuel quantity display, and also the left fuel gauge - I know that the scrolling sketch slows down the gauge update speed terribly, but for the fuel gauge that isn't important #define DCSBIOS_DEFAULT_SERIAL #include <AccelStepper.h> #include "DcsBios.h" #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include "charactersbak.h" #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 32 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) //Comment for barometric pressure #define ALTIMETER int updateInterval = 100; //the number of milliseconds between updates struct scrollDigit { int digit; //The digit that is displayed int y; // The vertical position of the digit }; struct disp { Adafruit_SSD1306 display; int width; int numberOfDigits; scrollDigit digits[5]; }; disp oled = {Adafruit_SSD1306(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET), 24, 5, {{0,0},{0,0},{0,0},{0,0},{0,0}}}; struct StepperConfig { unsigned int maxSteps; unsigned int acceleration; unsigned int maxSpeed; }; class Vid29Stepper : public DcsBios::Int16Buffer { private: AccelStepper& stepper; StepperConfig& stepperConfig; unsigned int (*map_function)(unsigned int); unsigned char initState; public: Vid29Stepper(unsigned int address, AccelStepper& stepper, StepperConfig& stepperConfig, unsigned int (*map_function)(unsigned int)) : Int16Buffer(address), stepper(stepper), stepperConfig(stepperConfig), map_function(map_function), initState(0) { } virtual void loop() { if (initState == 0) { // not initialized yet stepper.setMaxSpeed(stepperConfig.maxSpeed); stepper.setAcceleration(stepperConfig.acceleration); stepper.moveTo(-((long)stepperConfig.maxSteps)); initState = 1; } if (initState == 1) { // zeroing stepper.run(); if (stepper.currentPosition() <= -((long)stepperConfig.maxSteps)) { stepper.setCurrentPosition(0); initState = 2; stepper.moveTo(stepperConfig.maxSteps/2); } } if (initState == 2) { // running normally if (hasUpdatedData()) { unsigned int newPosition = map_function(getData()); newPosition = constrain(newPosition, 0, stepperConfig.maxSteps); stepper.moveTo(newPosition); } stepper.run(); } } }; struct StepperConfig stepperConfig = { 600, // maxSteps 1000, // maxSpeed 1000 // acceleration }; AccelStepper stepper(AccelStepper::DRIVER, 10, 11); Vid29Stepper lHydPressBuffer(0x10c2, stepper, stepperConfig, [](unsigned int newValue) -> unsigned int { return map(newValue, 65535, 0, 0, stepperConfig.maxSteps); }); void setup() { if(!oled.display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { for(;;); // Don't proceed, loop forever } DcsBios::setup(); } void UpdateDisplay() { oled.display.clearDisplay(); for (int i = 0; i < oled.numberOfDigits; i++) { printScrollingDigit(oled.digits[i].digit, oled.width, oled.digits[i].y, i + 1, &oled); } if (oled.width == 16) { oled.display.fillRect(0, 25, 67, 7, BLACK); } oled.display.display(); } int YPos() { return (oled.width + 9) * -1; } void printScrollingDigit(int digit, int width, int y, int pos, disp *oled) { int x = (width * pos) - width + pos; #ifdef ALTIMETER switch (digit) { case -1: oled->display.drawBitmap(x, y, c24_Empty, 24, 32, 1); oled->display.drawBitmap(x, y+33, c24_1, 24, 32, 1); break; case 1: oled->display.drawBitmap(x, y, c24_1, 24, 32, 1); oled->display.drawBitmap(x, y+33, c24_2, 24, 32, 1); break; case 2: oled->display.drawBitmap(x, y, c24_2, 24, 32, 1); oled->display.drawBitmap(x, y+33, c24_3, 24, 32, 1); break; case 3: oled->display.drawBitmap(x, y, c24_3, 24, 32, 1); oled->display.drawBitmap(x, y+33, c24_4, 24, 32, 1); break; case 4: oled->display.drawBitmap(x, y, c24_4, 24, 32, 1); oled->display.drawBitmap(x, y+33, c24_5, 24, 32, 1); break; case 5: oled->display.drawBitmap(x, y, c24_5, 24, 32, 1); oled->display.drawBitmap(x, y+33, c24_6, 24, 32, 1); break; case 6: oled->display.drawBitmap(x, y, c24_6, 24, 32, 1); oled->display.drawBitmap(x, y+33, c24_7, 24, 32, 1); break; case 7: oled->display.drawBitmap(x, y, c24_7, 24, 32, 1); oled->display.drawBitmap(x, y+33, c24_8, 24, 32, 1); break; case 8: oled->display.drawBitmap(x, y, c24_8, 24, 32, 1); oled->display.drawBitmap(x, y+33, c24_9, 24, 32, 1); break; case 9: oled->display.drawBitmap(x, y, c24_9, 24, 32, 1); oled->display.drawBitmap(x, y+33, c24_0, 24, 32, 1); break; default: oled->display.drawBitmap(x, y, c24_0, 24, 32, 1); oled->display.drawBitmap(x, y+33, c24_1, 24, 32, 1); break; } #endif } #ifdef ALTIMETER void onfuelQty10000change(unsigned int newValue) { unsigned int mappedValue = newValue / 6553; unsigned int y = map(newValue, mappedValue * 6553, mappedValue * 6553 + 6553, 0, YPos()); oled.digits[0].digit = mappedValue; oled.digits[0].y = y; } void onfuelQty1000change(unsigned int newValue) { unsigned int mappedValue = newValue / 6553; unsigned int y = map(newValue, mappedValue * 6553, mappedValue * 6553 + 6553, 0, YPos()); oled.digits[1].digit = mappedValue; oled.digits[1].y = y; } void onfuelQty100change(unsigned int newValue) { unsigned int mappedValue = newValue / 6553; unsigned int y = map(newValue, mappedValue * 6553, mappedValue * 6553 + 6553, 0, YPos()); oled.digits[2].digit = mappedValue; oled.digits[2].y = y; } DcsBios::IntegerBuffer fuelQty10000Buffer(0x10ce, 0xffff, 0, onfuelQty10000change); DcsBios::IntegerBuffer fuelQty1000Buffer(0x10d0, 0xffff, 0, onfuelQty1000change); DcsBios::IntegerBuffer fuelQty100Buffer(0x10d2, 0xffff, 0, onfuelQty100change); #else #endif unsigned long time = 0; void loop() { DcsBios::loop(); time = millis(); if (time % updateInterval == 0) { UpdateDisplay(); } } While this has the occasional glitch, it is nowhere near as bad as the altimeter pair. I put these in for you to try (if you have the hardware) and see if you can replicate what I'm seeing Cheers Les
  13. Great, nice spot. I was thinking about this overnight, and am concluding the same as you. I let the game just sit there at the end of the runway with the altimeter OLED display connected plus the LCD altimeter 100ft counter output monitor and the OLED 100ft counter monitor running. The OLED altimeter display was glitching, but there was no simultaneous change to either the LCD or OLED monitors. Both were totally static, and stable. I know that the Baro alt glitching happens much more when you change the values, while the Altimeter display glitches even on stable and static values, but when you fly, the Altimeter glitching is more frequent. So I believe you are correct in that something in the sketch is corrupting the output. Maybe the scrolling part is introducing some random factor, but the curious thing is that the baro alt sketch I have has no scrolling - it simply remaps the value then prints it. There's not too much for it to do with the data, if you see what I mean. Of course, when it glitches, it changes the number rather than showing the number scrolled part way, but maybe that's a clue in itself. It's like the numbers the display is being told to display are being swapped. The puzzler is why that would happen while the input value is static, like when it is on the ground. The non-scrolling baro display is not so sensitive when the altimeter counter is static too, but in the air, despite the baro alt value being static, with changes to the Altimeter it starts glitching. However, due to the fact that it uses the U8G2 protocol, it needs much more memory usage, driving the need for the ATmega328 nanos as the ATmega168 can't load it due to memory issues. I also know that the scrolling sketch needs the larger memory size nano, I think mostly due to the need for the bitmaps for the characters. So is it possible that it is becoming unstable due to memory issues? I tested the scrolling altimeter on a Mega, which has more memory I believe but it still glitched, but maybe it's the way it uses the memory? But why would changing data output for one signal affect another? I'll keep picking away at this, but one thought was to try and use the scrolling sketch, but replace character map with a standard font, and the \\\ with a letter, just to see if lightening the load reduces the glitching. Ian's code for his version appears to uses a single bitmap that displays all the characters in a ribbon, then chooses which part of that ribbon to show, I believe by clipping the image. Maybe a simpler concept? And lastly, I made a simple sketch with the help of the guys on the Arduino forum for the small 64 x 32 OLEDS for the TISL code wheels displays. So far as I have been able to test it, that does not glitch, although the output values from DCS bios are a simpler string of numbers. Food for thought... Les
  14. I have been running the LCD and OLED 'monitors' for the last hour and a half with the aircraft static at the end of the runway.. During that time I have not seen the OLED figure even twitch, it only glitches when the number is changing. Which is even more bizarre because my video from whenever it was I posted it was for similar conditions and clearly shows the display glitching. I think I am going to go ahead and try the concept of getting the sketch to ignore values that are too different from the ones before it, I have nothing to lose but some time - which being on lockdown has given me plenty of. If you know how to ode and splice something like that in, I am all ears! Cheers Les
  15. I have just written this sketch, it works on a 128 X 64 OLED module and it just displays the 100ft count for the altimeter as raw output (0 to 65535) on the OLED. And it appears to glitch. Setting a quick flight for takeoff, I used the pressure set wheel on the altimeter to control the baro alt, which has the effect of moving the altimeter 100 ft pointer and digit, and even though it should be a smooth flow of numbers, you can clearly see the numbers jump, to the point where three digits becomes 5 and then back to three in a split second. I had the LCD output running next to it, and that does not glitch These are the sketches I was using first the OLED code #define DCSBIOS_DEFAULT_SERIAL #include <DcsBios.h> #include <Arduino.h> #include <U8g2lib.h> #include <Wire.h> U8G2_SSD1306_128X64_ALT0_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); void setup() { u8g2.begin(); DcsBios::setup(); } void onAlt100ftChange(unsigned int newValue) { u8g2.clearBuffer(); u8g2.setFont(u8g2_font_fub20_tn ); //u8g2.setTextSize(2); u8g2.setCursor(0, 24); u8g2.print(newValue); u8g2.sendBuffer(); delay (5); } DcsBios::IntegerBuffer alt100ftBuffer(0x107e, 0xffff, 0, onAlt100ftChange); void loop() { DcsBios::loop(); } and the LCD code #include <Wire.h> #include <LiquidCrystal_PCF8574.h> #define DCSBIOS_IRQ_SERIAL #include <DcsBios.h> LiquidCrystal_PCF8574 lcd(0x27); // set the LCD address to 0x27 for a 16 chars and 2 line display int show; void onAlt10000ftCntChange(unsigned int newValue) { lcd.setCursor(0, 0); lcd.print(newValue); } DcsBios::IntegerBuffer alt10000ftCntBuffer(0x1080, 0xffff, 0, onAlt10000ftCntChange); void onAlt1000ftCntChange(unsigned int newValue) { lcd.setCursor(7, 0); lcd.print(newValue); } DcsBios::IntegerBuffer alt1000ftCntBuffer(0x1082, 0xffff, 0, onAlt1000ftCntChange); void onAlt100ftChange(unsigned int newValue) { lcd.setCursor(0, 1); lcd.print(newValue); } DcsBios::IntegerBuffer alt100ftBuffer(0x107e, 0xffff, 0, onAlt100ftChange); void setup() { lcd.begin(16, 2); lcd.clear(); DcsBios::setup(); } void loop() { DcsBios::loop(); lcd.setBacklight(255); } So is it possible that the OLED or the OLED library has greater sensitivity and can react to the very fast spurious BIOS output (assuming that that is where the glitch originates?) whereas the LCD system is somehow damped or smoothed? Or is it possible that the way that the Arduino and OLED work together to process the signal has some kind of internal interaction that generates noise in the signal? Edit Here's a video - sorry for the incorrect formatting of the LCD it is left justified rather than right justified so the number stays five digits even when it is back down to three. But you can clearly see the glitching in the OLED readout Cheers Les
  16. Thanks - I was going to have a go at just writing a sketch to output the raw values of the Altimeter data to the OLEDs without any scrolling of conversion, just to see if it wrote it in a stable manner. In a way it is comforting that you are getting the same glitching, makes me feel less like I'm being picked on! Nonetheless we need to find a way round it. Ian's sketch needs to be converted to I2C as you say, but that's maybe a bit advanced for my level. Part of the issue is that making a simpit like this takes up time and multiple skillsets and practices. I could possibly dedicate myself to trying to learn in sufficient depth how to program more advanced Adruino programs, but I would have to self teach, and it would leave no time to actually put it to any practical use. That's one of my bugbears with the Arduino forum, the use of the sketch is a means to an end, and only part of it at that. We need specialists to help us out with the bits we are not good with to allow us to get on with the bits we are confident with. I'm a 53 year old engineer. All this computing stuff came about after I left school, so it is not something I've ever had any formal training with. Interesting thought about the Arduino speed, it never occurred to me. And presumably because the different Arduinos only vary in memory capacity and number of outputs and not speed, using a Mega won't help. Lastly, I eventually worked out that I have two different types of Nano, the ATmega 168 type and the ATmega328. That's why some don't load, and having to use the U8G2 protocol for the 64 X 32 OLEDs forces the use of the larger memory types, as do the scrolling sketches Cheers Les
  17. Seems to be the story of my cockpit build, have a look at the issues I had with RS485.... I played around with this a bit more this morning. I loaded up the altimeter sketch onto a Mega, and with a new 128 x 64 OLED ran it, with identical glitching. I also modified the Baro Alt sketch so only two numbers instead of four were displayed, in case the adjacent numbers were trying to overwrite each other - no, the two missing digits stay missing and the remaining displayed ones jump about randomly, and as I had the LCD display showing the output from DCS bios, I could see that the output does not appear to be at fault. Yet again I am at a dead end. I was thinking of asking over on the Arduino forum, but lately the responses from there have been sarcastic and belittling, with them making you feel stupid for asking questions because you don't understand it. You get answers that are equally unfathomable as the original problem and you are made to feel like a retard because you don't know what it means, and that you shouldn't be messing with stuff if you don't understand it. Maybe I should park this for a while and get on with something else, it's not like it's the only job left to do! Cheers Les
  18. Thanks, not sure what, if anything I could do about the data flow. I may try loading the sketch in a Mega to see if that changes anything, but feeing a bit dispirited at the moment. Tomorrow with a fresh start I think! Cheers Les
  19. An update for you on this, together with a warning - it seems the 5 inch TFT from Buydisplay that I used cannot use different fonts, the font that it comes with is the only one it can use and none can be loaded to it to replace it. As a result, if you are contemplating doing a CDU, don't get one of these displays unless you are happy with the (admittedly minor) text corruption issues Cheers Les
  20. Guys, as part of trying to resolve an issue with a TFT screen with strange characters, I am being asked to provide the raw HEX output data that the game sends to DSC BIOS I tried to use the serial monitor to see what was being transmitted while the game was running, but it says 'port XX blocked' so I can't use the serial monitor for exctracting the data Is there any way to get this? Cheers Les
  21. I've been messing around with this, and there's a few points to feed back Firstly I have three OLED's currently functioning on my rig, all connected directly by USB, namely the following displays:- scrolling altimeter digital readout, using a 128 x 64 OLED using the Adafruit SSD1306 protocol scrolling fuel quantity digital readout, using a 128 x 32 OLED using the Adafruit SSD1306 protocol non-scrolling barometric pressure readout, using a 64 x 32 OLED using the U8G2 protocol The use of the U8G2 protocol was driven by the fact that the 64 x 32 OLED's don't work with the SSD1306 protocol 1) all three OLED's glitch, with the altimeter displays being worse than the fuel quantity readout and the Baro pressure readout being the worst of the three, despite being the simplest sketch 2) even if the USB connections to everything else is disconnected the remaining single OLED display will still glitch 3) the fuel quantity and altimeter readouts are already using the map function in their scrolling script to convert the 0 to 65535 values to integers between 1 and 10 4) I have checked the outputs from DCS BIOS for all three parameter sets with an LCD character display and the output from DCS is stable and clean 5) using the map function to convert the output to single digit integers then outputting to the LCD display, the display is perfect, smooth, clean, stable, and correct. 6) my scrolling sketches are derived from MiddleFart's scrolling altimeter sketch, which was designed for a 128 x 32 OLED module. I loaded up his original sketch on a spare 128 x 32 OLED module and tried that, and while it is much better than the equivalent 128 x 64 altimeter sketch, still glitches, so I can see that 128 x 32 modules are more stable. 7) I have a number of OLED modules, and the characteristic is repeatable across them, where the OLED compatibility allows - some 128 x 32 OLED's work with SSD1306, some need U8G2, not sure why So I am forced to conclude that there is some kind of issue with the OLED's and these sketches. I am able to load and run the example sketches for the OLED's with no problems. Maybe a vain hope, but does someone have a good stable DCS BIOS sketch for an OLED that they can post for me to try? Cheers Les
  22. I tried it, to no avail. I even tried it adding 48 to the number just in case It makes me wonder if I'm using the OLED library correctly, it the syntax I'm using essentially ignoring the instances of displayString as they are inside their own argument? Cheers Les
  23. I commented out and revised the sketch so now I can compile and load this sketch #define DCSBIOS_DEFAULT_SERIAL #include <DcsBios.h> #include <Arduino.h> //#include <U8g2lib.h> #include <Wire.h> #include <U8g2smalllib.h> U8G2_SSD1306_64X32_1F_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); char* displayString = "----"; // onDcsBiosWrite does not exist anymore, use Int16Buffers instead void onAltPressure0Change(unsigned int newValue0) { int Value0 = map(newValue0, 0, 65536, 0, 9); // 65536 would = 10, and should never occur{ displayString[0] = (Value0); } DcsBios::IntegerBuffer altPressure0Buffer(0x1086, 0xffff, 0, onAltPressure0Change); void onAltPressure1Change(unsigned int newValue1) { int Value1 = map(newValue1, 0, 65536, 0, 9); // 65536 would = 10, and should never occur{ displayString[1] = (Value1); } DcsBios::IntegerBuffer altPressure1Buffer(0x1088, 0xffff, 0, onAltPressure1Change); void onAltPressure2Change(unsigned int newValue2) { int Value2 = map(newValue2, 0, 65536, 0, 9); // 65536 would = 10, and should never occur{ displayString[2] = (Value2); } DcsBios::IntegerBuffer altPressure2Buffer(0x108a, 0xffff, 0, onAltPressure2Change); void onAltPressure3Change(unsigned int newValue3) { int Value3 = map(newValue3, 0, 65536, 0, 9); // 65536 would = 10, and should never occur{ displayString[3] = (Value3); } DcsBios::IntegerBuffer altPressure3Buffer(0x108c, 0xffff, 0, onAltPressure3Change); void setup() { u8g2.begin(); u8g2.clearBuffer(); u8g2.setFont(u8g2_font_fub20_tn ); u8g2.setCursor(0, 24); u8g2.print(displayString); u8g2.sendBuffer(); delay (10); DcsBios::setup(); } void loop() { DcsBios::loop(); It clearly isn't reading the displayString values correctly because all I get on the OLED is " ---- " which is what is being defined as the char* at the beginning of the sketch. I've obviously got something in the wrong place By the way, by changing the mapping to 0 to 9 it cured the out by one digit issue Cheers Les
  24. I have spliced in the code above to the OLED sketch, and unfortunately the erratic indication continues. ***edit - which is obvious because I did not comment out the original references..... what a numpty Les
  25. Ok, I did the changes as follows #include <Wire.h> #include <LiquidCrystal_PCF8574.h> #define DCSBIOS_IRQ_SERIAL #include <DcsBios.h> LiquidCrystal_PCF8574 lcd(0x27); // set the LCD address to 0x27 for a 16 chars and 2 line display int show; //unsigned char newValue; void onAltPressure0Change(unsigned int newValue0) { int Value0 = map(newValue0, 0, 65536, 0, 10); // 65536 would = 10, and should never occur{ lcd.setCursor(4, 0); lcd.print(Value0); } DcsBios::IntegerBuffer altPressure0Buffer(0x1086, 0xffff, 0, onAltPressure0Change); void onAltPressure1Change(unsigned int newValue1) { int Value1 = map(newValue1, 0, 65536, 0, 10); // 65536 would = 10, and should never occur{ lcd.setCursor(3, 0); lcd.print(Value1); } DcsBios::IntegerBuffer altPressure1Buffer(0x1088, 0xffff, 0, onAltPressure1Change); void onAltPressure2Change(unsigned int newValue2) { int Value2 = map(newValue2, 0, 65536, 0, 10); // 65536 would = 10, and should never occur{ lcd.setCursor(2, 0); lcd.print(Value2); } DcsBios::IntegerBuffer altPressure2Buffer(0x108a, 0xffff, 0, onAltPressure2Change); void onAltPressure3Change(unsigned int newValue3) { int Value3 = map(newValue3, 0, 65536, 0, 10); // 65536 would = 10, and should never occur{ lcd.setCursor(1, 0); lcd.print(Value3); } DcsBios::IntegerBuffer altPressure3Buffer(0x108c, 0xffff, 0, onAltPressure3Change); void setup() { lcd.begin(16, 2); lcd.clear(); DcsBios::setup(); } void loop() { DcsBios::loop(); lcd.setBacklight(255); } Which works, but is reading one less for each number, so 2992 becomes 1881 - an improvement but not sure why the data is reading like that Next step (even though there is the error above) is to test it in my OLED sketch to see how stable it is cheers Les
×
×
  • Create New...