diff --git a/.cproject b/.cproject index 05369a9..0e11640 100644 --- a/.cproject +++ b/.cproject @@ -2,7 +2,7 @@ - + @@ -13,7 +13,7 @@ - + @@ -85,7 +85,7 @@ - + @@ -96,7 +96,7 @@ - + @@ -167,7 +167,7 @@ - + @@ -178,7 +178,7 @@ - + diff --git a/.project b/.project index ed3161f..753778c 100644 --- a/.project +++ b/.project @@ -1,6 +1,6 @@ - SimpleTouchScreenDSO_BlueDisplay + SimpleDSO_BlueDisplay diff --git a/README.md b/README.md index 1ab8a82..a4f1ded 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ This DSO needs only a standard Arduino-Uno or Arduino-Nano, a HC-05 Bluetooth mo | Simple DSO with no attenuator on breadboard | DSO Chart screen | | :-: | :-: | -| ![DSO with passive attenuator on breadboard](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/media/ArduinoDSO_Simple.jpg) | ![DSO chart screen](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/media/Chart.jpg) | +| ![DSO with passive attenuator on breadboard](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/pictures/ArduinoDSO_simple.jpg) | ![DSO chart screen](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/pictures/Chart.jpg) | ## Features - 150 kSamples per second with good quality. @@ -151,23 +151,30 @@ and waveform frequency is not stable and decreased, since not all TIMER1 OVERFLO # SCREENSHOTS DSO start screen -![DSO start screen](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/media/Welcome.jpg) +![DSO start screen](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/pictures/Welcome.jpg) | DSO Chart screen | DSO Chart screen with long info | | :-: | :-: | -| ![DSO chart screen](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/media/Chart.jpg) | ![DSO chart screen with long info](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/media/Chart_Long_Info.jpg) | +| ![DSO chart screen](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/pictures/Chart.jpg) | ![DSO chart screen with long info](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/pictures/Chart_Long_Info.jpg) | | DSO settings menu | DSO frequency / waveform generator menu | -| ![DSO settings menu](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/media/Settings_Passive_Attenuator.jpg) | ![Frequency / waveform generator menu](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/media/Frequency.jpg) | +| ![DSO settings menu](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/pictures/Settings_Passive_Attenuator.jpg) | ![Frequency / waveform generator menu](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/pictures/Frequency.jpg) | | ![DSO at work](https://github.com/ArminJo/android-blue-display/blob/gh-pages/pictures/DSO+Tablet.jpg) | | # SCHEMATICS | SIMPLE 1 RANGE VERSION | 3 RANGE VERSION | | :-: | :-: | -| ![Fritzing schematic](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/fritzing/Arduino_Nano_DSO_Simple_Schaltplan.png) | ![Fritzing schematic](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/fritzing/Arduino_Nano_DSO_BT_Schaltplan.png) | -| ![Fritzing breadboard](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/fritzing/Arduino_Nano_DSO_Simple_Steckplatine.png) | ![Fritzing breadboard](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/fritzing/Arduino_Nano_DSO_BT_Steckplatine.png) | -| ![DSO with passive attenuator on breadboard](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/media/ArduinoDSO_Simple.jpg) | ![DSO with passive attenuator on breadboard](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/media/ArduinoDSO.jpg) | +| ![Fritzing schematic](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/fritzing/Arduino_Nano_DSO_simple_Schaltplan.png) | ![Fritzing schematic](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/fritzing/Arduino_Nano_DSO_BT_full_Schaltplan.png) | +| ![Fritzing breadboard](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/fritzing/Arduino_Nano_DSO_simple_Steckplatine.png) | ![Fritzing breadboard](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/fritzing/Arduino_Nano_DSO_BT_full_Steckplatine.png) | +| ![DSO with passive attenuator on breadboard](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/pictures/ArduinoDSO_simple.jpg) | ![DSO with passive attenuator on breadboard](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/pictures/ArduinoDSO.jpg) | # Revision History -### Version 1.0.0 -Initial Arduino library version +### Version 3.2 - 11/2019 +- Clear display buffer at start and at switching inputs. +- Multiline button caption. + +### Version 3.1 +- stop response improved for fast mode. +- value computation for ultra fast modes fixed. +- millis() timer compensation formula fixed. +- AC/DC button and info line handling improved. diff --git a/fritzing/Arduino_Nano_DSO_BT.fzz b/fritzing/Arduino_Nano_DSO_BT_full.fzz similarity index 100% rename from fritzing/Arduino_Nano_DSO_BT.fzz rename to fritzing/Arduino_Nano_DSO_BT_full.fzz diff --git a/fritzing/Arduino_Nano_DSO_BT_Schaltplan.png b/fritzing/Arduino_Nano_DSO_BT_full_Schaltplan.png similarity index 100% rename from fritzing/Arduino_Nano_DSO_BT_Schaltplan.png rename to fritzing/Arduino_Nano_DSO_BT_full_Schaltplan.png diff --git a/fritzing/Arduino_Nano_DSO_BT_Steckplatine.png b/fritzing/Arduino_Nano_DSO_BT_full_Steckplatine.png similarity index 100% rename from fritzing/Arduino_Nano_DSO_BT_Steckplatine.png rename to fritzing/Arduino_Nano_DSO_BT_full_Steckplatine.png diff --git a/fritzing/Arduino_Nano_DSO_BT_Simple.fzz b/fritzing/Arduino_Nano_DSO_BT_simple.fzz similarity index 100% rename from fritzing/Arduino_Nano_DSO_BT_Simple.fzz rename to fritzing/Arduino_Nano_DSO_BT_simple.fzz diff --git a/fritzing/Arduino_Nano_DSO_BT_Simple_Schaltplan.png b/fritzing/Arduino_Nano_DSO_BT_simple_Schaltplan.png similarity index 100% rename from fritzing/Arduino_Nano_DSO_BT_Simple_Schaltplan.png rename to fritzing/Arduino_Nano_DSO_BT_simple_Schaltplan.png diff --git a/fritzing/Arduino_Nano_DSO_BT_Simple_Steckplatine.png b/fritzing/Arduino_Nano_DSO_BT_simple_Steckplatine.png similarity index 100% rename from fritzing/Arduino_Nano_DSO_BT_Simple_Steckplatine.png rename to fritzing/Arduino_Nano_DSO_BT_simple_Steckplatine.png diff --git a/fritzing/Arduino_Nano_DSO_Simple.fzz b/fritzing/Arduino_Nano_DSO_simple.fzz similarity index 100% rename from fritzing/Arduino_Nano_DSO_Simple.fzz rename to fritzing/Arduino_Nano_DSO_simple.fzz diff --git a/fritzing/Arduino_Nano_DSO_Simple_Schaltplan.png b/fritzing/Arduino_Nano_DSO_simple_Schaltplan.png similarity index 100% rename from fritzing/Arduino_Nano_DSO_Simple_Schaltplan.png rename to fritzing/Arduino_Nano_DSO_simple_Schaltplan.png diff --git a/fritzing/Arduino_Nano_DSO_Simple_Steckplatine.png b/fritzing/Arduino_Nano_DSO_simple_Steckplatine.png similarity index 100% rename from fritzing/Arduino_Nano_DSO_Simple_Steckplatine.png rename to fritzing/Arduino_Nano_DSO_simple_Steckplatine.png diff --git a/media/ArduinoDSO.jpg b/pictures/ArduinoDSO.jpg similarity index 100% rename from media/ArduinoDSO.jpg rename to pictures/ArduinoDSO.jpg diff --git a/media/ArduinoDSO_Closeup.jpg b/pictures/ArduinoDSO_Closeup.jpg similarity index 100% rename from media/ArduinoDSO_Closeup.jpg rename to pictures/ArduinoDSO_Closeup.jpg diff --git a/media/ArduinoDSO_Simple.jpg b/pictures/ArduinoDSO_simple.jpg similarity index 100% rename from media/ArduinoDSO_Simple.jpg rename to pictures/ArduinoDSO_simple.jpg diff --git a/media/Chart.jpg b/pictures/Chart.jpg similarity index 100% rename from media/Chart.jpg rename to pictures/Chart.jpg diff --git a/media/Chart_Long_Info.jpg b/pictures/Chart_Long_Info.jpg similarity index 100% rename from media/Chart_Long_Info.jpg rename to pictures/Chart_Long_Info.jpg diff --git a/pictures/DSO+Tablet.jpg b/pictures/DSO+Tablet.jpg new file mode 100644 index 0000000..5a6f371 Binary files /dev/null and b/pictures/DSO+Tablet.jpg differ diff --git a/media/Frequency.jpg b/pictures/Frequency.jpg similarity index 100% rename from media/Frequency.jpg rename to pictures/Frequency.jpg diff --git a/media/Settings_Passive_Attenuator.jpg b/pictures/Settings_Passive_Attenuator.jpg similarity index 100% rename from media/Settings_Passive_Attenuator.jpg rename to pictures/Settings_Passive_Attenuator.jpg diff --git a/media/Settings_Simple.jpg b/pictures/Settings_simple.jpg similarity index 100% rename from media/Settings_Simple.jpg rename to pictures/Settings_simple.jpg diff --git a/media/Welcome.jpg b/pictures/Welcome.jpg similarity index 100% rename from media/Welcome.jpg rename to pictures/Welcome.jpg diff --git a/src/SimpleTouchScreenDSO.cpp b/src/SimpleTouchScreenDSO.cpp index 51923c8..5ff677e 100644 --- a/src/SimpleTouchScreenDSO.cpp +++ b/src/SimpleTouchScreenDSO.cpp @@ -475,6 +475,7 @@ void setup() { DisplayControl.showInfoMode = INFO_MODE_SHORT_INFO; //setACMode(!digitalReadFast(AC_DC_PIN)); + clearDataBuffer(); // first synchronize. Since a complete chart data can be missing, send minimum 320 byte for (int i = 0; i < 16; ++i) { @@ -1597,7 +1598,7 @@ uint16_t getAttenuatorFactor(void) { /* * toggle between DC and AC mode */ -void doAcDcMode(__attribute__((unused)) BDButton * aTheTouchedButton, __attribute__((unused)) int16_t aValue) { +void doAcDcMode(__attribute__((unused)) BDButton * aTheTouchedButton, __attribute__((unused)) int16_t aValue) { setACMode(!MeasurementControl.ChannelIsACMode); } @@ -1631,7 +1632,7 @@ void doSetTriggerDelay(float aValue) { /* * toggle between 5 and 1.1 volt reference */ -void doADCReference(__attribute__((unused)) BDButton * aTheTouchedButton, __attribute__((unused)) int16_t aValue) { +void doADCReference(__attribute__((unused)) BDButton * aTheTouchedButton, __attribute__((unused)) int16_t aValue) { uint8_t tNewReference = MeasurementControl.ADCReference; if (MeasurementControl.ADCReference == DEFAULT) { tNewReference = INTERNAL; @@ -1646,7 +1647,7 @@ void doADCReference(__attribute__((unused)) BDButton * aTheTouchedButton, __attr } } -void doStartStopDSO(__attribute__((unused)) BDButton * aTheTouchedButton, __attribute__((unused)) int16_t aValue) { +void doStartStopDSO(__attribute__((unused)) BDButton * aTheTouchedButton, __attribute__((unused)) int16_t aValue) { if (MeasurementControl.isRunning) { /* * Stop here @@ -1762,6 +1763,9 @@ void clearDisplayedChart(uint8_t * aDisplayBufferPtr) { sizeof(DataBufferControl.DisplayBuffer)); } +void clearDataBuffer() { + memset(DataBufferControl.DataBuffer, 0, sizeof(DataBufferControl.DataBuffer)); +} /* * Draws only one chart value - used for drawing while sampling */ diff --git a/src/SimpleTouchScreenDSO.h b/src/SimpleTouchScreenDSO.h index 1d63caa..bab23ff 100644 --- a/src/SimpleTouchScreenDSO.h +++ b/src/SimpleTouchScreenDSO.h @@ -11,6 +11,20 @@ #include "TouchDSOCommon.h" +// Internal version +#define VERSION_DSO "3.2" +/* + * Version 3.2 - 11/2019 + * - Clear display buffer at start and at switching inputs. + * - Multiline button caption. + * + * Version 3.1 + * - stop response improved for fast mode. + * - value computation for ultra fast modes fixed. + * - millis() timer compensation formula fixed. + * - AC/DC button and info line handling improved. + */ + /**************************************************************************** * Change this if you have reprogrammed the hc05 module for other baud rate ***************************************************************************/ @@ -73,12 +87,19 @@ const unsigned int REMOTE_DISPLAY_WIDTH = 320; // to see old chart values #define COLOR_DATA_HISTORY RGB(0x20,0xFF,0x20) -//Line colors +// Line colors +#define COLOR_VOLTAGE_PICKER COLOR_YELLOW +#define COLOR_VOLTAGE_PICKER_SLIDER RGB(0xFF,0XFF,0xD0) // Light Yellow #define COLOR_TRIGGER_LINE COLOR_PURPLE -#define COLOR_TRIGGER_SLIDER RGB(0xFF,0XF0,0xFF) +#define COLOR_TRIGGER_SLIDER RGB(0xFF,0XE8,0xFF) // light Magenta #define COLOR_HOR_REF_LINE_LABEL COLOR_BLUE +#define COLOR_MAX_MIN_LINE COLOR_GREEN #define COLOR_GRID_LINES RGB(0x00,0x98,0x00) +// Label colors +#define COLOR_HOR_GRID_LINE_LABEL COLOR_BLUE +#define COLOR_HOR_GRID_LINE_LABEL_NEGATIVE COLOR_RED + // GUI element colors #define COLOR_GUI_CONTROL RGB(0xE8,0x00,0x00) #define COLOR_GUI_TRIGGER RGB(0x00,0x00,0xFF) // blue diff --git a/src/TouchDSOCommon.h b/src/TouchDSOCommon.h index 1446b15..a97c508 100644 --- a/src/TouchDSOCommon.h +++ b/src/TouchDSOCommon.h @@ -17,16 +17,6 @@ #include "FrequencyGeneratorPage.h" #endif -// Internal version -#define VERSION_DSO "3.1" -/* - * Version 3.1 - * - stop response improved for fast mode. - * - value computation for ultra fast modes fixed. - * - millis() timer compensation formula fixed. - * - AC/DC button and info line handling improved. - */ - #ifdef AVR #else // No PROGMEM on ARM @@ -52,16 +42,6 @@ #define DISPLAY_VALUE_FOR_ZERO (REMOTE_DISPLAY_HEIGHT - 1) //#define DISPLAY_VALUE_FOR_ZERO (REMOTE_DISPLAY_HEIGHT - 2) // Zero line is not exactly at bottom of display to improve readability -//Line colors -#define COLOR_VOLTAGE_PICKER COLOR_YELLOW -#define COLOR_VOLTAGE_PICKER_SLIDER RGB(0xFF,0XFF,0xE0) // Light Yellow -#define COLOR_TRIGGER_LINE COLOR_PURPLE -#define COLOR_TRIGGER_SLIDER RGB(0xFF,0XF0,0xFF) // light Magenta - -#define COLOR_MAX_MIN_LINE COLOR_GREEN -#define COLOR_HOR_GRID_LINE_LABEL COLOR_BLUE -#define COLOR_HOR_GRID_LINE_LABEL_NEGATIVE COLOR_RED - /* * CHANNEL */ @@ -313,6 +293,7 @@ extern BDSlider TouchSliderVoltagePicker; void startAcquisition(void); void prepareForStart(void); void setChannel(uint8_t aChannel); +void clearDataBuffer(); // Stack info void initStackFreeMeasurement(void); diff --git a/src/TouchDSOGui.cpp b/src/TouchDSOGui.cpp index af37959..2b6fd4d 100644 --- a/src/TouchDSOGui.cpp +++ b/src/TouchDSOGui.cpp @@ -500,7 +500,7 @@ BDButton TouchButtonTriggerMode; BDButton TouchButtonTriggerDelay; BDButton TouchButtonChartHistoryOnOff; BDButton TouchButtonSlope; -char SlopeButtonString[] = "Slope A"; +char SlopeButtonString[] = "Slope\nascending"; BDButton TouchButtonChannels[NUMBER_OF_CHANNELS_WITH_FIXED_ATTENUATOR]; BDButton TouchButtonChannelSelect; @@ -536,13 +536,13 @@ const char * const ChannelDivByButtonStrings[NUMBER_OF_CHANNELS_WITH_FIXED_ATTEN BDButton TouchButtonChannelMode; BDButton TouchButtonAutoOffsetMode; -const char AutoOffsetButtonStringMan[] PROGMEM = "Offset man"; -const char AutoOffsetButtonStringAuto[] PROGMEM = "Offset auto"; -const char AutoOffsetButtonString0[] PROGMEM = "Offset 0V"; +const char AutoOffsetButtonStringMan[] PROGMEM = "Offset\nman"; +const char AutoOffsetButtonStringAuto[] PROGMEM = "Offset\nauto"; +const char AutoOffsetButtonString0[] PROGMEM = "Offset\n0V"; BDButton TouchButtonAutoRangeOnOff; -const char AutoRangeButtonStringAuto[] PROGMEM = "Range auto"; -const char AutoRangeButtonStringManual[] PROGMEM = "Range man"; +const char AutoRangeButtonStringAuto[] PROGMEM = "Range\nauto"; +const char AutoRangeButtonStringManual[] PROGMEM = "Range\nman"; BDButton TouchButtonSettingsPage; BDButton TouchButtonFrequencyPage; @@ -619,9 +619,8 @@ void initDSOGUI(void) { setSlopeButtonCaption(); // Back button for sub pages - TouchButtonBack.init(BUTTON_WIDTH_3_POS_3, tPosY, BUTTON_WIDTH_3, SETTINGS_PAGE_BUTTON_HEIGHT, COLOR_GUI_CONTROL, - F("Back"), - TEXT_SIZE_22, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doDefaultBackButton); + TouchButtonBack.init(BUTTON_WIDTH_3_POS_3, tPosY, BUTTON_WIDTH_3, SETTINGS_PAGE_BUTTON_HEIGHT, COLOR_GUI_CONTROL, F("Back"), + TEXT_SIZE_22, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doDefaultBackButton); // 2. row tPosY += SETTINGS_PAGE_ROW_INCREMENT; @@ -1219,9 +1218,11 @@ void setChannelButtonsCaption(void) { void setSlopeButtonCaption(void) { uint8_t tChar; if (MeasurementControl.TriggerSlopeRising) { - tChar = 'A'; // 0xD1; //ascending + tChar = 'a'; // 0xD1; //ascending + SlopeButtonString[SLOPE_STRING_INDEX + 1] = 's'; // for ascending } else { - tChar = 'D'; // 0xD2; //descending + tChar = 'd'; // 0xD2; //descending + SlopeButtonString[SLOPE_STRING_INDEX + 1] = 'e'; // for decending } SlopeButtonString[SLOPE_STRING_INDEX] = tChar; TouchButtonSlope.setCaption(SlopeButtonString, (DisplayControl.DisplayPage == DISPLAY_PAGE_SETTINGS)); @@ -1232,19 +1233,19 @@ void setTriggerModeButtonCaption(void) { // switch statement code is 12 bytes shorter here switch (MeasurementControl.TriggerMode) { case TRIGGER_MODE_AUTOMATIC: - tCaption = PSTR("Trigger auto"); + tCaption = PSTR("Trigger\nauto"); break; case TRIGGER_MODE_MANUAL_TIMEOUT: - tCaption = PSTR("Trigger man\ntimeout"); + tCaption = PSTR("Trigger\nman timeout"); break; case TRIGGER_MODE_MANUAL: - tCaption = PSTR("Trigger man"); + tCaption = PSTR("Trigger\nman"); break; case TRIGGER_MODE_FREE: - tCaption = PSTR("Trigger free"); + tCaption = PSTR("Trigger\nfree"); break; default: - tCaption = PSTR("Trigger ext"); + tCaption = PSTR("Trigger\next"); break; } TouchButtonTriggerMode.setCaptionPGM(tCaption, (DisplayControl.DisplayPage == DISPLAY_PAGE_SETTINGS)); @@ -1286,7 +1287,7 @@ void setACModeButtonCaption(void) { #ifdef AVR void setTriggerDelayCaption(void) { - strcpy_P(&sStringBuffer[0], PSTR("Trigger delay\n")); + strcpy_P(&sStringBuffer[0], PSTR("Trigger\nset delay")); if (MeasurementControl.TriggerDelayMode != TRIGGER_DELAY_NONE) { printfTriggerDelay(&sStringBuffer[14], MeasurementControl.TriggerDelayMillisOrMicros); } @@ -1592,6 +1593,8 @@ void doChannelSelect(BDButton * aTheTouchedButton, int16_t aValue) { } setChannel(tNewChannelValue); } + clearDataBuffer(); + /* * Refresh page if necessary */ diff --git a/src/lib/BlueDisplay/BlueDisplay.cpp b/src/lib/BlueDisplay/BlueDisplay.cpp index c798c40..0a3ff9f 100644 --- a/src/lib/BlueDisplay/BlueDisplay.cpp +++ b/src/lib/BlueDisplay/BlueDisplay.cpp @@ -929,7 +929,7 @@ uint16_t BlueDisplay::drawText(uint16_t aPosX, uint16_t aPosY, const __FlashStri char tStringBuffer[STRING_BUFFER_STACK_SIZE]; strncpy_P(tStringBuffer, tPGMString, tTextLength); #ifdef LOCAL_DISPLAY_EXISTS - tRetValue = LocalDisplay.drawTextPGM(aPosX, aPosY - getTextAscend(aTextSize), aPGMString, getLocalTextSize(aTextSize), aFGColor, + tRetValue = LocalDisplay.drawTextPGM(aPosX, aPosY - getTextAscend(aTextSize), tPGMString, getLocalTextSize(aTextSize), aFGColor, aBGColor); #endif if (USART_isBluetoothPaired()) { diff --git a/src/lib/BlueDisplay/Colors.h b/src/lib/BlueDisplay/Colors.h index 87e3607..c0bc5c1 100644 --- a/src/lib/BlueDisplay/Colors.h +++ b/src/lib/BlueDisplay/Colors.h @@ -69,18 +69,19 @@ typedef uint16_t color16_t; */ typedef uint32_t color32_t; -// eases constant color declarations +// Eases constant color declarations but should not be used for non constant colors. Then better use Adafruit_NeoPixel::Color() it saves program space #define COLOR32(r,g,b) ((color32_t)(((uint32_t)r<<16)|((uint16_t)g<<8)|b)) // return ((uint32_t)r << 16) | ((uint32_t)g << 8) | b; #define RED(color) ((color >> 16) & 0xFF) #define GREEN(color) ((color >> 8) & 0xFF) #define BLUE(color) (color 0xFF) +#define COLOR32_BLACK COLOR32(0,0,0) + #define COLOR32_WHITE COLOR32(255,255,255) #define COLOR32_WHITE_HALF COLOR32(128,128,128) // to reduce power consumption #define COLOR32_WHITE_QUARTER COLOR32(64,64,64) // to reduce power consumption #define COLOR32_WHITE_EIGHTH COLOR32(32,32,32) // to reduce power consumption -#define COLOR32_BLACK COLOR32(0,0,0) #define COLOR32_RED COLOR32(255,0,0) #define COLOR32_RED_HALF COLOR32(128,0,0) #define COLOR32_RED_QUARTER COLOR32(64,0,0)