After getting the drivers for the TFT display and the Adafruit graphics library working along with the Joystick, I started porting some of my existing software over to the ESP32. It has turned out to be nearly a direct drop-in from the code I have for the Nano and Pro-mini I have used before.
For some of the test functions a digital read out of values is OK, but when you are making adjustments I prefer some sort of a analog display. In my early projects I used a bar-graph as a analog display, but recently I came up with a very small set of functions that simulate a analog meter. With the speed of the processor and memory available, I could probably make one that is more accurate in appearance, but this simple one is adequate for what I want.
As a test I drew two meters on the screen, and have room for four if I would ever need them. With this size, there is plenty of room on the screen to display multiple digital values, such as instantaneous reading, and peak readings. I could also make one large meter that would cover the entire display area.
Some of the other test instruments I plan on making with the 'Test Gadget' will have frequency scans shown as a wave-form. I ported over my basic waveform screen with programmable grid sizes, and Y-axis scales. They look very nice on this size display, and can redraw with very little flicker.
I have just a few more of these routines to port over in the next few days.
Then I have to decide if I want to incorporate a full menu management system, or just use the simple menus I have used in the past.
Thats all for now check back for updates.
UPDATE 6/19/18
Thinking about what it will take to port some of the CWTD.org 'TestGadget' programs to the ESP32 version, I thought it would be nice to emulate the 2 X 16 LCD display used with their Nano version.
From the 'Gadget Rack' code I found the description of the the basic lcd commands.
Gadget codes have access to the 2 row by 16 character LCD. The LCD is initialized in
* the main setup code. The LCD is accessed with the following functions:
*
* void lcd.clear(void) // clears the lcd display and set cursor to 0,0
* void lcd.setCursor(int column, int row)
* int lcd.print(char *text)
* int lcd.print(type n, BASE) // n is a number (char, byte, int, long, or string,
* // BASE (optional) is BIN, DEC, OCT, HEX or an integer
* // specifying the number of digits to print following
* // the decimal point.
I found there was also an lcd.begin(int column, int row) function that is called in setup() to initialize the lcd. With just a little modification to these functions, I could emulate a LCD from a 2x16 to a 4x20 display. Some of these are dependent on the text size used. The first thing I did was define some global variables that are initialized in the begin function. For these I decided on
int lcdX; int lcdY; int lcdCol; int lcdRow; // position on screen and size of lcd to simulate
int lcdTxtSize; int lcdTxtColor; int lcdBakColor; // text size color and background color of //simulated lcd
Since I didn't want to bother rewriting anything from the lcd library, I just wrote some simple functions to translate the LCD functions to something understood by the tft library I use. To keep the format similar I changed the name from lcd.function to lcd_function. This should make it easier to rewrite any existing code.
First and most import function to write was the lcd_begin().
The original function only requires it be passed the number of columns and rows in the LCD display. For my version I need to also pass the X and Y location of the display on the screen, the text size to use, and the text color and background color for the simulated LCD. The lcd_begin() first copies the passed values to the global variables, and from those values define and draw a filled rectangle that is the emulated LCD display. The next function I wrote was the lcd_clear() which just uses the global variables set in lcd_begin() to compute and redraw the filled rectangle.
The lcd_setCursor(column,row) translates the LCD column and row information to X and Y coordinates on the tft display and calls the tft.setCursor(x,y) function. I had to make two different versions of the lcd.print() function, one for text and another for numbers.
The first is used as lcd_print( "text") to print text at the current cursor position on the LCD. The next is lcd_printNum(6,2) which in this case prints the number 6 followed by ".00" .
Here are a couple pictures of what the emulated LCD looks like
first a 16 x 4 display using this code
lcd_begin(10, 60, 16, 4, 3, BLUE, YELLOW) ; // text and background color
tft.setTextColor(lcdTxtColor);
tft.setTextSize(lcdTxtSize);
for (int i = 0; i < lcdRow; i++) {
lcd_setCursor(0, i);
lcd_print("12345");
lcd_setCursor(5, i);
lcd_print("7890123456");
}
The second picture shows the use of the lcd_setCursor(),
lcd_print() and lcd_printNum() functions using this code.
lcd_setCursor(0, 0);
lcd_print("12345");
lcd_setCursor(5, 1);
lcd_printNum(6, 2);
Hopefully these simple functions might make any porting of the CWTD 'TestGadget' or any other code written for a LCD display to the tft display I am using for my ESP32 version a little easier.
No comments:
Post a Comment