Main menu

A few days ago I told to the child that we will make a robot that will live in computer and turn on the lights...
Of course this is not done quickly, and the the volume sensors shipped from ebay to Russia is not fast.
Lev today remembered about the robot and I had to come up with something fast.
I made robot Cobra, whose eyes light up when Cobra sees movement or hears a loud noise.
Cobra
{youtube}t4l7r-2FAas{/youtube}
To create Cobra I used Arduino Uno, Troyka shield (only for ease of connection), two yellow LEDs, 100 ohms resistor, sound sensor (LM393 + electret microphone), infrared motion sensor (PIR), case for Arduino Uno + Ethernet Shield.
Connection diagram:
cobra2
Sketch - a mix of others (links, unfortunately, i can't point, because i do not remember):

int calibrationTime = 10; //Время калибровки датчика (10-60 сек. по даташиту)
long unsigned int lowIn; //Время, в которое посагли глаза        
long unsigned int pause = 2000; //Длительность свечения глаз
boolean lockLow = true; //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
boolean takeLowTime; //Флаг. Сигнализирует о необходимости запомнить время, в которое погасли глаза
int analogData = 0; //тут будут храниться данные с АЦП
int pirPin = 6;    //вывод подключения PIR датчика
int ledPin = 7;   //вывод глаз (светодиодов)
int micPin = A5;  //пин микрофона

void setup()
{
  Serial.begin(9600); // На всякий случай
  pinMode(pirPin, INPUT);
  pinMode(ledPin, OUTPUT);

  delay(4000);
  digitalWrite(pirPin, LOW);

  //дадим датчику время на калибровку
  for(int i = 0; i < calibrationTime; i++)
  {
    //Во время калибровки будет мигать глаза
    i % 2 ? digitalWrite(ledPin, HIGH) : digitalWrite(ledPin, LOW);
    delay(1000);
  }
  //По окончанию калибровки погасим глаза
  digitalWrite(ledPin, LOW);
  delay(50);
}

void loop()
{
 
  analogData=analogRead(micPin); //читаем значение
 
  //Если обнаружено движение или звук
  if(digitalRead(pirPin) == HIGH || (analogData > 0 && analogData < 900))
  {
    Serial.println("SENSOR ACTIVE");
    //Если до этого момента еще не включили реле
    if(lockLow)
    {
      lockLow = false;      
      digitalWrite(ledPin, HIGH); //Включаем глаза
    }        
    takeLowTime = true;
  }

  //Ели движения нет
  if(digitalRead(pirPin) == LOW)
  {      
    //Если время окончания движения еще не записано
    if(takeLowTime)
    {
      lowIn = millis();          //Сохраним время окончания движения
      takeLowTime = false;       //Изменим значения флага, чтобы больше не брать время, пока не будет нового движения
    }
    //Если время без движение превышает паузу => движение окончено
    if(!lockLow && millis() - lowIn > pause)
    {
      //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения
      lockLow = true;                
      digitalWrite(ledPin, LOW);
    }
  }
}