Доработка металлоискателя Пират
KEN, Спасибо, вечером попробую. Тут оказалось сложнее, чем думал я с этим пином.

Sam, Да вроде изучил распиновку цифровых пинов. И выводил специально на пинах, согласно даташиту ардуины. Но тут дело в другом было, да и
нужны были глубокие познания, согласен с тобой. Вроде каждый день читаю книжку по 1-2 страницы и некоторые функции сложны
ещё для меня, особенно на практике. Для того форум и существует, что бы кто то подсказал.
KEN, Спасибо.    

Код:
const int SPEAKER_PIN  = 11; // Пин усилителя для динамика
const int COIL_PIN     = 9; // Пин для IRF740 и катушки
const int frequencyPin = 2;  // Пин D2 для входящего сигнала с TL072
const int ledPin4      = 4;  // Светодиод для частоты до 10Гц
const int ledPin5      = 5;  // Светодиод для частоты до 20Гц
const int ledPin6      = 6;  // Светодиод для частоты до 30Гц
const int ledPin7      = 7;  // Светодиод для частоты до 40Гц
const int ledPin8      = 8;  // Светодиод для частоты до 125Гц

volatile unsigned long pulseCount = 0; // Считаю импульсы
void setup() {
  
//Подсказка от Ken  
  TCCR1B = 0x18;
  TCCR1A = 0x82;
  ICR1 = 16000;// Частота
  OCR1A = 250;//Ширина импульса
  TCNT1=0x0;
  pinMode(9, OUTPUT);
  TCCR1B |= 2;
  
  // Настройка режимов пинов скетча
  pinMode(ledPin4,     OUTPUT);
  pinMode(ledPin5,     OUTPUT);
  pinMode(ledPin6,     OUTPUT);
  pinMode(ledPin7,     OUTPUT);
  pinMode(ledPin8,     OUTPUT);
  pinMode(SPEAKER_PIN, OUTPUT);
  pinMode(COIL_PIN,    OUTPUT);
  pinMode(frequencyPin, INPUT);

  // Тест световой и звуковой при включении металоискателя
  digitalWrite(ledPin4, HIGH);tone(SPEAKER_PIN, 300);
  delay(100);
  digitalWrite(ledPin4, LOW);
  digitalWrite(ledPin5, HIGH);tone(SPEAKER_PIN, 310);
  delay(100);
  digitalWrite(ledPin5, LOW);
  digitalWrite(ledPin6, HIGH);tone(SPEAKER_PIN, 320);
  delay(100);
  digitalWrite(ledPin6, LOW);
  digitalWrite(ledPin7, HIGH);tone(SPEAKER_PIN, 330);
  delay(100);
  digitalWrite(ledPin7, LOW);
  digitalWrite(ledPin8, HIGH);tone(SPEAKER_PIN, 340);
  delay(100);
  digitalWrite(ledPin8, LOW);
  
  
  // Генерация звука 500 Гц на динамике в течение <1 секунды
  tone(SPEAKER_PIN, 500,100);
  // Жду окончания тона
  delay(1000);

// Прерывание при изменении состояния на пине frequencyPin
  attachInterrupt(digitalPinToInterrupt(frequencyPin), countPulse, RISING);

  Serial.begin(9600);
}

  void loop() {

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

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

   Serial.print("Частота: ");
  Serial.println(frequency);

  // Включение светодиодов в зависимости от частоты
  if (frequency >= 1 && frequency <= 10) {
  digitalWrite(ledPin4, HIGH);
  tone(SPEAKER_PIN, 300);
} else {
  digitalWrite(ledPin4, LOW);
  noTone(SPEAKER_PIN);
}
  if (frequency > 10 && frequency <= 20) {
  digitalWrite(ledPin5, HIGH);
  tone(SPEAKER_PIN, 305);
} else {
  digitalWrite(ledPin5, LOW);
}
  if (frequency > 20 && frequency <= 30) {
  digitalWrite(ledPin6, HIGH);
  tone(SPEAKER_PIN, 310);
} else {
  digitalWrite(ledPin6, LOW);
}
  if (frequency > 30 && frequency <= 40) {
  digitalWrite(ledPin7, HIGH);
  tone(SPEAKER_PIN, 315);
} else {
  digitalWrite(ledPin7, LOW);
}
  if (frequency > 40 && frequency <= 125) {
  digitalWrite(ledPin8, HIGH);
  tone(SPEAKER_PIN, 500);
} else {
  digitalWrite(ledPin8, LOW);
}
  
  }
// Тут я прерываю для подсчета импульсов
void countPulse() {
  pulseCount++;
}
Возможно лучше замерять не частоту а период между импульсами, чем он меньше тем выше частота звука, это позволит озвучивать каждый импульс.
KEN, 125Гц это задающая частота для работы мосфета 740.
А вот импульс я буду уже ловить после TL072 и обрабатывать. А сейчас дописываю 4 кнопки : Две на громкость и две на чувствительность.
Сегодня пробовал на энкодере, что то вообще не
понравилось...перешел на кнопки.
Перешел на кнопки и запутался в 2 кнопках...1 Смотрю в монитор порта и как бы если не пользоваться кнопками, то все работает: и озвучка и индикация. Если начать нажимать кнопки, то в мониторе они регулируют на + и -, но перебивают мне озвучку и индикацию.
Или я не через ту функцию делаю? analogWrite...
Код:
const int SPEAKER_PIN  = 11;    // Пин на динамик
const int COIL_PIN     = 9;     // Пин для IRF740 и катушки
const int frequencyPin = 2;     // Пин D2 для входящего сигнала с TL072
const int ledPin4      = 4;     // Светодиод для частоты до 10Гц
const int ledPin5      = 5;     // Светодиод для частоты до 20Гц
const int ledPin6      = 6;     // Светодиод для частоты до 30Гц
const int ledPin7      = 7;     // Светодиод для частоты до 40Гц
const int ledPin8      = 8;     // Светодиод для частоты до 125Гц
const int BUTTON_UP_PIN = 10;   // Пин для кнопки "громкость+"
const int BUTTON_DOWN_PIN = 12; // Пин для кнопки " громкость-"
      int volume = 0; // громкость при включении металоискателя

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

void setup() {

  //Подсказка от Ken  
  TCCR1B = 0x18;
  TCCR1A = 0x82;
  ICR1 = 16000;// Частота
  OCR1A = 250;//Ширина импульса
  TCNT1=0x0;
  pinMode(9, OUTPUT);
  TCCR1B |= 2;
  
  // Настройка режимов пинов скетча
  pinMode(ledPin4,      OUTPUT);
  pinMode(ledPin5,      OUTPUT);
  pinMode(ledPin6,      OUTPUT);
  pinMode(ledPin7,      OUTPUT);
  pinMode(ledPin8,      OUTPUT);
  pinMode(SPEAKER_PIN,  OUTPUT);
  pinMode(COIL_PIN,     OUTPUT);
  pinMode(frequencyPin,  INPUT);
  pinMode(BUTTON_UP_PIN, INPUT_PULLUP);   // Использую внутренний подтягивающий резистор
  pinMode(BUTTON_DOWN_PIN, INPUT_PULLUP); // Использую внутренний подтягивающий резистор

  // Тест световой и звуковой при включении металоискателя
  digitalWrite(ledPin4, HIGH);tone(SPEAKER_PIN, 300);
  delay(100);
  digitalWrite(ledPin4, LOW);
  digitalWrite(ledPin5, HIGH);tone(SPEAKER_PIN, 310);
  delay(100);
  digitalWrite(ledPin5, LOW);
  digitalWrite(ledPin6, HIGH);tone(SPEAKER_PIN, 320);
  delay(100);
  digitalWrite(ledPin6, LOW);
  digitalWrite(ledPin7, HIGH);tone(SPEAKER_PIN, 330);
  delay(100);
  digitalWrite(ledPin7, LOW);
  digitalWrite(ledPin8, HIGH);tone(SPEAKER_PIN, 340);
  delay(100);
  digitalWrite(ledPin8, LOW);
  
  // Генерация звука 500 Гц в динамике в течение <1 секунды
  tone(SPEAKER_PIN, 500,100);
  // Жду окончания тона
  delay(100);

// Прерывание при изменении состояния на пине frequencyPin
  attachInterrupt(digitalPinToInterrupt(frequencyPin), countPulse, RISING);

  Serial.begin(9600);
}

  void loop() {

  analogWrite(SPEAKER_PIN, volume);// Устанавливаю громкость на динамике
    
  // проверяю кнопку громкость+
  if (digitalRead(BUTTON_UP_PIN) == LOW) {
    if (volume < 255) {   // запрещаю громкость более 255
      volume += 10; // Увеличиваю громкость на 10
      if (volume > 255) volume = 255; // максимальная громкость
      delay(200);
    }
  }
  // проверяю кнопку громкость-
  if (digitalRead(BUTTON_DOWN_PIN) == LOW) {
    if (volume > 0) { // запрещаю громкость мение 0
      volume -= 10; // Уменьшаю громкость на 10
      if (volume < 0) volume = 0; // минимальная громкость
      delay(200);
    }
  }

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

  // Сброс счетчика на новый замер
  pulseCount = 0;
  
  //вывожу информацию на монитор порта
  Serial.print("Частота: ");
  Serial.println(frequency);
  Serial.print("Громкость: ");
  Serial.println(volume);

// Включение светодиодов в зависимости от частоты
  if (frequency >= 1 && frequency <= 10) {
  digitalWrite(ledPin4, HIGH);
  tone(SPEAKER_PIN, 300);
} else {
  digitalWrite(ledPin4, LOW);
  noTone(SPEAKER_PIN);
}
  if (frequency > 10 && frequency <= 20) {
  digitalWrite(ledPin5, HIGH);
  tone(SPEAKER_PIN, 305);
} else {
  digitalWrite(ledPin5, LOW);
}
  if (frequency > 20 && frequency <= 30) {
  digitalWrite(ledPin6, HIGH);
  tone(SPEAKER_PIN, 310);
} else {
  digitalWrite(ledPin6, LOW);
}
  if (frequency > 30 && frequency <= 40) {
  digitalWrite(ledPin7, HIGH);
  tone(SPEAKER_PIN, 315);
} else {
  digitalWrite(ledPin7, LOW);
}
  if (frequency > 40 && frequency <= 125) {
  digitalWrite(ledPin8, HIGH);
  tone(SPEAKER_PIN, 500);
} else {
  digitalWrite(ledPin8, LOW);
}
  
  }
  
  
// Тут я прерываю для подсчета импульсов
void countPulse() {
  pulseCount++;

  }
(02-09-2025, 22:59)KEN : частоту
Я наверное с конца начал делать, вот и путаюсь...возможно мне надо, первое что это сделать на пин А0 входящий сигнал,на катушку подать...ну 200Гц например и простенький тест- скетч напишу и на мониторе посмотреть интервал,треш,период...понаблюдать за изменением показаний с катушки и что творится в мониторе. А потом уже  дальше, свои хотелки делать.
Этим и займусь вечером.
// Задерживаю на 1 сек и замеряю частоту сигнала
  pulseCount = 0;
  delay(1000);
  unsigned long frequency = pulseCount; // Частота в герцах
bulat, Я макетку пока разобрал,хочу с A0 поиграться. Чуть попозже опять соберу и попробую обнулиться в другом месте.Спасибо.
Не совсем пойму что у вас должно получится в итоге...
bulat, Планировал с тл072 снять сигнал, сделать регулировку "чувствительность" или "амплитуда" двумя кнопками и по частоте сделать (по первому щелчку)озвучку и led.
С пина 9 планировал взять сигнал 125Гц 125 микросекунд и отказаться от таймера 555.
Ну а с IRF уже как в Пирате....диоды,TL .....и считывать на пине 2.
....
Сейчас переиграл, по другому сделаю.