Продолжая тему Raspberry. Первые шаги "Интернета вещей" выделяю отдельно про камеру. Разделы буду добавлять по мере готовности. Темы: Делаем первый снимок Поднимаем веб-сервер nginx Выкладываем снимки и ролики для удаленного просмотра Фотоловушка.
Берем Raspberry Pi 3 подключаем камеру устанавливаем по инструкции Установка и первый запуск Воспользуемся штатными приложениями для захвата изображения и видео: Три приложения: raspistill, raspivid и raspistillyuv Подключаем камеру и делаем первый снимок Код (Bash): pi@raspberrypi:~ $ raspistill -o image.jpg В домашнем каталоге появился файл Код (Bash): pi@raspberrypi:~ $ ls -l | grep jpg -rw-r--r-- 1 pi pi 4626478 Sep 2 04:10 image.jpg Если этого не произошло, то возможно не включен модуль камеры. У меня системы выругалась: Код (Bash): pi@raspberrypi:~ $ raspistill -o image.jpg mmal: mmal_vc_component_create: failed to create component 'vc.ril.camera' (1:ENOMEM) mmal: mmal_component_create_core: could not create component 'vc.ril.camera' (1) mmal: Failed to create camera component mmal: main: Failed to create camera component mmal: Camera is not enabled in this build. Try running "sudo raspi-config" and ensure that "camera" has been enabled В командной строке включаем так: Код (Bash): pi@raspberrypi:~ $ sudo raspi-config находим пункт 5 Код (Bash): 5 Interfacing Options Configure connections to peripherals выбираем Код (Bash): P1 Camera Enable/Disable connection to the Raspberry Pi Camera переключаем в положение enabled сохраняем и перегружаемся. Делаем первый снимок.
nginx Заходим root`ом Код (Bash): pi@raspberrypi:~ $ su -l Обновляем сведения о пакетах Код (Bash): root@raspberrypi:~# apt-get update Устанавливаем Код (Bash): root@raspberrypi:~# apt-get install nginx Включаем в автозагрузку Код (Bash): root@raspberrypi:~# systemctl enable nginx Правим файл /etc/nginx/sites-available/default Вставляем туда кусок Код (Bash): root /var/www/html; autoindex on; autoindex_exact_size off; autoindex_localtime on; charset utf-8; index index.php index.html index.htm index.nginx-debian.html; server_name _; Привожу полный текст исправленного файла Код (Bash): root@raspberrypi:~# cat /etc/nginx/sites-available/default ## # You should look at the following URL's in order to grasp a solid understanding # of Nginx configuration files in order to fully unleash the power of Nginx. # http://wiki.nginx.org/Pitfalls # http://wiki.nginx.org/QuickStart # http://wiki.nginx.org/Configuration # # Generally, you will want to move this file somewhere, and start with a clean # file but keep this around for reference. Or just disable in sites-enabled. # # Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples. ## # Default server configuration # server { listen 80 default_server; listen [::]:80 default_server; # SSL configuration # # listen 443 ssl default_server; # listen [::]:443 ssl default_server; # # Self signed certs generated by the ssl-cert package # Don't use them in a production server! # # include snippets/snakeoil.conf; root /var/www/html; autoindex on; autoindex_exact_size off; autoindex_localtime on; charset utf-8; # Add index.php to the list if you are using PHP index index.html index.htm index.nginx-debian.html; server_name _; location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; } # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # include snippets/fastcgi-php.conf; # # # With php5-cgi alone: # fastcgi_pass 127.0.0.1:9000; # # With php5-fpm: # fastcgi_pass unix:/var/run/php5-fpm.sock; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # Virtual Host configuration for example.com # # You can move that to a different file under sites-available/ and symlink that # to sites-enabled/ to enable it. # #server { # listen 80; # listen [::]:80; # # server_name example.com; # # root /var/www/example.com; # index index.html; # # location / { # try_files $uri $uri/ =404; # } #} Перегружаем сервис Код (Bash): root@raspberrypi:~# service nginx restart по адресу нашего устройства ( у меня это http://172.16.5.38/ открывается тестовая страница
Выкладываем снимки и ролики для удаленного просмотра Заходим root`ом Код (Bash): pi@raspberrypi:~ $ su -l Создаем каталог и даем ему доступ Код (Bash): root@raspberrypi:~# mkdir /var/www/html/foto;chmod 777 /var/www/html/foto выходим Код (Bash): root@raspberrypi:~# exit logout pi@raspberrypi:~ $ и уже от имени пользователя pi даем команду Код (Bash): pi@raspberrypi:~ $ raspistill -o /var/www/html/foto/image.jpg по адресу http://172.16.5.38/foto/image.jpg появился наш снимок Пишем ролик Код (Bash): pi@raspberrypi:~ $ raspivid -t 15000 -o -> /var/www/html/foto/my_file.h264 на сайте видим файл my_file.h264 скачиваем и просматриваем Подробнее как делать снимок разного качества и записывать ролики в командной строке в официальной документации Например: Код (Bash): raspistill -t 30000 -tl 0 -o /var/www/html/foto/%04d.jpg -q 50 -n В течении 30 секунд делать снимки, с минимальными паузами, качеством 50 %, без предварительного просмотра. У меня камера успела сделать за 30 секунд 51 снимок. Список виден на сайте. Удалить все снимки разом можно командой Код (Bash): pi@raspberrypi:~ $ rm -rf /var/www/html/foto/*
Фотоловушка. Если нажимаем на кнопку или срабатывает датчик, то камера делает снимки или записывает ролик. Подробнее как подключать кнопку и считывать данные смотрите Считываем кнопку Делаем все тоже самое, но вставляем кусок кода, который при срабатывании кнопки также запишет данные в файл, но и выполнит команду из предыдущей темы Выкладываем снимки и ролики для удаленного просмотра Причем предварительно создаст каталог, куда камера будет складывать снимки. Код (Python): #!/usr/bin/python # -*- coding: utf-8 -*- import RPi.GPIO as GPIO from datetime import datetime,date,time,timedelta import os.path,time import subprocess GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(19, GPIO.IN) GPIO.setup(19, GPIO.IN, pull_up_down=GPIO.PUD_UP) # подтяжка к питанию f1="/var/www/html/foto/kn1.html" #Лог файл a2=open(f1, 'a') # открываем лог файл b19=0 # задаем первоначальное состояние кнопки while True : # запускаем цикл now=datetime.now() # задаем время #Далее считываем кнопку и записываем в файл if (GPIO.input(19)) == 0: if b19 == 1: a2=open(f1, 'a') a2.write('<br />' + '19' + ' on ' + str(now) + '\n'), a2.close() print('19' + ' on ' + str(now) + '\n'), b19=0 # Создаем каталог и в этот каталог камера складывает снимки now_time=datetime.now() r=(now_time.strftime('%d.%m.%Y_%H.%M.%S')) print(r) h = str('/var/www/html/foto/' + r) os.mkdir(h) da = ('raspistill -t 10000 -tl 0 -o ' + h + '/%03d.jpg -q 50 -n') subprocess.call(da, shell=True) # выполняем bash команду # Тоже самое, если кнопка переключилась в другую сторону if (GPIO.input(19)) == 1: if b19 == 0: a2=open(f1, 'a') a2.write('<br />' + '19' + ' off ' + str(now) + '\n'), a2.close() print('19' + ' off ' + str(now) + '\n'), b19=1 now_time=datetime.now() r=(now_time.strftime('%d.%m.%Y_%H.%M.%S')) print(r) h = str('/var/www/html/foto/' + r) os.mkdir(h) da = ('raspistill -t 10000 -tl 0 -o ' + h + '/%03d.jpg -q 50 -n') subprocess.call(da, shell=True) time.sleep(0.1) При каждом срабатывании кнопки на сайте появляется каталог, в котором снимки. если строчки Код (Python): da = ('raspistill -t 10000 -tl 0 -o ' + h + '/%03d.jpg -q 50 -n') поменять на Код (Python): da = ('raspivid -t 10000 -o -> ' + h + '/my_file.h264') то будет записываться ролик