Сообщений: 3977
Своих тем: 11
Рег.: 10-2021
Репутация:
58
KEN, Спасибо, вечером попробую. Тут оказалось сложнее, чем думал я с этим пином.
Sam, Да вроде изучил распиновку цифровых пинов. И выводил специально на пинах, согласно даташиту ардуины. Но тут дело в другом было, да и
нужны были глубокие познания, согласен с тобой. Вроде каждый день читаю книжку по 1-2 страницы и некоторые функции сложны
ещё для меня, особенно на практике. Для того форум и существует, что бы кто то подсказал.
Сообщений: 3977
Своих тем: 11
Рег.: 10-2021
Репутация:
58
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++;
}
Сообщений: 895
Своих тем: 8
Рег.: 09-2021
Репутация:
41
Возможно лучше замерять не частоту а период между импульсами, чем он меньше тем выше частота звука, это позволит озвучивать каждый импульс.
Сообщений: 3977
Своих тем: 11
Рег.: 10-2021
Репутация:
58
KEN, 125Гц это задающая частота для работы мосфета 740.
А вот импульс я буду уже ловить после TL072 и обрабатывать. А сейчас дописываю 4 кнопки : Две на громкость и две на чувствительность.
Сегодня пробовал на энкодере, что то вообще не
понравилось...перешел на кнопки.
Сообщений: 3977
Своих тем: 11
Рег.: 10-2021
Репутация:
58
Перешел на кнопки и запутался в 2 кнопках...  Смотрю в монитор порта и как бы если не пользоваться кнопками, то все работает: и озвучка и индикация. Если начать нажимать кнопки, то в мониторе они регулируют на + и -, но перебивают мне озвучку и индикацию.
Или я не через ту функцию делаю? 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++;
}
Сообщений: 3977
Своих тем: 11
Рег.: 10-2021
Репутация:
58
(02-09-2025, 22:59)KEN : частоту Я наверное с конца начал делать, вот и путаюсь...возможно мне надо, первое что это сделать на пин А0 входящий сигнал,на катушку подать...ну 200Гц например и простенький тест- скетч напишу и на мониторе посмотреть интервал,треш,период...понаблюдать за изменением показаний с катушки и что творится в мониторе. А потом уже дальше, свои хотелки делать.
Этим и займусь вечером.
Сообщений: 219
Своих тем: 0
Рег.: 09-2021
Репутация:
5
// Задерживаю на 1 сек и замеряю частоту сигнала
pulseCount = 0;
delay(1000);
unsigned long frequency = pulseCount; // Частота в герцах
Сообщений: 3977
Своих тем: 11
Рег.: 10-2021
Репутация:
58
bulat, Я макетку пока разобрал,хочу с A0 поиграться. Чуть попозже опять соберу и попробую обнулиться в другом месте.Спасибо.
Сообщений: 219
Своих тем: 0
Рег.: 09-2021
Репутация:
5
Не совсем пойму что у вас должно получится в итоге...
Сообщений: 3977
Своих тем: 11
Рег.: 10-2021
Репутация:
58
bulat, Планировал с тл072 снять сигнал, сделать регулировку "чувствительность" или "амплитуда" двумя кнопками и по частоте сделать (по первому щелчку)озвучку и led.
С пина 9 планировал взять сигнал 125Гц 125 микросекунд и отказаться от таймера 555.
Ну а с IRF уже как в Пирате....диоды,TL .....и считывать на пине 2.
....
Сейчас переиграл, по другому сделаю.
|