#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>
#include <math.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1 // Geen reset pin nodig bij I2C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
int fwdPin = A0;
int refPin = A1;
const int Ishunt_pin = A2; //Uno A5 geeft hangup / stop bij de UNO
const int Drive_pin = A3; // 50R diode 1n4148 detector 1W ca 5V verdeeld 50/50? PA en 50R dummy
#define PTT (2) // Low is actief opto input pul down
#define SWRalarm 7
#define SWR_ResetButton 8
#define FAN_PIN 9 //PWM-uitgang naar MOSFET timer1
int PTTstate = 0; // PTT in
bool TxState = false; // PTT in
int peakFwd = 0;
int peakRef = 0;
float swr = 1;
float powerThreshold = 5.0;
bool alarmTriggered = false;
float alarmswr = 1;
unsigned int VoltDriveLevel =0; // Sensor PA ingang 50R 50k potmeter
unsigned int SupplyCurrent = 0; // Power supply voltage moet integer zijn
bool TxEnable = true; // enable Tx
#define AntRelay (4) // IRF510 low= ON opto pull down low is gate high( max 5V zener) eerst
#define TxPWR (6) // BTS low= ON opto pull down na 20mS
void setup() {
pinMode(SWRalarm, OUTPUT);
pinMode(AntRelay, OUTPUT);
pinMode(PTT,INPUT);
pinMode(PTT, INPUT_PULLUP);
digitalWrite(SWRalarm, LOW);
pinMode(SWR_ResetButton, INPUT_PULLUP);
pinMode(FAN_PIN, OUTPUT);
// Verhoog PWM-frequentie op D5 (Timer1) naar 7.8 kHz deze timer is ingebruik voor msec alleen voor test met UNO gebruiken
// Stel Timer1 in op hogere frequentie NANO
// Copilot ivm piepen op laag toerental
TCCR0B = TCCR0B & 0b11111000 | 0x01; // voor test op UNO heeft nietPrescaler 0 → ~31.25 kHz
TCCR1B = TCCR1B & 0b11111000 | 0x01; //D9 Prescaler 1 → ~31.25 kHz
Serial.begin(115200);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3c)) {
Serial.println(F("SSD1306 niet gevonden"));
while (true);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.display();
sensors.begin();
}
void loop() {
// overbodig RunOnce = 0; // Now we are in loop
// delay (2000); // voor debug loop vertraging
// test PTT ingang
PTTstate = digitalRead(PTT);
if (PTTstate == 0 & TxEnable ) { // PTT gnd transmit
if (TxState == false) // start TX sequentie
{
digitalWrite(AntRelay, HIGH); //coaxrelay ON
delay(10); // 2sec voorr test //18-6-2024 Sequenzer delay was 20mS swr pieken bij inschakellen TX geeft Alarm hielp niet
digitalWrite(TxPWR, HIGH); //Power PA -ON
TxState = true;
}
if (TxEnable == false)
{
digitalWrite(TxPWR, LOW); //PA uit
digitalWrite(AntRelay, LOW); //coaxrelay uit
}
LeesSwrVoltages();
} // eind PTT=0 = uit
if (PTTstate == true) { // schakel terug naar ontvangst indien nog in TX mode
if (TxState == true)
{
digitalWrite(TxPWR, LOW); //PWR PA off dwz optocoupler uit BTS gate hoog
delay(10); // 20 ms TX eerst uit
digitalWrite(AntRelay, LOW); // op ontvangst
TxState = false;
}
LeesSwrVoltages(); //
}
}
void LeesSwrVoltages(){
int fwdRaw = analogRead(fwdPin);
int refRaw = analogRead(refPin);
int fwdLevel = map(fwdRaw, 0, 1023, 0, 100);
int refLevel = map(refRaw, 0, 1023, 0, 100);
float forward = (float)fwdRaw;
float reflected = (float)refRaw;
VoltDriveLevel =analogRead(Drive_pin); // sensor Voltage op 50R ingang dummy
float forwardVoltage = forward * ((800.0 / 1023) / 5.0);
float forwardPower = (forwardVoltage * forwardVoltage) / 50.0;
if (VoltDriveLevel>280) {
// VoltDriveLevel alarm 9-10-2024
digitalWrite(TxPWR, LOW); //PA uit
alarmTriggered = true;
// alarmswr = drive ;
TxEnable = false;
// u8x8.setCursor(2, 6); //
// u8x8.print(" DRIVE !");
}
if (forward > powerThreshold && forward > reflected) {
swr = (forward + reflected) / (forward - reflected);
} else {
swr = 0;
}
if (digitalRead(SWR_ResetButton) == LOW) {
alarmTriggered = false;
TxEnable = true;
}
if ((forward > powerThreshold) && (swr > 3.0)) {
alarmTriggered = true;
alarmswr = swr ;
TxEnable = false;
}
digitalWrite(SWRalarm, alarmTriggered ? LOW : HIGH);
if (swr > 10.0) swr = 10.0;
int swrPercent = (int)(log10(swr) * 100.0 / log10(10.0));
if (fwdLevel > peakFwd) peakFwd = fwdLevel;
else peakFwd--;
if (refLevel > peakRef) peakRef = refLevel;
else peakRef--;
display.clearDisplay();
// formule: x = 30 + ((log10(val) - log10(min)) / (log10(max) - log10(min))) * 90;
// SWR schaalverdeling (1–10)
float swrMin = log10(1);
float swrMax = log10(10);
for (int swrVal = 1; swrVal <= 10; swrVal++) {
float logSWR = log10(swrVal);
int x = 30 + (int)((logSWR - swrMin) / (swrMax - swrMin) * 90);
display.drawLine(x, 20, x, 22, SSD1306_WHITE); // SWR schaal
}
// Power schaalverdeling (1–800W)
float pwrMin = log10(1);
float pwrMax = log10(800);
for (int pwrVal = 1; pwrVal <= 800; pwrVal *= 2) {
float logPWR = log10(pwrVal);
int x = 30 + (int)((logPWR - pwrMin) / (pwrMax - pwrMin) * 90);
display.drawLine(x, 0, x, 2, SSD1306_WHITE); // FWD schaal
//display.drawLine(x, 10, x, 12, SSD1306_WHITE); // REF schaal
}
// FWD bar + peak
display.setCursor(0, 0);
display.print("FWD:");
display.fillRect(30, 0, fwdLevel * 0.9, 8, SSD1306_WHITE);
int peakXfwd = 30 + (peakFwd * 0.9);
display.drawLine(peakXfwd, 0, peakXfwd, 7, SSD1306_WHITE); // piek-lijn
// REF bar + peak
display.setCursor(0, 10);
display.print("REF:");
display.fillRect(30, 10, refLevel * 0.9, 8, SSD1306_WHITE);
int peakXref = 30 + (peakRef * 0.9);
display.drawLine(peakXref, 10, peakXref, 17, SSD1306_WHITE); // piek-lijn
// SWR bar
display.setCursor(0, 20);
display.print("SWR:");
display.fillRect(30, 20, swrPercent * 0.9, 8, SSD1306_WHITE);
// SWR value
display.setCursor(75, 35);
display.print("SWR: ");
display.print(swr, 2);
// Power value
display.setCursor(0, 35);
display.print("PWR: ");
display.print(forwardPower, 0);
display.print("W");
// Alarm status
display.setCursor(0, 55);
if (alarmTriggered) {
display.print("ALARM! ");
display.print(alarmswr, 2);
} else {
display.print("OK ");
}
sensors.requestTemperatures();
float tempC = sensors.getTempCByIndex(0);
int pwm = map(tempC, 25, 50, 0, 255);
pwm = constrain(pwm, 0, 255);
analogWrite(FAN_PIN, pwm);
display.setCursor(80, 55);
display.print("T: ");
display.print(tempC);
display.println(" C");
display.display();
display.display();
Serial.print("Forward Power: ");
Serial.print(forwardPower, 2);
Serial.print(" W | Reflected: ");
Serial.print(reflected, 2);
Serial.print(" | SWR: ");
Serial.print(swr, 2);
Serial.print(" | T: ");
Serial.println(tempC, 2);
delay(10);
}
Loading
ds18b20
ds18b20