Скетч барахлит...

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Доброго всем времени суток. Толи скетч барахлит, толи я. Вобщем суть такая: если порог громкости на микрафоне выше допустимого больше 2 сек., то должен сработать сервопривод, повернувшись на 90 гр.. Если после этого нажать кнопку, то сервопривод вернется в исходное положение. Но первого действия не происходит, а второе выглядит так: нажал кнопку серв поворачивается на 180 гр. и возвращается обратно.

Mestniy96
Offline
Зарегистрирован: 31.08.2015
#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'...
  } 
 }

 

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Так и понять не могу, что не так в коде!

keefa
Offline
Зарегистрирован: 19.06.2015

Mestniy96 пишет:

Так и понять не могу, что не так в коде!

А почему кнопка проинициализирована как выход? Строка 16

Mestniy96
Offline
Зарегистрирован: 31.08.2015

А должна быть как вход? Сорри за тупой вопрос! 

А если я поменяю на вход, то значение HIGH мне нужно будет менять на LOW?

keefa
Offline
Зарегистрирован: 19.06.2015

Mestniy96 пишет:

А должна быть как вход? Сорри за тупой вопрос!

Да, как вход. Либо вообще удалить эту строку. Входа можно не инициализировать

keefa
Offline
Зарегистрирован: 19.06.2015

Зависит от того, к плюсу или к минусу у тебя подключена кнопка вторым концом. Если к плюсу, то оставить

Mestniy96
Offline
Зарегистрирован: 31.08.2015

У меня кнопка идет одним концом черзе резистр на землю и к 3 пину. А обратная сторона кнопки идет на питание. Получается мне оставитьнадо! 

И еще вопрос, а с кодом датчика шума, все впорядке?

keefa
Offline
Зарегистрирован: 19.06.2015

Нет не в порядке. У тебя карент тайм всегда будет равен миллис, пока уровень звука приввшает пороговое значение. И ничего отсчитывать не будет.

nevkon
Offline
Зарегистрирован: 20.01.2015

1. Комментарии не соответствуют логике. По программе серва должна повернуться если с момента включения прошло более 2 секунд при достаточном пороге шума. Выведите в сериал то что получаете на переменных.

2. AnalogRead вызывается слишком часто.

3. Как подключена кнопка? Подтяжка к чему-либо присутствует? От этого будет зависеть HIGH или LOW.

4. Нет антидребезга, но при такой малой задаче несущественно.

Araris
Offline
Зарегистрирован: 09.11.2012

Еще пoдсказка: значение переменной loopTime внутри loop() нигде не нзменяется.

Mestniy96
Offline
Зарегистрирован: 31.08.2015

А как тогда отсчитать время именно с того момента, когда порог привысит свое значение?

nevkon
Offline
Зарегистрирован: 20.01.2015

Почитайте тему "как мигать светодиодом без делай". Принцип будет тот же.

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Я прочитал эту тему но там светодиод будет включатся в любом случае после заданных сек., после запуска программы. А мне нужно, что-бы оно начало отсчет, с того момента, как порог громкости превышен!

keefa
Offline
Зарегистрирован: 19.06.2015

попробуй 

#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;
  }
}

 

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Спасибо попробую!!!

nevkon
Offline
Зарегистрирован: 20.01.2015

После 27 строки советую поставить x=0; хотя бы. А то серву замучаете. Или в 26 строке условием поставьте x=2000. Мимо не проскочит, но и не сработает несколько раз.

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Спасибо Всем. Учту!