Управление светом от хлопков в ладоши.

akz
Offline
Зарегистрирован: 08.11.2011

 Задача заключается в том чтобы управлять светом от двух хлопков в ладоши.Хочу все это сделать на ардуино но испытываю трудности в написании программы.Сам новичок в программировании.Два хлопка должны включать диод, а два выключать.Вот код программы не судите строго.

void setup(){
pinMode(2,INPUT);
pinMode(13,OUTPUT);
analogReference(EXTERNAL);
}
void loop(){
label:
unsigned long time;
int var = analogRead(2);
if(var < x || var > a){  //x и a будут заменены на точные значения.
time = millis(); // начать отсчет времени.
do{
if(var < x || var > a){
digitalWrite(13,HIGH);
}
}while(time < 1000); //после получения на входе значений  ждать второе значение пока не пройдет секунда.
else if(time > 1000){
goto label;
}
if(var < x || var > a){
time = 0;
do{
if(var < x || var > a){
digitalWrite(13,LOW);
}
}while(time < 1000);
}

 

Mastino
Offline
Зарегистрирован: 03.12.2011

Попробуй так и посмотри что пишет когда хлопаешь и когда не хлопаешь:)

void setup() {
  Serial.begin(9600);
}

void loop() {
  int sensorValue = analogRead(2);
  Serial.println(sensorValue, DEC);
}

 

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011
int analogData=0; //тут будут храниться данные с АЦП пин 0
int ledstate=0; //переменная состояния вкл-выкл
void setup() {
  pinMode(13,OUTPUT);
}

void loop() {
  analogData=analogRead(0); //читаем значение

if(analogData>120){ //в моём случае аудио сенсор имеет жутко малую чувствительность и выдаёт значение до 130 из 1024 возможных

  delay(200); //ожидаем 200милисекунд для повторного хлопка - можно не делать но в моём случае это добавило удобства
  for(int t=0;t<=500;t++) //цикл на проверку второго хлопка по идее на пол секунды но ардуино делает его дольше
  {
    delay(1); //для цикла
    analogData=analogRead(0);//считываем данные
    if(analogData>120){  //сверяем данные для второго хлопка, если он был то меняем состояние лампы с вкл на выкл и наоборот
      ledstate=!ledstate; //меняем состояние
      analogData=0;//обнуляем данные
      break;//выходим из цикла после второго хлопка
      delay(200);//для удобства
    }
}
analogData=0;

}

digitalWrite(13,ledstate); //включаем выключаем светодиод на 13м пине
  
}

 

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

Мой рогатый код, заинтересовали меня, сделать сразу влёт как думал не вышло. Есть видео - работает. Главное после включения ждать секунду и можно снова 2 раза хлопать. 

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

У меня мега1280 и есть куча всяких шилдов и сенсоров, вот и решил помочь.  Итого что в моём случае это мега1280 + DFrobot audio sensor + IO Expansion Shield 

akz
Offline
Зарегистрирован: 08.11.2011

 Спасибо.Как у вас все получилось просто.

akz
Offline
Зарегистрирован: 08.11.2011

 Остается только дописать программу чтобы  также 2-ух хлопков выключался.И вопрос зачем вы в конце обнулили данные?

Цитата:

analogData=0//обнуляем данные

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

ТАк оно и включается и выключается после двух хлопков 

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

В конце можно было бы не обнулять. В ходе экспериментов пробовал разные варианты - это остатки предыдущих вариантов.

akz
Offline
Зарегистрирован: 08.11.2011

 Понятно.И еще один вопрос не по теме.Как вы так редактируете код, когда вставляете его на форум я понимаю что есть кнопка "code", но как ею пользоваться?

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

нажимаете на кнопку код и в пустом поле вставляете весь свой код и всё 

akz
Offline
Зарегистрирован: 08.11.2011
int analogData=0; //тут будут храниться данные с АЦП пин 0
int ledstate=0; //переменная состояния вкл-выкл
void setup() {
pinMode(13,OUTPUT);
analogReference(EXTERNAL);
}
void loop() {
analogData=analogRead(0); //читаем значение
if(analogData > a && analogData < x){ //x и a будут заменены на точные значения
delay(200); //ожидаем 200милисекунд для повторного хлопка - можно не делать но в моём случае это добавило удобства
for(int t=0;t<=500;t++){ //цикл на проверку второго хлопка по идее на пол секунды но ардуино делает его дольше
delay(1); //для цикла
analogData=analogRead(0);//считываем данные
if(analogData > a && analogData < x){  //сверяем данные для второго хлопка, если он был то меняем состояние лампы с вкл на выкл и наоборот
ledstate=!ledstate; //меняем состояние
break;//выходим из цикла после второго хлопка
delay(200);//для удобства
    }
}
}
digitalWrite(13,ledstate);
}
Вот законченный код.

 

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

Не прокатит.

Во первых вместо || (логического ИЛИ) должно быть логическое И. Потому что ИЛИ - Истина, если хотя бы один операнд истина - у вас получится постоянная истина на выходе проверки, потому что если хлопка нет, analogData=0 и попадает под условие analogData < x - итого истина.
 

А если поставить логическое И - Истина, если оба операнда истина (true) То получится сравнение, тоесть если analogData попадает между а и х

 

Во вторых у вас в коде нет конечного элемента, который будет управлять вкл/выкл тоесть digitalWrite(pin,ledstate)

akz
Offline
Зарегистрирован: 08.11.2011

   я хотел написать &, но перепутал с ||. 

akz
Offline
Зарегистрирован: 08.11.2011

Теперь все исправлено

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

if(ledstate == 0){
22 digitalWrite(13,LOW)
23 }
24 else if(ledstate == 1){
25 digitalWrite(13,HIGH)

Эти проверки лишние, переменная принимает значения или 0 или 1, соответственно необходимо писать лишь

digitalWrite(13,ledstate)

 

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

&& вот так правильно, а не одна & 

akz
Offline
Зарегистрирован: 08.11.2011

 Я хотел бы задать вопрос о выводе AREF.Мне не совсем понятно, как его использовать.Просто к выводу AREF  подключить напряжение например +3в и все?

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

Его можно вообще не использовать в данной задаче. 

akz
Offline
Зарегистрирован: 08.11.2011

 Все собрано.Уррраааа.Вот здесь нашел схему микрофонного усилителя : www.cxem.net/sound/soundpred/soundpred5.php

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

 >>Я хотел бы задать вопрос о выводе AREF.Мне не совсем понятно, как его использовать.Просто к выводу AREF подключить напряжение например +3в и все?<<

На ареф подается опорное напряжение АЦП , по умолчанию (когда ареф не подключен) там 5в.

АЦП сравнивает опорное напряжение с поступающим и делает соответствующие выводы.

Если вы хотите подключить к ареф 3в  то : эту функцию нужно включить программно , напруга , 

подаваемая на ареф , должна быть супер стабильной иначе получите ложные данные.

sofree
Offline
Зарегистрирован: 16.01.2012

Потратил несколько часов на написание кода.

При старте происходит автодетект уровня тишины. После определённого времени есть возможность автоматического отключения нагрузки, также с опцией мигания в конце.

Подключение по этой схеме:
upload.wikimedia.org/wikipedia/commons/4/49/Electret_condenser_microphone_schematic..svg
Полярность микрофона имеет значение!

Вообщем, попробуйте залить этот код:

 

 

unsigned int silence_val = 0; //если 0, то будет autodetect уровня тишины
unsigned int detect_delta = 10; //считается что есть звук, если значение звука различается на эту дельту относительно тишины
unsigned int detect_count = 2; //количество замеров в цикле и выборка среднего за операцию
unsigned int pin_in = 5; //аналоговый вход pin
unsigned int pin_out = 2; //упраление нагрузкой на этот pin
unsigned int silence_between = 500; //после первого срабатывание столько длится тишина
unsigned int second_detect = 2000; //после тишины столько проверяется на второе срабатывание
unsigned int pin_out_max_on1 = 5 * 1000; //msec идёт на выходной pin (0 - мониторится не будет)
unsigned int pin_out_max_on2 = 15 * 1000; //msec идёт мигание (0 - мигания не будет)
unsigned int pin_out_max_on2_skip = 50; //столько длится фаза одного мигания
unsigned int pin_led_debug = 13; //debug led

unsigned int detect1;
unsigned int detect2;
unsigned int pin_out_status = 0;
unsigned long tm = 0;
unsigned long tm_delta;
unsigned int i;
unsigned int count;
unsigned int tmp;
unsigned int silence;
unsigned int cur_val;
unsigned int cur_pin_out_max_on2_skip = 0;
unsigned int tmp_pin_out_status;

void setup()
{
  Serial.begin(9600);
  pinMode(pin_out, OUTPUT);
  pinMode(pin_led_debug, OUTPUT);
}

unsigned int analogReadCount(unsigned int pin_in, unsigned int count)
{
  unsigned int i;
  unsigned long ul;

  ul = 0;

  for(i = 0; i < count; i++)
    ul += analogRead(pin_in);

  return (ul / i);
}

void loop()
{
  //silence
  if(silence_val == 0)
  {
    silence_val = analogReadCount(pin_in, 1000);

    Serial.print("Silence val: ");
    Serial.println(silence_val);
  }
  //end
  
  while(1)
  {
    cur_val = analogReadCount(pin_in, detect_count);

    if((cur_val + detect_delta) < silence_val)
    {
      Serial.print("Detect 1: ");
      Serial.println(cur_val);

      //задержка, чтобы последующие щелки пропустились
      digitalWrite(pin_led_debug, HIGH);
      delay(50);
      digitalWrite(pin_led_debug, LOW);
      //end
      
      detect1 = 1;
    } else
    {
      detect1 = 0;
    }
    
    if(detect1 == 1)
    { 
      //тишина    
      silence = 1;

      for(i = 0; i < silence_between; i++)
      {
        cur_val = analogReadCount(pin_in, detect_count);    

        if((cur_val + detect_delta) < silence_val)
        {
          silence = 0;
          break;
        }
      }
      //end

      Serial.print("Silence: ");
      Serial.println(silence);
    }

    //первый был, тишина была
    if((detect1 == 1) && (silence == 1))
    {
      digitalWrite(pin_led_debug, HIGH);

      //второй щелчок
      Serial.println("detect2 start");

      for(i = 0; i < second_detect; i++)
      {
        cur_val = analogReadCount(pin_in, detect_count);

        if((cur_val + detect_delta) < silence_val)
        {
          Serial.print("Detect 2: ");
          Serial.println(cur_val);
            
          pin_out_status = !pin_out_status;
          digitalWrite(pin_out, pin_out_status);
          
          if(pin_out_status == 1)
          {
            tm = millis();
            tmp_pin_out_status = pin_out_status;
          } else
          {
            tm = 0;
          }

          //задержка, чтобы последующие щелки пропустились
          digitalWrite(pin_led_debug, HIGH);
          delay(20);
          digitalWrite(pin_led_debug, LOW);
          delay(20);
          digitalWrite(pin_led_debug, HIGH);
          delay(20);
          digitalWrite(pin_led_debug, LOW);
          //end
            
          break;
        }
      }

      Serial.println("detect2 finish");
      //end
    }
    //end
    
    //max on
    if(tm != 0)
    {
      tm_delta = millis() - tm;

      if(tm_delta > pin_out_max_on1)
      {
        if(pin_out_max_on2 == 0)
        {
          Serial.println("Max on 1 - off");

          digitalWrite(pin_out, LOW);
          pin_out_status = 0;
          tm = 0;
        } else
        {
          if(tm_delta < pin_out_max_on2)
          {
            pin_out_status = 0; //(для decect2) пусть основной цикл думает что led не горит, тогда если щёлкнуть led включится
            
            Serial.println("Max on 2");
            
            if(cur_pin_out_max_on2_skip > pin_out_max_on2_skip)
            {
              tmp_pin_out_status = !tmp_pin_out_status;
              digitalWrite(pin_out, tmp_pin_out_status);
              
              cur_pin_out_max_on2_skip = 0;
            } else
            {
              cur_pin_out_max_on2_skip++;
            }
          } else
          {
            Serial.println("Max on 2 - off");

            digitalWrite(pin_out, LOW);
            pin_out_status = 0;
            tm = 0;
          }
        }
      }
    }
    //end
  }
}

 

leshacos
Offline
Зарегистрирован: 18.12.2012

ДОброго! скажи пожалуйста,  что необходимо для того чтобы работала система 2хлопкового вкл выкл..

сам не программер..так что..)

обязателен ли комп включенный при этом? вообще можно ли ардуину  как то скрыть от глаз допустим поместить в стену (проштробить и зашпоклевать)?

буду признателен+)

dimka
dimka аватар
Offline
Зарегистрирован: 21.09.2012

управление хлопком в ладоши (инфракрасным) ИК сигналом

Clap Switch, management claps infrared IR signal

Version 0.1 2013/06/12



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

Для защиты от случайного срабатывания - посторонних шумов



1. Вводим звуковой логин в моем примере это три хлопка 

Если логин введен правильно Загорается желтый светодиод у нас есть три секунды для ввода звукового пароля

2. Вводим звуковой пароль, в моем примере это два хлопка, если звуковой пароль введен правильно загорается зеленый светодиод, у нас есть пять секунд Для ввода звуковой команды







3. Например хлопаем два раза у нас включается второй pin на ардуино,

или отправляется (инфракрасный) ИК сигнал на телевизор включая второй телеканал.



Нужно заранее прописать в sketch, код кнопки пульта от вашего телевизора

/* урок от Дмитрия Осипова. http://www.youtube.com/user/d36073?feature=watch

Включение света и отправка ИК  сигнала с помощью хлопка v.01
управление хлопком в ладоши (инфракрасным) ИК  сигналом
Clap Switch, management claps infrared IR signal
Version 0.1 2013/06/12

Скачать библиотеку IRremote для ИК пульта
https://disk.yandex.ru/public/?hash=yNz1au3lm3/yyMHOYtnZ2UGSf19wTvYBZnkxmhW4Xt0%3D

скетч arduino чтобы узнать код кнопки ИК пульта
sketch arduino buttons on the remote to learn the code
https://disk.yandex.ru/public/?hash=KzLtuC1ljISPaCoXw03D6mbiKea8spktcWL5QKJHGRQ%3D 

4/6 как ? узнать код - кнопки своего ИК пульта
http://www.youtube.com/watch?v=InZuGntH_wk

Arduino Розетки, Управление любым ИК пультом, (программируемые на лету) socket IR remote control
http://www.youtube.com/watch?v=Nx6DUQ7Tx1w

*/




/*
 
 Clap Counter
 
 Uses KY037 to count clap sounds via Analog Input
 
 Analyses signal coming into Analog Pin A0 for minimum increase above the
 baseline. Then waits for the duration of a clap and checks to see if the
 signal has dropped sufficiently. 
 
 It then waits to see if a new clap is detected within a specified timeframe.
 If so, it adds the new clap. If not, it outputs the number of claps counted
 using a Serial.print. 
 
 Note: The values used to detect an increase in sound, drop of in sound and delay for end of sound
       were not calculated, measured or otherwise intelligently obtained.
       Oh no, they were just stabbed at in the dark until it worked a bit.
       There accuracy of counting could be significantly improved by correcting these values.
       
Note: This program uses a dreadful technique of counting program cycles instead of timing a delay.
      This means that if you add some code to do something, even bug testing, then your timing goes out. 
      If you can continuously monitor a time value instead of counting program cycles, please update and re-post this code.
 
Note: You must open the serial monitor to see any results. 
   (Arduino 1.0.1 Serial Monitor is under Tools)
 
 
 The circuit:
 * Pin marked S attached to analog input 0 (marked as A0 on my Arduino Uno)
 * Pin marked G attached to GND (in the Power section of the Aruiono Uno)
 * Pin marked + attached to 5V
 * Pin marked D0 is not attached to anything
 
 Circuit behaviour:
 * No Sound
  - Both LEDs on KY037 are on
  - Pin 13 indicator on Arduino Uno is on
  - TX and RX are off

 * Clap
  - LED under blue box on KY037 dims momentarily
  - Pin 13 indicator turns off for a noticable moment, it may shimmer or flash
  - TX will flash on a short moment after Pin 13 indicator remains on again.
     note, if you clap again before TX flashes, TX will wait again until Pin 13 settles.

 
 Created by Tim Marsh
 modified 09 Mar 2013
 Based on sample code by Tom Igoe
 
 This example code is in the public domain.
 
 http://arduino.cc/en/Tutorial/AnalogInput
 
 */
 

#include <IRremote.h> // это скачанная библиотека 

#define PanasonicAddress      0x4004  

//ВАЖНО !!! ( EE008FE0 ) это код кнопки №1 - моего (ИК)! (инфракрасного пульта)!, -
//-у вашего пульта будет другой код, замените на свой!
#define P1        0xEE008FE0  
#define P2        0xEE008FD0  
#define P3        0xEE008FF0 
#define P4        0xEE008FC8 
#define P5        0xEE008FE8 
#define P6        0xEE008FD8 
#define P7        0xEE008FF8 
#define P8        0xEE008FC4 
#define P9        0xEE008FE4 
#define P0        0xEE008FD4 

#define JVC1      0xFB05 //( FB05 ) это код кнопки пульта от видеокамеры JVC (ZOOM)
#define JVC2      0xFB85

IRsend irsend;

//eventTime, для паузы,  вместо delay,будем использовать функцию millis. 
unsigned long eventTime=0;
 
//переменная переключения режима, при нажатии кнопки она принимает значение +1
int a=0;
int b=0; 
int c=0; 
int d=0; 
int e=0; 
int f=0; 
int g=0;



int sensorPin = A0;    //микрофон подключен сюда. select the input pin for the KY036
int ledPin = 13;      // индикатор чувствительности микрофона.select the pin for the LED (also flashes on Arduino Uno)

// ВАЖНО !!! (PIN 3;) вЫход ИК передатчика, ((PIN 3;)на другой пин изменить нельзя)

//пины управляющие светодиодами, или реле, чем угодно.
int ledPin4 = 4;
int ledPin5 = 5;
int ledPin6 = 6;
int ledPin7 = 7;
int ledPin8 = 8;
int ledPin9 = 9;
int ledPin10 = 10;

//индикация ввода звукового логина и пароля,password and login
int login_ledPin = 11;
int password_ledPin = 12;



int sensorValue = 0;  // variable to store the value coming from the sensor
int intMax = 0;        // Used to store both the baseline from A0 and the level of A0 when it tripped
int intClapCount = 0;  // The number of claps that have been detected in the timeframe
int intSensitivity = 3;  // The increase in value above the baseline from A0 required to register a clap
int intDropOffSense = 3;  // The decrease in A0 value from the new baseline required to register a clap has ended
int intClapDuration = 300;  // The number of program cycles allowed for the echo of the clap to drop off
int intIntervalDuration = 700;  // The number of program cycles allowed for the next clap to start (note: Program cycles is a very dirty way of timing an event and should be avoided)
int intIntervalCount = 0;   // The number of milliseconds to wait before detecting the level of sound after a clap

void setup() {
    Serial.begin(9600);  // I think this sets up the serial monitor 
                         // note; my original value of 115200 failed, but 9600 worked.
  pinMode(ledPin, OUTPUT);  // declare the ledPin as an OUTPUT:
  

  // назначаем пины как выходы
  pinMode(ledPin4, OUTPUT);
  pinMode(ledPin5, OUTPUT);
  pinMode(ledPin6, OUTPUT);
  pinMode(ledPin7, OUTPUT);
  pinMode(ledPin8, OUTPUT);
  pinMode(ledPin9, OUTPUT);
  pinMode(ledPin10, OUTPUT);
  
  pinMode(login_ledPin, OUTPUT);
  pinMode(password_ledPin, OUTPUT);
  
 
  intMax = analogRead(sensorPin) ; // read the analog pin and use the value for the level of background noise
}

void loop() {


  // Check if sufficient program cycles have passed to conclude counting a set of claps
  
  intIntervalCount +=1; // A program cycle has been counted
  if (intIntervalCount > intIntervalDuration)  // TRUE if enough cycles have been counted
    {
      if(intClapCount > 0)  // TRUE if any claps have been counted
      {
        PrintOutput(); // Sends the program control to the bit that outputs to the Serial Monitor
      }
      
      intClapCount = 0;  // Resets the number of claps to zero
      intIntervalCount = 0; // Starts counting program cycles from the beginning
                            // note, this value is also reset to zero after each clap is counted
      
//      Serial.println("New Interval");
    }
  sensorValue = analogRead(sensorPin);  // reads the value coming from A0 analog input
  if (sensorValue > (intMax + intSensitivity)) // Sharp increase in sound above the baseline
  {
    intMax = sensorValue;  // sets the new baseline to be the volume of the clap when it was detected
                           // note, this is not the maximum volume that the clap produced.
    delay(intClapDuration);    // Wait for echoes to fade
    sensorValue = analogRead(sensorPin);  // read A0 again after the clap sound has died off
                                          // note, otherwise you may be detecting talking or some other noise
    if(sensorValue < (intMax - intDropOffSense))   // Sharp decrease in sound down from the volume the clap was detected at 
    {
      NewClap(); // go and do everything that happens when a clap has been detected
    }
    intMax = analogRead(sensorPin) ;  // Set the baseline to be the current background level. 
                                      // This base line may be too high if there is still clap echoes being detected
                                      // A longer delay here may be appropriate.
  }
  

 // This just makes the Pin 13 indicator flash or go off when other things are going on.  
  digitalWrite(ledPin, HIGH);   // turn the ledPin on
  delay(1);          
  digitalWrite(ledPin, LOW);   // turn the ledPin off:   
  delay(0);                  
}

void PrintOutput()

   // Serial.print(" Claps: "); // Prints the text in inverted commas to the Serial Monitor
  //  Serial.println(intClapCount);  // Prints the number of claps to the Serial Monitor and starts a new line
  // note, you can do this in one command if you concatenate the two phrases   

  
                                   
 {
   
  // если хлопнули 3 раза,включаем login_ledPin, на (пауза) 3 секунды, и Выключаем
   //Количество хлопков и паузу можно менять на свой вкус
   if(intClapCount==3) eventTime=millis(),digitalWrite(login_ledPin, HIGH);
       if(millis()-eventTime>3000)  digitalWrite(login_ledPin, LOW);
      
  //Только при условии если, (Одновременно) включен login_ledPin !, и  хлопнули 2 раза,
 // включаем password_ledPin, на (пауза) 5 секунд, и Выключаем
   //Количество хлопков и паузу можно менять на свой вкус
      
      if (digitalRead(login_ledPin) == HIGH  && (intClapCount==2)) eventTime=millis(),digitalWrite(password_ledPin, HIGH);
        if(millis()-eventTime>5000)  digitalWrite(password_ledPin, LOW);
  
  
   
   
   
   
   //только при условии если (Одновременно)включен password_ledPin, и хлопок в ладоши 
   //меняем состояние пина, на выключен или наоборот включен
   
   //Здесь во второй строчке я добавил дополнительное условие ((digitalRead(login_ledPin) == LOW)  &&, 
  // так как команда 2 хлопка,пересекается с моей командой для пароля
   

       if (digitalRead(password_ledPin) ==  HIGH  && (intClapCount==1)){a=a+1;}
       
       if (digitalRead(login_ledPin) == LOW  && (digitalRead(password_ledPin) == HIGH)   && (intClapCount==2)){b=b+1;}       
       if (digitalRead(password_ledPin) ==  HIGH  && (intClapCount==3)){c=c+1;}
       if (digitalRead(password_ledPin) ==  HIGH  && (intClapCount==4)){d=d+1;} 
       if (digitalRead(password_ledPin) ==  HIGH  && (intClapCount==5)){e=e+1;}
       if (digitalRead(password_ledPin) ==  HIGH  && (intClapCount==6)){f=f+1;}
       if (digitalRead(password_ledPin) ==  HIGH  && (intClapCount==7)){g=g+1;}


// начинаем включать светодиоды на пинах
// действие после хлопка, если переменная стала равна 1 то
// произвести переключение пина в режим HIGH, если же нет то вернуть переменную в исходное состояние   
       
  if (a==1){digitalWrite(ledPin4, HIGH);} else {digitalWrite(ledPin4, LOW); a=0;}
  if (b==1){digitalWrite(ledPin5, HIGH);} else {digitalWrite(ledPin5, LOW); b=0;}
  if (c==1){digitalWrite(ledPin6, HIGH);} else {digitalWrite(ledPin6, LOW); c=0;}
  if (d==1){digitalWrite(ledPin7, HIGH);} else {digitalWrite(ledPin7, LOW); d=0;}    
  if (e==1){digitalWrite(ledPin8, HIGH);} else {digitalWrite(ledPin8, LOW); e=0;}
  if (f==1){digitalWrite(ledPin9, HIGH);} else {digitalWrite(ledPin9, LOW); f=0;}
  if (g==1){digitalWrite(ledPin10, HIGH);} else {digitalWrite(ledPin10, LOW); g=0;}

  

  
  
//только при условии если, (Одновременно)включен password_ledPin, и Обнаружен хлопок в ладоши
//Отправляем сигнал через (ИК) передатчик, заранее записанные код кнопк вашего! пульта
// после отправки (ИК)сигнала, Выключаем password_ledPin
// (intClapCount==1)) 1 это количество хлопков

  {  
  //и Здесь во второй строчке я добавил дополнительное условие ((digitalRead(login_ledPin) == LOW)  &&, 
  // так как команда 2 хлопка,пересекается с моей командой для пароля
    
 { if (digitalRead(password_ledPin) == HIGH  && (intClapCount==1)) irsend.sendPanasonic(PanasonicAddress,P1),digitalWrite(password_ledPin, LOW);}
 
{ if (digitalRead(login_ledPin) == LOW  && (digitalRead(password_ledPin) == HIGH  && (intClapCount==2)))
irsend.sendPanasonic(PanasonicAddress,P2),digitalWrite(password_ledPin, LOW);}

 { if (digitalRead(password_ledPin) == HIGH  && (intClapCount==3)) irsend.sendPanasonic(PanasonicAddress,P3),digitalWrite(password_ledPin, LOW);}
 { if (digitalRead(password_ledPin) == HIGH  && (intClapCount==4)) irsend.sendPanasonic(PanasonicAddress,P4),digitalWrite(password_ledPin, LOW);}
 { if (digitalRead(password_ledPin) == HIGH  && (intClapCount==5)) irsend.sendPanasonic(PanasonicAddress,P5),digitalWrite(password_ledPin, LOW);}
 { if (digitalRead(password_ledPin) == HIGH  && (intClapCount==6)) irsend.sendPanasonic(PanasonicAddress,P6),digitalWrite(password_ledPin, LOW);}
 { if (digitalRead(password_ledPin) == HIGH  && (intClapCount==7)) irsend.sendPanasonic(PanasonicAddress,P7),digitalWrite(password_ledPin, LOW);}
 { if (digitalRead(password_ledPin) == HIGH  && (intClapCount==8)) irsend.sendPanasonic(PanasonicAddress,P8),digitalWrite(password_ledPin, LOW);}
 { if (digitalRead(password_ledPin) == HIGH  && (intClapCount==9)) irsend.sendPanasonic(PanasonicAddress,P9),digitalWrite(password_ledPin, LOW);}
 { if (digitalRead(password_ledPin) == HIGH  && (intClapCount==10)) irsend.sendPanasonic(PanasonicAddress,P0),digitalWrite(password_ledPin, LOW);}
    
 }
//Если включился password_ledPin, выключаем login_ledPin 
if(digitalRead(password_ledPin) == HIGH)  digitalWrite(login_ledPin, LOW);
}
void NewClap()
 {
    intClapCount += 1;  // Adds another clap to the count of claps
    intIntervalCount = 0;  // Sets the cycle counter back to zero so that the program waits until the end of a set of claps before printing.
  }
/* урок от Дмитрия Осипова. http://www.youtube.com/user/d36073?feature=watch

Включение света и отправка ИК  сигнала с помощью хлопка v.03
управление хлопком в ладоши (инфракрасным) ИК  сигналом
Clap Switch, management claps infrared IR signal
Version 0.3 2013/06/28

1. Добавил дополнительную защиту от посторонних шумов и случайных срабатываний.
A. если логин набран неправильно,вырубаем Arduino на 10 секунд.
B. если логин набран правильно, а пароль набран неправильно,вырубаем Arduino на 20 секунд.

*******************************************************************
Arduino Включение света и отправка ИК сигнала с помощью хлопка Clap Switch v.01
http://www.youtube.com/watch?v=D9TGU8JFKqA

Скачать библиотеку IRremote для ИК пульта
https://disk.yandex.ru/public/?hash=yNz1au3lm3/yyMHOYtnZ2UGSf19wTvYBZnkxmhW4Xt0%3D

скетч arduino чтобы узнать код кнопки ИК пульта
sketch arduino buttons on the remote to learn the code
https://disk.yandex.ru/public/?hash=KzLtuC1ljISPaCoXw03D6mbiKea8spktcWL5QKJHGRQ%3D 

4/6 как ? узнать код - кнопки своего ИК пульта
http://www.youtube.com/watch?v=InZuGntH_wk

Arduino Розетки, Управление любым ИК пультом, (программируемые на лету) socket IR remote control
http://www.youtube.com/watch?v=Nx6DUQ7Tx1w

усилитель ИК инфракрасного сигнала IR infrared signal amplifier на одном транзисторе Arduino
http://www.youtube.com/watch?v=3EYxONWSyR4

*/




/*
 
 Clap Counter
 
 Uses KY037 to count clap sounds via Analog Input
 
 Analyses signal coming into Analog Pin A0 for minimum increase above the
 baseline. Then waits for the duration of a clap and checks to see if the
 signal has dropped sufficiently. 
 
 It then waits to see if a new clap is detected within a specified timeframe.
 If so, it adds the new clap. If not, it outputs the number of claps counted
 using a Serial.print. 
 
 Note: The values used to detect an increase in sound, drop of in sound and delay for end of sound
       were not calculated, measured or otherwise intelligently obtained.
       Oh no, they were just stabbed at in the dark until it worked a bit.
       There accuracy of counting could be significantly improved by correcting these values.
       
Note: This program uses a dreadful technique of counting program cycles instead of timing a delay.
      This means that if you add some code to do something, even bug testing, then your timing goes out. 
      If you can continuously monitor a time value instead of counting program cycles, please update and re-post this code.
 
Note: You must open the serial monitor to see any results. 
   (Arduino 1.0.1 Serial Monitor is under Tools)
 
 
 The circuit:
 * Pin marked S attached to analog input 0 (marked as A0 on my Arduino Uno)
 * Pin marked G attached to GND (in the Power section of the Aruiono Uno)
 * Pin marked + attached to 5V
 * Pin marked D0 is not attached to anything
 
 Circuit behaviour:
 * No Sound
  - Both LEDs on KY037 are on
  - Pin 13 indicator on Arduino Uno is on
  - TX and RX are off

 * Clap
  - LED under blue box on KY037 dims momentarily
  - Pin 13 indicator turns off for a noticable moment, it may shimmer or flash
  - TX will flash on a short moment after Pin 13 indicator remains on again.
     note, if you clap again before TX flashes, TX will wait again until Pin 13 settles.

 
 Created by Tim Marsh
 modified 09 Mar 2013
 Based on sample code by Tom Igoe
 
 This example code is in the public domain.
 
 http://arduino.cc/en/Tutorial/AnalogInput
 
 */
 

#include <IRremote.h> // это скачанная библиотека 

#define PanasonicAddress      0x4004  

//ВАЖНО !!! ( EE008FE0 ) это код кнопки №1 - моего (ИК)! (инфракрасного пульта)!, -
//-у вашего пульта будет другой код, замените на свой!
#define P1        0xEE008FE0  
#define P2        0xEE008FD0  
#define P3        0xEE008FF0 
#define P4        0xEE008FC8 
#define P5        0xEE008FE8 
#define P6        0xEE008FD8 
#define P7        0xEE008FF8 
#define P8        0xEE008FC4 
#define P9        0xEE008FE4 
#define P0        0xEE008FD4 

#define JVC1      0xFB05 //( FB05 ) это код кнопки пульта от видеокамеры JVC (ZOOM)
#define JVC2      0xFB85

IRsend irsend;

//eventTime, для паузы,  вместо delay,будем использовать функцию millis. 
unsigned long eventTime=0;
 
//переменная переключения режима, при нажатии кнопки она принимает значение +1
int a=0;
int b=0; 
int c=0; 
int d=0; 
int e=0; 
int f=0; 
int g=0;



int sensorPin = A0;    //микрофон подключен сюда. select the input pin for the KY036
int ledPin = 13;      // индикатор чувствительности микрофона.select the pin for the LED (also flashes on Arduino Uno)

// ВАЖНО !!! (PIN 3;) вЫход ИК передатчика, ((PIN 3;)на другой пин изменить нельзя)

//пины управляющие светодиодами, или реле, чем угодно.
int ledPin4 = 4;
int ledPin5 = 5;
int ledPin6 = 6;
int ledPin7 = 7;
int ledPin8 = 8;
int ledPin9 = 9;
int ledPin10 = 10;

//индикация ввода звукового логина и пароля,password and login
int login_ledPin = 11;
int password_ledPin = 12;



int sensorValue = 0;  // variable to store the value coming from the sensor
int intMax = 0;        // Used to store both the baseline from A0 and the level of A0 when it tripped
int intClapCount = 0;  // The number of claps that have been detected in the timeframe
int intSensitivity = 3;  // The increase in value above the baseline from A0 required to register a clap
int intDropOffSense = 3;  // The decrease in A0 value from the new baseline required to register a clap has ended
int intClapDuration = 300;  // The number of program cycles allowed for the echo of the clap to drop off
int intIntervalDuration = 700;  // The number of program cycles allowed for the next clap to start (note: Program cycles is a very dirty way of timing an event and should be avoided)
int intIntervalCount = 0;   // The number of milliseconds to wait before detecting the level of sound after a clap

void setup() {
    Serial.begin(9600);  // I think this sets up the serial monitor 
                         // note; my original value of 115200 failed, but 9600 worked.
  pinMode(ledPin, OUTPUT);  // declare the ledPin as an OUTPUT:
  

  // назначаем пины как выходы
  pinMode(ledPin4, OUTPUT);
  pinMode(ledPin5, OUTPUT);
  pinMode(ledPin6, OUTPUT);
  pinMode(ledPin7, OUTPUT);
  pinMode(ledPin8, OUTPUT);
  pinMode(ledPin9, OUTPUT);
  pinMode(ledPin10, OUTPUT);
  
  pinMode(login_ledPin, OUTPUT);
  pinMode(password_ledPin, OUTPUT);
  
 
  intMax = analogRead(sensorPin) ; // read the analog pin and use the value for the level of background noise
}

void loop() {


  // Check if sufficient program cycles have passed to conclude counting a set of claps
  
  intIntervalCount +=1; // A program cycle has been counted
  if (intIntervalCount > intIntervalDuration)  // TRUE if enough cycles have been counted
    {
      if(intClapCount > 0)  // TRUE if any claps have been counted
      {
        PrintOutput(); // Sends the program control to the bit that outputs to the Serial Monitor
      }
      
      intClapCount = 0;  // Resets the number of claps to zero
      intIntervalCount = 0; // Starts counting program cycles from the beginning
                            // note, this value is also reset to zero after each clap is counted
      
//      Serial.println("New Interval");
    }
  sensorValue = analogRead(sensorPin);  // reads the value coming from A0 analog input
  if (sensorValue > (intMax + intSensitivity)) // Sharp increase in sound above the baseline
  {
    intMax = sensorValue;  // sets the new baseline to be the volume of the clap when it was detected
                           // note, this is not the maximum volume that the clap produced.
    delay(intClapDuration);    // Wait for echoes to fade
    sensorValue = analogRead(sensorPin);  // read A0 again after the clap sound has died off
                                          // note, otherwise you may be detecting talking or some other noise
    if(sensorValue < (intMax - intDropOffSense))   // Sharp decrease in sound down from the volume the clap was detected at 
    {
      NewClap(); // go and do everything that happens when a clap has been detected
    }
    intMax = analogRead(sensorPin) ;  // Set the baseline to be the current background level. 
                                      // This base line may be too high if there is still clap echoes being detected
                                      // A longer delay here may be appropriate.
  }
  

 // This just makes the Pin 13 indicator flash or go off when other things are going on.  
  digitalWrite(ledPin, HIGH);   // turn the ledPin on
  delay(1);          
  digitalWrite(ledPin, LOW);   // turn the ledPin off:   
  delay(0);                  
}

void PrintOutput()

   // Serial.print(" Claps: "); // Prints the text in inverted commas to the Serial Monitor
  //  Serial.println(intClapCount);  // Prints the number of claps to the Serial Monitor and starts a new line
  // note, you can do this in one command if you concatenate the two phrases   

  
                                   
 {
   
   // Добавляем защиту от посторонних шумов  (если логин набран правильно,а пароль  набран неправильно 
  //Только при условии если, (Одновременно) выключен login_ledPin,и (Хлопков было больше двух, или меньше двух )
  //Тоесть не (2). Каким должен быть пароль.вырубаем ардуино на 20 секунд.
   
   { if (digitalRead(login_ledPin) == HIGH  && (intClapCount > 2 || intClapCount< 2)) 
 digitalWrite(login_ledPin, LOW),digitalWrite(password_ledPin, LOW),delay(20000);}
 
    // Только при условии если, (Одновременно) выключен password_ledPin, и Хлопков было  три,
    // включаем login_ledPin, на (пауза) 3 секунд, и Выключаем
   //Количество хлопков и паузу можно менять на свой вкус
   if (digitalRead(password_ledPin) == LOW  && (intClapCount==3)) eventTime=millis(),digitalWrite(login_ledPin, HIGH);
       if(millis()-eventTime>3000)  digitalWrite(login_ledPin, LOW);
      
  //Только при условии если, (Одновременно) включен login_ledPin !, и  хлопнули 2 раза,
 // включаем password_ledPin, на (пауза) 5 секунд, и Выключаем
   //Количество хлопков и паузу можно менять на свой вкус
      
      if (digitalRead(login_ledPin) == HIGH  && (intClapCount==2)) eventTime=millis(),digitalWrite(password_ledPin, HIGH);
        if(millis()-eventTime>5000)  digitalWrite(password_ledPin, LOW);
    
    
   // Добавляем защиту от посторонних шумов  (если логин набран неправильно)  
  //Только при условии если, (Одновременно) выключен password_ledPin,и (Хлопков было больше трех, или меньше трех )
  //Тоесть не (3). Каким должен быть логин.вырубаем ардуино на 10 секунд.
  { if (digitalRead(password_ledPin) == LOW  && (intClapCount > 3 || intClapCount< 3)) digitalWrite(login_ledPin, LOW),delay(10000);}
   
   
   
   
   //только при условии если (Одновременно)включен password_ledPin, и хлопок в ладоши 
   //меняем состояние пина, на выключен или наоборот включен
   
   //Здесь во второй строчке я добавил дополнительное условие ((digitalRead(login_ledPin) == LOW)  &&, 
  // так как команда 2 хлопка,пересекается с моей командой для пароля
   

       if (digitalRead(password_ledPin) ==  HIGH  && (intClapCount==1)){a=a+1;}
       
       if (digitalRead(login_ledPin) == LOW  && (digitalRead(password_ledPin) == HIGH)   && (intClapCount==2)){b=b+1;}       
       if (digitalRead(password_ledPin) ==  HIGH  && (intClapCount==3)){c=c+1;}
       if (digitalRead(password_ledPin) ==  HIGH  && (intClapCount==4)){d=d+1;} 
       if (digitalRead(password_ledPin) ==  HIGH  && (intClapCount==5)){e=e+1;}
       if (digitalRead(password_ledPin) ==  HIGH  && (intClapCount==6)){f=f+1;}
       if (digitalRead(password_ledPin) ==  HIGH  && (intClapCount==7)){g=g+1;}


// начинаем включать светодиоды на пинах
// действие после хлопка, если переменная стала равна 1 то
// произвести переключение пина в режим HIGH, если же нет то вернуть переменную в исходное состояние   
       
  if (a==1){digitalWrite(ledPin4, HIGH);} else {digitalWrite(ledPin4, LOW); a=0;}
  if (b==1){digitalWrite(ledPin5, HIGH);} else {digitalWrite(ledPin5, LOW); b=0;}
  if (c==1){digitalWrite(ledPin6, HIGH);} else {digitalWrite(ledPin6, LOW); c=0;}
  if (d==1){digitalWrite(ledPin7, HIGH);} else {digitalWrite(ledPin7, LOW); d=0;}    
  if (e==1){digitalWrite(ledPin8, HIGH);} else {digitalWrite(ledPin8, LOW); e=0;}
  if (f==1){digitalWrite(ledPin9, HIGH);} else {digitalWrite(ledPin9, LOW); f=0;}
  if (g==1){digitalWrite(ledPin10, HIGH);} else {digitalWrite(ledPin10, LOW); g=0;}

  

  
  
//только при условии если, (Одновременно)включен password_ledPin, и Обнаружен хлопок в ладоши
//Отправляем сигнал через (ИК) передатчик, заранее записанные код кнопк вашего! пульта
// после отправки (ИК)сигнала, Выключаем password_ledPin
// (intClapCount==1)) 1 это количество хлопков

  {  
  //и Здесь во второй строчке я добавил дополнительное условие ((digitalRead(login_ledPin) == LOW)  &&, 
  // так как команда 2 хлопка,пересекается с моей командой для пароля
    
 { if (digitalRead(password_ledPin) == HIGH  && (intClapCount==1)) irsend.sendPanasonic(PanasonicAddress,P1),digitalWrite(password_ledPin, LOW);}
 
{ if (digitalRead(login_ledPin) == LOW  && (digitalRead(password_ledPin) == HIGH  && (intClapCount==2)))
irsend.sendPanasonic(PanasonicAddress,P2),digitalWrite(password_ledPin, LOW);}

 { if (digitalRead(password_ledPin) == HIGH  && (intClapCount==3)) irsend.sendPanasonic(PanasonicAddress,P3),digitalWrite(password_ledPin, LOW);}
 { if (digitalRead(password_ledPin) == HIGH  && (intClapCount==4)) irsend.sendPanasonic(PanasonicAddress,P4),digitalWrite(password_ledPin, LOW);}
 { if (digitalRead(password_ledPin) == HIGH  && (intClapCount==5)) irsend.sendPanasonic(PanasonicAddress,P5),digitalWrite(password_ledPin, LOW);}
 { if (digitalRead(password_ledPin) == HIGH  && (intClapCount==6)) irsend.sendPanasonic(PanasonicAddress,P6),digitalWrite(password_ledPin, LOW);}
 { if (digitalRead(password_ledPin) == HIGH  && (intClapCount==7)) irsend.sendPanasonic(PanasonicAddress,P7),digitalWrite(password_ledPin, LOW);}
 { if (digitalRead(password_ledPin) == HIGH  && (intClapCount==8)) irsend.sendPanasonic(PanasonicAddress,P8),digitalWrite(password_ledPin, LOW);}
 { if (digitalRead(password_ledPin) == HIGH  && (intClapCount==9)) irsend.sendPanasonic(PanasonicAddress,P9),digitalWrite(password_ledPin, LOW);}
 { if (digitalRead(password_ledPin) == HIGH  && (intClapCount==10)) irsend.sendPanasonic(PanasonicAddress,P0),digitalWrite(password_ledPin, LOW);}
    
 }
//Если включился password_ledPin, выключаем login_ledPin 
if(digitalRead(password_ledPin) == HIGH)  digitalWrite(login_ledPin, LOW);
}
void NewClap()
 {
    intClapCount += 1;  // Adds another clap to the count of claps
    intIntervalCount = 0;  // Sets the cycle counter back to zero so that the program waits until the end of a set of claps before printing.
  }
 
Vinch
Offline
Зарегистрирован: 01.08.2013

У меня модуль микрофона на LM 393 при подключении выдаёт одни и те же значения, меняется максимум на единичку, если только чем нибудь по самому микрофону постучать, то значения меняются, а так хлопай, кричи и все одно и то же, в чем может быть проблема?