Давайте разберем проект подключения датчика движения к Arduino и организуем автоматическую отправку сообщения при срабатывании датчика.
Список деталей для сборки модели — что нам потребуется?
Для сборки проекта, описанного в этом уроке, понадобятся следующие детали:
- Arduino UNO;
- Датчик движения;
- Breadboard;
- Соединительные провода папа-папа.
Схема подключения PIR-датчика к Arduino:
К Arduino в этом проекте требуется подключить только датчик движения, поэтому провода от датчика можно подключить непосредственно к Arduino. Но т.к. в таком случае провода держаться немного неплотно, удобнее использовать схему c breadboard:
Скетч для датчика движения
Arduino будет послать сообщение по USB Serial связи при обнаружении движения.
//Время калибровки датчика (10-60 сек. по даташиту) int calibrationTime = 30; //Время, в которое был принят сигнал отсутствия движения(LOW) long unsigned int lowIn; //Пауза, после которой движение считается оконченным long unsigned int pause = 5000; //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет boolean lockLow = true; //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения boolean takeLowTime; int pirPin = 7; //вывод подключения PIR датчика int ledPin = 13; //вывод сигнального диода void setup() { Serial.begin(9600); pinMode(pirPin, INPUT); pinMode(ledPin, OUTPUT); digitalWrite(pirPin, LOW); //дадим датчику время на калибровку Serial.print("Calibrating"); for(int i = 0; i < calibrationTime; i++) { Serial.print("."); delay(1000); } Serial.println(" done"); Serial.println("SENSOR ACTIVE"); delay(50); } void loop() { //Если обнаружено движение if(digitalRead(pirPin) == HIGH) { //Если еще не вывели информацию об обнаружении if(lockLow) { lockLow = false; Serial.println("Motion detected"); delay(50); } takeLowTime = true; } //Ели движения нет if(digitalRead(pirPin) == LOW) { //Если время окончания движения еще не записано if(takeLowTime) { lowIn = millis(); //Сохраним время окончания движения takeLowTime = false; //Изменим значения флага, чтобы больше не брать время, пока не будет нового движения } //Если время без движение превышает паузу => движение окончено if(!lockLow && millis() - lowIn > pause) { //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения lockLow = true; Serial.println("Motion finished"); delay(50); } } }