Main menu

Пару дней назад сказал ребенку, что мы сделаем робота, который будет жить в компьютере и включать свет...
Естественно такое быстро не делается, да и датчики объема едут с ebay в РФ совсем не быстро.
Сегодня Лёва вспомнил про робота и пришлось что-то быстро придумывать.
Сделал робота-кобру, у которой загораются глаза, если кобра видит движение или слышит громкий звук.
Cobra


Для создания корбы я использовал Arduino Uno, Troyka shield (только для удобства подключения), два желтых светодиода, резистор 100Ом, датчик звука (LM393 + электретный микрофон), инфракрасный датчик движения (PIR), кейс для Arduino Uno + Ethernet Shield.
Схема подключения:
cobra2
Скетч - смесь чужих (ссылки, к сожалению, не укажу, так как не помню):

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