Отправка сообщений на email с использованием датчика движения
Рассмотрен проект, в котором отсылается уведомление на email, когда обнаруживается движение с помощью пир-датчика движения.
Проект реализован на Arduino. Кроме Arduino IDE нам понадобится дополнительная программа на Python.
Основа проета - микроконтроллер Arduino. С его помощью считываются данные с ПИР датчика движения. Полученные значения передаются дальше на персональный компьютер через USB кабель и дальше отправляются на заданный email.
Необходимое оборудование
Для реализации проекта вам понадобятся (помимо компьюте с выходом в интернет. Мы ведь будем отсылать email;)):
- Пироэлектрический датчик движения
- Плата Arduino Uno (или ее аналог)
- Монтажная плата (breadboard)
- Коннекторы
Схема подключения
Единственное, что надо подключить - это пироэлектрический датчик движения. В связи с этим, использовать монтажную плату не обязательно.
Сенсор можно подключить напрямую к плате Arduino. Правда учтите, что стандартнье коннекторы будут немного "гулять" в пинах на плате. Этого не будет, если вы все таки соберете схему на монтажной плате, как это показано ниже:

Скетч для 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 и загрузите серийный монитор.

Установка 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 через командную строку. Это необходимо для установки PySerial.
Для этого мы кое-что добавим в переменную PATH.

Для того, чтобы это сделать, перейдите в панель Windows Control и найдите пункт System Properties. После этого кликните на кнопку “Environment Variables” и в окне, которое появится, выберите “Path” в нижней части (System Variables). Нажмите “Edit” и после этого в конце строки “Variable Value” без удаления начального текста, добавьте следующий текст: ;C:\Python27
ВАЖНО! Не забудьте ";" перед вашей новой записью!
Для проверки новых настроек, зайдите в командную строку (DOS Prompt) и введите команду “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

Программа на 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.

После этих изменений вы можете запускать программу из командной строки / терминала с помощью команды:
python movement.py
После обнаружения движения вы должны увидеть в терминале сообщения, приведенные на рисунке ниже. С некоторой задержкой вам на email придет уведомление.

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