Jump to content

lesthegrngo

Members
  • Posts

    1245
  • Joined

  • Last visited

Everything posted by lesthegrngo

  1. I am very pleased to report that the multiplexing sketch for the OLEDs is done and working beautifully, and with the OLED's installed they look great and are doing exactly what I hoped. The effort involved was way out of proportion to the in game result, but as mentioned before, this is one of those bits of the build that has given me a lot of pleasure. One small minus is that I had to add spacers between two of the PCB's (this unit is only 140mm x 85mm but has a total of six PCB's!) which means that the mounting holes in my dash no longer line up, a bit of a bummer that. Still, mustn't grumble, I just have to find an alternative method. The sketch is also lighter than I expected, which means that I can at least connect the 12 rotary encoder connections to the same nano should I wish to, but if I want to connect the rest of the TISL I will need another nano, or move to a Mega. If I choose the latter, now I have a bit more knowledge of how to use the I2C multiplexers, I could combine it with other displays. I know the left console has a number that I need to make (radios and so forth), and they are all ones that don't require fast refrsh rates, so they are ideal candidates. Now, what's next on the long long list.....?!, Cheers Les
  2. Ha ha, I like it! Ever thought of TFT? Les
  3. Great job - OLED? I ended up copping out and using LCD displays and just made it a digital readout. The one that truly embarrasses me is the standby attitude indicator, which in my version is a printed copy sellotaped to the back of the gauge fascia! Cheers Les
  4. The remaining OLED's and the multiplexer arrived yesterday, and I have fitted the parts in. I had been looking at the sketch before the multiplexer arrived, but of course could not test it until today. I obviously have missed out the callouts somewhere, and so I would like some assistance with this sketch. This is what I have done so far #define DCSBIOS_DEFAULT_SERIAL #include <DcsBios.h> #include <Arduino.h> #include <U8g2lib.h> #include <Wire.h> #include "XBM1.h" //64x32 XBM format #define TCAADDR 0x70 void tcaselect (uint8_t i) { if (i > 7) return; Wire.beginTransmission(TCAADDR); Wire.write(1 << i); Wire.endTransmission(); } U8G2_SSD1306_64X32_1F_F_HW_I2C u8g2_01(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); U8G2_SSD1306_64X32_1F_F_HW_I2C u8g2_02(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); U8G2_SSD1306_64X32_1F_F_HW_I2C u8g2_03(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); U8G2_SSD1306_64X32_1F_F_HW_I2C u8g2_04(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); U8G2_SSD1306_64X32_1F_F_HW_I2C u8g2_05(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); U8G2_SSD1306_64X32_1F_F_HW_I2C u8g2_06(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); const unsigned char* aBitmaps[] = { 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 onTislCode1Change(unsigned int newValue) { u8g2_01.clearBuffer(); u8g2_01.drawXBMP( 0, 0, 64, 32, aBitmaps[newValue]); u8g2_01.sendBuffer(); } DcsBios::IntegerBuffer tislCode1Buffer(0x1116, 0x1f00, 8, onTislCode1Change); void onTislCode2Change(unsigned int newValue) { u8g2_02.clearBuffer(); u8g2_02.drawXBMP( 0, 0, 64, 32, aBitmaps[newValue]); u8g2_02.sendBuffer(); } DcsBios::IntegerBuffer tislCode2Buffer(0x111a, 0x1f00, 8, onTislCode2Change); void onTislCode3Change(unsigned int newValue) { u8g2_03.clearBuffer(); u8g2_03.drawXBMP( 0, 0, 64, 32, aBitmaps[newValue]); u8g2_03.sendBuffer(); } DcsBios::IntegerBuffer tislCode3Buffer(0x111e, 0x1f00, 8, onTislCode3Change); void onTislCode4Change(unsigned int newValue) { u8g2_04.clearBuffer(); u8g2_04.drawXBMP( 0, 0, 64, 32, aBitmaps[newValue]); u8g2_04.sendBuffer(); } DcsBios::IntegerBuffer tislCode4Buffer(0x1122, 0x1f00, 8, onTislCode4Change); void onTislAlt1000Change(unsigned int newValue) { u8g2_05.clearBuffer(); u8g2_05.drawXBMP( 0, 0, 64, 32, aBitmaps[newValue]); u8g2_05.sendBuffer(); } DcsBios::IntegerBuffer tislAlt1000Buffer(0x1114, 0x0f00, 8, onTislAlt1000Change); void onTislAlt10000Change(unsigned int newValue) { u8g2_06.clearBuffer(); u8g2_06.drawXBMP( 0, 0, 64, 32, aBitmaps[newValue]); u8g2_06.sendBuffer(); } DcsBios::IntegerBuffer tislAlt10000Buffer(0x1112, 0xf000, 12, onTislAlt10000Change); void setup() { void DisplayInit(){ for (int i = 0; i < 7; i++) { tcaselect(i); } u8g2_01.begin(); u8g2_02.begin(); u8g2_03.begin(); u8g2_04.begin(); u8g2_05.begin(); u8g2_06.begin(); DcsBios::setup(); } void loop() { DcsBios::loop(); } If anyone can take a look and check the syntax and my callouts I would be very grateful! Cheers Les
  5. Miter Glue? New one on me! Looks like I'll have to google it Cheers Les
  6. Looking good! Les
  7. If you take a look at the link pasted by Crash Test Pilot (https://www.reichelt.de/mini-din-ste...ct=pol_4&nbc=1 ) you will see that the connector is made up of a load of bits, but I think the one at the bottom right is all you need, and then solder on the connecting wires, use heatshrink to cover the bare connections, then just lead the wires away. Further down the same page is a female socket connector, you could cut that back so that there are no flanges, and repeat the solder / heatshrink process. If it is safely inside a tube and properly insulated, there should be no reason it shouldn't work Les
  8. I think there were a couple of people wanting this info, so here's what I do for PCB's. I use 30 degree engraving cutters, and go to 0.1 mm deep on each pass until the complete PCB is engraved. Max speed you can get on the cutter spindle, and about 300 mm per minute feed speed for the x and y axes movement. I also clamped a piece of thick MDF on the router bed that has holes drilled in it at 30mm spacing in a matrix, with those knurled M3 'nuts' (like these https://www.ebay.com/itm/100pcs-M3-6mm-Brass-Cylinder-Knurled-Threaded-Round-Insert-Embedded-Nuts-kit/333583802504?hash=item4dab24e088:g:JdYAAOSwuSxepAlx ) at the bottom, and then machined the top of the MDF so it was flat, so that I could put the blank PCB on it and know that it was reasonably level. The most important thing is to make sure that the PCB is held down firmly and evenly, don't overtighten any screws as this pulls the PCB down locally and you won't get it to engrave in that area. To machine contact holes, slots for switch contacts, screw holes and clearance pockets I use 0.8mm end mill cutters, again max speed, 0.3mm depth cuts each pass at MAXIMUM 200 mm per minute feed. This also works for the outer profile of the boards, but be careful near the end to prevent the PCB coming loose and fouling the cutter. I was thinking of trying o get some of the reusable silicone double sided tape to put between the PCB and the bed to see if that helped keep the blank PCB firm without having to tighten it too much. However in the absence of that use as many clamps as you can, as this will improve your chances of a good job, at least in my experience Cheers Les
  9. I use Qcad to design them ( there is a free to use version, the 'trial' version ) and then engrave them myself using a 3018 cnc engraver. The attached picture is one I made yesterday for the TISL OLED multiplexer Middlefart uses ExpressPCB and has them made for him, but as I am constantly changing my designs I like the ability to do it myself Cheers Les
  10. I know what you mean - the actual wiring up of all that I have made has been an incredibly trying part, and probably my least favourite part of the build. However I have tried, where I can, to make PCB's that the switches solder directly to, and that has really helped as the PCB's also have headers so I can use multiple connection headers to take the signal to the bodnar board or Arduino. But to answer your original question, I have only seen pre-wired potentiometers, never switches Cheers Les
  11. I have spent the day making an Up Front Controller, so just seen this - will have to take a good long look tomorrow when I'm a bit fresher, but thanks for doing this! If you need 64 height characters I think I provided a character file along with my 128 x 64 sketch in an earlier post. Also if you need a modified character map, let me know to try and help Cheers Les
  12. If it cuts down on active USB connections I still see it as a benefit, as an RS485 network would need the same number of nanos Cheers Les
  13. As I understand it, the multiplexer does not replace what you are doing. I am going to have to use a multiplexer on my TISL sketch simply because the addresses of the I2C 0.49" can't be changed and so if I want more than one running off a nano I need the multiplexer to split out the different OLEDs. Whereas what you are doing (again if I understand correctly) is a pre-process / post process of a signal so that the work having to be done by the second one to determine what to show on the OLED is not so much it overwhelms the unit. So I think what you are doing still adds value, especially if what it does is reduce the data stream so that heavy processing sketches like the scrolling OLED ones can be combined on one Nano, rather than having multiple nanos, one for each. It also may make the processing of the scrolling sketchs a low enough work load that you can run a gauge or other function on the same nano without it slowing the gauge function down horribly (as it does at the moment) If the static I2C addresses of the OLEDs used can't be changed, that's when the multiplexer comes in. A question, the 'slave' nano, is it connected to USB for power only, or does it receive data direct from DCS Bios? If it is just power, that's also an advantage as you could just use a USB power source, and it means one less 'active' USB connection that can cause lag Cheers Les
  14. I think you have to make individual 'struct' parts as well - have a look at my multiple stepper motor on one mega sketch Les
  15. Nice I think you have to assign each OLED an individual name up at the initial definitions, something like oled.display.begin Oled0 (0x3d) oled.display.begin Oled1 (0x3c) then call out the OLED instance in each case Here's how I did it for multiple LCD displays for the CMSC #include <Wire.h> #include <LiquidCrystal_PCF8574.h> #define DCSBIOS_IRQ_SERIAL #include <DcsBios.h> LiquidCrystal_PCF8574 lcd0(0x27); // set the LCD address to 0x27 for a 16 chars and 2 line display LiquidCrystal_PCF8574 lcd1(0x26); LiquidCrystal_PCF8574 lcd2(0x25); int show; void onCmscTxtJmrChange(char* newValue) { lcd0.setCursor(0, 0); lcd0.print(newValue); } DcsBios::StringBuffer<8> cmscTxtJmrBuffer(0x1096, onCmscTxtJmrChange); void onCmscTxtChaffFlareChange(char* newValue) { lcd1.setCursor(0, 0); lcd1.print(newValue); } DcsBios::StringBuffer<8> cmscTxtChaffFlareBuffer(0x108e, onCmscTxtChaffFlareChange); void onCmscTxtMwsChange(char* newValue) { lcd2.setCursor(0, 0); lcd2.print(newValue); } DcsBios::StringBuffer<8> cmscTxtMwsBuffer(0x12b0, onCmscTxtMwsChange); void setup() { lcd0.begin(16, 2); lcd1.begin(16, 2); lcd2.begin(16, 2); DcsBios::setup(); } void loop() { DcsBios::loop(); lcd0.setBacklight(5); lcd1.setBacklight(5); lcd2.setBacklight(5); } Cheers Les
  16. Molevitch, the 10 position switch, did it work on all the 10 positions prior to connecting it to DCS BIOS? The reason I ask is that I got a load of 3 to 12 position switches, where you select how many positions that the switch can move to by putting a tabbed washer under the mount nut. However when I actually physically tested it for electrical connectivity to design the PCB, I found that in reality it was not a 12 contact switch, merely a 12 position switch. When you rotated it, instead of connecting ground to contacts 1, then 2, then, 4, 5, 6, 7, 8, 9, 10, 11, what actually did was connect ground to 1, then 2, then 3, then 1, then 2..... So in actual fact it was a 3 position switch with four contacts each. Half an hour with a set of jewelers screwdrivers, a modelling sprue cutter and lots of swearing and I had a proper 12 position switch, they are not difficult to modify, just fiddly. Could it be that your switch has the same issue? And with regard to DCS BIOS, it may not be the simplest thing for me to use, as I share your view on electronics. However it has enabled me to get things working that were the stuff of dreams a couple of years ago so I am grateful for its existence. There are two caveats to DSC BIOS for me. Firstly, where I can use a Bodnar type board for input, I will, as they are 'light' on the system and in my experience are very reliable and robust. I have a number of panels I made (the CDU is a good example, the MFCD's another) where the buttons and inputs are all available via the DCS control mapping, and so all go into the 64 button boards, even if I am using Arduinos and DCS for the rest of the panel. I will only use DCS Bios for those items where no control mapping is available. Of course the downside is extra wiring.... Secondly, my experience with DCS BIOS would have been 20 times easier if I hadn't had all the issues with RS485. I believe that I have probably mis-spent 6 or seven weeks in total over the last 18 months with RS485. I can't blame DCS BIOS for that, though. In itself DCS BIOS has it's niggles, but (so far) everything I have tried to make I have ultimately managed to complete, even some of the more esoteric ones. I don't know about you, but one of my problems here with stuff like RS485 is that I am working alone physically. There is no-one I can ask to double check my stuff, so if I am blind to something obvious it will stay that way. Maybe that's where you should look, trying to get someone else to to take a look at what you are doing to see if there is an obvious fault. But I accept your sympathies wholeheartedly! Cheers Les
  17. I'm getting there. This is the majority of the Dash now done, and with the exception of the altimeter gauge and the multiple TISL OLEDs all is working, and the majority together. I have to sort out the lag, combining all the gauges and displays where possible onto one Arduino will help I want to make some patch cables and modules in order to try and cut down on cabling, and make bus bars for 12v / 5v etc. There are still lots of multiple pin headers that have to be connected up, I wish there was a better solution but with the limited time and resource I have I'm going to have to put up with it. I may make some PCB based transfer 'wires' to help link it all together, and make solid state routings to the Bodnar boards and Arduinos, as space is tight. I'm also going to have to get better at making short ribbon connectors with headers to help with that. If anyone has some good connectivity ideas, I'm listening. Next up is the Up Front Controller and the dash brow, and also to see if I can get the four built in displays working with Ikarus. I think that the two MFCD's can stay as they are using MonitorSetp.lua, but I was unable to get the airspeed indicator working with Helios, and also the artificial horizon was missing some functionality and I was unable to understand how to configure it in Helios. Of course I still need to finish the Altimeter too, once the Optocoupler arrives, and the TISL OLED multiplexer sketch is ready, apart from the minor detail that I don't have the multiplexer board yet. from what I can tell it should be easy enough to implement though Cheers Les
  18. That sounds cool - but how would the two units be linked? Please don't say RS485........! Les
  19. If you can do without backlighting the panels, I estimate you save 50% of your effort Les
  20. I'm using exclusively X27-168 motors and have not had an issue, and would recommend pairing with A4988 drivers. The lag is definitely due to lots of USB connections, I disconnected some and was happily doing bumps and circuits this afternoon. Obviously I would welcome any suggestions, but realise that a good USB 3.0 pcie card is next on the shopping list What I didn't realise was that the replays also drive the gauges and stuff, which means I have a canned way of really accurately setting up the calibration of the gauges - plus it's really neat seeing everything working on the replays! Les
  21. Just a quick update - almost an hour and a half of flying this afternoon, no glitching of any of the OLED displays at all. Cheers Les
  22. Of course - I forgot you were in the UK, where free shipping and delivery dates mean something. To give you an idea of the problems I have, IF you can find someone who ships to Hungary ( and many don't) it is a lottery as to when you get things. For example, I received on Tuesday of this week some 3 pin connector headers that were ordered on the 8th January. UPS should be better, right? Nah. They were supposed to deliver something I managed to buy from Amazon, but when the guy went to deliver it, because there was a plaque with the owners name on it at the gate (I rent) he made the decision that it was the wrong address and didn't deliver, and all I knew about was an e-mail 2 days later saying that there was a failed attempted delivery. I got my order ten days later after numerous calls to UPS. Many items never arrive at all. Still, it is a very attractive city. Cheers Les
  23. Of course, the least I can do! here's the sketch #define DCSBIOS_IRQ_SERIAL #include "DcsBios.h" #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include "Character40X64.h" #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // 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]; }; #ifdef ALTIMETER disp oled = {Adafruit_SSD1306(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET), 42, 3, {{0,0},{00,0},{00,0},{0,0},{0,0}}}; #else disp oled = {Adafruit_SSD1306(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET), 16, 4, {{0,0},{0,0},{0,0},{0,0},{0,0}}}; #endif void setup() { if(!oled.display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32 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); } //Clear the area below the the numbers if we are using the small font if (oled.width == 16) { oled.display.fillRect(0, 63, 127, 7, BLACK); } oled.display.display(); } int YPos() { return (oled.width + 1) * -1.5; } 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, 40, 64, 1); oled->display.drawBitmap(x, y+65, c24_1, 40, 64, 1); break; case 1: oled->display.drawBitmap(x, y, c24_1, 40, 64, 1); oled->display.drawBitmap(x, y+65, c24_2, 40, 64, 1); break; case 2: oled->display.drawBitmap(x, y, c24_2, 40, 64, 1); oled->display.drawBitmap(x, y+65, c24_3, 40, 64, 1); break; case 3: oled->display.drawBitmap(x, y, c24_3, 40, 64, 1); oled->display.drawBitmap(x, y+65, c24_4, 40, 64, 1); break; case 4: oled->display.drawBitmap(x, y, c24_4, 40, 64, 1); oled->display.drawBitmap(x, y+65, c24_5, 40, 64, 1); break; case 5: oled->display.drawBitmap(x, y, c24_5, 40, 64, 1); oled->display.drawBitmap(x, y+65, c24_6, 40, 64, 1); break; case 6: oled->display.drawBitmap(x, y, c24_6, 40, 64, 1); oled->display.drawBitmap(x, y+65, c24_7, 40, 64, 1); break; case 7: oled->display.drawBitmap(x, y, c24_7, 40, 64, 1); oled->display.drawBitmap(x, y+65, c24_8, 40, 64, 1); break; case 8: oled->display.drawBitmap(x, y, c24_8, 40, 64, 1); oled->display.drawBitmap(x, y+65, c24_9, 40, 64, 1); break; case 9: oled->display.drawBitmap(x, y, c24_9, 40, 64, 1); oled->display.drawBitmap(x, y+65, c24_0, 40, 64, 1); break; default: oled->display.drawBitmap(x, y, c24_0, 40, 64, 1); oled->display.drawBitmap(x, y+65, c24_1, 40, 64, 1); break; } #endif } #ifdef ALTIMETER void onAlt10000FtChange(unsigned int newValue) { unsigned int mappedValue = newValue / 6553; unsigned int y = map(newValue, mappedValue * 6553, mappedValue * 6553 + 6553, 0, YPos()); if (mappedValue == 0) { mappedValue = -1; } #ifdef TEST Serial.println(mappedValue); #endif oled.digits[0].digit = mappedValue; oled.digits[0].y = y; } void onAlt1000FtChange(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 onAlt100FtChange(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 Alt10000FtBuffer(0x1080, 0xffff, 0, onAlt10000FtChange); DcsBios::IntegerBuffer Alt1000FtBuffer(0x1082, 0xffff, 0, onAlt1000FtChange); DcsBios::IntegerBuffer Alt100FtBuffer(0x1084, 0xffff, 0, onAlt100FtChange); #endif unsigned long time = 0; void loop() { DcsBios::loop(); time = millis(); if (time % updateInterval == 50) { UpdateDisplay(); } } And here's the character map, you need to rename it as Character40X64.h static const unsigned char PROGMEM c24_0[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x00, 0x00, 0x00, 0x07, 0xff, 0xc0, 0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x3f, 0xff, 0xf8, 0x00, 0x00, 0x7f, 0xff, 0xf8, 0x00, 0x00, 0x7f, 0xc7, 0xfc, 0x00, 0x00, 0xfe, 0x01, 0xfe, 0x00, 0x00, 0xfc, 0x00, 0xfe, 0x00, 0x01, 0xfc, 0x00, 0x7f, 0x00, 0x01, 0xf8, 0x00, 0x3f, 0x00, 0x03, 0xf8, 0x00, 0x3f, 0x00, 0x03, 0xf0, 0x00, 0x1f, 0x80, 0x03, 0xf0, 0x00, 0x1f, 0x80, 0x03, 0xf0, 0x00, 0x1f, 0x80, 0x07, 0xe0, 0x00, 0x1f, 0x80, 0x07, 0xe0, 0x00, 0x1f, 0x80, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xe0, 0x00, 0x1f, 0x80, 0x03, 0xe0, 0x00, 0x1f, 0x80, 0x03, 0xf0, 0x00, 0x1f, 0x80, 0x03, 0xf0, 0x00, 0x1f, 0x80, 0x03, 0xf0, 0x00, 0x3f, 0x80, 0x03, 0xf8, 0x00, 0x3f, 0x00, 0x01, 0xf8, 0x00, 0x3f, 0x00, 0x01, 0xfc, 0x00, 0x7f, 0x00, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0x00, 0xff, 0x01, 0xfe, 0x00, 0x00, 0x7f, 0xff, 0xfc, 0x00, 0x00, 0x7f, 0xff, 0xf8, 0x00, 0x00, 0x3f, 0xff, 0xf0, 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0xc0, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 PROGMEM c24_1[] = { 0x00, 0x00, 0x00, 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, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x03, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0x00, 0x00, 0x7f, 0xff, 0xff, 0x00, 0x00, 0x7f, 0xff, 0xff, 0x00, 0x00, 0x7f, 0xff, 0xff, 0x00, 0x00, 0x7f, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 PROGMEM c24_2[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xff, 0xf0, 0x00, 0x01, 0xff, 0xff, 0xf8, 0x00, 0x01, 0xff, 0xff, 0xfc, 0x00, 0x01, 0xff, 0xff, 0xfc, 0x00, 0x01, 0xfc, 0x03, 0xfe, 0x00, 0x01, 0xe0, 0x00, 0xfe, 0x00, 0x01, 0x80, 0x00, 0x7f, 0x00, 0x01, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x1f, 0xe0, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xc0, 0x03, 0xff, 0xff, 0xff, 0xc0, 0x03, 0xff, 0xff, 0xff, 0xc0, 0x03, 0xff, 0xff, 0xff, 0xc0, 0x03, 0xff, 0xff, 0xff, 0xc0, 0x03, 0xff, 0xff, 0xff, 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}; static const unsigned char PROGMEM c24_3[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x01, 0xff, 0xff, 0xf0, 0x00, 0x03, 0xff, 0xff, 0xf8, 0x00, 0x03, 0xff, 0xff, 0xfc, 0x00, 0x03, 0xff, 0xff, 0xfe, 0x00, 0x03, 0xfc, 0x03, 0xfe, 0x00, 0x03, 0xe0, 0x00, 0xff, 0x00, 0x03, 0x80, 0x00, 0x7f, 0x00, 0x03, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x01, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0x00, 0x00, 0x00, 0x01, 0xff, 0x80, 0x00, 0x00, 0x01, 0xff, 0xf0, 0x00, 0x00, 0x01, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x06, 0x00, 0x00, 0x7f, 0x00, 0x07, 0x00, 0x00, 0xff, 0x00, 0x07, 0xe0, 0x01, 0xfe, 0x00, 0x07, 0xf8, 0x07, 0xfe, 0x00, 0x07, 0xff, 0xff, 0xfc, 0x00, 0x07, 0xff, 0xff, 0xf8, 0x00, 0x07, 0xff, 0xff, 0xf0, 0x00, 0x03, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 PROGMEM c24_4[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 0x00, 0x7f, 0xfc, 0x00, 0x00, 0x00, 0xfe, 0xfc, 0x00, 0x00, 0x00, 0xfc, 0xfc, 0x00, 0x00, 0x01, 0xf8, 0xfc, 0x00, 0x00, 0x03, 0xf0, 0xfc, 0x00, 0x00, 0x07, 0xf0, 0xfc, 0x00, 0x00, 0x0f, 0xe0, 0xfc, 0x00, 0x00, 0x0f, 0xc0, 0xfc, 0x00, 0x00, 0x1f, 0x80, 0xfc, 0x00, 0x00, 0x3f, 0x00, 0xfc, 0x00, 0x00, 0x7f, 0x00, 0xfc, 0x00, 0x00, 0xfe, 0x00, 0xfc, 0x00, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0x01, 0xf8, 0x00, 0xfc, 0x00, 0x03, 0xf0, 0x00, 0xfc, 0x00, 0x07, 0xf0, 0x00, 0xfc, 0x00, 0x07, 0xe0, 0x00, 0xfc, 0x00, 0x0f, 0xc0, 0x00, 0xfc, 0x00, 0x1f, 0x80, 0x00, 0xfc, 0x00, 0x1f, 0x80, 0x00, 0xfc, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xe0, 0x1f, 0xff, 0xff, 0xff, 0xe0, 0x1f, 0xff, 0xff, 0xff, 0xe0, 0x1f, 0xff, 0xff, 0xff, 0xe0, 0x1f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 PROGMEM c24_5[] = { 0x00, 0x00, 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, 0x80, 0x00, 0xff, 0xff, 0xff, 0x80, 0x00, 0xff, 0xff, 0xff, 0x80, 0x00, 0xff, 0xff, 0xff, 0x80, 0x00, 0xff, 0xff, 0xff, 0x80, 0x00, 0xff, 0xff, 0xff, 0x80, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc0, 0x00, 0x00, 0xff, 0xff, 0xf0, 0x00, 0x00, 0xff, 0xff, 0xf8, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x00, 0x00, 0xc0, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x02, 0x00, 0x00, 0x7f, 0x00, 0x03, 0x80, 0x00, 0x7f, 0x00, 0x03, 0xe0, 0x01, 0xfe, 0x00, 0x03, 0xfc, 0x07, 0xfe, 0x00, 0x03, 0xff, 0xff, 0xfc, 0x00, 0x03, 0xff, 0xff, 0xf8, 0x00, 0x03, 0xff, 0xff, 0xf0, 0x00, 0x01, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 PROGMEM c24_6[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x03, 0xff, 0xfe, 0x00, 0x00, 0x07, 0xff, 0xfe, 0x00, 0x00, 0x0f, 0xff, 0xfe, 0x00, 0x00, 0x1f, 0xf0, 0x06, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x03, 0xe0, 0x3f, 0x00, 0x00, 0x07, 0xe1, 0xff, 0xe0, 0x00, 0x07, 0xe7, 0xff, 0xf8, 0x00, 0x07, 0xff, 0xff, 0xfc, 0x00, 0x07, 0xff, 0xff, 0xfe, 0x00, 0x07, 0xff, 0xff, 0xff, 0x00, 0x07, 0xff, 0x01, 0xff, 0x80, 0x07, 0xf8, 0x00, 0x7f, 0x80, 0x07, 0xe0, 0x00, 0x3f, 0xc0, 0x07, 0xe0, 0x00, 0x1f, 0xc0, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xe0, 0x00, 0x0f, 0xe0, 0x07, 0xe0, 0x00, 0x0f, 0xe0, 0x07, 0xe0, 0x00, 0x07, 0xe0, 0x07, 0xe0, 0x00, 0x07, 0xe0, 0x07, 0xe0, 0x00, 0x07, 0xe0, 0x07, 0xe0, 0x00, 0x07, 0xe0, 0x07, 0xe0, 0x00, 0x07, 0xe0, 0x07, 0xe0, 0x00, 0x07, 0xe0, 0x03, 0xf0, 0x00, 0x07, 0xe0, 0x03, 0xf0, 0x00, 0x0f, 0xe0, 0x03, 0xf0, 0x00, 0x0f, 0xc0, 0x03, 0xf8, 0x00, 0x0f, 0xc0, 0x01, 0xf8, 0x00, 0x0f, 0xc0, 0x01, 0xfc, 0x00, 0x1f, 0x80, 0x00, 0xfc, 0x00, 0x3f, 0x80, 0x00, 0xfe, 0x00, 0x7f, 0x00, 0x00, 0x7f, 0x80, 0xff, 0x00, 0x00, 0x7f, 0xff, 0xfe, 0x00, 0x00, 0x3f, 0xff, 0xfc, 0x00, 0x00, 0x1f, 0xff, 0xf8, 0x00, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0x00, 0x03, 0xff, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 PROGMEM c24_7[] = { 0x00, 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, 0xff, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xff, 0xe0, 0x07, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x00, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0x00, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 PROGMEM c24_8[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x80, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 0x00, 0x1f, 0xff, 0xf8, 0x00, 0x00, 0x3f, 0xff, 0xfc, 0x00, 0x00, 0x7f, 0xff, 0xfe, 0x00, 0x00, 0xff, 0x01, 0xfe, 0x00, 0x01, 0xfc, 0x00, 0x7f, 0x00, 0x01, 0xf8, 0x00, 0x3f, 0x00, 0x03, 0xf8, 0x00, 0x1f, 0x80, 0x03, 0xf0, 0x00, 0x1f, 0x80, 0x03, 0xf0, 0x00, 0x1f, 0x80, 0x03, 0xf0, 0x00, 0x1f, 0x80, 0x03, 0xf0, 0x00, 0x0f, 0x80, 0x03, 0xf0, 0x00, 0x0f, 0x80, 0x03, 0xf0, 0x00, 0x0f, 0x80, 0x03, 0xf0, 0x00, 0x1f, 0x80, 0x03, 0xf8, 0x00, 0x1f, 0x80, 0x03, 0xf8, 0x00, 0x1f, 0x80, 0x01, 0xfc, 0x00, 0x3f, 0x00, 0x01, 0xff, 0x00, 0x3f, 0x00, 0x00, 0xff, 0x80, 0x7e, 0x00, 0x00, 0x7f, 0xe0, 0xfc, 0x00, 0x00, 0x3f, 0xf9, 0xf8, 0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0x7f, 0xf8, 0x00, 0x00, 0xfe, 0x1f, 0xfc, 0x00, 0x00, 0xfc, 0x07, 0xfe, 0x00, 0x01, 0xf8, 0x01, 0xff, 0x00, 0x03, 0xf0, 0x00, 0x7f, 0x80, 0x03, 0xf0, 0x00, 0x3f, 0x80, 0x07, 0xe0, 0x00, 0x1f, 0xc0, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x0f, 0xe0, 0x00, 0x0f, 0xe0, 0x0f, 0xc0, 0x00, 0x0f, 0xe0, 0x0f, 0xc0, 0x00, 0x07, 0xe0, 0x0f, 0xc0, 0x00, 0x07, 0xe0, 0x0f, 0xe0, 0x00, 0x07, 0xe0, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xf0, 0x00, 0x0f, 0xc0, 0x07, 0xf0, 0x00, 0x1f, 0xc0, 0x03, 0xf8, 0x00, 0x1f, 0x80, 0x03, 0xfc, 0x00, 0x3f, 0x80, 0x01, 0xfe, 0x00, 0x7f, 0x00, 0x01, 0xff, 0x83, 0xfe, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x7f, 0xff, 0xf8, 0x00, 0x00, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x0f, 0xff, 0xc0, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 PROGMEM c24_9[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xc0, 0x00, 0x00, 0x1f, 0xff, 0xe0, 0x00, 0x00, 0x7f, 0xff, 0xf0, 0x00, 0x00, 0xff, 0xff, 0xf8, 0x00, 0x00, 0xff, 0xcf, 0xfc, 0x00, 0x01, 0xfe, 0x01, 0xfe, 0x00, 0x03, 0xf8, 0x00, 0xfe, 0x00, 0x03, 0xf8, 0x00, 0x7f, 0x00, 0x07, 0xf0, 0x00, 0x3f, 0x00, 0x07, 0xe0, 0x00, 0x3f, 0x80, 0x07, 0xe0, 0x00, 0x1f, 0x80, 0x07, 0xe0, 0x00, 0x1f, 0x80, 0x0f, 0xc0, 0x00, 0x1f, 0x80, 0x0f, 0xc0, 0x00, 0x1f, 0xc0, 0x0f, 0xc0, 0x00, 0x0f, 0xc0, 0x0f, 0xc0, 0x00, 0x0f, 0xc0, 0x0f, 0xc0, 0x00, 0x0f, 0xc0, 0x0f, 0xc0, 0x00, 0x0f, 0xc0, 0x0f, 0xc0, 0x00, 0x0f, 0xc0, 0x0f, 0xc0, 0x00, 0x0f, 0xc0, 0x0f, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xe0, 0x00, 0x0f, 0xc0, 0x07, 0xf0, 0x00, 0x0f, 0xc0, 0x07, 0xf8, 0x00, 0x1f, 0xc0, 0x03, 0xfc, 0x00, 0x7f, 0xc0, 0x01, 0xff, 0x03, 0xff, 0xc0, 0x01, 0xff, 0xff, 0xff, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x7f, 0xff, 0xef, 0xc0, 0x00, 0x1f, 0xff, 0x8f, 0xc0, 0x00, 0x0f, 0xfe, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 0xe0, 0x3f, 0xf0, 0x00, 0x00, 0xff, 0xff, 0xe0, 0x00, 0x00, 0xff, 0xff, 0xc0, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 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}; static const unsigned char PROGMEM c24_Empty[] = { 0x01, 0xf8, 0x0f, 0xc0, 0xfe, 0x80, 0xfc, 0x0f, 0xe0, 0x7e, 0xc0, 0x7e, 0x07, 0xf0, 0x3f, 0xe0, 0x3f, 0x03, 0xf8, 0x1f, 0xf0, 0x1f, 0x81, 0xfc, 0x0f, 0xf8, 0x0f, 0xc0, 0xfe, 0x07, 0xfc, 0x07, 0xe0, 0x7f, 0x03, 0x7e, 0x03, 0xf0, 0x3f, 0x81, 0x3f, 0x01, 0xf8, 0x1f, 0xc0, 0x1f, 0x80, 0xfc, 0x0f, 0xe0, 0x0f, 0xc0, 0x7e, 0x07, 0xf0, 0x07, 0xe0, 0x3f, 0x03, 0xf8, 0x03, 0xf0, 0x1f, 0x81, 0xfc, 0x01, 0xf8, 0x0f, 0xc0, 0xfe, 0xc0, 0xfc, 0x07, 0xe0, 0x7f, 0xe0, 0x7e, 0x03, 0xf0, 0x3f, 0xf0, 0x3f, 0x01, 0xf8, 0x1f, 0xf8, 0x1f, 0x80, 0xfc, 0x0f, 0xfc, 0x0f, 0xc0, 0x7e, 0x07, 0xfe, 0x07, 0xe0, 0x3f, 0x03, 0x7f, 0x03, 0xf0, 0x1f, 0x81, 0x3f, 0x81, 0xf8, 0x0f, 0xc0, 0x1f, 0xc0, 0xfc, 0x07, 0xe0, 0x0f, 0xe0, 0x7e, 0x03, 0xf0, 0x07, 0xf0, 0x3f, 0x01, 0xf8, 0x03, 0xf8, 0x1f, 0x80, 0xfc, 0x81, 0xfc, 0x0f, 0xc0, 0x7e, 0xc0, 0xfe, 0x07, 0xe0, 0x3f, 0xe0, 0x7f, 0x03, 0xf0, 0x1f, 0xf0, 0x3f, 0x81, 0xf8, 0x0f, 0xf8, 0x1f, 0xc0, 0xfc, 0x07, 0xfc, 0x0f, 0xe0, 0x7e, 0x03, 0xfe, 0x07, 0xf0, 0x3f, 0x01, 0x3f, 0x03, 0xf8, 0x1f, 0x80, 0x1f, 0x81, 0xfc, 0x0f, 0xc0, 0x0f, 0xc0, 0xfe, 0x07, 0xe0, 0x07, 0xe0, 0x7f, 0x03, 0xf0, 0x03, 0xf0, 0x3f, 0x81, 0xf8, 0x01, 0xf8, 0x1f, 0xc0, 0xfc, 0x80, 0xfc, 0x0f, 0xe0, 0x7e, 0xc0, 0x7e, 0x07, 0xf0, 0x3f, 0xe0, 0x3f, 0x03, 0xf8, 0x1f, 0xf0, 0x1f, 0x81, 0xfc, 0x0f, 0xf8, 0x0f, 0xc0, 0xfe, 0x07, 0xfc, 0x07, 0xe0, 0x7f, 0x03, 0x7e, 0x03, 0xf0, 0x3f, 0x81, 0x3f, 0x01, 0xf8, 0x1f, 0xc0, 0x1f, 0x80, 0xfc, 0x0f, 0xe0, 0x0f, 0xc0, 0x7e, 0x07, 0xf0, 0x07, 0xe0, 0x3f, 0x03, 0xf8, 0x03, 0xf0, 0x1f, 0x81, 0xfc, 0x01, 0xf8, 0x0f, 0xc0, 0xfe, 0xc0, 0xfc, 0x07, 0xe0, 0x7f, 0xe0, 0x7e, 0x03, 0xf0, 0x3f, 0xf0, 0x3f, 0x01, 0xf8, 0x1f, 0xf8, 0x1f, 0x80, 0xfc, 0x0f, 0xfc, 0x0f, 0xc0, 0x7e, 0x07, 0xfe, 0x07, 0xe0, 0x3f, 0x03, 0x7f, 0x03, 0xf0, 0x1f, 0x81, 0x3f, 0x81, 0xf8, 0x0f, 0xc0, 0x1f, 0xc0, 0xfc, 0x07, 0xe0, 0x0f, 0xe0, 0x7e, 0x03, 0xf0, 0x07, 0xf0, 0x3f, 0x01, 0xf8, 0x03, 0xf8, 0x1f, 0x80, 0xfc}; Where are you getting your 128 x 64 OLED from? If it's China, you have a long wait right now, in my experience. If you want it quickly I can send you one from here, won't take more than a week for you to get it. You can have it in exchange for the help you gave on this! Cheers Les
  24. Now that this is working I need to my self sorted out with a way to cut down on the USB port usage - with everything connected I am getting up to nine seconds lag between the on screen change and the device change, and that includes gauges and the Altimeter OLED, despite being on dedicated Nanos. Nevertheless, I consider progress has been made, despite the unpleasant thought of having to come back to trying to get RS485 working It is super cool watching everything work! Les
  25. Well, I may end up having to come back to this sooner that I thought, Hans. I did a test today (OK, I was playing to enjoy seeing all the stuff working...) by connecting a load of the separate parts up using USB, which even though I had 15 gauges running of the Mega, still meant due to the current state that I had a total of 14 USB devices connected, including the Thrustmaster HOTAS / joystick combination. And boy does it cause lag... Admittedly 14 USB connections is more than I want to end up with, as there are six that can be combined onto another Mega, but clearly I need to keep the number of USB connections down, and ultimately the RS485 network will probably have to be the way. The nice scrolling OLED displays look like they need to be kept on individual Arduinos, if nothing else because they have static and conflicting i2C addresses. The i2C multiplexers I'm still waiting for may help but I suspect that the load each OLED puts on the nanos will prevent that I assume that there is nothing that can be done to address the USB lag? Cheers Les
×
×
  • Create New...