Скетч барахлит...
- Войдите на сайт для отправки комментариев
Пнд, 19/10/2015 - 06:10
Доброго всем времени суток. Толи скетч барахлит, толи я. Вобщем суть такая: если порог громкости на микрафоне выше допустимого больше 2 сек., то должен сработать сервопривод, повернувшись на 90 гр.. Если после этого нажать кнопку, то сервопривод вернется в исходное положение. Но первого действия не происходит, а второе выглядит так: нажал кнопку серв поворачивается на 180 гр. и возвращается обратно.
#include <Servo.h>//Подключаем библиотеку для Сервопривода #define LOUDNESS_SENSOR_PIN A5 // Наш датчик шума подключим к A5 #define servoPin 9 //Устанавливаем пин для Сервопривода #define TRESHOLD 500 // Устанавливаем порог для крика(предположительно 500) #define servoMinImp 544 // Это исходное положение - 0° #define servoMaxImp 1520 // Это ваше положение - 90° Servo myservo;//Переменная для сервопривода unsigned long currentTime;//переменные для времени unsigned long loopTime; int cnopka = 3; void setup() { currentTime = millis(); // считываем время loopTime = currentTime; myservo.attach(servoPin, servoMinImp, servoMaxImp);//Устанавливаем пин для сервопривода pinMode(cnopka, OUTPUT); } void loop() { int loudness = analogRead(LOUDNESS_SENSOR_PIN); // Создаем переменную для считывания показаний с датчика шума int cnopkapin = digitalRead(cnopka);// Создаем переменную для считывания показаний с кнопки if (loudness > TRESHOLD) // Если громкость выше пороговой через 10 сек, то.. { currentTime = millis();//Начинаем отсчет времени... if (loudness > TRESHOLD && currentTime >= (loopTime + 2000)) { myservo.writeMicroseconds(servoMaxImp); // Поворачиваем сервопривод на 90' } } if (cnopkapin == HIGH)// Если нажали кнопку, то... { myservo.writeMicroseconds(servoMinImp); // Значение сервопривода возвращается в 0'... } }Так и понять не могу, что не так в коде!
Так и понять не могу, что не так в коде!
А почему кнопка проинициализирована как выход? Строка 16
А должна быть как вход? Сорри за тупой вопрос!
А если я поменяю на вход, то значение HIGH мне нужно будет менять на LOW?
А должна быть как вход? Сорри за тупой вопрос!
Да, как вход. Либо вообще удалить эту строку. Входа можно не инициализировать
Зависит от того, к плюсу или к минусу у тебя подключена кнопка вторым концом. Если к плюсу, то оставить
У меня кнопка идет одним концом черзе резистр на землю и к 3 пину. А обратная сторона кнопки идет на питание. Получается мне оставитьнадо!
И еще вопрос, а с кодом датчика шума, все впорядке?
Нет не в порядке. У тебя карент тайм всегда будет равен миллис, пока уровень звука приввшает пороговое значение. И ничего отсчитывать не будет.
1. Комментарии не соответствуют логике. По программе серва должна повернуться если с момента включения прошло более 2 секунд при достаточном пороге шума. Выведите в сериал то что получаете на переменных.
2. AnalogRead вызывается слишком часто.
3. Как подключена кнопка? Подтяжка к чему-либо присутствует? От этого будет зависеть HIGH или LOW.
4. Нет антидребезга, но при такой малой задаче несущественно.
Еще пoдсказка: значение переменной loopTime внутри loop() нигде не нзменяется.
А как тогда отсчитать время именно с того момента, когда порог привысит свое значение?
Почитайте тему "как мигать светодиодом без делай". Принцип будет тот же.
Я прочитал эту тему но там светодиод будет включатся в любом случае после заданных сек., после запуска программы. А мне нужно, что-бы оно начало отсчет, с того момента, как порог громкости превышен!
попробуй
#include <Servo.h>//Подключаем библиотеку для Сервопривода #define LOUDNESS_SENSOR_PIN A5 // Наш датчик шума подключим к A5 #define servoPin 9 //Устанавливаем пин для Сервопривода #define TRESHOLD 500 // Устанавливаем порог для крика(предположительно 500) #define servoMinImp 544 // Это исходное положение - 0° #define servoMaxImp 1520 // Это ваше положение - 90° Servo myservo;//Переменная для сервопривода unsigned long currentTime;//переменные для времени unsigned long loopTime; int cnopka = 3; int x = 0; void setup() { currentTime = millis(); // считываем время loopTime = currentTime; myservo.attach(servoPin, servoMinImp, servoMaxImp);//Устанавливаем пин для сервопривода } void loop() { int loudness = analogRead(LOUDNESS_SENSOR_PIN); // Создаем переменную для считывания показаний с датчика шума int cnopkapin = digitalRead(cnopka);// Создаем переменную для считывания показаний с кнопки if (millis() - currentTime >= 1) { if (loudness > TRESHOLD) { // Если громкость выше пороговой через 10 сек, то.. x++; if (x >= 2000) { myservo.writeMicroseconds(servoMaxImp); // Поворачиваем сервопривод на 90' } } else x = 0; currentTime = millis(); } if (cnopkapin == HIGH) { // Если нажали кнопку, то... myservo.writeMicroseconds(servoMinImp); // Значение сервопривода возвращается в 0'... x = 0; } }Спасибо попробую!!!
После 27 строки советую поставить x=0; хотя бы. А то серву замучаете. Или в 26 строке условием поставьте x=2000. Мимо не проскочит, но и не сработает несколько раз.
Спасибо Всем. Учту!