/*
Arduino | coding-help
Screen Flicker when updating values
Syn [puffy], puffy - Tuesday, May 5, 2026 5:26 PM
Trying to make a custom digital boost/vacuum gauge with a map sensor.
I finally got the values to be stable but it's causing my SPI screen to
flicker.
*/
#include <Adafruit_GFX.h>
#include <Adafruit_ST7789.h>
#include <SPI.h>
#define TFT_CS 10
#define TFT_RST 9
#define TFT_DC 8
#define TFT_BLK 7 // Backlight pin
#define ST77XX_VFD_BLUE 0x0f7e // this is a "565 RGB" value
const double VREF = 5.00;
const int SENSOR_PIN = A0;
const int MODE_SW_PIN = 2;
double oldValue = 99.0; // always different on boot
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
float psiToInHg(float value) {
float convertedValue = value * 2.036;
return convertedValue;
}
void setup() {
Serial.begin(115200);
Serial.println("ST7789 Display Test");
pinMode(MODE_SW_PIN, INPUT_PULLUP);
pinMode(TFT_BLK, OUTPUT);
analogWrite(TFT_BLK, 255); // Set backlight to full brightness (0-255)
tft.init(240, 320);
tft.setRotation(3); // Adjust rotation if needed
tft.fillScreen(ST77XX_BLACK);
tft.setTextSize(3);
tft.setCursor(10, 10);
//tft.setTextColor(ST77XX_BLUE, ST77XX_BLACK);
tft.setTextColor(ST77XX_VFD_BLUE, ST77XX_BLACK);
}
void loop(void) {
char buffer[16];
char pressBuff[8];
float displayPressure = 0.0;
bool isPSI = !digitalRead(MODE_SW_PIN);
int rawValue = analogRead(SENSOR_PIN); // read the input pin
int mappedValue = map(rawValue, 0, 1023, -30, 20);
float voltage = (rawValue * VREF) / 1023.0;
float pressure = (5.8149 * voltage) - 14.211;
//float pressure = (voltage - 14.183) / 5.8083;
//int rawADC = analogRead(A0);
//float voltage = float(rawADC) / 1024.0 * 5.0;
//float pressure = (voltage - 0.5) / 4.0 * 15.0;
if (!isPSI) {
displayPressure = psiToInHg(pressure);
} else {
displayPressure = pressure;
}
if (displayPressure != oldValue) {
oldValue = displayPressure;
Serial.print("Raw value: ");
Serial.println(rawValue); // print raw sensor reading
Serial.print("Voltage: ");
Serial.println(voltage); // print raw sensor reading
Serial.print("PSI: ");
Serial.println(pressure, 2); // print raw sensor reading
Serial.println();
// puts the float pressure into a char array, pressBuff
dtostrf(displayPressure, 6, 2, pressBuff);
snprintf(buffer, 16, "%s %s ", pressBuff, isPSI ? "PSI" : "inHg");
tft.setCursor(40, 50);
tft.print(buffer);
}
}PSI / inHg
VALUES ARE DEMO ONLY