Постоянно пищит зуммер.
- Войдите на сайт для отправки комментариев
Пнд, 01/05/2017 - 00:56
Есть такой скетч
#define blinPin 0
#define bloutPin 1
#define pirPin 2
#define shumPin 3
void setup() {
Serial.begin(9600); //Serial.begin скорость соединения с другими устройствами
pinMode(blinPin, INPUT);
pinMode(bloutPin, OUTPUT);
pinMode(pirPin , INPUT);
pinMode(shumPin, OUTPUT);
}
void loop() { // int = integer (Pascal)
int pirSig = digitalRead(pirPin); //digitalRead Функция считывает значение с заданного входа - HIGH или LOW.
int warOn = bloutPin;
int warOk = blinPin;
int num = 0;
digitalWrite(warOn, HIGH);
digitalWrite(shumPin, LOW);
// Провека полученного сигнала со смартфона
if ((warOk == 1) && (num ==1)) { // Если сигнал получен
num = 0;
digitalWrite(shumPin, LOW);
}
if ((warOk == 0) && (num == 1)){ //Если сигнал не получен
digitalWrite(warOn, HIGH); // digitalWrite Подает HIGH или LOW значение на цифровой вход/выход (pin).
Serial.println("1"); // Serial.println Передает данные через последовательный порт
digitalWrite(shumPin, LOW);
delay(1000);
}
//Если обнаружили движение
if ((pirSig == HIGH) && (num == 0)) {
digitalWrite(warOn, HIGH); // digitalWrite Подает HIGH или LOW значение на цифровой вход/выход (pin).
Serial.println("1"); // Serial.println Передает данные через последовательный порт
digitalWrite(shumPin, LOW);
num = 1;
delay(1000);
}
}
В краткости есть пир датчик в случае его срабатывания должен начать пищать зуммер. А он почему то пищит остоянно. ХЗ может подключил не так на нём нет распиновки. Может кто знает как его подключать(лично я подключил так же как и аналоги). Или киньте точно рабочий скетч дапустим 2 секундымолчит2 орёт.
в случае его срабатывания должен начать пищать зуммер.
Не должен!
У Вас на shumPin подаётся только LOW и никогда не подаётся HIGH. Так с чего Вашему зуммеру менять состояние? Либо он должен всегда молчать, либо всегда пищать.
О дальнейшем - я вчера Вам сказал, давайте ссылку на Ваш модуль пищалки и схему/фото, так давайте же. Посмотрим, разберёмся. Зачем Вы завели новую тему, думаете что-то изменится.
Ну вот скетч, при каждой фиксации движения издаёт краткий писк
int calibrationTime = 10; int inputPin = 2; // choose the input pin (for PIR sensor) int pirState = LOW; // we start, assuming no motion detected int tonePin = 11; const long intervalBlink = 500; int ledPin = 13; // choose the pin for the LED unsigned long previousMillis = 0; // will store last time LED was updated int ledState = LOW; //the time when the sensor outputs a low impulse long unsigned int lowIn; //the amount of milliseconds the sensor has to be low //before we assume all motion has stopped long unsigned int pause = 5000; boolean lockLow = true; boolean takeLowTime; void setup() { pinMode(ledPin, OUTPUT); // declare LED as output pinMode(inputPin, INPUT); // declare sensor as input Serial.begin(9600); digitalWrite(inputPin, LOW); //give the sensor some time to calibrate Serial.print("calibrating sensor "); for (int i = 0; i < calibrationTime; i++) { Serial.print("."); delay(1000); } Serial.println(" done"); Serial.println("SENSOR ACTIVE"); delay(50); } void loop() { if (digitalRead(inputPin) == HIGH) { // digitalWrite(ledPin, HIGH); if (lockLow) { //makes sure we wait for a transition to LOW before any further output is made: lockLow = false; Serial.println("---"); Serial.print("motion detected at "); Serial.print(millis() / 1000); Serial.println(" sec"); tone(tonePin, 2000, 100); delay(50); } takeLowTime = true; } if (digitalRead(inputPin) == LOW) { digitalWrite(ledPin, LOW); if (takeLowTime) { lowIn = millis(); //save the time of the transition from high to LOW takeLowTime = false; //make sure this is only done at the start of a LOW phase } //if the sensor is low for more than the given pause, //we assume that no more motion is going to happen if (!lockLow && millis() - lowIn > pause) { //makes sure this block of code is only executed again after //a new motion sequence has been detected lockLow = true; Serial.print("motion ended at "); //output Serial.print((millis() - pause) / 1000); Serial.println(" sec"); delay(50); } } }в случае его срабатывания должен начать пищать зуммер.
Не должен!
У Вас на shumPin подаётся только LOW и никогда не подаётся HIGH. Так с чего Вашему зуммеру менять состояние? Либо он должен всегда молчать, либо всегда пищать.
О дальнейшем - я вчера Вам сказал, давайте ссылку на Ваш модуль пищалки и схему/фото, так давайте же. Посмотрим, разберёмся. Зачем Вы завели новую тему, думаете что-то изменится.
Старую темя я не нашёл. Подумал её делитнули.
Модуль купил в интерент магазине. Распиновки там нет.
Пишит он не смотря на то что подаётся LOW
Ну вот скетч, при каждой фиксации движения издаёт краткий писк
int calibrationTime = 10; int inputPin = 2; // choose the input pin (for PIR sensor) int pirState = LOW; // we start, assuming no motion detected int tonePin = 11; const long intervalBlink = 500; int ledPin = 13; // choose the pin for the LED unsigned long previousMillis = 0; // will store last time LED was updated int ledState = LOW; //the time when the sensor outputs a low impulse long unsigned int lowIn; //the amount of milliseconds the sensor has to be low //before we assume all motion has stopped long unsigned int pause = 5000; boolean lockLow = true; boolean takeLowTime; void setup() { pinMode(ledPin, OUTPUT); // declare LED as output pinMode(inputPin, INPUT); // declare sensor as input Serial.begin(9600); digitalWrite(inputPin, LOW); //give the sensor some time to calibrate Serial.print("calibrating sensor "); for (int i = 0; i < calibrationTime; i++) { Serial.print("."); delay(1000); } Serial.println(" done"); Serial.println("SENSOR ACTIVE"); delay(50); } void loop() { if (digitalRead(inputPin) == HIGH) { // digitalWrite(ledPin, HIGH); if (lockLow) { //makes sure we wait for a transition to LOW before any further output is made: lockLow = false; Serial.println("---"); Serial.print("motion detected at "); Serial.print(millis() / 1000); Serial.println(" sec"); tone(tonePin, 2000, 100); delay(50); } takeLowTime = true; } if (digitalRead(inputPin) == LOW) { digitalWrite(ledPin, LOW); if (takeLowTime) { lowIn = millis(); //save the time of the transition from high to LOW takeLowTime = false; //make sure this is only done at the start of a LOW phase } //if the sensor is low for more than the given pause, //we assume that no more motion is going to happen if (!lockLow && millis() - lowIn > pause) { //makes sure this block of code is only executed again after //a new motion sequence has been detected lockLow = true; Serial.print("motion ended at "); //output Serial.print((millis() - pause) / 1000); Serial.println(" sec"); delay(50); } } }Спасибо. Но я ничего не понял.
http://brainid.ru/product/active-buzzer-module/
Это ссылка на модуль
Может кто знает как его подключать.
Попробуйте минус к земле, "S" - к пину, средний не подключать.
Источник : http://arduinomodules.info/ky-012-active-buzzer-module/
Может кто знает как его подключать.
Попробуйте минус к земле, "S" - к пину, средний не подключать.
Источник : http://arduinomodules.info/ky-012-active-buzzer-module/
на сколько я понимаю, s надо подключать к пину, который поддерживает шим
Вы же писали, что зуммер активный? Если так, то не надо.
Ок понял попробую
Вот здесь написано как подключать и пример скетча есть - https://tkkrlab.nl/wiki/Arduino_KY-012_Active_buzzer_module
Неужели Вы и впрямь покупали его за 60 рублей?
Их ведь (12 мм активных зуммеров) навалом по 7, а если 100шт., то и по 5 с копейками?
Так, в итоге подлкючить получилось.
Проблема теперь в следующем. Нужно что бы зуммер после первого писка пищал постоянно до тех пор пока не придут сигнал, а он пишит только несколько раз. Вот скетч.
#define blinPin 0 #define bloutPin 1 #define pirPin 2 int tonePin = 10; void setup() { Serial.begin(9600); //Serial.begin скорость соединения с другими устройствами pinMode(blinPin, INPUT); pinMode(bloutPin, OUTPUT); pinMode(pirPin , INPUT); pinMode (tonePin, OUTPUT); } void midi() { tone(tonePin, 1318, 51.1363125); delay(56.818125); delay(56.818125); tone(tonePin, 1567, 51.1363125); delay(56.818125); delay(56.818125); tone(tonePin, 2637, 51.1363125); delay(56.818125); delay(56.818125); tone(tonePin, 2093, 51.1363125); delay(56.818125); delay(56.818125); tone(tonePin, 2349, 51.1363125); delay(56.818125); delay(56.818125); tone(tonePin, 3135, 511.363125); delay(568.18125); } void loop() { // int = integer (Pascal) int pirSig = digitalRead(pirPin); //digitalRead Функция считывает значение с заданного входа - HIGH или LOW. int warOn = bloutPin; int warOk = blinPin; int num = 0; digitalWrite(warOn, HIGH); // Провека полученного сигнала со смартфона if ((warOk == 1) && (num ==1)) { // Если сигнал получен num = 0; analogWrite (tonePin,LOW); } if ((warOk == 0) && (num == 1)){ //Если сигнал не получен digitalWrite(warOn, HIGH); // digitalWrite Подает HIGH или LOW значение на цифровой вход/выход (pin). Serial.println("1"); // Serial.println Передает данные через последовательный порт analogWrite (tonePin, HIGH); midi(); delay(100); } //Если обнаружили движение if ((pirSig == HIGH) && (num == 0)) { digitalWrite(warOn, HIGH); // digitalWrite Подает HIGH или LOW значение на цифровой вход/выход (pin). Serial.println("1"); // Serial.println Передает данные через последовательный порт analogWrite (tonePin, HIGH); midi(); num = 1; delay(100); } if ((pirSig == LOW) && (num == 1)) { midi(); delay(100); } }Евгений можете объяснить,?
Вот здесь написано как подключать и пример скетча есть - https://tkkrlab.nl/wiki/Arduino_KY-012_Active_buzzer_module
Неужели Вы и впрямь покупали его за 60 рублей?
Их ведь (12 мм активных зуммеров) навалом по 7, а если 100шт., то и по 5 с копейками?
Помогите пожалуйста !!!!!
Нет, не могу.
Представьте себе, что Вы вообще ничего не знаете о своём замысле и идее этой программы. Вы бы поняли своё описание
Нужно что бы зуммер после первого писка пищал постоянно до тех пор пока не придут сигнал, а он пишит только несколько раз.
Во и я не понял.
Напишите только что именно Вы хотели сделать и распишите про каждое действие, в каких строках оно у Вас делается. Тогда, возможно, станет понятен общий замысел и будет возможно найти неполадку.
Нет, не могу.
Представьте себе, что Вы вообще ничего не знаете о своём замысле и идее этой программы. Вы бы поняли своё описание
Нужно что бы зуммер после первого писка пищал постоянно до тех пор пока не придут сигнал, а он пишит только несколько раз.
Во и я не понял.
Напишите только что именно Вы хотели сделать и распишите про каждое действие, в каких строках оно у Вас делается. Тогда, возможно, станет понятен общий замысел и будет возможно найти неполадку.
#define blinPin 0 // RX порт #define bloutPin 1 // TX порт #define pirPin 2 // PIR датчик int tonePin = 10; // зуммер void setup() { Serial.begin(9600); //Serial.begin скорость соединения с другими устройствами pinMode(blinPin, INPUT); pinMode(bloutPin, OUTPUT); pinMode(pirPin , INPUT); pinMode (tonePin, OUTPUT); } void midi() { // мелодия которая играет во время тревоги tone(tonePin, 1318, 51.1363125); delay(56.818125); delay(56.818125); tone(tonePin, 1567, 51.1363125); delay(56.818125); delay(56.818125); tone(tonePin, 2637, 51.1363125); delay(56.818125); delay(56.818125); tone(tonePin, 2093, 51.1363125); delay(56.818125); delay(56.818125); tone(tonePin, 2349, 51.1363125); delay(56.818125); delay(56.818125); tone(tonePin, 3135, 511.363125); delay(568.18125); } void loop() { // int = integer (Pascal) int pirSig = digitalRead(pirPin); //digitalRead Функция считывает значение с заданного входа - HIGH или LOW. int warOn = bloutPin; int warOk = blinPin; int num = 0; digitalWrite(warOn, HIGH); analogWrite (tonePin, LOW); // всё что выше думаюпонятно //Если обнаружили движение if ((pirSig == HIGH) && (num == 0)) { // здесь если PIR датчик сработал и некая переменная равна 0 она нужны для седующих действий, то просисходит то что описанно ниже digitalWrite(warOn, HIGH); // digitalWrite Подает HIGH или LOW значение на цифровой вход/выход (pin).// подача тока на выход Serial.println("1"); // Serial.println Передает данные через последовательный порт // отправка на выход сверху значение 1 analogWrite (tonePin, HIGH); // подача сигнала на зуммер midi(); // проигрыш мелодии num = 1; //присваивание переменной значение 1 delay(50);} if ((pirSig == LOW) && (num == 1)) { // если PIR не даёт сигнал и переменная равна 1 то играет мелодия midi();// та самая мелодия delay(50);} if ((warOk == 0) && (num == 1)){ //Если сигнал не получен // если сигнал с входа от блютуза не получен то идёт повоторение 1 цикла digitalWrite(warOn, HIGH); // digitalWrite Подает HIGH или LOW значение на цифровой вход/выход (pin). Serial.println("1"); // Serial.println Передает данные через последовательный порт analogWrite (tonePin, HIGH); midi(); delay(50);} if ((warOk == 1) && (num ==1)) { // Если сигнал получен // если по входу получен сигнал 1 от блютуз модуля то музыка перестаёт игратью num = 0; analogWrite (tonePin,LOW); delay(50);} }так мне надо что бы если срабатывает pir датчик то начинает играть мелодия без остановки и по выходу отправляет 1 на телефон который подключён к блютуз до тех пор пока по блютуз входу не приходит ноль, как только сигнал приходит программа начинает работать заново. Пока вроде всё работает кроме того что музыка играет только 3 раза а нужно что бы играла до момента получения сигнала
Что значит "без остановки и по выходу". Играет до конца, отправляет 1 и начинает играть сначала? Так?
Значит,то что мелодия будетиграть до тех пор пока на arduino по блютузвходу непридёёт сигнал 1
Вы не поняли вопроса. Как она будет "играть до тех пор". Проигрываться до конца и начинаться сначала? Что делать, если 1 пришла посередине мелодии? Доигрывать до конца или прерывать в том месте, где пришла 1?
Да, уж!
Вот зачем Вы пишете комментариии типа "digitalWrite Подает HIGH или LOW значение на цифровой вход"? Виесто того, чтобы описывать логику Вышей программы. Эти совершенно ненужные комментарии у Вас есть, а вот собственно логика не описана свосем.
Хорошо, давайте я сам прокомментирую Ваш текст. Мои комментарии либо в строках, либо (если длинные), то под строками. Читайте внимательно и переделывайте. Кстати, в выражениях я стеснялся - обидетесь, дело Ваше - хотите учитьтся - учитесь, хотите поиграть в обидчивую гимназистку - вперёд!
#define blinPin 0 // RX порт #define bloutPin 1 // TX порт #define pirPin 2 // PIR датчик int tonePin = 10; // зуммер // НЕ очень ясно почему все остальные пины сделаны через define, // а tonePin через глобальную переменную. Так делают, если хотят // менять пин во время выполнения, но Вы же его не меняете! void setup() { Serial.begin(9600); pinMode(blinPin, INPUT); // НАФИГА? Раз уж Вы запустили Serial, этим пином управляет UART - не трогайте его вообще pinMode(bloutPin, OUTPUT); // НАФИГА? Раз уж Вы запустили Serial, этим пином управляет UART - не трогайте его вообще pinMode(pirPin , INPUT); pinMode (tonePin, OUTPUT); } void midi() { // мелодия которая играет во время тревоги tone(tonePin, 1318, 51.1363125); // третий параьтр tone - целое число. ".1363125" будет просто отброшено. // И даже если бы дробная часть не отбрасывалась, Вы уверены, что Вам // нужно указывать задержку в пикосекундах? Выбрасывайте ".1363125" - её // всё равно компилятор выбросит delay(56.818125); // Тоже самое, что выше - дробная часть будет отброшена. А даже если бы и не была // зачем указывать длительность в наносекундах? delay(56.818125); // Тоже про дробную часть tone(tonePin, 1567, 51.1363125); // Тоже про дробнуй часть delay(56.818125); // Тоже про дробную часть delay(56.818125); // Тоже про дробную часть tone(tonePin, 2637, 51.1363125); // Тоже про дробнуй часть delay(56.818125); // Тоже про дробную часть delay(56.818125); // Тоже про дробную часть tone(tonePin, 2093, 51.1363125); // Тоже про дробную часть delay(56.818125); // Тоже про дробную часть delay(56.818125); // Тоже про дробную часть tone(tonePin, 2349, 51.1363125); // Тоже про дробную часть delay(56.818125); // Тоже про дробную часть delay(56.818125); // Тоже про дробную часть tone(tonePin, 3135, 511.363125); // Тоже про дробную часть delay(568.18125); // Тоже про дробную часть } void loop() { // int = integer (Pascal) int pirSig = digitalRead(pirPin); //digitalRead Функция считывает значение с заданного входа - HIGH или LOW. int warOn = bloutPin; int warOk = blinPin; int num = 0; digitalWrite(warOn, HIGH); // НАФИГА? Раз уж Вы запустили Serial, этим пином управляет UART - не трогайте его вообще analogWrite (tonePin, LOW); // всё что выше думаюпонятно // // Напрасно думаете. Нихрена непонятно. Чем писать бессмысленный комментарий о том, // что делает digitalRead лучше бы Вы объяснили нахрена Вы присваиваете переменным // номера пинов. Чем не устроили макросы? Нафига пихаете HIGH в TX пин? Считаете, // что Serial сам не разберётся, что туда пихать? //Если обнаружили движение if ((pirSig == HIGH) && (num == 0)) { // здесь если PIR датчик сработал и некая переменная равна 0 она нужны для седующих действий, то просисходит то что описанно ниже digitalWrite(warOn, HIGH); // digitalWrite Подает HIGH или LOW значение на цифровой вход/выход (pin).// подача тока на выход // Первая часть комментария выше бессмысленна. Вторая часть бредова - подача какого нахрен тока на какой нахрен выход? // Для чего? Еще раз - этим пином управляет UART не трогайте Вы его грязными руками! Serial.println("1"); // Serial.println Передает данные через последовательный порт // отправка на выход сверху значение 1 analogWrite (tonePin, HIGH); // подача сигнала на зуммер // Какого нахрен сигнала? Нафига? Буквально в следующей строчке Вы вызываете функцию, которая на этот же самый пин // выдаёт tone - она затрёт этот Ваш ШИМ как бык овцу. Эта строка не несёт никакой смысловой нагрузки midi(); // проигрыш мелодии num = 1; //присваивание переменной значение 1 delay(50); } if ((pirSig == LOW) && (num == 1)) { // если PIR не даёт сигнал и переменная равна 1 то играет мелодия midi();// та самая мелодия delay(50); } if ((warOk == 0) && (num == 1)) { //Если сигнал не получен // если сигнал с входа от блютуза не получен то идёт повоторение 1 цикла // Какой нахрен сигнал? warOk получает значение в строке 44 и нигде // больше не меняется - она всегда равна 0. Так нахрена её с нулём сравнивать? digitalWrite(warOn, HIGH); // digitalWrite Подает HIGH или LOW значение на цифровой вход/выход (pin). // Комментария не имеет смысла. А само действие - блин - для чего? Еще раз - этим пином // управляет UART не трогайте Вы его грязными руками! Serial.println("1"); // Serial.println Передает данные через последовательный порт analogWrite (tonePin, HIGH); // Нафига? Буквально в следующей строчке Вы вызываете функцию, которая на этот же самый пин // выдаёт tone - она затрёт этот Ваш ШИМ как бык овцу. Эта строка не несёт никакой смысловой нагрузки midi(); delay(50); } if ((warOk == 1) && (num == 1)) { // Если сигнал получен // если по входу получен сигнал 1 от блютуз модуля то музыка перестаёт игратью // Какой нахрен сигнал? warOk получает значение в строке 44 и нигде // больше не меняется - она ВСЕГДА равна 0. Так нахрена её с единицей сравнивать? // Это условие не выполнится никогда (ну, разве что 0 станет равным 1). num = 0; analogWrite (tonePin, LOW); // Нафига? delay(50); } }так. Я сразу писал что плохо в этом разбираюсь, поэтому соединял несколько кодов в один , поэтому такая штука получилась. Если мелодия играет и проиходит единица то она заканчивается сразу. Задумка идёт на то , что с андроида приходит сигнал в иде цывры один как задать его я не знаю. поэтому warOk и warOn. Вообщем таки всё.
Ну, понимаете, Вы подходите не с той стороны. Вы пытаетесь писать не программу не уяснив до конца логику работы. Так не получится. Начните с того, что напишите словами что Вы делаете. Только именно что Вы делаете, а не глупости вроде "вывожу ток". Словами - в терминах задачи. Чётко по шагам. Пройтиде по записи прямо пальцем и убедитесь, что логика написана правильно. А потом, под этими комментариями просто впишите адекватные коды. Вы же пытаетесь сразу коды писать не понимаю толком что они делают. Например, Вот Вы пишете, что "мелодия заканчивается сразу" а между тем в функции проигрывания мелодии у Вас даже попытки нет узнать пришло ли что-нибудь - она у Вас заточена на тупое проигрывание от начала до конца.