Comco C22 hat geschrieben: Mo 22. Jun 2026, 21:28
das machen wir.....warten.....
// Pin-Belegung für den ATtiny
const int micInputPin = A2; // ANALOGER Eingang (Pin 3): Liest die gedrückte Taste (UP, DOWN, PTT)
const int upOutputPin = 4; // AUSGANG (Pin 3): Schaltet den 2,2 kOhm Widerstand für Kanal UP
const int downOutputPin = 1; // AUSGANG (Pin 6): Schaltet den 3,9 kOhm Widerstand für Kanal DOWN
const int squelchPin = A1; // ANALOGER Eingang (Pin 2): Misst die Squelch-Spannung
// Suchlauf-Zustände
enum ScanDirection { OFF, UP, DOWN };
ScanDirection currentScan = OFF;
unsigned long squelchOpenTime = 0;
bool squelchWasOpen = false;
// Schwellenwerte für Squelch und Tasten (müssen ggf. im Labor angepasst werden)
const int squelchThreshold = 205; // Ca. 1,0V vom Spannungsteiler
const int pttThreshold = 50; // Nahe 0V (Kurzschluss gegen Masse)
const int upThresholdLow = 400; // Beispielwert für 2,2 kOhm Fenster
const int upThresholdHigh = 600;
const int downThresholdLow = 700; // Beispielwert für 3,9 kOhm Fenster
const int downThresholdHigh = 900;
void setup() {
pinMode(upOutputPin, OUTPUT);
pinMode(downOutputPin, OUTPUT);
digitalWrite(upOutputPin, LOW);
digitalWrite(downOutputPin, LOW);
}
void loop() {
// 1. Tasten am Mikrofon abfragen (Spannung auf der Mic-Leitung messen)
int micValue = analogRead(micInputPin);
// PTT gedrückt (Kurzschluss gegen Masse) -> Suchlauf SOFORT beenden
if (micValue < pttThreshold) {
currentScan = OFF;
digitalWrite(upOutputPin, LOW);
digitalWrite(downOutputPin, LOW);
squelchWasOpen = false;
delay(200); // Entprellen
}
// UP-Taste gedrückt -> Suchlauf Vorwärts starten
else if (micValue > upThresholdLow && micValue < upThresholdHigh && currentScan == OFF) {
currentScan = UP;
delay(200);
}
// DOWN-Taste gedrückt -> Suchlauf Rückwärts starten
else if (micValue > downThresholdLow && micValue < downThresholdHigh && currentScan == OFF) {
currentScan = DOWN;
delay(200);
}
// 2. Suchlauf-Logik ausführen, wenn aktiv
if (currentScan != OFF) {
int squelchValue = analogRead(squelchPin);
// Squelch ist OFFEN (Signal da!)
if (squelchValue > squelchThreshold) {
if (!squelchWasOpen) {
squelchWasOpen = true;
squelchOpenTime = millis(); // Zeit merken, wann das Signal kam
}
// Während das Signal da ist, machen wir PAUSE (kein Kanalwechsel)
digitalWrite(upOutputPin, LOW);
digitalWrite(downOutputPin, LOW);
// Wenn das Signal da ist UND 5 Sekunden (5000ms) vergangen sind -> läuft er weiter
if (millis() - squelchOpenTime >= 5000) {
squelchWasOpen = false; // Timer zurücksetzen, damit er weitersucht
}
}
// Squelch ist ZU (Rauschen/Stille) -> Weiterblättern
else {
squelchWasOpen = false; // Signal ist weg, normal weitersuchen
if (currentScan == UP) {
digitalWrite(upOutputPin, HIGH);
delay(80);
digitalWrite(upOutputPin, LOW);
} else if (currentScan == DOWN) {
digitalWrite(downOutputPin, HIGH);
delay(80);
digitalWrite(downOutputPin, LOW);
}
delay(300); // Suchlauf-Geschwindigkeit (Zeit zwischen den Kanälen)
}
}
}