敢碰就報警的Arduino Yún系統

2021-01-10 雷鋒網

如果你想做一個報警系統,目的恐怕再明確不過了-你不想讓孩子爬上櫥櫃或是冰箱偷東西吃,也不想其他人偷開你的鎖櫃。當然啦,可能你會想給偷吃食物的寵物拍張照片。或者,你想學學美劇《辦公室》裡Dwight Schrute所扮演的角色,看看是誰把同事的工作材料換成了果凍。那麼問題來了,你該怎麼做呢?

是的,你可以在櫥櫃/冰箱/鎖櫃裡放上一個設備,一旦它監測到有動靜,就會拍一張照片然後發送到你的電子郵件裡。還有如果你會IFTTT(讓網際網路為你服務)的話,甚至可以自動把那些「小偷們」的照片發到社交媒體上,讓全世界看看他們的臉。

首先,讓我們先來欣賞一下小哥浮誇的演技:

這個報警系統項目,由一個運動傳感器(PIR),一個攝像頭,以及一個支持無線Wi-Fi連接設備組成。筆者選擇了Arduino Yún,因為它非常易於使用,還能輕鬆配置無線Wi-Fi,而且如果你想換成RaspberryPi,也很容易。當然啦,如果你使用RaspberryPi的話,Wi-Fi配置可能會略微麻煩一些,因為它必須要連接到一臺計算機上才能進行配置操作,而使用Arduino Yún就相對輕鬆多了,任何人都可以在上面直接配置。這個報警系統項目其實非常簡單,即便你沒有什麼焊接/電氣方面的技巧,也能在幾分鐘時間裡輕鬆完成組裝。廢話不多說,趕緊來看看怎麼做吧。

第一步 Arduino基本配置

首先,你需要配置自己的Arduino Yún網絡設置,如果你按照教程一步步操作,其實非常簡單。 點擊查看教程.

完成配置之後,你需要測試Arduino的連接狀況。打開瀏覽器,輸入http://arduino.local,然後即能看到Arduino網頁界面了。

如果一切操作正常,打開SSH會話。

$ sshroot@arduino.local

默認密碼是:「arduino」。

然後,讓我們來安裝一些有用的軟體包

$opkg update

$opkg install openssh-sftp-server

那麼,為什麼要安裝「openssh-sftp-server」呢?因為這個軟體包可以讓你從Arduino上面輕鬆上傳或下載文件。現在,你可以使用一個通用的SFTP客戶端,比如filezilla,transmit,或是cyberduck等等,這樣就不用輸入麻煩的SCP命令來進行文件傳輸了。

然後,為了兼容Python,我們還需要安裝一個SSL支持包(感謝sbkirby!)。因為在默認軟體包裡,並沒有包含這個軟體支持包。

$opkg update

$opkg install python-openssl

筆者牆裂推薦你可以在Arduino Yún上插一個SD卡(如果你有一個的話),Arduino Yún設備會自動分配文件路徑,地址是mnt/sda1。

然後,我們要在Arduino Yún上面安裝USB攝像頭和USB音效卡。

第二步 安裝並測試USB攝像頭

通過opkg套件管理系統,已經有支持Linino的UVC軟體包了,因此安裝攝像頭可以說是非常簡單的一個步驟。是需要通過ssh連接到Yún上面,然後輸入:

$ opkg update

$ opkg install kmod-video-uvc

就可以了。

不過我們還需要一個可以拍照片的軟體,筆者使用過一款容量極小,但又非常便於使用的拍照軟體fswebcam,按照如下命令,安裝即可。

$ opkg install fswebcam

第三步 拍攝你的第一張照片

首先要確保你使用了SD卡作為存儲,否則Arduino內存會很快就被耗盡。好了,如果你正在使用SD存儲卡的話,你應該已經能夠看到它的安裝路徑地址了/mnt/sda1.如果你還沒有使用,那麼請將FAT32格式的SD卡插入到設備的SD卡插槽裡面,並重啟你的Arduino設備。

現在,請把攝像頭插進設備的USB埠,然後輸入:

$ cd /mnt/sda1

$ fswebcam test.png

如果一切正常的話,你現在就能拍攝自己的第一張照片啦!注意看看你的SD卡裡的內容哦,:)

這意味著,現在我們可以通過Yún’s Bridge庫,在自己的Arduino設備裡面拍照片,按照下面這種操作方式就能實現:

Process.runShellCommand("fswebcam /mnt/sda1/test.png");

第四步 安裝音效卡

在Yún上打開一個ssh會話,然後輸入:

$opkg install kmod-usb-audio

$opkg install madplay

完成安裝之後,現在Arduino Yún設備就有了音效卡支持了。筆者只嘗試了下MP3格式的音樂播放,還沒有自己錄製一些音頻,但是很快就會去嘗試下!

如果想要測試一下音效卡效果,其實也非常簡單,你只需在SD卡裡複製一個MP3音頻文件,然後輸入:

$cd /mnt/sda1

$madplay yoursound.mp3  

這意味著現在我們可以通過Yún’s Bridge庫,在Arduino設備裡面播放聲音了,按照下面這種操作方式就能實現: 

Process.runShellCommand("madplay /mnt/sda1/test.mp3");

第五步 電子郵件腳本

現在,我們的監控設備可以拍照片並且支持播放聲音….但是我們還想要更多功能!我們想讓這款設備能通過電子郵件發送文件。

所以,我們該怎麼做呢?答案其實非常簡單….一個python腳本就能搞定!Arduino Yún整合了Temboo庫,筆者想讓這個監控系統更加具有兼容性,因此我們會使用一個非常簡單的python腳本編碼圖像文件,並通過電子郵件發送出去。

筆者選擇的電子郵箱是Gmail,但是這個代碼腳本其實可以選擇任何支持SMTP伺服器的電子郵箱。

你可以創建一個新文件,稱之為「sendemail.py」,然後把下面這段代碼複製進去,

# coding=utf-8

# Copyright (C) 2014  Stefano Guglielmetti

# This program is free software: you can redistribute it and/or modify

# it under the terms of the GNU General Public License as published by

# the Free Software Foundation, either version 3 of the License, or

# (at your option) any later version.

# This program is distributed in the hope that it will be useful,

# but WITHOUT ANY WARRANTY; without even the implied warranty of

# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License

# along with this program. If not, see <http://www.gnu.org/licenses/>.

import smtplib, os, sys

from email.MIMEMultipart import MIMEMultipart

from email.MIMEBase import MIMEBase

from email.MIMEText import MIMEText

from email.Utils import COMMASPACE, formatdate

from email import Encoders

#From address, to address, subject and message body

from_address    = 'FROM_ADDRESS@EMAIL.COM'

to_address      = ['YOUR_ADDRESS@EMAIL.COM']

email_subject   = 'Alert!!! Zombies!!! Ahead!!!'

email_body      = 'A non dead intruder has been detected and needs to be eliminated!'

# Credentials (if needed)

username = 'EMAIL_LOGIN'

password = 'EMAIL_PASSWORD'

# The actual mail send

server = 'smtp.gmail.com:587'

def send_mail(send_from, send_to, subject, text, files=[], server="localhost"):

    assert type(send_to)==list

    assert type(files)==list

    msg = MIMEMultipart()

    msg['From'] = send_from

    msg['To'] = COMMASPACE.join(send_to)

    msg['Date'] = formatdate(localtime=True)

    msg['Subject'] = subject

    msg.attach( MIMEText(text) )

    for f in files:

        part = MIMEBase('application', "octet-stream")

        part.set_payload( open(f,"rb").read() )

        Encoders.encode_base64(part)

        part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(f))

        msg.attach(part)

    smtp = smtplib.SMTP(server)

    smtp.starttls()

    smtp.login(username,password)

    smtp.sendmail(send_from, send_to, msg.as_string())

    smtp.close()

send_mail(from_address, to_address, email_subject, email_body, [sys.argv[1]], server) #the first command line argument will be used as the image file name

現在,你需要把相關電子郵件設置做下改動,如下

#From address, to address, subject and message body

from_address    = 'FROM_ADDRESS@EMAIL.COM'

to_address      = ['YOUR_ADDRESS@EMAIL.COM']

email_subject   = 'Alert!!! Zombies!!! Ahead!!!'

email_body      = 'An undead intruder has been detected and needs to be eliminated!' 

# Credentials (if needed)

username = 'EMAIL_LOGIN'

password = 'EMAIL_PASSWORD'

# The actual mail send

server = 'smtp.gmail.com:587'

接下來,你可以通過SFTP(或是SCP,如果你喜歡的話)把這段腳本文件上傳到Arduino Yún的SD卡裡,然後再次打開SSH會話,輸入下面這段命令:

$cd /mnt/sda1

$python sendemail.py test.png

幾秒鐘之後,你就會收到一封電子郵件,附件就是Arduino Yún拍攝的照片,是不是很神奇!

第六步 讓我們搭設電路板!

別擔心,這一個步驟其實也是非常簡單的。你根本用不著焊接什麼材料,所有部件都能靠組裝完成。筆者使用了這款PIR傳感器,是因為它即可靠,又方便使用。你可以參照下圖來進行相關操作:

我們已經連上了這個PIR傳感器。如果監控系統設備發現了一些動作,上面的LED燈就會打開。

第七步 現在是時候加上Arduino Sketch了

在Arduino IDE上複製下面這段代碼,然後上傳到你的Yún上:

 * Switches a LED, takes a picture and sends it via email

 * according to the state of the sensors output pin.

 * Determines the beginning and end of continuous motion sequences.

 *

 * @author: Stefano Guglielmetti / stefano (at) mikamai (dot) com / http://jeko.net

 * @date:   feb 5, 2014  

 *

 * based on the example by Kristian Gohlke / krigoo (_) gmail (_) com / http://krx.at

 * http://playground.arduino.cc/Code/PIRsense

 *

 * stefano guglielmetti (cleft) 2014 

 *

 * released under a creative commons "Attribution-NonCommercial-ShareAlike 2.0" license

 * http://creativecommons.org/licenses/by-nc-sa/2.0/de/

 *

 *

 * The Parallax PIR Sensor is an easy to use digital infrared motion sensor module. 

 * (http://www.parallax.com/detail.asp?product_id=555-28027)

 *

 * The sensor's output pin goes to HIGH if motion is present.

 * However, even if motion is present it goes to LOW from time to time, 

 * which might give the impression no motion is present. 

 * This program deals with this issue by ignoring LOW-phases shorter than a given time, 

 * assuming continuous motion is present during these phases.

 *  

 */

#include <Bridge.h>

/////////////////////////////

//VARS

//the time we give the sensor to calibrate (10-60 secs according to the datasheet)

int calibrationTime = 10;        

//the time when the sensor outputs a low impulse

long unsigned int lowIn;         

//the amount of milliseconds the sensor has to be low 

//before we assume all motion has stopped

long unsigned int pause = 5000;  

boolean lockLow = true;

boolean takeLowTime;  

int pirPin = 6;    //the digital pin connected to the PIR sensor's output

int ledPin = 13;

Process p;

String imageName;

/////////////////////////////

//SETUP

void setup(){

  Bridge.begin();

  Serial.begin(9600);

  pinMode(pirPin, INPUT);

  pinMode(ledPin, OUTPUT);

  digitalWrite(pirPin, LOW);

  //give the sensor some time to calibrate

  Serial.print("calibrating sensor ");

  for(int i = 0; i < calibrationTime; i++){

    Serial.print(".");

    delay(1000);

  }

  Serial.println(" done");

  Serial.println("SENSOR ACTIVE");

  delay(50);

}

 

////////////////////////////

//LOOP

void loop(){

  if(digitalRead(pirPin) == HIGH){

    digitalWrite(ledPin, HIGH);   //the led visualizes the sensors output pin state

    if(lockLow){  

      //makes sure we wait for a transition to LOW before any further output is made:

      lockLow = false;            

      Serial.println("---");

      Serial.print("motion detected at ");

      Serial.print(millis()/1000);

      Serial.println(" sec"); 

      imageName = uniqueFileName("png"); //generate a new, uniqe file name

      p.runShellCommand("fswebcam /mnt/sda1/" + imageName); //takes the picture

      while(p.running()); //wait till the process ends

      p.runShellCommand("madplay /mnt/sda1/sounds/sirena.mp3"); //play the siren sound

      while(p.running()); //wait till the process ends

      p.runShellCommand("python /mnt/sda1/sendemail.py /mnt/sda1/" + imageName); //sends the picture via email

      while(p.running()); //wait till the process ends

      delay(50);

    }         

    takeLowTime = true;

  }

  if(digitalRead(pirPin) == LOW){       

    digitalWrite(ledPin, LOW);  //the led visualizes the sensors output pin state

    if(takeLowTime){

      lowIn = millis();          //save the time of the transition from high to LOW

      takeLowTime = false;       //make sure this is only done at the start of a LOW phase

    }

    //if the sensor is low for more than the given pause, 

    //we assume that no more motion is going to happen

    if(!lockLow && millis() - lowIn > pause){  

      //makes sure this block of code is only executed again after 

      //a new motion sequence has been detected

      lockLow = true;                        

      Serial.print("motion ended at ");      //output

      Serial.print((millis() - pause)/1000);

      Serial.println(" sec");

      delay(50);

    }

  }

}

 

 

/* A simple function to generate unique timestamp based filenames */

String uniqueFileName(String ext){

  String filename = "";

  p.runShellCommand("date +%s");

  while(p.running()); 

  while (p.available()>0) {

    char c = p.read();

    filename += c;

  } 

  filename.trim();

  filename += "." + ext;

 

  return filename;

}  

十秒鐘之後(校準時間),就將開始工作,並拍攝照片了!!!

一切搞定!下面這張照片,就是組裝完成後的效果圖。在GitHub上,有這個項目的詳細文檔。

 via makezine

關注硬創邦微信號(leiphone_bang),加入全球創客馬拉松主群(群號:259592983),參與我們的互動討論,獲得最新比賽信息~

雷鋒網原創文章,未經授權禁止轉載。詳情見轉載須知。

相關焦點

  • [新課推薦]人工智慧科普活動資源包配套課程Micro:bit+ Arduino...
    3黑夜報警利用主板、拓展板製作黑夜報警系統4 排雷報警利用主板、拓展板製作黑色排雷報警系統5電子蠟燭利用microbit擴展板(含聲音傳感器)、主板、製作一個電子蠟燭6測距顯示利用microbit擴展板、主板、超聲波傳感器製作一個測距系統7音樂播放利用microbit擴展板(含蜂鳴器)、主板、製作一個音樂播放系統8我愛交友
  • 如何安裝紅外對射報警系統
    如何安裝紅外對射報警系統 佚名 發表於 2020-04-13 14:24:01 前言: 紅外線報警系統是由若干個紅外線報警器構成的一個整體的防盜系統,
  • arduino從零開始(4)PWM與呼吸燈
    在arduino中,我們常用PWM來驅動LED的暗亮程度,電機的轉速等。我們知道,在數字電路中,電壓信號是離散的: 不是 0(0V)  就是 1(5V或者3.3V), 那麼如何輸出介於 0v 和  5V之間的某個電壓值呢?簡單來說就是在一個周期內讓電壓在0V與5V之間快速切換,根據5V的佔比便可以模擬出0v到5v之間的不同電壓。
  • 智能家居控制-arduino紅外遙控控制燈
    上一篇文章介紹了 arduino接受智能家具系統中的紅外遙控的解碼在此基礎上,今天就做一個遙控器控制的燈,我們可以將燈換成繼電器,這樣的話就實現了,用紅外遙控機,控制家裡的電器開關,比如燈,電視,插座,洗衣機等接線圖幾原理圖如上,一個板子一個紅外接收器,一個燈(可以換成你想控制的任何設備
  • 數碼管與ARDUINO 開發板的連接使用
    數碼管模塊與arduino連接示意圖接線說明:數碼管的VCC –arduino上的5V數碼管的GND -- arduino上的GND數碼管的DS -- arduino上的A0數碼管的ST_CP -- arduino上的A1數碼管的SH_CP -- arduino上的A2
  • 火災自動報警系統可以分為區域報警系統、集中報警系統以及控制中
    火災自動報警系統可以分為區域報警系統、集中報警系統以及控制中
  • 萬能超的arduino學習日記(一)
    本科時候有接觸過arduino,但是由於導師方向原因,轉做了3D列印和動力學分析,所以這裡是啥都會一點點的萬能超,希望能夠和大家一起學習討論。最近由於興趣原因,決定重新撿起arduino,所以決定寫這個萬能超的arduino學習日記跟大家一起重新學習。最開始的入門學習,我選擇跟B站太極創客的學習視頻,因為有基礎,選擇二倍速觀看學習。
  • 紅外對射報警系統 周界報警系統連接圖原理
    很多關注的朋友會留言問除了監控領域,比如樓宇對講,比如停車場系統,比如周界報警系統能不能給寫寫。相信這些領域,智能化公司都會用到,我也不例外,當初也在施工一線待過,但是每個產品廠家的產品接法不一定相同,每個時期的主流產品也不同。
  • 一文看懂arduino驅動uln2003操作步進電機的方法
    arduino驅動uln2003操作步進電機的方法   1、網上買的步進電機,很多接線順序都不對。「IN0~IN4」連接arduino的4個數字口(在代碼裡進行相應的設置)。   3、28BYJ-48步進電機的齒輪減速比為64:1,轉速約15轉/分鐘,一些軟體採用某些手段和高電壓電源(如12伏直流)也能達到約25轉/分鐘的轉速。   4步控制信號序列:11.25度/步,32步旋轉一周。   8步控制信號序列:5.625度/步, 64步旋轉一周。
  • 科學家:碰都不敢碰
    科學家:碰都不敢碰我們絕大部分人對鐵達尼號的了解基本上都是來自於電影,被裡面的情景深深打動,而電影也是根據真正的鐵達尼號沉沒進行改編的。其實在最初的時候,就有科學家花費巨大的財力去發掘它,後來經過七十年的時間,才找到它,實際上人類是很想發掘的,但是確實無法發掘,科學家還曾表示:碰都不能碰。
  • 非洲沙漠長出「神奇西瓜」,人們卻不敢吃,當地人:碰都不要去碰
    但其實沙漠裡面有很多的生物,很多動物白天隱藏在沙漠的最底層,到了晚上這些動物就會出來覓食,白天溫度太高,這些動物可不敢跑出來。那麼在沙漠裡除了有螞蟻,蛇等之類的動物,還有一些植物的存在。無水的非洲沙漠裡,卻長出了西瓜,這讓人不得不感慨,地球的神奇之處,人們卻不敢吃,當地人:碰都不要去碰。這到底是怎麼回事呢?一起來看看吧。
  • Arduino使用光敏電阻實驗
    今天我來用光敏電阻加arduino板子來實現光控燈。 工具/原料 arduino板子 光敏電阻 電阻 LED燈 麵包板
  • 什麼是周界防範報警系統?常見的周界防範報警系統有哪幾個?
    百家號/文 作者:陝西鑫安安防什麼是周界防範報警系統?常見的周界防範報警系統有哪幾類?今天小鑫就帶大家來做簡單的了解。周界防範報警系統一、什麼是周界防範報警系統?周界防範報警系統就是對指定邊界所做的報警防範體系。二、周界防範系統的目的?當有人攀爬和穿越周界防範報警區域時,能可靠報警,並且能夠聯動視頻監控系統精確定位報警區域,及時守護所防範區域的安全。
  • 家用火災報警系統調試
    大家好,歡迎繼續關注智能建築之機電安裝,今天將為大家帶來的內容是電氣火災報警系統調試第二分項:家用火災報警系統調試。火災報警系統組成火災報警系統,使監測區域的煙霧濃度、溫度達到探測器的報警設定值;(2)探測器應發出火災報警聲信號,聲報警信號的聲壓級應在45dB~75dB之間,並應採用逐漸增大的方式,初始聲壓級不應大於45dB;(3)家用火災報警控制器的火災報警和信息顯示功能應符合標準規定。
  • 火災自動報警系統類型與組成
    一、系統構成火災自動報警系統主要由觸發器件、火災報警裝置、火災報警裝置和其他輔助功能的裝置組成,如圖所示(《建築消防技術》P312)。2、火災報警控制器火災報警控制器是自動報警系統的重要組成部分,它的先進性是現代建築消防系統的重要標誌。火災報警控制器接收火災探測器送來的火警信號,經過運算(邏輯運算)、處理後認定火災,發出火警信號。
  • 報警系統與探測器接線方式圖解
    報警系統與探測器接線方式圖解   有線防盜報警器因為穩定,價格實惠,所以受到一般工程商的信賴,對於一般不是專業的人員來說,似乎連接有線探測器和防盜報警主機有點困難,此文將詳細介紹如何使用有線防區及有線探測器與報警系統之間的連接。
  • 火災自動報警系統規範解讀_2020年火災自動報警系統規範解讀資料...
    資料目錄 1總則 2術語 3基本規定 4消防聯動控制的設計 5火災探測器的選擇 6系統設備的設置 7住宅建築火災報警系統 8可燃氣體探測報警系統 9電氣火災監控系統 10系統供電 11布線 12典型場所的火災自動報警系統 附錄E探測器安裝間距的極限曲線 附錄F不同高度的房間梁對探測器設置的影響 附錄G按梁間區域面積確定一隻探測器保護的梁間區域的個數內容簡介  本資料是GB50116
  • 超美的野花馬纓丹,在農村無人敢碰!竟然是這個原因!
    在農村有一種超美的野花叫馬纓丹,馬纓丹是馬鞭草科馬纓丹屬植物,雖然很美,但是卻無人敢碰!馬纓丹它的侵略性比較強,所以在全球被譽為10種有害的雜草之一。馬纓丹的介紹馬纓丹是直立或蔓性常綠灌木,又叫五色梅、臭草,為常見的庭園栽培觀賞植物,在北方則為盆栽觀賞花木。
  • 火災自動報警系統,火災報警控制器、聯動控制器的區別及點數設計
    簡單說就是給到報警控制器信號,報警控制器會根據預先設定好的邏輯公式進行判斷,當符合邏輯設定的時候就會報警,但是單純火災報警控制器不具備控制設備動作的功能,如果希望控制設備動作時,則需要在火災報警控制器上再連不同的控制器。比如氣體滅火系統中,按照規定氣體滅火系統應由專用的氣體滅火控制器。
  • 火災報警系統的防雷設計方案-火災報警,感煙探測器,火災報警-消防...
    火災報警系統的防雷設計方案2010/1/29/10:11來源:廣州市奧天科技發展有限公司>作者:AOTEM    【慧聰消防網】 一、概況     主要有火災報警及消防聯動控制系統(FAS)是有建築物內部裝置感煙探測器、感溫探測器及模擬顯示盤構成的,當發生火災時能自動噴灑水或其他滅火液體氣體,經防排煙系統排除火災所產生的煙霧並防止其漫延的系統總稱