#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>
// TFT pinnen aanpassen aan jouw setup
#define TFT_CS 10
#define TFT_RST 8
#define TFT_DC 9
#define SWRalarm A3 // SWR >3 alarm output
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
int fwdPin = A0;
int refPin = A1;
int peakFwd = 0;
int peakRef = 0;
void setup() {
tft.initR(INITR_BLACKTAB);
tft.setRotation(1);
tft.fillScreen(ST77XX_BLACK);
tft.setTextSize(1);
tft.setTextColor(ST77XX_WHITE);
pinMode (SWRalarm, OUTPUT);
digitalWrite (SWRalarm, LOW); // standaard uit
}
uint16_t getGradientColor(int percent) {
// Groen naar rood
uint8_t r = (percent * 255) / 100;
uint8_t g = 255 - (percent * 255 / 100);
return tft.color565(r, g, 0);
}
void drawProgressBar(int x, int y, int w, int h, int percent) {
tft.drawRect(x, y, w, h, ST77XX_WHITE);
int fill = (percent * (w - 2)) / 100;
for (int i = 0; i < fill; i++) {
int p = (i * 100) / (w - 2);
uint16_t color = getGradientColor(p);
tft.drawFastVLine(x + 1 + i, y + 1, h - 2, color);
}
tft.fillRect(x + 1 + fill, y + 1, (w - 2) - fill, h - 2, ST77XX_BLACK);
}
void drawSWRScale() {
float swrValues[] = {1.0, 2.0, 3.0, 5.0, 7.0, 10.0};
int numValues = sizeof(swrValues) / sizeof(swrValues[0]);
int barStartX = 10;
int barEndX = 150;
int barY = 96; // onderkant van de VU-meter
int labelY = barY + 10;
float logMin = log10(1.0);
float logMax = log10(10.0);
for (int i = 0; i < numValues; i++) {
float swr = swrValues[i];
float logSWR = log10(swr);
float ratio = (logSWR - logMin) / (logMax - logMin);
int x = barStartX + ratio * (barEndX - barStartX);
// Teken streepje
tft.drawFastVLine(x, barY - 2, 4, ST77XX_WHITE);
// Teken label
tft.setCursor(x - 2, labelY-4);
tft.setTextColor(ST77XX_WHITE);
tft.setTextSize(0);
tft.print(swr, 0);
}
}
void loop() {
int fwdRaw = analogRead(fwdPin);
int refRaw = analogRead(refPin);
int fwdLevel = map(fwdRaw, 0, 1023, 0, 100);
int refLevel = map(refRaw, 0, 1023, 0, 100);
int forwardRaw = analogRead(fwdPin); // A0
int reflectedRaw = analogRead(refPin); // A1
// Vermogen schatten (optioneel lineariseren of kalibreren)
float forward = (float)forwardRaw;
float reflected = (float)reflectedRaw;
// Power-berekening
float forwardVoltage = forwardRaw * ((1000.0/1023) / 5.0); // lineair: 5V = 1000W
float forwardPower = (forwardVoltage * forwardVoltage) / 50.0; // bij 50 ohm belasting
// SWR-berekening
float swr;
if (forward > reflected) {
swr = (forward + reflected) / (forward - reflected);
} else {
swr = 99.9; // Onrealistische waarde, geeft aan dat iets mis is
}
if (swr > 3.0) {
digitalWrite(SWRalarm, HIGH); // waarschuwing aan
} else {
digitalWrite(SWRalarm, LOW); // waarschuwing uit
}
// Beperk SWR tot max 10 voor display
if (swr > 10.0) swr = 10.0;
int swrPercent = (int)(log10(swr) * 100.0 / log10(10.0)); // 0–100%
// Piekdetectie
if (fwdLevel > peakFwd) peakFwd = fwdLevel;
else peakFwd--;
if (refLevel > peakRef) peakRef = refLevel;
else peakRef--;
// Teken VU-balken
drawProgressBar(10, 15, 150, 15, fwdLevel);
drawProgressBar(10, 35, 150, 15, refLevel);
drawProgressBar(10, 80, 150, 15, swrPercent);
// Teken piek
int peakXfwd = 10 + (peakFwd * 150 / 100);
int peakXrev = 10 + (peakRef * 150 / 100);
tft.drawLine(peakXfwd, 15, peakXfwd, 29, ST77XX_WHITE);
tft.drawLine(peakXrev, 35, peakXrev, 49, ST77XX_WHITE);
drawSWRScale();
// Geef Power op scherm weer
tft.setCursor(10, 54);
tft.setTextColor(ST77XX_WHITE);
tft.setTextSize(2);
tft.print("PWR: ");
tft.fillRect(58, 54, 112, 15, ST77XX_BLACK); // wissen
tft.print(forwardPower, 0);
// Geef SWR op scherm weer
tft.setCursor(10, 112);
tft.setTextColor(ST77XX_WHITE);
tft.setTextSize(2);
tft.print("SWR: ");
tft.fillRect(58, 112, 112, 15, ST77XX_BLACK); // wissen
tft.print(swr, 2);
// Labels
tft.setTextSize(1);
//tft.setCursor(130, 15);
//tft.print("Fwd");
//tft.setCursor(130, 35);
//tft.print("Ref");
tft.setTextSize(0);
tft.setCursor(10, 100);
//int swrPercent = (int)(log10(swr) * 100.0 / log10(10.0)); // 0–100%
//tft.print("1 2 3 4 5 6 7 8 9 10");
delay(50);
}