I go it to work. Has very little screen flicker as well.
NOTE:- this is setup on a 320x480 tft, but the display area is 74x284 pixels
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7796S.h>
#include <RotaryEncoder.h>
#include <Fonts/FreeSansBoldOblique9pt7b.h>
#include <Fonts/FreeSansBoldOblique12pt7b.h>
#define display_CS 10
#define display_RST 8
#define display_DC 9
#define display_MOSI 11
#define display_CLK 13
#define BLACK 0x0000
#define GRAY 0x8410 //lGRAY = light gray, GREY = dark grey 16bit colour
#define GREY 0x632C
#define WHITE 0xFFFF
#define RED 0xF800
#define ORANGE 0xFCA0
#define YELLOW 0xFFE0
#define DENIM 0x4CBA
#define GREEN 0x07E0
#define DARKGREEN 0x2BE3
#define LIGHTGREEN 0x97F0
#define CYAN 0x07FF
#define AQUA 0x04FF
#define BLUE 0x001F
#define MAGENTA 0xF81F
#define PINK 0xF69A
#define GREYGREEN 0x2984
Adafruit_ST7796S display(display_CS, display_DC, display_MOSI, display_CLK, display_RST);
RotaryEncoder Rotary(&RotaryChanged, 2, 3, 28); // Pins 2 (DT), 3 (CLK), 28 (SW) - 28 is just a null number as the (SW) is not used
int encCounter = 0;
long posn = -999;
long newposn;
char buffer1[10];
char buffer2[10];
void RotaryChanged() {
const unsigned int state = Rotary.GetState();
if (state & DIR_CW)
encCounter++;
if (state & DIR_CCW)
encCounter--;
}
void setup() {
Serial.begin(9600);
Serial.print(("Oih !"));
display.init(320, 480, 0, 0, ST7796S_BGR);
display.fillScreen(BLACK);
display.invertDisplay(1);
display.setRotation(1);
display.setTextColor(WHITE);
display.setCursor(80, 100);
display.setTextSize(1);
display.println("T.I.S.M"); // mum, we are serious. google it
delay(500);
display.fillScreen(WHITE);
display.fillRect(0, 0, 284, 73, GREY);
display.fillRoundRect(6, 5, 196, 36, 9, WHITE);
}
void loop() {
display.fillTriangle(100, 15, 90, 5, 110, 5, RED);
display.fillTriangle(100, 30, 90, 40, 110, 40, RED);
float measurment = (encCounter / 200.000);
float imperial = (measurment / 25.4000);
dtostrf(measurment, 6, 3, buffer1);
dtostrf(imperial, 6, 4, buffer2);
Serial.println(buffer1);
Serial.println(encCounter);
newposn = encCounter; // derived from rotary encoder
if (newposn != posn) {
posn = newposn;
int16_t startX = (encCounter - 500);
int16_t startY = 8;
int16_t numTicks = 200;
int16_t minTickHeight = 10;
int16_t medTickHeight = 20;
int16_t majTickHeight = 30;
int16_t minTickspacing = 20;
int16_t medTickspacing = 100;
int16_t majTickspacing = 200;
for (int i = 0; i < numTicks; i++) {
display.drawFastVLine(startX + (i * minTickspacing) - 1, startY + 10, minTickHeight, WHITE); //
display.drawFastVLine(startX + (i * minTickspacing) + 1, startY + 10, minTickHeight, WHITE);
display.drawFastVLine(startX + (i * minTickspacing), startY + 10, minTickHeight, BLACK);
display.drawFastVLine(startX + (i * medTickspacing) - 1, startY, medTickHeight, WHITE);
display.drawFastVLine(startX + (i * medTickspacing) + 1, startY, medTickHeight, WHITE);
display.drawFastVLine(startX + (i * medTickspacing), startY, medTickHeight, BLACK);
display.drawFastVLine(startX + (i * majTickspacing) - 1, startY, majTickHeight, WHITE);
display.drawFastVLine(startX + (i * majTickspacing) + 1, startY, majTickHeight, WHITE);
display.drawFastVLine(startX + (i * majTickspacing), startY, majTickHeight, BLACK);
}
display.drawRoundRect(1, 1, 204, 44, 11, RED);
display.drawRoundRect(3, 2, 201, 42, 10, RED);
display.drawRoundRect(5, 4, 198, 38, 9, RED);
display.fillRect(205, 0, 300, 40, GREY);
display.setCursor(206, 25);
display.setFont(&FreeSansBoldOblique9pt7b);
display.setTextSize(1);
display.setTextColor(BLACK);
display.fillRect(65, 50, 80, 20, GREY);
display.print("Position");
display.setCursor(70, 67);
display.setFont(&FreeSansBoldOblique12pt7b);
display.print(buffer1);
display.setCursor(140, 65);
display.print("mm");
display.setCursor(200, 65);
display.fillRect(200, 46, 80, 20, GREY);
display.fillRect(280, 0, 220, 80, WHITE);
display.setFont(&FreeSansBoldOblique9pt7b);
display.print(buffer2);
display.setCursor(257, 65);
display.print("in");
}
}