de S53X
Samodejno krmiljenje RemoteQTH 4SQ-8DIR
SDC – PstRotatorAz – ESP32 – ULN2803A – 4SQ-8DIR
Cilj: po vnosu callsign v SDC “NewQSO” okno se 4SQ sam postavi v pravo smer.
Veriga sistema: SDC – PstRotatorAz – ESP32 – ULN2803A – 4SQ-8DIR
***
SDC
Podaja položaj antene
↓
PstRotatorAz
Pridobi azimut
↓
TCP
Zanesljivejši prenos: TCP skrbi za dostavo in vrstni red podatkov
↓
ESP32-S3
Razbere azimut in izbere smer
↓
ULN2803A
Vklop ustrezne kombinacije
↓
BC327→ releji na 4SQ RF Boxu
Vklop posameznih relejev
***
Kazalo:
1. SDC nastavitve za povezavo s PstRotatorAz
2. PstRotatorAZ nastavitve za povezavo z ESP32-S3-Wi-Fi
3. sketch za ESP32-S3 (glej priponko 1)
4. test ESP32-S3 izhodov z LED
5. releji v RemoteQTH 4SQ-8DIR RF Boxu
6. ožičenje ESP32-S3 – ULN2803A
1. SDC nastavitve za povezavo s PstRotatorAz
Med SDC in PstRotator poteka UDP protokol.
– SDC- v Contest – Antennas nastavi:
– kljukica PST Rotator
– IP 192.168.88.11 ( IP PCja kjer teče SDC)- TX port pusti na 12000, RX na 12001
– v PstRotator v UDP Control Setup vpiši isti IP in port kot zgoraj
1. SDC nastavitve za povezavo s PstRotatorAz
Med SDC in PstRotator poteka UDP protokol.
– SDC- v Contest – Antennas nastavi:
– kljukica PST Rotator
– IP 192.168.88.11 ( IP PCja kjer teče SDC)- TX port pusti na 12000, RX na 12001
– v PstRotator v UDP Control Setup vpiši isti IP in port kot zgoraj




2. PstRotatorAZ nastavitve za povezavo z ESP32-S3-Wi-Fi
Nastavitve v PstRotatorAz:
V oknu Communication → TCP Client.
V oknu TCP Client- Connection nastavi Azimuth:
– IP: 192.168.88.40 ( = IP od ESP32)
– Port: 4001
– nato klikni Connect.
( v oknu Monitor od Arduino IDE programa lahko spremljaš kako prihajajo paketi s komandami)
– v Setup označi UDP Contro, da prejema UDP iz SDC.


3. Sketch za ESP32-S3 (glej priponko 1)
– install in/ali open Arduino IDE
– izberi pravi Board
– priklopi ESP32 na COM xx
– izberi pravi COM xx


4. Test ESP32-S3 izhodov z LED
Vseh šest izhodov ESP32-S3 lahko preveriš z LED-diodo, ne da bi priklopil ULN2803A. Tako preveriš ali se posamezni GPIO preklopi na HIGH, ko PstRotatorAz spremeni smer.
Potrebuješ:
– 1 LED-diodo
– 1 upor 330 Ω (lahko tudi 220 Ω)
– nekaj povezovalnih žic
Pozor: ESP32-S3 uporablja logiko 3,3 V. Ne priklapljaj LED neposredno med GPIO in GND brez upora. Ne uporabljaj 5 V na GPIO.

Priključi eno LED in upor, nato ju zaporedoma prestavljaj na te GPIO-je:
Rele – GPIO – Smer, v kateri mora LED svetiti
R1 – GPIO 4 – N, SE, W, NW
R2 – GPIO 5 – SE, S, W, NW
R3 – GPIO 6 – E, SE, S, NW
R4 – GPIO 7 – N, E, SE, NW
R5 – GPIO 15 – SE, SW
R6 – GPIO 16 – E, SE, S, SW, W
LED mora svetiti, ko je ustrezni izhod HIGH in ugasniti, ko je LOW.
5. releji v RemoteQTH 4SQ-8DIR RF Boxu
smer: pritegne rele:
S 2-3-6
SW 5-6
W 1-2-6
NW 1-2-3-4
N 1-4
NE /
E 3-4-6
SE 1-2-3-4-5-6
V FTP Cat5 kablu, ki pelje iz 4-SQ 8 Direction Antenna Switch boxa in ga priklopiš na RF box je razpored žic:
1 – be/or rele 1
2 – or rele 2
3 – be/ze rele 3
4 – be/pl rele 4
5 – ze rele 5
6 – be/rj rele 6
plava GND
rjava REF
oplet FTP Cat5 kabla GND
Poraba toka glede na smer pri 12,5V:
S 19 mA
SW 17 mA
W 19 mA
NW 20 mA
N 10 mA
NE 3 mA = poraba elekronike
E 19 mA
SE 34 mA = vsi releji ON
6. Ožičenje ESP32-S3 – ULN2803A

Pri ESP32 z logiko 3,3 V je kombinacija ESP32 + ULN2803A + BC327 + releji RT424912 zato, da ohraniš obstoječi program in preklapljaš pozitivnih +12 V na tuljave, katerih skupni priključki so na skupnem GND. ULN 2803A namreč preklaplja minus pol, releje v RF Boxu pa plus 12V napetost.
opis slike spodaj:
– levi pcb – 6x BC327 transistorji:
… vklapljajo releje v RF Boxu
– desni PCB:
… ESP32 S3 ploščica – Wi-Fi RX iz PstRotatorAz preko LAN omrežja
… viola je ULN2803A – odpira BC327 glede na signal iz ESP32
… zelena je MP-1584 – down converter iz 12V na 5V za napajanje ESP32



samodejni preklop smeri z ESP32

RemoteQTH 4SQ-8DIR RF Box

ročni preklop smeri z Antenna Switch
S53X 30. 10. 2026
*
**
***
*** priponka 1- sketch koda:
=========================================================================
#include <WiFi.h>
#include <WebServer.h>
// ================================
// Wi-Fi in omrezje
// ================================
const char* ssid = “tvoj_wifi”;
const char* password = “geslo_tvojega_wifi”;
IPAddress local_IP(192, 168, 88, 40);
IPAddress gateway(192, 168, 88, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress dns(192, 168, 88, 1);
// ================================
// TCP in spletni streznik
// ================================
WebServer webServer(80);
WiFiServer tcpServer(4001);
WiFiClient tcpClient;
String ukaz = “”;
unsigned long zadnjiIzpisStanja = 0;
// ================================
// GPIO izhodi za releje
// ================================
const int R1 = 4;
const int R2 = 5;
const int R3 = 6;
const int R4 = 7;
const int R5 = 15;
const int R6 = 16;
// Varnost: ob zagonu so vsi izhodi izklopljeni.
// HIGH aktivira vhod ULN2803A.
void vsiRelejiIzklopljeni() {
digitalWrite(R1, LOW);
digitalWrite(R2, LOW);
digitalWrite(R3, LOW);
digitalWrite(R4, LOW);
digitalWrite(R5, LOW);
digitalWrite(R6, LOW);
}
// Nastavi kombinacijo relejev
void nastaviReleje(
bool r1, bool r2, bool r3,
bool r4, bool r5, bool r6
) {
digitalWrite(R1, r1 ? HIGH : LOW);
digitalWrite(R2, r2 ? HIGH : LOW);
digitalWrite(R3, r3 ? HIGH : LOW);
digitalWrite(R4, r4 ? HIGH : LOW);
digitalWrite(R5, r5 ? HIGH : LOW);
digitalWrite(R6, r6 ? HIGH : LOW);
}
// ================================
// Izbira smeri glede na azimut
// ================================
void nastaviSmer(int azimut) {
azimut = ((azimut % 360) + 360) % 360;
Serial.println();
Serial.println(“——————————“);
Serial.print(“Azimut: “);
Serial.print(azimut);
Serial.println(” stopinj”);
if (azimut >= 338 || azimut < 23) {
Serial.println(“SMER: N”);
nastaviReleje(1, 0, 0, 1, 0, 0);
}
else if (azimut < 68) {
Serial.println(“SMER: NE”);
nastaviReleje(0, 0, 0, 0, 0, 0);
}
else if (azimut < 113) {
Serial.println(“SMER: E”);
nastaviReleje(0, 0, 1, 1, 0, 1);
}
else if (azimut < 158) {
Serial.println(“SMER: SE”);
nastaviReleje(1, 1, 1, 1, 1, 1);
}
else if (azimut < 203) {
Serial.println(“SMER: S”);
nastaviReleje(0, 1, 1, 0, 0, 1);
}
else if (azimut < 248) {
Serial.println(“SMER: SW”);
nastaviReleje(0, 0, 0, 0, 1, 1);
}
else if (azimut < 293) {
Serial.println(“SMER: W”);
nastaviReleje(1, 1, 0, 0, 0, 1);
}
else {
Serial.println(“SMER: NW”);
nastaviReleje(1, 1, 1, 1, 0, 0);
}
Serial.println(“——————————“);
}
// ================================
// Obdelava TCP ukazov
// ================================
void obdelajUkaz(String s) {
s.trim();
// Odstrani zakljucni podpicje
if (s.endsWith(“;”)) {
s.remove(s.length() – 1);
}
// Zanima nas samo ukaz AP
if (!s.startsWith(“AP”)) {
return;
}
/*
Pri dosedanjih primerih:
AP1090; -> 090 -> 90 stopinj
AP1180; -> 180 -> 180 stopinj
Predpostavka protokola:
prvi znak za AP je oznaka, azimut pa so
naslednje tri stevke.
*/
if (s.length() != 6) {
Serial.print(“Nepricakovana oblika AP ukaza: “);
Serial.println(s);
return;
}
String azText = s.substring(3, 6);
for (unsigned int i = 0; i < azText.length(); i++) {
if (!isDigit(azText[i])) {
Serial.println(“Napaka: azimut ni stevilo.”);
return;
}
}
int azimut = azText.toInt();
if (azimut < 0 || azimut > 359) {
Serial.println(“Napaka: azimut je izven obsega.”);
return;
}
Serial.print(“Prejet AP ukaz: “);
Serial.println(s);
nastaviSmer(azimut);
}
// ================================
// Zagon
// ================================
void setup() {
Serial.begin(115200);
delay(1000);
// Najprej pripravi GPIO in izklopi izhode
pinMode(R1, OUTPUT);
pinMode(R2, OUTPUT);
pinMode(R3, OUTPUT);
pinMode(R4, OUTPUT);
pinMode(R5, OUTPUT);
pinMode(R6, OUTPUT);
vsiRelejiIzklopljeni();
Serial.println();
Serial.println(“=================================”);
Serial.println(“ESP32-S3 – PstRotatorAz”);
Serial.println(“TCP + 8 smeri + 6 izhodov”);
Serial.println(“=================================”);
if (!WiFi.config(local_IP, gateway, subnet, dns)) {
Serial.println(“OPOZORILO: Staticni IP ni nastavljen.”);
}
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.print(“Povezovanje na Wi-Fi”);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(“.”);
}
Serial.println();
Serial.println(“Wi-Fi povezan!”);
Serial.print(“IP ESP32: “);
Serial.println(WiFi.localIP());
webServer.on(“/”, HTTP_GET, []() {
webServer.send(
200,
“text/plain; charset=utf-8”,
“ESP32-S3 deluje.\nTCP vrata: 4001\n”
);
});
webServer.begin();
Serial.println(“Spletni streznik: vrata 80.”);
tcpServer.begin();
tcpServer.setNoDelay(true);
Serial.println(“TCP streznik: vrata 4001.”);
Serial.println(“Cakam na PstRotatorAz…”);
}
// ================================
// Glavna zanka
// ================================
void loop() {
webServer.handleClient();
// Sprejem TCP povezave
if (!tcpClient || !tcpClient.connected()) {
if (tcpClient) {
tcpClient.stop();
ukaz = “”;
Serial.println(“TCP povezava prekinjena.”);
}
WiFiClient novaPovezava = tcpServer.available();
if (novaPovezava) {
tcpClient = novaPovezava;
tcpClient.setNoDelay(true);
ukaz = “”;
Serial.println(“TCP POVEZAVA VZPOSTAVLJENA!”);
Serial.print(“Oddaljeni IP: “);
Serial.println(tcpClient.remoteIP());
}
}
// TCP je tok podatkov; vsak ukaz zakljuci podpicje
while (tcpClient && tcpClient.connected() &&
tcpClient.available() > 0) {
char znak = (char)tcpClient.read();
if (znak == ‘;’) {
ukaz += ‘;’;
obdelajUkaz(ukaz);
ukaz = “”;
}
else if (znak >= 32 && znak <= 126) {
ukaz += znak;
if (ukaz.length() > 100) {
Serial.println(“Predolg ukaz – zavrzen.”);
ukaz = “”;
}
}
}
// Izpis stanja vsakih 5 sekund
if (millis() – zadnjiIzpisStanja >= 5000) {
zadnjiIzpisStanja = millis();
if (WiFi.status() != WL_CONNECTED) {
Serial.println(“OPOZORILO: Wi-Fi ni povezan.”);
}
else if (tcpClient && tcpClient.connected()) {
Serial.println(“Stanje TCP: povezava aktivna.”);
}
else {
Serial.println(“Stanje TCP: cakam na PstRotatorAz.”);
}
}
delay(2);
}
================================================================