Отправка сообщений на email с использованием датчика движения

Рассмотрен проект, в котором отсылается уведомление на email, когда обнаруживается движение с помощью пир-датчика движения.

Проект реализован на Arduino. Кроме Arduino IDE нам понадобится дополнительная программа на Python.

Основа проета - микроконтроллер Arduino. С его помощью считываются данные с ПИР датчика движения. Полученные значения передаются дальше на персональный компьютер через USB кабель и дальше отправляются на заданный email.

Необходимое оборудование

Для реализации проекта вам понадобятся (помимо компьюте с выходом в интернет. Мы ведь будем отсылать email;)):

  • Пироэлектрический датчик движения
  • Плата Arduino Uno (или ее аналог)
  • Монтажная плата (breadboard)
  • Коннекторы

Схема подключения

Единственное, что надо подключить - это пироэлектрический датчик движения. В связи с этим, использовать монтажную плату не обязательно.

Сенсор можно подключить напрямую к плате Arduino. Правда учтите, что стандартнье коннекторы будут немного "гулять" в пинах на плате. Этого не будет, если вы все таки соберете схему на монтажной плате, как это показано ниже:

PIR датчик движения

Скетч для Arduino

Когда в зоне чувствительности датчика появится объект, Arduino передаст сигнал с помощью серийного протокола связи через USB порт. При этом возникает небольшая проблема. Если делать все "в лоб", Arduino будет генерировать кучу email'ов. В программе эта проблема решена следующим образом: если промежуток времени между сигналами слишком короткий, микроконтроллер генерирует другое сообщение и письмо не будет отправляться.

int pirPin = 7;

int minSecsBetweenEmails = 60; // 1 минута

long lastSend = -minSecsBetweenEmails * 1000l;

void setup()

{

pinMode(pirPin, INPUT);

Serial.begin(9600);

}

void loop()

{

long now = millis();

if (digitalRead(pirPin) == HIGH)

{

if (now > (lastSend + minSecsBetweenEmails * 1000l))

{

Serial.println("MOVEMENT");

lastSend = now;

}

else

{

Serial.println("Too soon");

}

}

delay(500);

}

Переменную “minSecsBetweenEmails” вы можете смело менять в соответствии с вашими потребностями. Тут она выставлена на 60 секунд, то есть email 'ы будут отправляться не чаще чем раз в 60 секунд.

Для отслеживания времени, когда был отправлен предыдущий email, используется переменная “lastSend”. Она инициализируется как отрицательное число, равное количеству миллисекунд, указанных в переменной “minSecsBetweenEmails” со знаком минус. Благодаря этому ПИР датчик движения может отрабатывать сразу после запуска скетча, без задержки в 1 минуту.

Внутри цикла используется функция “millis()”. Благодаря ее использованию мы получаем значение времени, которое прошло с момента запуска Arduino. Полученное значение сравнивается со временем с момента последней передачи сигнала. Если это значение больше установленных нами 60 секунд, отсылается сообщение “MOVEMENT”. В любом другом случае, даже при наличии движения, будет отправляться сообщение “Too soon”.

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

Скетч Arduino

Установка Python и PySerial

Если вы используете Mac или Linux, Python уже установлен. Если вы используете Windoes, надо его установить. В любой операционке вам придется установить библиотеку PySerial library, которая используется для настройки обмена данными с Arduino.

Установка Python на Windows

Для установки Python на Windows, скачайте дистрибутив здесь

Рассматриваемый проект реализован на Python 2.7.3. ВАЖНО! замечены некоторые проблемы с PySerial на Windows, если вы используете Python 3, так что рекомендую использовать Python 2.

Python установка

После установки Python, в меню "Пуск" появится новая программа. Нам это не понадобится. Мы организуем работу Python через командную строку. Это необходимо для установки PySerial.

Для этого мы кое-что добавим в переменную PATH.

Меняем PATH

Для того, чтобы это сделать, перейдите в панель Windows Control и найдите пункт System Properties. После этого кликните на кнопку “Environment Variables” и в окне, которое появится, выберите “Path” в нижней части (System Variables). Нажмите “Edit” и после этого в конце строки “Variable Value” без удаления начального текста, добавьте следующий текст: ;C:\Python27

ВАЖНО! Не забудьте ";" перед вашей новой записью!

Для проверки новых настроек, зайдите в командную строку (DOS Prompt) и введите команду “python”. В результате вы должны увидеть нечто подобное:

Первый запуск Python

Установка PySerial

Вне зависимости от вашей операционной системы, вам надо загрузить пакет установщика .tar.gz для PySerial 2.6. Скачть его можно по ссылке

Вы скачаете файл под названием: pyserial-2.6.tar.gz

Если вы используете Windows, вам надо будет распаковатл скачанный файл. К сожалению, это не совсем стандартный zip файл, так что вам надо дополнительно скачать 7-zip.

Если вы используете Mac или Linux, откройте Terminal, 'cd' в директорию, куда вы скачали pyserial-2.6.tar.gz и после этого пропишите следующую команду для распаковки установщика:

$ tar -xzf pyserial-2.6.tar.gz

Остальная часть установки одинаковая для любых операционных систем. Используйте окно командной строки/терминала, “cd” в папку pyserial-2.6, после чего запустите команду:

sudo python setup.py install

Sudo Python

Программа на Python

Теперь настало время создать программу для Python. Для этого скопируйте код, представленный ниже в файл с названием “movement.py”. На Mac / Linux вы можете использовать “nano” editor, в Windows проще всего, наверное, создать файл с использованием Python-редактора "IDLE”, который доступен у вас в программах после установки Python 'а.

import time

import serial

import smtplib

TO = 'putyour@email.here'

GMAIL_USER = 'putyour@email.here'

GMAIL_PASS = 'putyourpasswordhere'

SUBJECT = 'Intrusion!!'

TEXT = 'Your PIR sensor detected movement'

ser = serial.Serial('COM4', 9600)

def send_email():

print("Sending Email")

smtpserver = smtplib.SMTP("smtp.gmail.com",587)

smtpserver.ehlo()

smtpserver.starttls()

smtpserver.ehlo

smtpserver.login(GMAIL_USER, GMAIL_PASS)

header = 'To:' + TO + '\n' + 'From: ' + GMAIL_USER

header = header + '\n' + 'Subject:' + SUBJECT + '\n'

print header

msg = header + '\n' + TEXT + ' \n\n'

smtpserver.sendmail(GMAIL_USER, TO, msg)

smtpserver.close()

while True:

message = ser.readline()

print(message)

if message[0] == 'M' :

send_email()

time.sleep(0.5)

Перед запуском программы на Python надо внести некоторые изменения. Они все находятся в верхней части кода.

В программе предполагается, что email 'ы будут отправляться с gmail аккаунта. Так что если у вас его нет, придется завести для реализации этого проекта (поверьте, это не реклама;)).

Измените email адрес рядом с “TO” на тот, на который вы хотите получать уведомления. Это не обязательно ваше мыло, но, скорее всего, именно его вы и захотите использовать.

Измените email адрес рядом с “GMAIL_USER” на адрес вашего gmail 'а и укажите пароль в следующей строке.

Если хотите, можете изменить строку с subject и текст сообщения, которое будет отправляться.

Кроме того, вам надо будет настроить порт, которому подключен Arduino, изменив строку, которая приведена ниже:

ser = serial.Serial('COM4', 9600)

В Windows это будет что-то вроде "COM4". Для Mac и Linux - “/dev/tty.usbmodem621”. Найти это можно в Arduino IDE. В правом нижнем углу среды всегда показан порт, который выделен для Arduino.

COM-порт Arduino

После этих изменений вы можете запускать программу из командной строки / терминала с помощью команды:

python movement.py

После обнаружения движения вы должны увидеть в терминале сообщения, приведенные на рисунке ниже. С некоторой задержкой вам на email придет уведомление.

Терминал Python

Дальнейшее развитие проекта

После того как вы настроили отправку уведомлений на email с помощью Arduino, перед вами открывается огромный горизонт новых возможностей. Добавляйте новые датчики, например: температуры, уровня влажности почвы, ультразвуковые датчики расстояния и т.п. Масштаб автоматизации зависит от вашего энтузиазма и оборудования.

Можно подключить светодиод или механическую конструкцию к Arduino, которая будет отрабатывать при наличии соответствующего email.

Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!