#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);
#define PTT  (2)         // Low  is actief  opto input pul down
int PTTstate = 0;   // PTT in 
#define FAN_PIN 5            //PWM-uitgang naar MOSFET timer1
 
 #define SWRalarm   7
#define SWR_ResetButton 8
bool TxState = false;   // PTT in 
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
int fwdPin = A0;
int refPin = A1;
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
ssd1306
ssd1306
Loading
ds18b20
ds18b20