Датчик звука, хлопаем в ладоши.
- Войдите на сайт для отправки комментариев
Чт, 11/04/2013 - 22:09
Преобрел такой датчик звука:

Написал простенький код к нему
void loop(){
val = digitalRead(inputPin); // read input value
if (val == HIGH) { // check if the input is HIGH
if (pirState == LOW) {
// we have just turned on
Serial.println("Motion detected!");
// We only want to print on the output change, not state
pirState = HIGH;
}
}
Когда хлопаем в лодоши появляется надпись Motion detected.
Помогите пожалуйста доработать код. Необходимо хлопнуть 2 раза (второй раз через 1-2 секунды) и только тогда должен появится текст.
при обнаружении хлопка добавить чтение millis() - время с момента запуска ардуины. если разница между 2 значениями millis меньше заданной, к примеру 300 мс, то вывести Motion detected
Спасибо за идею, понял, заработало.
У меня в голове были более сложные схемы. Не думал что все так просто. :)
Все таки не осилю сам. Помогите:
SOUNDval = digitalRead(SOUNDinputPin); // read input value if (SOUNDval == HIGH) { // check if the input is HIGH if (SOUNDState == LOW) { // Этот кусок срабатывает когда датчик определил что что-то шумит //далее у нас условие c которым и проблемы, что я тут не так делаю? // когда я хлопаю в ладоши реле зацикливается, быстро включается и выключается. if (SOUNDTime < millis() && SOUNDTime+500>millis() && SOUNDTime+1500<millis()) { digitalWrite(led2, HIGH); } else { digitalWrite(led2, LOW); } SOUNDTime=millis(); SOUNDState = HIGH; } } else { if (SOUNDState == HIGH){ //Этот кусок срабатывает когда тишена. SOUNDState = LOW; } }можно полный кусок loop?
И в чем разница между SoundVal - (состояние датчика?) и SoundState?
И в примерах есть ли хоть какой-то delay() на прослушке, или loop мотается без остановки вообще?
попробуй так:
long soundTime=0; // время 1-го хлопка loop() { Soundval=digitalRead(SoundinputPin); if(SOUNDval==HIGH) { if(firstSound==false) { // регистрируем первый хлопок, запоминаем его время soundTime=millis(); firstSound=true; } else { // проверяем время второго хлопка long secondSoundTime=millis(); // лучше измерить один раз для if if((millis>soundTime) && ((secondSoundTime-soundTime)>500) && ((secondSoundTime-soundTime)<1500)) { firstSound=false; // первая проверка - не обнулились ли millis() // слышали второй хлопок // выводим надпись, мигаем диодами и т.д. } else { // если пауза была большой, то считаем второй хлопок опять как первый firstSound=true; soundTime=millis(); } } } }Спасибо, большое за условие, все получилось. Сначало попробовал полность ваш код, откомпелировал, загрузил. Но он почему-то не заработал. Потом ваше условие вставил в свой код и все заработало как нужно. Как и просили выкладываю весь код:
По поводу SoundVal и SoundState, знаете я не знаю. Если нету SoundState происходит зацикливание.
long soundTime=0; // время 1-го хлопка int soundinputPin = 3; // choose the input pin (for PIR sensor) int soundState = LOW; // we start, assuming no motion detected int soundval = 0; // variable for reading the pin status void setup() { pinMode(soundinputPin, INPUT); // declare sensor as input Serial.begin(9600); } void loop(){ soundval = digitalRead(soundinputPin); // read input value if (soundval == HIGH) { // check if the input is HIGH if (soundState == LOW) { // we have just turned on long secondSoundTime=millis(); // лучше измерить один раз для if if((millis()>soundTime) && ((secondSoundTime-soundTime)>500) && ((secondSoundTime-soundTime)<1500)) { Serial.println("Motion detected!"); } soundTime=millis(); // We only want to print on the output change, not state soundState = HIGH; } } else { if (soundState == HIGH){ // we have just turned of Serial.println("Motion ended!"); // We only want to print on the output change, not state soundState = LOW; } } }if((millis()>soundTime) && ((secondSoundTime-soundTime)>500) && ((secondSoundTime-soundTime)<1500)) здесь в первом условии тоже лучше бы поставить secondSoundTime, а не millis. ведь в эту переменную мы и сохранили время. а вообще такой loop мне кажется странным. он должен бегать по кругу в ожидании звуков? неужели у Вашего датчика нет прерывания на звуки?
управление хлопком в ладоши (инфракрасным) ИК сигналом
Clap Switch, management claps infrared IR signal
Version 0.1 2013/06/12
Перед тем как начать управление хлопками, нужно ввести звуковой логин и звуковой пароль.
Для защиты от случайного срабатывания - посторонних шумов
1. Вводим звуковой логин в моем примере это три хлопка
Если логин введен правильно Загорается желтый светодиод у нас есть три секунды для ввода звукового пароля
2. Вводим звуковой пароль, в моем примере это два хлопка, если звуковой пароль введен правильно загорается зеленый светодиод, у нас есть пять секунд Для ввода звуковой команды
3. Например хлопаем два раза у нас включается второй pin на ардуино,
или отправляется (инфракрасный) ИК сигнал на телевизор включая второй телеканал.
Нужно заранее прописать в sketch, код кнопки пульта от вашего телевизора