В связи с эпидемией коронавируса, начавшейся в прошлом году, во всем мире резко возрос спрос на бесконтактные термометры, позволяющие практически мгновенно измерять температуру человека, не вступая с ним в непосредственный контакт.
Сейчас на рынке доступно достаточно много моделей бесконтактных термометров, но ни одна из них не имеет функции оповещения по Email в случае превышения температуры определенной границы. В этой же статье мы используем всю мощь сегодняшних технологий интернета вещей (Internet of Things, IoT) и разработаем бесконтактный термометр с оповещениями по Email на основе платы Raspberry Pi, датчике MLX90614 и камеры для Raspberry Pi.
Ранее на нашем сайте мы уже рассматривали следующие проекты бесконтактных термометров:
- бесконтактный настенный термометр на Arduino с логгером данных на SD карту;
- бесконтактный умный инфракрасный термометр на Arduino и смартфоне;
- бесконтактный инфракрасный термометр на Arduino и датчике температуры MLX90614.
Необходимые компоненты
- Плата Raspberry Pi (купить на AliExpress).
- Камера для Raspberry Pi (купить на AliExpress).
- Бесконтактный инфракрасный датчик температуры MLX90614 (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
- Источник питания (5V, 2A/3A).
Авторы проекта (ссылка на оригинал в конце статьи) использовали Raspberry Pi 3 Raspbian OS. Вы можете использовать любой другой тип платы Raspberry Pi и подходящую операционную систему для нее.
Инфракрасный датчик температуры MLX90614
В настоящее время в электронных схемах широкое применение находят датчики температуры DHT11 и LM35. Но в нашем проекте нам нужен совершенно иной датчик температуры, который мог бы определять температуру конкретного объекта (не температуру окружающей среды вокруг него) без непосредственного контакта с ним. Для этой цели могут быть использованы бесконтактные датчики температуры, которые используют лазерное или инфракрасное излучение для определения температуры объекта. К числу подобных датчиков относится и MLX90614, использующий инфракрасную энергию для определения температуры объекта. Внешний вид данного датчика показан на следующем рисунке.
Датчик MLX90614 производится компанией Melexis Microelectronics Integrated system. В своем составе он содержит два устройства: инфракрасный термоэлектрический детектор (обнаруживающий элемент) и вычислительное устройство, построенное на принципах цифровой обработки сигналов. Принцип работы датчика основан на законе Стефана – Больцмана, который говорит о том, что каждое нагретое тело излучает инфракрасную энергию, интенсивность которой прямо пропорционально температуре этого тела. Обнаруживающий элемент датчика измеряет какое количество энергии инфракрасной энергии излучается выбранным объектом, а вычислительный блок конвертирует это значение энергии в значение температуры используя встроенный 17-битный АЦП (аналого-цифровой преобразователь). На выход датчика информация о температуре передается по интерфейсу I2C.
Краткие технические характеристики датчика температуры MLX90614:
- рабочее напряжение: от 3.6V до 5V;
- измеряемый диапазон температур: от -70°C до 382.2°C;
- температура окружающей среды: от -40°C до 125°C;
- точность измерения температуры: 0.02°C.
Более полную информацию о датчике MLX90614 вы можете посмотреть в даташите на него.
Подключение датчика MLX90614 к Raspberry Pi
Шаг 1. Вначале включим использование протокола I2C (enabling the I2C) в настройках платы Raspberry Pi.
Выполните команду sudo raspi-config чтобы войти в панель настроек платы. В ней выберите настройки подключения (interfacing options).
В них включите использование протокола I2C.
Шаг 2. Скачайте библиотеку (пакет) для работы с датчиком MLX90614 по адресу https://pypi.org/project/PyMLX90614/#files, на открывшейся странице сделайте правый клик мышкой на библиотеке и скопируйте адрес ссылки для ее скачивания.
Затем в терминале платы напишите wget и после нее скопированный адрес ссылки:
1 |
Wget https://files.pythonhosted.org/packages/67/8a/443af31ff99cca1e30304dba28a60d3f07d247c8d410822411054e170c9c/PyMLX90614-0.0.3.tar.gz |
В результате выполнения данной команды вы скачаете архив с именем ‘PyMLX90614-0.0.3.tar.gz’. Извлеките файлы из этого архива в каталог с помощью команды:
1 |
tar -xf PyMLX90614-0.0.3.tar.gz |
Затем установим ряд необходимых пакетов с помощью команд:
1 2 |
sudo apt-get install python-setuptools sudo apt-get install -y i2c-tools |
Затем перейдем в каталог с библиотекой с помощью команды cd PyMLX90614-0.0.3/ и выполним в нем следующую команду:
1 |
sudo python setup.py install |
После этого подключите датчик MLX90614 к плате Raspberry Pi согласно следующей схемы (разработанной с помощью программы fritzing).
После этого можно узнать I2C адрес датчика с помощью команды i2cdetect -y 1. Если все работает так, как надо, то в терминале мы должны увидеть следующую картину:
0x5A – это I2C адрес датчика MLX90614, что соответствует данным из его даташита.
Далее в файле mlxread.py мы напишем простую программу для считывания данных с датчика MLX90614.
1 2 3 4 5 6 7 |
from smbus2 import SMBus from mlx90614 import MLX90614 bus = SMBus(1) sensor = MLX90614(bus, address=0x5A) print "Ambient Temperature :", sensor.get_ambient() print "Object Temperature :", sensor.get_object_1() bus.close() |
Запустим этот файл на выполнение с помощью команды python mlxread.py. После этого вы в окне терминала должны увидеть значения температуры, считываемые с датчика. Автор проекта подносил свою руку к датчику и убирал ее, поэтому на представленной картинке показаны различные значения температуры.
На этом успешное подключение датчика MLX90614 к плате Raspberry Pi закончено.
Подключение камеры (Pi Camera) к Raspberry Pi
Шаг 1. Включите использование камеры в настройках платы.
Для этого выполните команду sudo raspi-config и в открывшейся панели настроек выберите настройки подключения (interfacing options).
Выберите в них камеру и включите ее использование (enable the camera).
Затем подключите камеру к соответствующему разъему Raspberry Pi.
Шаг 2. Для проверки того, что камера работает исправно, сделаем ей тестовое фото и сохраним его на рабочий стол платы (авторы проекта использовали Full GUI Raspbian OS version).
1 |
raspistill -o Desktop/image.jpg |
В результате выполнения этой команды у вас на рабочем столе должен появиться файл image.jpg.
Настройка SMTP протокола для передачи Email с помощью Raspberry Pi
В данном разделе статьи мы рассмотрим настройку GMAIL аккаунта для того, чтобы иметь возможность передавать письма электронной почты, сигнализирующие о том, что температура превышает заранее определенное значение.
SMTP – это простой протокол электронной почты (Simple Mail Transfer Protocol), работающий на прикладном уровне эталонной модели взаимодействия открытых систем и ответственный за передачу/прием электронной почты при помощи протокола TCP/IP.
В данной статье мы будем рассматривать работу только с аккаунтами GMAIL, поэтому, чтобы не было проблем с совместимостью, заведите себе свежий Gmail аккаунт.
По умолчанию, Google не разрешает пользователям передавать электронные письма с помощью скриптов на python. Для того, чтобы иметь возможность делать это, нам необходимо немного ослабить требования к безопасности аккаунта. Для этого выполните следующую последовательность шагов.
Шаг 1. В правом верхнем углу вашего Google аккаунта нажмите "шестеренку" для управления вашим аккаунтом.
Шаг 2. Выберите пункт Security (безопасность) и пролистайте вниз до пункта “Less Secure App Access”.
Шаг 3. Разрешите пониженную безопасность вашего аккаунта (enable the less secure app).
Шаг 4. Повторите это с другим аккаунтом email чтобы на нем можно было таким же образом передавать/принимать email от скрипта на python.
Шаг 5. Скачайте необходимые пакеты.
1 2 |
sudo apt-get install ssmtp sudo apt-get install mailutils |
Если вам не удается скопировать эти команды чтобы выполнить их, напечатайте их вручную.
Шаг 6. После того как установка этих библиотек будет закончена, нам необходимо внести изменения в файл ssmtp.conf – нам необходимо внести в него параметры отправителя электронных писем.
Для редактирования этого файла выполните команду sudo nano /etc/ssmtp/ssmtp.conf.
Пролистайте вниз файла и вставьте туда следующие строки:
1 2 3 4 5 |
mailhub=smtp.gmail.com:587 AuthUser=YourEmailAddress AuthPass=YourEmailPassword UseSTARTTLS=YES UseTLS=YES |
В этом случае вы на экране должны наблюдать примерно следующую картину:
Внешний вид собранной конструкции нашего проекта на макетной плате показан на следующем рисунке.
Объяснение программы для Raspberry Pi
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
В программе на python нам необходимо будет считывать данные с датчика температуры, сравнивать их с заранее определенным значением (границей), авторизоваться на сервисе email и затем отправлять email с прикрепленным к нему письму.
Первым делом в программе нам необходимо подключить (импортировать) все необходимые библиотеки. Электронные письма (email) можно отправлять с помощью библиотеки, а структуру письма (тема, тело письма и приложения к нему) мы будем формировать с помощью MIME (Multipurpose Internet Mail Extensions – многоцелевые расширения электронной почты в интернете).
1 2 3 4 5 6 7 8 9 10 11 |
import RPi.GPIO as gpio import picamera import time import smtplib from email.MIMEMultipart import MIMEMultipart from email.MIMEText import MIMEText from email.MIMEBase import MIMEBase from email import encoders from email.mime.image import MIMEImage from smbus2 import SMBus from mlx90614 import MLX90614 |
После этого мы укажем в программе адреса отправителя и получателя электронной почты, тему письма, содержание (тело) письма.
1 2 3 4 5 6 7 |
fromaddr = "test2718test@gmail.com" # change the email address accordingly toaddr = "electrofunedu@gmail.com" mail = MIMEMultipart() mail['From'] = fromaddr mail['To'] = toaddr mail['Subject'] = "Temperature value exceed alert" body = "Please find the attached image" |
Затем мы создадим функцию, с помощью которой мы будем отправлять электронные письма (E-mail).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
def sendMail(data): mail.attach(MIMEText(body, 'plain')) print data dat='%s.jpg'%data print dat attachment = open(dat, 'rb') image=MIMEImage(attachment.read()) attachment.close() mail.attach(image) server = smtplib.SMTP('smtp.gmail.com', 587) server.starttls() server.login(fromaddr, "test12345@") text = mail.as_string() server.sendmail(fromaddr, toaddr, text) server.quit() |
После этого мы запрограммируем функцию для захвата изображения с камеры, которое потом будет передаваться в электронном письме. Вместе с изображением мы также будем сохранять дату и время, когда оно было сделано.
1 2 3 4 5 6 7 8 9 |
def capture_image(): data= time.strftime("%d_%b_%Y|%H:%M:%S") camera.start_preview() time.sleep(5) print data camera.capture('%s.jpg'%data) camera.stop_preview() time.sleep(1) sendMail(data) |
Далее настроим ряд параметров камеры (PiCamera).
1 2 3 4 |
camera = picamera.PiCamera() camera.rotation=0 camera.awb_mode= 'auto' camera.brightness=55 |
И, наконец, с помощью команды while(1) мы организуем бесконечный цикл, в котором мы будем считывать данные с датчика температуры MLX90614 и если измеренное значение температуры будет превышать заранее определенное граничное значение, мы будем вызывать функции capture_image() и sendMail(data) чтобы передать захваченное с камеры изображение через email.
Тестирование работы проекта
Когда аппаратная часть проекта будет готова, запустите код программы проекта на python на выполнение. Он будет выводить в окно терминала значения температуры, считанные с датчика MLX90614.
Если измеренное значение температуры будет превышать заранее определенное граничное значение, будет производиться захват изображения с камеры, сохранение его в плате Raspberry Pi и отправка его через E-mail. Внешний вид оформления этого письма показан на следующем рисунке.
Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
Исходный код программы на Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
import RPi.GPIO as gpio import picamera import time import smtplib from email.MIMEMultipart import MIMEMultipart from email.MIMEText import MIMEText from email.MIMEBase import MIMEBase from email import encoders from email.mime.image import MIMEImage from smbus2 import SMBus from mlx90614 import MLX90614 fromaddr = "test2718test@gmail.com" # измените email адрес на свой toaddr = "electrofunedu@gmail.com" mail = MIMEMultipart() mail['From'] = fromaddr mail['To'] = toaddr mail['Subject'] = "Temperature value exceed alert" body = "Please find the attached image" data="" def sendMail(data): mail.attach(MIMEText(body, 'plain')) print data dat='%s.jpg'%data print dat attachment = open(dat, 'rb') image=MIMEImage(attachment.read()) attachment.close() mail.attach(image) server = smtplib.SMTP('smtp.gmail.com', 587) server.starttls() server.login(fromaddr, "test12345@") text = mail.as_string() server.sendmail(fromaddr, toaddr, text) server.quit() def capture_image(): data= time.strftime("%d_%b_%Y|%H:%M:%S") camera.start_preview() time.sleep(5) print data camera.capture('%s.jpg'%data) camera.stop_preview() time.sleep(1) sendMail(data) camera = picamera.PiCamera() camera.rotation=0 camera.awb_mode= 'auto' camera.brightness=55 while 1: bus = SMBus(1) sensor = MLX90614(bus, address=0x5A) print "Ambient Temperature :", sensor.get_ambient() print "Object Temperature :", sensor.get_object_1() temp = sensor.get_object_1() bus.close() if temp>34: capture_image() time.sleep(0.1) else: time.sleep(0.01) |