在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

聚豐項(xiàng)目 > 基于Intel Edision的Eclipse實(shí)現(xiàn)門禁確認(rèn)系統(tǒng)

基于Intel Edision的Eclipse實(shí)現(xiàn)門禁確認(rèn)系統(tǒng)

當(dāng)有人按門鈴時(shí),發(fā)出聲音提示有人來訪;LCD上顯示一條來訪信息;聲音響起后,將有30s的時(shí)間輸入密碼確認(rèn),這里使用瀏覽器輸入密碼。

anger0925 anger0925

分享
6 喜歡這個(gè)項(xiàng)目
團(tuán)隊(duì)介紹

anger0925 anger0925

團(tuán)隊(duì)成員

常旭磊 創(chuàng)客

分享
項(xiàng)目簡介
當(dāng)有人按門鈴時(shí),發(fā)出聲音提示有人來訪;LCD上顯示一條來訪信息;聲音響起后,將有30s的時(shí)間輸入密碼確認(rèn),這里使用瀏覽器輸入密碼。
硬件說明

硬件搭建

1、Intel edison開發(fā)板和Arduino breakout套件;

2、Grove按鍵

3、Grove蜂鳴器

4、Grove RGB LCD顯示器

組裝:

1、Grove按鍵連接到D6上;

2、Grove蜂鳴器連接在D5上;

3、Grove RGB LCD顯示器接在任意一個(gè)I2C接口上。


   


軟件說明

準(zhǔn)備工作

1)要使用web服務(wù)器,需要使用 Crow* Web 微框架,以提供易于使用,但功能強(qiáng)大的 Web 服務(wù)器。 Crow 庫要求 libboost 軟件包安裝于英特爾? Edison 開發(fā)板,并將所需的包含和庫文件添加至 Eclipse* Cross G++ Compiler 和 Cross G++ Linker。

  開發(fā)板上已經(jīng)安裝了bootst,通過opkg info boost查看版本號(hào)。


opkg install boost升級(jí),

已經(jīng)是最新版本。

接下來需要將庫和包含文件從開發(fā)板復(fù)制到運(yùn)行 Eclipse 的計(jì)算機(jī),以便 Cross G++ Compiler 和 Cross G++ Linker 能夠找到它們。

/usr/include下的boost目錄拷貝到iss-iot-win\devkit-x86\sysroots\i586-poky-linux\usr\include下

/usr/lib下的libboost前綴的庫全部拷貝到iss-iot-win\devkit-x86\sysroots\i586-poky-linux\usr\lib下。


#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <unistd.h>
#include <sstream>
#include <thread>
#include <ctime>
#include <chrono>
#include <string>

#include <jhd1313m1.h>
#include "biss0001.hpp"

#include "../lib/restclient-cpp/include/restclient-cpp/restclient.h"

#include "datastore.h"
#include "mqtt.h"

#include "../lib/crow/crow_all.h"
#include "../src/html.h"
#include "../src/css.h"
#include <buzzer.hpp>
#include <grove.hpp>
//#include <jhd1313m1.hpp>


using namespace std;

bool countdownStarted = false;
bool disarmed = false;
bool alarmTriggered = false;

chrono::time_point<chrono::system_clock> detectTime;

chrono::time_point<chrono::system_clock> disarmTime;

//讀取密碼
string access_code() {
  if (!getenv("CODE")) {
    return "4321";
  } else {
    return getenv("CODE");
  }
}

//通知遠(yuǎn)程數(shù)據(jù)存儲(chǔ)
void notify(std::string message) {
          //time此函數(shù)會(huì)返回從公元 1970 年1 月1 日的UTC 時(shí)間從0 時(shí)0 分0 秒算起到現(xiàn)在所經(jīng)過的秒數(shù)。
                //如果t 并非空指針的話,此函數(shù)也會(huì)將返回值存到t 指針?biāo)傅膬?nèi)存.
                //然后調(diào)用localtime將time_t所表示的CUT時(shí)間轉(zhuǎn)換為本地時(shí)間,(我們是+8區(qū),比CUT多8個(gè)小時(shí))
  time_t now = std::time(NULL);
  char mbstr[sizeof "2011-10-08T07:07:09Z"];
  strftime(mbstr, sizeof(mbstr), "%FT%TZ", localtime(&now));

  stringstream text;
  text << "{\"state\":";
  text << "\"" << message << " " << mbstr << "\"}";

  log_mqtt(text.str());
  log_datastore(text.str());
}

struct Devices
{
  upm::Jhd1313m1* screen;
  upm::BISS0001* motion;
  upm::GroveButton* button;
    upm::Buzzer* buzzer;


  Devices(){
  };
 
  void init() {

    screen = new upm::Jhd1313m1(0);

    motion = new upm::BISS0001(4);

     buzzer = new upm::Buzzer(5);
     stop_buzzing();

      button = new upm::GroveButton(6);
  };

  void cleanup() {
    delete screen;
    delete motion;
    delete button;
    delete buzzer;
  }

  //LCD顯示
  void message(const string& input, const size_t color = 0x0000ff) {
   // cout << input << std::endl;//輸出到終端打印。我這里不需要
    size_t red   = (color & 0xff0000) >> 16;
    size_t green = (color & 0x00ff00) >> 8;
    size_t blue  = (color & 0x0000ff);

    string text(input);
    text.resize(16, ' ');

    screen->setCursor(0,0);
    screen->write(text);
    screen->setColor(red, green, blue);
  }

  void start_alarm_countdown() {
          //檢測到按鍵
    countdownStarted = true;
    detectTime = chrono::system_clock::now();//當(dāng)前時(shí)間
    string msg = "Person detected";//顯示有人
    message(msg, 0xff00ff);
    notify(msg);
    start_buzzing();
  }

 
  //見到到有,但沒有輸入確認(rèn)
  void trigger_alarm() {
    alarmTriggered = true;
    string msg = "Alarm triggered!";
    message(msg, 0xff00ff);
    notify(msg);
    stop_buzzing();
  }

  void disarm() {
    disarmTime = chrono::system_clock::now();
    disarmed = true;
    countdownStarted = false;
    alarmTriggered = false;
  }

  void reset() {
    disarmed = false;
    countdownStarted = false;
    alarmTriggered = false;
    stop_buzzing();
  }

  int elapsed_since(chrono::time_point<chrono::system_clock> tp) {
    chrono::duration<double> elapsed;
    chrono::time_point<chrono::system_clock> now;
    now = chrono::system_clock::now();
    elapsed = now - tp;
    return elapsed.count();
  }

  void detect() {
    if (alarmTriggered) {
      if (elapsed_since(detectTime) > 120) reset();//2分鐘后恢復(fù)
    } else if (disarmed) {
      if (elapsed_since(disarmTime) > 120) reset();//確認(rèn)后,預(yù)留2分鐘,客人通過
    } else if (countdownStarted) {
      if (elapsed_since(detectTime) > 30) trigger_alarm();//按鍵后30s,沒有輸入確認(rèn)密碼,報(bào)警
    } else if (button->value()) {
      start_alarm_countdown();//有按鍵,報(bào)警準(zhǔn)備開始
    } else {
      message("Monitoring...");
    }
  }

   void start_buzzing() {
     buzzer->setVolume(0.5);
     buzzer->playSound(2600, 0);
   }

   void stop_buzzing() {
           buzzer->setVolume(0);
     buzzer->stopSound();
     buzzer->stopSound();
   }

};

void runner(Devices& devices) {
  for (;;) {
    devices.detect();
    usleep(500);
  }
}

Devices devices;

void exit_handler(int param)
{
  devices.cleanup();
  exit(1);
}

int main() {
  signal(SIGINT, exit_handler);

  mraa_platform_t platform = mraa_get_platform_type();
  if ((platform != MRAA_INTEL_GALILEO_GEN1) &&
    (platform != MRAA_INTEL_GALILEO_GEN2) &&
    (platform != MRAA_INTEL_EDISON_FAB_C)) {
    std::cerr << "ERROR: Unsupported platform" << std::endl;
    return MRAA_ERROR_INVALID_PLATFORM;
  }

  devices.init();

  std::thread t1(runner, std::ref(devices));

  crow::SimpleApp app;


  CROW_ROUTE(app, "/")
  ([]() {
    std::stringstream text;
    text << index_html;
    return text.str();
  });

  CROW_ROUTE(app, "/alarm")
  ([](const crow::request& req) {
    if(req.url_params.get("code") != nullptr) {
      if (access_code() == req.url_params.get("code")) {
        devices.disarm();
      } else {
        notify("invalid code");
      }
    }

    return crow::response("OK");
  });

  CROW_ROUTE(app, "/styles.css")
  ([]() {
    std::stringstream text;
    text << styles_css;
    return text.str();
  });

  // start web server
  app.port(3000).multithreaded().run();

  // wait forever for the thread to exit
  t1.join();

  return MRAA_SUCCESS;
}

演示效果

1、上電

2、按鍵

這個(gè)時(shí)候門鈴響起,如果從web上能確認(rèn)密碼。那么門打開,有2分鐘時(shí)間讓人通過。然后恢復(fù)到起始狀態(tài),等待按鍵。

3、如果按鍵后,30秒內(nèi),還沒有web密碼確認(rèn)。那么產(chǎn)生報(bào)警。


等待一段時(shí)間恢復(fù)到起始狀態(tài)等待按鍵。


評(píng)論區(qū)(1 )
  • 動(dòng)心忍性1234: 您好我是無線電雜志的編輯,我們對(duì)您的項(xiàng)目十分感興趣,請(qǐng)問您有興趣投稿嗎?成為我們的作者除稿費(fèi)外還有其他優(yōu)厚條件。敬請(qǐng)參與。投稿請(qǐng)聯(lián)系QQ260534978.

    回復(fù)

主站蜘蛛池模板: 丁香在线视频 | 日本大片成人免费播放 | 国产三级精品播放 | 在线视频亚洲色图 | 久久婷婷丁香七月色综合 | 亚洲精品自拍区在线观看 | 色网视频 | 一区二区三区久久 | 丁香花高清在线观看 | 偷拍福利视频 | 天天插狠狠干 | 毛片在线网站 | 成人精品人成网站 | 亚洲日本黄色 | 欧美在线观看视频一区 | 两性色午夜视频免费播放 | 亚洲综合欧美日本另类激情 | 777色狠狠一区二区三区香蕉 | 六月丁香婷婷天天在线 | 欧美日韩亚洲国产一区二区综合 | 欧美在线天堂 | 99久久免费中文字幕精品 | 狼色在线视频 | 一级毛片一级毛片一级毛片aa | 日本大片免a费观看在线 | 欧美人与动性行为网站免费 | 3344在线| 四虎永久免费最新在线 | 在线欧美色 | 欧美在线一区二区三区 | 亚洲综合色婷婷中文字幕 | 在线亚洲小视频 | 伊人久久大香线蕉综合亚洲 | 多男一女一级淫片免费播放口 | 久久精品久| 黄色三级免费网站 | 亚洲综合国产一区二区三区 | 伊人手机在线观看 | 九色视频播放 | 欧美精品影院 | 欧美婷婷 |