Доработка металлоискателя Пират
боб, Ты же знаешь мое отношение к счетчику Гейгера. А тут можно программно сделать озвучку до 600Гц например, радующее ухо. Светодиоды я могу урезать до 4 например.
А ардуина убирает лишние узлы схемы, такие как таймер 555 или УД2 , заменить на tl и из неё выжать попробовать всё+ ещё грубая и точная настройка на этих резисторах, так же в утиль.
Ну яж и говорю, обострение 1

(01-09-2025, 11:05)gal : ответ в сериал монитор
Светики загораются, звука нет. Я там чуть выше ошибся. Светодиоды загораются от входящего сигнала(чем выше частота)по одному, а вот звука нет.
у вас на сериал монитор одни нуля
Попробую ещё раз прописать:
  if (frequency > 50 && frequency <= 100) {
    digitalWrite(ledPin10, HIGH);
    tone(SPEAKER_PIN, 500);
  } else {
    digitalWrite(ledPin10, LOW);
  }

(01-09-2025, 11:23)gal : сериал монитор одни нуля
Почему нули?           
// Тут я прерываю для подсчета импульсов
//void countPulse() {
// pulseCount++;
//}
это не работает

а это работает, но в сетап пин моде есть glitch


PHP код:
int pulseCount;
//int  frequency =pulseCount;

const int SPEAKER_PIN = 12; // Пин усилителя для динамика
const int COIL_PIN    = 13; // Пин для IRF740 и катушки
const int frequencyPin = 2; // Пин D2 для входящего сигнала с TL072
const int ledPin3     = 3;  // Светодиод для частоты до 10Гц
const int ledPin5     = 5;  // Светодиод для частоты до 20Гц
const int ledPin6     = 6;  // Светодиод для частоты до 30Гц
const int ledPin9     = 9;  // Светодиод для частоты до 40Гц
const int ledPin11    = 11; // Светодиод для частоты до 50Гц
const int ledPin10    = 10; // Светодиод для частоты до 60Гц
const int ledPin8     = 8;  // Светодиод для частоты до 70Гц
const int ledPin7     = 7;  // Светодиод для частоты до 125Гц

//volatile unsigned long pulseCount = 0; // Считаю импульсы

void setup() {
  Serial.begin(115200);

  // Настройка режимов пинов скетча
  pinMode(ledPin3,     OUTPUT);
  pinMode(ledPin5,     OUTPUT);
 
// pinMode(ledPin6,     OUTPUT);
  //pinMode(ledPin7,     OUTPUT);
 /// pinMode(ledPin8,     OUTPUT);
 // pinMode(ledPin9,     OUTPUT);
 // pinMode(ledPin10,     OUTPUT);
 // pinMode(ledPin11,     OUTPUT);



  ///pinMode(ledPin5,     OUTPUT);
  // pinMode(ledPin6,     OUTPUT);
  // pinMode(ledPin7,     OUTPUT);

  // pinMode(ledPin8,     OUTPUT);
  // pinMode(ledPin9,     OUTPUT);
  //pinMode(ledPin10,    OUTPUT);
  //pinMode(ledPin11,    OUTPUT);
  /*
    pinMode(SPEAKER_PIN, OUTPUT);
    pinMode(COIL_PIN,    OUTPUT);
    pinMode(frequencyPin, INPUT);
  */
}

void loop() {
  // Задерживаю на 1 сек и замеряю частоту сигнала
  //delay(1000);
  unsigned long frequency = pulseCount; // Частота в герцах

  // Сброс счетчика на новый замер
  // pulseCount = 0;
  pulseCount++;
  if (pulseCount > 125)
  {
    pulseCount = 0;
  }
  //////////////////////////
  Serial.print("  frequency =  "); Serial.print(frequency);
  Serial.print("  pulseCount =  "); Serial.print(pulseCount);
  Serial.println();
  /////////////////////////
  delay(1000);

}
// Тут я прерываю для подсчета импульсов
//void countPulse() {
// pulseCount++;
//} 
пару минут...
когда в сериал монитор частота  меняется используйте это

Код:
if (frequency >= 1 && frequency <= 10) {
    digitalWrite(ledPin3, HIGH);
    tone(SPEAKER_PIN, 250);
  } else {
    digitalWrite(ledPin3, LOW);
  }
https://disk.yandex.ru/i/3Mx2L0pRjkCShQ
все, проблема решена ?
Подожди, прописываю ещё.
gal, Ну вроде заработал звук на сигнал, пока сам я не понял, где ошибка была. Может скобку не там ставил где то?
Спасибо.
Код:
const int SPEAKER_PIN = 12; // Пин усилителя для динамика
const int COIL_PIN    = 13; // Пин для IRF740 и катушки
const int FREQUENCY = 125;  // 125Гц
const int frequencyPin= 2;  // Пин D2 для входящего сигнала с TL072
const int ledPin3     = 3;  // Светодиод для частоты до 10Гц
const int ledPin5     = 5;  // Светодиод для частоты до 20Гц
const int ledPin6     = 6;  // Светодиод для частоты до 30Гц
const int ledPin9     = 9;  // Светодиод для частоты до 40Гц
const int ledPin11    = 11; // Светодиод для частоты до 50Гц
const int ledPin10    = 10; // Светодиод для частоты до 60Гц
const int ledPin8     = 8;  // Светодиод для частоты до 70Гц
const int ledPin7     = 7;  // Светодиод для частоты до 125Гц

volatile unsigned long pulseCount = 0; // Считаю импульсы
void setup() {
  // Настройка режимов пинов скетча
  pinMode(ledPin3,     OUTPUT);
  pinMode(ledPin5,     OUTPUT);
  pinMode(ledPin6,     OUTPUT);
  pinMode(ledPin7,     OUTPUT);
  pinMode(ledPin8,     OUTPUT);
  pinMode(ledPin9,     OUTPUT);
  pinMode(ledPin10,    OUTPUT);
  pinMode(ledPin11,    OUTPUT);
  pinMode(SPEAKER_PIN, OUTPUT);
  pinMode(COIL_PIN,    OUTPUT);
  pinMode(frequencyPin, INPUT);

  // Тест световой и звуковой при включении металоискателя
  digitalWrite(ledPin3, HIGH);tone(SPEAKER_PIN, 100);
  delay(100);
  digitalWrite(ledPin3, LOW); 
  digitalWrite(ledPin5, HIGH);tone(SPEAKER_PIN, 110);
  delay(100);
  digitalWrite(ledPin5, LOW); 
  digitalWrite(ledPin6, HIGH);tone(SPEAKER_PIN, 120);
  delay(100);
  digitalWrite(ledPin6, LOW);
  digitalWrite(ledPin9, HIGH);tone(SPEAKER_PIN, 130);
  delay(100);
  digitalWrite(ledPin9, LOW);
  digitalWrite(ledPin11, HIGH);tone(SPEAKER_PIN, 140);
  delay(100);
  digitalWrite(ledPin11, LOW);
  digitalWrite(ledPin10, HIGH);tone(SPEAKER_PIN, 150);
  delay(100);
  digitalWrite(ledPin10, LOW);
  digitalWrite(ledPin8, HIGH);tone(SPEAKER_PIN, 200);
  delay(100);
  digitalWrite(ledPin8, LOW);
  digitalWrite(ledPin7, HIGH);tone(SPEAKER_PIN, 250);
  delay(100);
  digitalWrite(ledPin7, LOW);
  // Генерация звука 500 Гц на динамике в течение <1 секунды
  tone(SPEAKER_PIN, 500,100);
  // Жду окончания тона
  delay(1000);

// Прерывание при изменении состояния на пине frequencyPin
  attachInterrupt(digitalPinToInterrupt(frequencyPin), countPulse, RISING);
 
  Serial.begin(9600);
}
 
  void loop() {

      tone(COIL_PIN, FREQUENCY);
  delay(1); // Чуть больше 125 мкс на единичный цикл (нужен для задержки)
  noTone(COIL_PIN);
  delay(8); // Ожидание чуть меньше, чтобы компенсировать задержку
   
  // Задерживаю на 1 сек и замеряю частоту сигнала
  delay(1000);
  unsigned long frequency = pulseCount; // Частота в герцах

  // Сброс счетчика на новый замер
  pulseCount = 0;

   Serial.print("Частота: ");
  Serial.println(frequency);
 
  // Включение светодиодов в зависимости от частоты
  if (frequency >= 1 && frequency <= 10) {
  digitalWrite(ledPin3, HIGH);
  tone(SPEAKER_PIN, 400);
} else {
  digitalWrite(ledPin3, LOW);
  noTone(SPEAKER_PIN);
}
  if (frequency > 10 && frequency <= 20) {
  digitalWrite(ledPin5, HIGH);
  tone(SPEAKER_PIN, 410);
} else {
  digitalWrite(ledPin5, LOW);
}
  if (frequency > 20 && frequency <= 30) {
  digitalWrite(ledPin6, HIGH);
  tone(SPEAKER_PIN, 420);
} else {
  digitalWrite(ledPin6, LOW);
}
  if (frequency > 30 && frequency <= 40) {
  digitalWrite(ledPin9, HIGH);
  tone(SPEAKER_PIN, 430);
} else {
  digitalWrite(ledPin9, LOW);
}
  if (frequency > 40 && frequency <= 50) {
  digitalWrite(ledPin11, HIGH);
  tone(SPEAKER_PIN, 440);
} else {
  digitalWrite(ledPin11, LOW);
}
  if (frequency > 50 && frequency <= 60) {
  digitalWrite(ledPin10, HIGH);
  tone(SPEAKER_PIN, 450);
} else {
  digitalWrite(ledPin10, LOW);
}
  if (frequency > 60 && frequency <= 70) {
  digitalWrite(ledPin8, HIGH);
  tone(SPEAKER_PIN, 460);
} else {
  digitalWrite(ledPin8, LOW);
}
  if (frequency > 70 && frequency <= 150) {
  digitalWrite(ledPin7, HIGH);
  tone(SPEAKER_PIN, 470);
} else {
  digitalWrite(ledPin7, LOW);
}
  }
// Тут я прерываю для подсчета импульсов
void countPulse() {
  pulseCount++;
}

А, дописал себе ещё одну важную вещь...если нет первого щелчка с Пирата, то прописал ...если меньше 1Гц, то noTone(SPEAKER_PIN);