/* * VoltBar.ino ver. 1.18.21 * ------------------------ * This program provides bar graph (vertical orientations) and measure Volt from 0 - 15 Volt on Port A15 * ----------------------------------------------------------------------------------------------------- * * It requires and Arduino Mega (or UNO) and an Adafruit 3.5" TFT 240x320 + Touchscreen Breakout Board * https://learn.adafruit.com/adafruit-2-4-color-tft-touchscreen-breakout?view=all * * Adafruit libraries * https://github.com/adafruit/Adafruit_HX8357_Library/archive/master.zip * https://github.com/adafruit/Adafruit-GFX-Library/archive/master.zip * * Optional touch screen libraries (Touch-Screen is not in use in this program) * https://github.com/adafruit/Touch-Screen-Library/archive/master.zip * ****************************************************************************** * All the mcufriend.com UNO shields have the same pinout. * i.e. control pins A0-A4. Data D2-D9. microSD D10-D13. * Touchscreens are normally A1, A2, D7, D6 but the order varies * * This demo should work with most Adafruit TFT libraries * If you are not using a shield, use a full Adafruit constructor() * e.g. Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); ****************************************************************************** * * Revisions * rev date author description * 1 12-19-2015 kasprzak initial creation * 2 21-01-2018 OZ6YM, Palle Special edition (Volt-BAR) * * This pin setting will also operate the SD card * Pin settings * * Arduino device * 5V Vin * GND GND * A0 * A1 * A2 Y+ (for touch screen use) * A3 X- (for touch screen use) * A4 * A5 * 1 * 2 * 3 * 4 CCS (42 for mega) * 5 * 6 * 7 Y- (44 for mega) * 8 X+ (46 for mega) * 9 DC (48 on mega * change define) * 10 CS (53 for mega * change define) * 11 MOSI (51 for mega) * 12 MISO (50 for mega) * 13 CLK (SCK) (52 for mega) * 44 Y- (for touch screen only) * 46 X+ (for touch screen only) * 48 DC * A15 READS the voltage on A15 ( MEGA2560 ) but could use A0 on UNO * SDA * SLC */ #include <MCUFRIEND_kbv.h> // https://github.com/prenticedavid/MCUFRIEND_kbv long INPUTPORT = A15; // In use of a MEGA2560 // // COLOR-PICKER is all possible colors om MCUFRIEND-Display //--------------------------------------------------------- // http://www.barth-dev.de/online/rgb565-color-picker/ #define LTBLUE 0xB6DF #define LTTEAL 0xBF5F #define LTGREEN 0xBFF7 #define LTCYAN 0xC7FF #define LTRED 0xFD34 #define LTMAGENTA 0xFD5F #define LTYELLOW 0xFFF8 #define LTORANGE 0xFE73 #define LTPINK 0xFDDF #define LTPURPLE 0xCCFF #define LTGREY 0xE71C #define BLUE 0x001F #define TEAL 0x0438 #define GREEN 0x07E0 #define CYAN 0x07FF #define RED 0xF800 #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define ORANGE 0xFD20 #define PINK 0xF81F #define PURPLE 0x801F #define GREY 0xC618 #define WHITE 0xFFFF #define BLACK 0x0000 #define DKBLUE 0x000D #define DKTEAL 0x020C #define DKGREEN 0x03E0 #define DKCYAN 0x03EF #define DKRED 0x6000 #define DKMAGENTA 0x8008 #define DKYELLOW 0x8400 #define DKORANGE 0x8200 #define DKPINK 0x9009 #define DKPURPLE 0x4010 #define DKGREY 0x4A49
int BACKGND = DKGREY; // Default Background color int MyBar = BLUE;
double volts; double bvolts;
boolean graph_1 = true; boolean graph_2 = true; boolean graph_3 = true; boolean graph_4 = true; boolean graph_5 = true; boolean graph_6 = true; boolean graph_7 = true;
uint16_t g_identifier;
// NOT all variables is in use or this program // ------------------------------------------- struct grafix { // Graph structure declaration int x; // upper left coordinate horizontal int y; // upper left coordinate vertical int w; // width of graph int h; // height of graph float minX; // minimum X graph value, can be negative float maxX; // maximum X graph value float minY; // minimum Y float maxY; // maximum Y float xInc; // scale division between lo and hi float yInc; // y increment float currentValue; // Current value int digitTotal; // total digits displayed, not counting decimal point int decimals; // digits after decimal point int barColor; // Color for bar int voidColor; // Background color in bar chart int backBar; // Background bar color int border; // Border color int textColor; // Color for text int backFill; // Background color for entire graph char label[30]; // Label text } myG; // NOT IN USE
MCUFRIEND_kbv tft; // Defining tft
int flag; /*************************************************/ void DrawBarChartV( double x , double y , double w, double h , double loval , double hival , double inc , double curval , int dig , int dec, unsigned int barcolor, unsigned int voidcolor, unsigned int bordercolor, unsigned int textcolor, unsigned int backcolor, String label, boolean & redraw); /*************************************************/ void setup(void) { // Serial.begin(9600); g_identifier = tft.readID(); // Get TFT ID 3.2" = 0x9341 tft.begin(g_identifier);
Serial.print("TFT ID "); Serial.println(g_identifier, HEX);
tft.begin(g_identifier); tft.fillScreen(BACKGND); tft.setRotation(1); pinMode(INPUTPORT, INPUT);
} //******************************************************************************************************* void loop() { bvolts = analogRead(INPUTPORT); DrawBarChartV( 305, 40, 10, 190, 0, 1500 , 100, bvolts , 4 , 0, BLUE, DKGREEN, BLUE, WHITE, BLACK, "Volt", graph_1); } /******************************************************************************************************** This method will draw a vertical bar graph for single input it has a rather large arguement list and is as follows
x = position of bar graph (lower left of bar) y = position of bar (lower left of bar w = width of bar graph h = height of bar graph (does not need to be the same as the max scale) loval = lower value of the scale (can be negative) hival = upper value of the scale inc = scale division between loval and hival curval = date to graph (must be between loval and hival) dig = format control to set number of digits to display (not includeing the decimal) dec = format control to set number of decimals to display (not includeing the decimal) barcolor = color of bar graph voidcolor = color of bar graph background bordercolor = color of the border of the graph textcolor = color of the text backcolor = color of the bar graph's background label = bottom lable text for the graph redraw = flag to redraw display only on first pass (to reduce flickering) ******************************************************************************************/ void DrawBarChartV( double x , double y , double w, double h , double loval , double hival , double inc , double curval , int dig , int dec, unsigned int barcolor, unsigned int voidcolor, unsigned int bordercolor, unsigned int textcolor, unsigned int backcolor, String label, boolean & redraw) { double stepval, range; double my, level; double i, data;
// draw the border, scale, and label once // avoid doing this on every update to minimize flicker if (redraw == true) { redraw = false; tft.drawRect(x , y , w , h , bordercolor);
// step val basically scales the hival and low val to the height // deducting a small value to eliminate round off errors // this val may need to be adjusted stepval = ( inc) * (double (h) / (double (hival - loval))) - .001; //********************************************************************* tft.setTextSize(1); tft.setTextColor(textcolor, BACKGND);
for (i = 0; i <= h; i += stepval) { my = y + h + i -190; tft.drawFastHLine(x-5, my, 5, textcolor); // draw vertical skala-labels //---------------------------- tft.setCursor(x + w -40, my - 3 ); data = (hival - ( i * (inc / stepval)))/100; tft.println(Format(data, dig, dec)); //Skala lodret } //******* END of for ****************************************** } //********* END of if ******************************************
// compute level of bar graph that is scaled to the height and the hi and low vals // this is needed to accompdate for +/- range level = map( bvolts, 0, 1023, 0, 188 ); if ( level < 102 ) { MyBar = ORANGE; } // level < 6,65 volt if ( level > 102 ) { MyBar = BLUE; } // level OK! if ( level < 88 ) { MyBar = RED; } // level < 8,00 volt
// draw the bar graph // write a upper and lower bar to minimize flicker cause by blanking out bar and redraw on update tft.fillRect(x, y, w, h - level, GREEN); tft.fillRect(x, y + 190 - level, w, level, MyBar);
// write the current value tft.setTextColor(textcolor, BACKGND); tft.setTextSize(2); tft.setCursor(x +30 , y - h - 23); tft.println(Format(curval, dig, dec)); // talrække lodret } // ******************** END of DrawBarChartV ******************
// /**************************************************************** Purpose: To format any double number. ****************************************************************/ String Format(double val, int dec, int dig ) { int addpad = 0; char sbuf[20]; String condata = (dtostrf(val, dec, dig, sbuf)); int slen = condata.length();
for ( addpad = 1; addpad <= dec + dig - slen; addpad++) { condata = " " + condata; } return (condata); } // ****************** END of Format ************************** // // ******************** END of Program VoltBar ***************** //