Пару дней назад сказал ребенку, что мы сделаем робота, который будет жить в компьютере и включать свет...
Естественно такое быстро не делается, да и датчики объема едут с ebay в РФ совсем не быстро.
Сегодня Лёва вспомнил про робота и пришлось что-то быстро придумывать.
Сделал робота-кобру, у которой загораются глаза, если кобра видит движение или слышит громкий звук.
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);
}
}
}