산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

물리적 홈 자동화 인터페이스

구성품 및 소모품

TowerPro 서보
× 1
작은 경첩
× 1
버튼
× 1
Arduino 윤
× 1
100A 변류기
× 1
저항 및 커패시터
× 7

이 프로젝트 정보

이 프로젝트에 대한 빠른 설명은 아래 두 개의 비디오를 참조하십시오.

물리적 홈 자동화 인터페이스실제 제어와 인터페이스

인터페이스는 정보를 전달하고 사용자가 사물을 제어할 수 있도록 합니다. 대부분의 홈 자동화 플랫폼은 "가상 인터페이스"에 의존합니다. 스마트 폰을 꺼내 앱을 열어 집에 무슨 일이 일어나고 있는지 확인하고 조명을 켜고 끕니다. 자리를 비울 때 잘 작동합니다. 그러나 가상 표현을 보고 디스플레이의 정보를 구문 분석하려면 작업이 필요합니다. 집중이 필요하고 직관적이지 않습니다.

저는 "물리적 인터페이스"를 만들고 싶었습니다. 실제 집에서 제가 알고 싶은 것을 물리적으로 모방한 작은 모델 하우스였습니다. 그래서 차고 문이 열리면 모델의 차고 문이 열리길 원합니다. 이 모델 하우스는 내 커피 테이블에 앉을 수 있고, 잠자기 전에 차고 문이 열려 있는지 확인할 수 있습니다. 또는 VPN을 통해 집에 연결된 직장에서 책상에 이것을 가질 수 있습니다. 일을 하다 보면 현관문을 열어두었는지 확인할 수 있다. 이 물리적 인터페이스는 내가 만든 만큼 창의적이거나 실용적일 수 있습니다.

따라서 다음 단계에서는

<올>
  • 문 위치, 에너지 사용량, 조명이 켜져 있는지 여부 등을 표시하는 모델 하우스를 만드십시오.
  • Open Energy Monitor Arduino 라이브러리를 사용하여 에너지 모니터를 구축하고 모델 하우스 및 OpenHAB에 에너지 사용 정보 제공
  • 모델 하우스에 문/창 위치를 보내는 몇 가지 방법을 제공합니다. DIY 홈 자동화 시스템에서 Wink Hub와 Wink "Tripper" 접촉 센서 데이터를 어떻게 활용할 수 있는지 보여주세요.
  • Wink와 Arduino를 사용하여 실제 차고 문을 열고 닫거나 조명을 켜고 끄는 것과 같은 출력을 수행하세요.
  • 모델 하우스에는 Arduino 컨트롤러에 연결된 일부 서보와 LED가 있습니다. 이 컨트롤러는 도어 위치와 에너지 사용량을 나타내는 MQTT 메시지를 구독하고 그에 따라 서보를 작동합니다. 표시등이 켜져 있는지 여부를 나타내는 LED와 동일한 아이디어입니다. 이 센서 정보를 MQTT 브로커로 가져오는 몇 가지 옵션이 있으므로 이후 단계에서 자세히 설명하겠습니다. 그 중심에는 MQTT 브로커(Mosquitto)와 OpenHAB를 실행하는 Raspberry Pi가 있습니다. OpenHAB는 모델하우스를 운영하기 위해 필요하지 않지만 스마트폰 앱에 대한 인터페이스를 제공하고 원격 모니터링 및 작동을 허용하기 위해 필요합니다. 물리적 인터페이스가 필요하다고 해서 가상 인터페이스를 버릴 준비가 된 것은 아닙니다.



    모델 하우스에도 두 개의 버튼이 있습니다. 버튼 중 하나는 지그비 전구 켜기/끄기를 토글합니다. 다른 버튼은 차고 문을 열고 닫습니다(REAL 집에서).


    파트 1:주택 건설

    1) 모델하우스 건설

    2) 제어 옵션, 배선 및 코드

    2부:입력(센서)

    3) 센서:에너지 모니터

    4) 센서:DIY 센서 노드 옵션

    5) 센서:윙크 허브 &트리퍼 접촉 센서

    파트 3:출력

    6) 조명

    7) 차고 도어 오프너


    1단계:모델 하우스 건설

    나는 이 단계를 규범적으로 하려는 것이 아니다. 저는 공예에 있어서는 꽤 어리숙한 편이라 모델하우스를 어떻게 지었는지 보여드릴게요. 당신은 당신의 주거를 닮고 당신이 관심 있는 것들을 반영하도록 건물을 짓고 싶을 것입니다. 여기에 창의성을 위한 많은 공간이 있습니다. 이 그림의 일부 구성 요소(예:변류기)는 이후 단계에서 사용됩니다.

    구성요소 :

    <울>
  • (1) 상자. 크기와 비율은 귀하에게 달려 있습니다.
  • (3) Tower Pro SG90 서보 http://www.dx.com/p/towerpro-sg90-9g-mini-servo-w...
  • (2) 작은 경첩 http://www.homedepot.com/p/Stanley-National-Hardw...
  • (일부) 접착재. 3M 후크의 양면 접착제를 사용했습니다.
  • Arduino Yun 또는 Arduino Uno(이더넷 실드 포함).
  • 버튼http://www.radioshack.com/mini-spst-1-5-amp-moment...
  • 집 주위에 흩어져 있는 물건

  • 지붕

    나는 상자의 측면 덮개 중 하나를 잘라내어 지붕을 형성하기 위해 다른 (아직 붙어 있는) 측면 덮개에 부착했습니다. 직각에 대한 구조를 제공하기 위해 작은 상자를 사용하고 나중에 레고 조각으로 더 잘지지했습니다. 이 직각을 만들기 위해 집 주변에 있는 모든 것을 사용할 수 있습니다.

    문/창문

    표시하려는 문의 구멍을 자릅니다. 문에 경첩 한두개를 양면테이프로 붙이고 집에 붙입니다. 나는 알고 있습니다. 멋진 것은 아니므로 집 주변에 있는 것으로 자유롭게 즉흥적으로 만드십시오. 후크와 함께 제공되는 3M 양면 폼 접착제를 사용했습니다. 또한 이 폼 접착 스트립을 사용하여 서보 모터를 장착했습니다. 차고 도어의 경우 서보 모터 암이 차고 도어를 열고 중력이 차고 도어를 닫습니다. 정문의 경우 서보 암이 문을 열 수 있도록 힌지 도어에 스트링을 부착해야 했습니다. 보이는 노란색 레고 조각은 경첩에서 서보를 오프셋하기 위한 것입니다.

    //www.youtube.com/embed/z-xyVXUSqNM

    에너지 측정기

    멋진 것은 없습니다. 화살표 모양의 것을 잘라내어 서보 암에 부착하기만 하면 됩니다. 모호한 관목 모양의 모양을 잘라내어 킬로와트 눈금으로 표시하고 그 사이에 관목이 있는 상자에 서보 모터를 마찰 맞춥니다.

    에너지 소모 서보 위에는 빨간색 LED를 테이프로 붙였습니다.

    조명과 차고 문을 제어하는 ​​두 개의 버튼도 있습니다. 이것은 순간 버튼입니다. 단추는 판지 상자 벽에 고정되도록 외부에 너트가 있습니다. 반대쪽에는 납땜할 전선용 금속 접점이 있습니다.

    2단계:주택 건설 - 전선 및 코드

    배선

    다음은 배선도입니다. 상자 안의 배선을 꽤 엉망으로 만들었습니다. 어떤 와이어가 어떤 핀에 있는지 알고 싶다면:

    <울>
  • 상태 핀 LED:7
  • 표시등 LED:4
  • 서보 1(정문):3
  • 서보 2(차고 도어):5
  • 서보 3(에너지 사용의 관목):6
  • 버튼 1(조명 켜기/끄기):8
  • 버튼 2(차고 문 열기/닫기):9
  • 컨트롤러 옵션

    당신은 당신이 편안하고 손에있는 것을 사용할 수 있습니다. 더 저렴한($20) 옵션은 Arduino Uno 클론과 이더넷 실드를 사용하는 것입니다. 나는 그것으로 시작했지만 그것은 나를 이더넷 케이블에 묶었습니다. 그래서 아두이노 윤($65)으로 바꿨습니다. 훨씬 비싸지 만 Wi-Fi를 사용할 수있는 자유를주었습니다. Yun은 정말 사용하기 쉬웠습니다. 당신은 기본적으로:

    <올>
  • 이더넷을 통해 Yun을 라우터에 연결
  • 윤의 웹페이지로 이동
  • 라우터에 비밀번호 및 고정 IP 설정
  • 윤 스케치 다운로드
  • 아래에 Arduino Uno와 Arduino Yun에 대한 스케치가 첨부되어 있습니다. 그것들은 매우 유사하며 Yun에서 사용되는 이더넷 브리지를 제외하고 Yun 코드를 Uno로 복사할 수 있습니다. Yun으로 전환한 후 두 개의 컨트롤 버튼을 추가했습니다. 결과적으로 Uno 스케치에는 해당 버튼이 없습니다.

    첫 번째 단계의 비디오는 Arduino Yun을 보여줍니다. 다음은 Uno와 이더넷 쉴드를 사용한 동영상입니다. 이 영상을 만들 당시에는 두 개의 버튼을 아직 설치하지 않았지만 나머지는 모두 동일하게 작동합니다.

    //www.youtube.com/embed/7i6McpbU3Gs


    smarthome_ethernet.ino smarthome_yun.ino


    3단계:센서:에너지 모니터

    이제 에너지 사용량을 표시할 수 있는 물리적 인터페이스가 있으므로 집의 에너지 소비량을 읽고 해당 소비량을 MQTT 브로커에 게시하는 센서 노드를 구축해야 합니다. 몇 가지 방법이 있습니다. Arduino Yun을 사용하고 있습니다. 가장 덜 복잡한 방법이지만 비용이 가장 적게 드는 것은 아닙니다. 원하는 경우 Arduino Uno, 이더넷 쉴드 및 무선 라우터를 사용하여 Wi-Fi 브리지 역할을 할 수 있습니다. 또는 Open Energy Monitor 패키지와 함께 Pi를 사용할 수 있습니다. 윤 방식만 다루겠습니다.

    나는 eBay에서 $ 7 전류 변압기를 사용하고 있습니다. 여기에서 Yhdc SCT-013-000의 100A 버전을 찾을 수 있습니다. 위의 배선도에 따라 배선하고, 이 단계의 맨 아래에 Arduino Yun 스케치를 업로드합니다. MQTT 브로커 IP 주소로 코드를 수정해야 합니다. Open Energy Monitor 라이브러리에 대한 이 페이지는 좋은 참고 자료입니다. 다음은 이상적인 구성 요소 값입니다.

    <울>
  • 부담 저항기 =33옴
  • 전압 분배기 저항 =10k 옴
  • 커패시터 =10uF
  • 내 에너지 모니터의 그림은 정확한 구성 요소가 없기 때문에 회로도와 실제로 일치하지 않습니다. 33옴 저항이 없었기 때문에 68옴 저항 2개를 병렬로 사용해야 했습니다. 그리고 정류회로용 10uF 커패시터가 없어서 대신 22uF 커패시터 2개를 사용했습니다. 직렬 등가 커패시턴스가 충분히 가깝습니다.

    집의 들어오는 위상 중 하나에 변류기를 연결하십시오. 나는 단 하나의 100A 변압기만 가지고 있었기 때문에 위상 중 하나만 모니터링하고 있습니다. 결국, 들어오는 전력의 다른 쪽 다리와 분기 회로를 모니터링하기 위해 더 많은 변압기를 얻고 싶습니다. 실제 앰프 미터를 사용하여 내 DIY 설정은 항상 서로 다른 앰프 판독값에서 앰프 미터보다 1amp를 읽습니다(위의 5번째 이미지 참조). 추가 앰프를 빼는 것은 아주 간단한 문제입니다.


    오픈HAB

    데이터가 들어오기 때문에 데이터를 그래프로 표시할 수 있도록 OpenHAB에 표시할 수도 있습니다. 다음은 관련 OpenHAB 구성입니다.

    항목 정의

    숫자 itm_smarthome_energy_amps "에너지(암페어) [%.1f]" {mqtt="<[mymosquitto:2853:state:default]"}

    숫자 itm_smarthome_energy_watts "에너지(와트) [ %.1f]" {mqtt="<[mymosquitto:2852:state:default]"}

    사이트맵

    Text label="Energy" icon="firstfloor"
    {

    Frame label="Energy Usage" { Text item=itm_smarthome_energy_amps

    Text item=itm_smarthome_energy_watts

    Chart item=itm_smarthome_energy_watts period=h refresh=5000 } //프레임 에너지 사용량

    }//Text label="Energy"

    지속성

    차트를 사용하기 때문에 에너지 사용에 대한 일종의 지속성 전략을 정의해야 합니다. RRD4J는 사용하기 가장 쉬우므로 "/openhab/configurations/persistence/rrd4j.persist"에 대해 알아보겠습니다.

    Strategies {
    // rrd 차트의 경우 cron 전략이 필요합니다 everyMinute :"0 * * * * ?"}

    Items { DemoSwitch,NoOfLights,Window_GF_Toilet,Heating* :전략 =everyChange, everyMinute, restoreOnStartup // rrd Temperature*,Weather_Chart*에 온도 값만 저장하자. :strategy =everyMinute, restoreOnStartup itm_smarthome_energy_watts :strategy =everyUpdate}

    에너지 모니터 화면

    Energy_monitor_yun.ino

    4단계:센서:DIY 무선 센서 노드

    무선 개폐 센서에는 몇 가지 옵션이 있습니다.

    이전 프로젝트 중 하나에서 5달러 무선 트랜시버를 사용하여 MQTT 게이트웨이를 통해 센서 데이터를 전송했습니다. 저는 여전히 이 프로젝트를 사용하여 OpenHAB에 차고 문 상태를 가져오고 있으며 데모 비디오에서 실제로 모델 하우스의 차고 문이 실제 차고 문 상태를 반영하는 방법입니다. 사용하려는 경우 이 단계에서 자세한 코드와 회로를 찾을 수 있습니다. 보기 흉하지만 아무도 눈치채지 못할 차고에 있습니다.

    조명이 켜져 있는지 여부를 표시하는 데 사용하는 조도 센서도 있습니다. 이것은 또한 이 단계에서 자세히 설명된 이전 Instructable에서 가져온 것입니다. 광 저항을 사용하여 밝기 정보를 무선으로 OpenHAB에 다시 보내는 Uber 센서의 일부입니다. 이 경우 조명 수준을 나타내는 MQTT 주제를 구독하고 있습니다.

    또한 이전 Instructable에서 동일한 무선 트랜시버와 게이트웨이를 사용하는 배터리 구동 리드 스위치 센서를 만들었습니다. 그러나, 그것은 썩 보기 좋지 않습니다. 나는 미적인 이유로 실내 문이나 창에 실제로 그것을 사용할 수 없습니다. 그래서 이 문제를 극복하기 위해 Wink의 더 멋진 소비자 등급 리드 스위치 센서를 사용하고 있습니다. 이는 우리를 다음 단계로 이끕니다.

    //www.youtube.com/embed/uiD-HLezygI//www.youtube.com/embed/VKniJzIVHsI

    5단계:센서:윙크 허브

    나는 PHP 익스플로잇에 대한 액세스 권한을 얻기 위해 허브를 루팅하는 방법을 찾은 초기 Wink Hub 사용자의 이 블로그 게시물에서 발생했습니다. 이 익스플로잇을 사용하면 "aprontest" 유틸리티를 실행하여 Wink Hub와 페어링된 항목을 제어할 수 있습니다. 이 방법을 사용하여 OpenHAB 인터페이스에서 조명을 제어할 수 있었습니다.

    Wink Hub를 응원하는 가장 흥미로운 이점은 로컬 Wink 서버에 액세스하지 않고도 조명 및 센서 상태를 제어할 수 있습니다. Wink Hub 및 Wink API는 조명 제어를 수행하거나 센서 상태를 가져오기 위해 Wink 서버에 연결하기 위해 항상 인터넷으로 이동해야 합니다. 이제 이 PHP 익스플로잇을 사용하여 조명 및 센서 작업을 로컬 LAN에 유지할 수 있습니다. 대단합니다.

    이 단계의 맨 아래에 PHP 스크립트를 포함했습니다. 이 파일을 열 수 없으면 이 링크를 시도하십시오. 이 스크립트는 Raspberry Pi에서 실행되고 두 개의 Wink Tripper 리드 스위치의 상태에 대해 Wink Hub를 폴링합니다. 이 상태는 REST API를 통해 OpenHAB로 전송됩니다. 그런 다음 OpenHAB은 이러한 문 위치에 대한 MQTT 주제를 게시합니다. 그런 다음 모델 하우스의 컨트롤러는 이러한 문 위치 항목을 구독하여 문을 열거나 닫습니다.

    이 단계에서 첨부된 3개의 OpenHAB 구성 파일(항목, 사이트맵 및 규칙)은 모든 것이 작동하는 데 필요합니다. 그들은 폴링 스크립트가 REST 인터페이스를 통해 상호 작용하는 연락처 항목을 정의합니다. OpenHAB를 통해 지그비 전구를 제어하기 위한 예제 스크립트도 있습니다.

    //www.youtube.com/embed/tWKPcBOn1KM

    스크립트 및 구성 파일.

    사이트맵.txt 규칙.txt items.txt demo_1_general.sh polling.php


    6단계:출력:조명

    구성 파일을 다룬 순서 때문에 이전 단계에서는 물리적 인터페이스와 OpenHAB 인터페이스를 통해 "연결된 전구"를 제어하는 ​​데 필요한 모든 것을 제공했습니다. 조명은 Wink 허브가 지원하는 모든 조명이 될 수 있습니다. 현재 Cree Connected Bulb와 GE Wink 조명으로 이것을 테스트했습니다. 둘 다 예상대로 작동합니다. 광 센서와 버튼이 스마트 전구를 제어하는 ​​방법을 더 잘 보여주는 이 비디오를 여기에 던지겠습니다.

    //www.youtube.com/embed/KSDUEfro3Vo

    7단계:출력:차고 도어 오프너

    5단계에서 제공된 구성 파일에는 차고 문을 제어하는 ​​데 필요한 대부분의 OpenHAB 항목이 포함되어 있습니다. 그러나 실제로 차고 문을 열고 닫으려면 여전히 무언가가 필요합니다. 이를 위해 이전 Instructable의 일부를 수정하고 있습니다. 다음 구성 요소로 차고 도어 오프너를 만들었습니다.

    <울>
  • Arduino 클론($10)
  • 이더넷 실드($7)
  • 리드 릴레이($2)
  • 예비 차고 도어 리모컨($22)
  • Arduino는 건식 접점을 열고 닫아 리드 릴레이를 제어합니다. 예비 차고 도어 오프너의 버튼은 리드 릴레이의 무전압 접점을 가로질러 배선됩니다. Arduino의 5번 핀과 GND를 리드 릴레이의 코일 핀 2개(외부 핀 2개)에 연결하고 내부 릴레이 핀을 차고 도어 리모컨의 버튼에 연결합니다.

    Arduino는 MQTT 주제를 구독하고 열기/닫기 명령을 기다립니다. 이 항목을 볼 때 리드 릴레이에 일시적으로 전원을 공급하여 예비 차고 도어 리모컨의 "버튼"을 닫습니다. Arduino 스케치는 아래에 첨부되어 있습니다. 또한 규칙 파일에 "garage_monitor_rules.txt"를 추가하십시오. 5단계에서 첨부한 룰에 추가로 필요한 부분입니다. 기존에 사용하던 초음파 센서 방식을 사용하지 않는다면 수정에 맞게 바꿔줘야 하는 부분입니다.

    //www.youtube.com/embed/CqbRosfqM3c

    차고 문이 꽤 예쁘거나 차고 문이 열릴 때 집의 다른 부분에서 일종의 오디오 안내를 원하는 경우 위에 추가된 규칙은 오디오 파일을 재생할 수 있습니다. 약 1분 30초의 첫 번째 비디오 데모에서 들을 수 있습니다.

    //www.youtube.com/embed/pdKfJtnpNzs


    차고_모니터_규칙.txt grage_opener.ino


    8단계:기타 생각

    이 프로젝트에서 내린 결정은 내가 편안하게 사용할 수 있는 도구, 내가 가지고 있는 부품, 작업 방식에 대한 우선 순위를 반영합니다. 다른 도구 세트가 있고 다른 하드웨어 구성 요소를 쉽게 사용할 수 있습니다. 또한 홈 오토메이션이 작동하는 방식에 대해 다른 아이디어가 있을 수 있습니다.

    MQTT 및 OpenHAB를 사용할 때 많은 유연성이 있으며 내가 한 것처럼 정확하게 작업을 수행할 필요가 없습니다. 모델 하우스를 제어하는 ​​데 사용되는 컨트롤러는 Arduino, Raspberry Pi 또는 Sparkcore의 일부가 될 수 있습니다. DIY 센서는 Arduino 또는 독립형 ESP8266이 될 수 있습니다. 유일한 제약은 센서 데이터가 어떻게든 MQTT 브로커에 공개되어야 한다는 것입니다. OpenHAB 설치에 USB Z-wave 스틱이 있는 경우 OpenHAB를 Z-wave to MQTT 브리지로 사용하고 Z-wave 센서를 도어 감지에 활용할 수 있습니다.

    Wink 열림/닫힘 센서도 다르게 수행할 수 있습니다. Wink Hub를 근절하지 않는 경우 Wink API를 사용하여 센서 상태를 파악하고 OpenHAB에 게시하거나 MQTT를 통해 직접 게시할 수 있습니다. 이를 위해서는 Wink Server를 사용해야 하지만 루트 허브의 제약이 제거됩니다.

    그래서, 일을 다르게 하는 많은 방법. 저는 공통 분모가 가장 낮은 하드웨어를 사용하는 경향이 있으므로 Arduino와 판지 상자를 사용합니다.

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • smarthome_yun.ino
  • smarthome_ethernet.ino
  • energy_monitor_yun.ino
  • smarthome_yun.ino일반 텍스트
    // Eric Tsai// 2015-04-13// 물리적 스마트 홈 인터페이스를 제어하기 위한 Arduino Yun 코드// 용도에 맞게 MQTT 주제 이름 수정// MQTT 브로커 IP 주소 수정//new yun included#include #include #include //이더넷 쉴드 사용 시 기존 이더넷 포함/*#include #include #include  */#include //이더넷 실드 설정/*IPAddress ip(192, 168, 2, 36);byte mac[] ={ 0x90, 0xA2, 0xDA, 0x0D, 0x43, 0x13 };byte server[ ] ={ 192, 168, 1, 101 };EthernetClient ethClient;PubSubClient 클라이언트(서버, 1883, 콜백, ethClient);*/unsigned long keepalivetime=0;unsigned long MQTT_reconnect=0;//yunclient를 사용하여 networkYunClient yun에 브리지; //이더넷 clientPubSubClient와 동일 client("192.168.1.101", 1883, callback, yun);bool conn_ok;//MQTT 연결 상태를 나타내는 LED 사용.int ledPin =4; // 조명 켜짐을 나타냄int statusPin =7; //MQTT 연결 상태 표시 //servo controlint servo1Pin =3; //앞문 서보2Pin =5; // 차고 doorint servo3Pin =6; //에너지 사용량 미터서보 서보1; //도어서보 서보2; //차고 도어서보 서보3; //에너지int 버튼1 =8; //정문 위의 버튼int button2 =9; //차고 문 위의 버튼//서보 작동:servosint의 대상 위치 서보1_target =5; //도어, closedint 서보2_target =5; //차고, 폐쇄형 서보3_target =180; //에너지, 180은 "0" 와트, 모터가 역방향으로 장착됨 sint servo1_pos_cur =5;int servo2_pos_cur =5;int servo3_pos_cur =180; // 180은 "0" 와트, 모터가 거꾸로 장착됨int servo1Opened =5;int servo1Closed =130;int servo2Opened =5;int servo2Closed =150;unsigned long servo1_time =0;unsigned long servo2_time =0;unsigned long servo3_time =0;/ /debounce 버튼, 스팸 방지 publishunsigned long button1_db =0;unsigned long button2_db =0;int button=0;int callback_flag =0;char buff_message[12];//--------- -------------------------------------------------- ----// MQTT 콜백// 여기에서 MQTT 메시지에 반응//-------------------------------- -------------------------------void callback(char* topic, byte* payload, unsigned int length) { //convert 주제를 int로 int mytopic =atoi(주제); //Serial.print(mytopic); //페이로드를 int로 변환 payload[length] ='\0'; // atof가 올바르게 구문 분석할 수 있도록 줄 반환을 추가합니다. float mymsg =atof( (const char *) payload); //led if (mytopic ==2822) { if (mymsg ==1) { digitalWrite(ledPin, HIGH); } if (mymsg ==0) { digitalWrite(ledPin, LOW); } } //서보 1, 정문 if (mytopic ==2832) { if (mymsg ==1) //opened { //Serial.println("servo1 열림"); 서보1_타겟 =서보1열림; } if (mymsg ==0) //closed { //Serial.println("servo1 closed"); 서보1_타겟 =서보1닫힘; } //Serial.println(servo1_target); } /* //두 번째 차고 문 신호 "closed" =off =send 1 "open" =on =send 0 */ //servo 2, 차고 문 if (mytopic ==2842) { if (mymsg ==1) / /opened { 서보2_타겟 =서보2열림; } if (mymsg ==0) //닫힘 { 서보2_대상 =서보2닫힘; } //콜백_플래그=1; //servo3_target =mymsg; } //서보 3, 에너지 미터 if (mytopic ==2852) { //message =watts //최대 및 최소 미터에 대한 바인딩 와트 if (mymsg> 6000) { mymsg =6000; } if (mymsg <0) { mymsg =0; } //bias meter from 180 degrees to 0 degrees //180 deg to 0 deg =0 watt to 6000 watts, for example //set max watts to what makes sense for you. servo3_target =180-((1-((6000-mymsg)/6000))*180)-25; callback_flag=1; }}//end callbackvoid setup() { pinMode(ledPin, OUTPUT); //LED indicating light on pinMode(statusPin, OUTPUT); pinMode(button1, INPUT_PULLUP); //use pull-up resistor, invert logic pinMode(button2, INPUT_PULLUP); //use pull-up resistor, invert logic digitalWrite(ledPin, HIGH); //yun bridge Bridge.begin(); //connect to MQTT broker client.connect("yun smarthome"); client.publish("watch", "Smart Home Connected!"); keepalivetime=millis(); //Wire.onReceive (receiveEvent); MQTT_reconnect =millis(); //client.subscribe("#"); //test subscribe client.subscribe("2822"); //LED client.subscribe("2832"); //servo 1 topic client.subscribe("2842"); //servo 2 topic client.subscribe("2852"); //servo 3 topic digitalWrite(ledPin, LOW); //servo servo1.attach(servo1Pin); servo1.write(90); servo2.attach(servo2Pin); servo2.write(90); servo3.attach(servo3Pin); servo3.write(5);} // end of setupvoid loop() { client.loop(); //MQTT processing needs this to run //For servo positioning, don't want to move too fast. //Must crawl from current position to target position //but also avoid using "delay" cmd, that just freezes up microcontroller //servo 1 if ((millis() - servo1_time)> 20) { if (servo1_pos_cur> servo1_target) { servo1_pos_cur =servo1_pos_cur - 1; } if (servo1_pos_cur  20) { if (servo2_pos_cur> servo2_target) { servo2_pos_cur =servo2_pos_cur - 1; } if (servo2_pos_cur  20) { if (servo3_pos_cur> servo3_target) { servo3_pos_cur =servo3_pos_cur - 1; } if (servo3_pos_cur 3000) || (button1_db> millis())) { button1_db=millis(); client.publish("2862", "button1 yaya"); } } //button 2 button=digitalRead(button2); if (button==0) //inverted logic { if ( ((millis() - button2_db)>3000) || (button2_db> millis())) { button2_db=millis(); client.publish("2872", "button2 yaya"); } } //check network connection to MQTT broker every 60 seconds. //reconnect if no longer connected if ((millis() - MQTT_reconnect)> 60000) { conn_ok =client.connected(); if (conn_ok==1) { digitalWrite(statusPin, HIGH); //Serial.println("MQTT connected OK"); } else { digitalWrite(statusPin, LOW); //Serial.println("MQTT NOT connected OK"); } //no connection, reconnect if (conn_ok ==0) { client.disconnect(); 지연(5000); while (client.connect("smarthouse") !=1) { digitalWrite(statusPin, LOW); //Serial.println("Error connecting to MQTT"); 지연(4000); } digitalWrite(statusPin, HIGH); } //Serial.println("reconnected to MQTT"); MQTT_reconnect =millis(); client.publish("watch","smart home heartbeat!"); }//end Mosquitto connection check} // end of loop
    smarthome_ethernet.inoPlain text
    // Eric Tsai// 2015-04-1// Arduino Uno w/ Ethernet, code for controlling physical smart home interface// Modify MQTT topic names to match your use// Modify MQTT broker IP address#include #include #include #include //Ethernetbyte mac[] ={ 0x90, 0xA2, 0xDA, 0x0D, 0x43, 0x13 };byte server[] ={ 192, 168, 1, 101 };EthernetClient ethClient;PubSubClient client(server, 1883, callback, ethClient);unsigned long keepalivetime=0;unsigned long MQTT_reconnect=0;bool conn_ok;//use LED for indicating MQTT connection status.int ledPin =4; //indicate lights onint statusPin =7; //indicate MQTT conn status//servo controlint servo1Pin =3; //front doorint servo2Pin =5; //garage doorint servo3Pin =6; //energy usage meterServo servo1; //doorServo servo2; //garage doorServo servo3; //energy//servo operation:target positions for servosint servo1_target =5; //door, closedint servo2_target =5; //garage, closedint servo3_target =180; //energy, 180 is "0" watts, motor mounted backwardsint servo1_pos_cur =5;int servo2_pos_cur =5;int servo3_pos_cur =180; // 180 is "0" watts, motor mounted backwardsint servo1Opened =5;int servo1Closed =120;int servo2Opened =5;int servo2Closed =150;unsigned long servo1_time =0;unsigned long servo2_time =0;unsigned long servo3_time =0;//---------------------------------------------------------------// MQTT call back// react to MQTT messages here//---------------------------------------------------------------void callback(char* topic, byte* payload, unsigned int length) { Serial.println("received MQTT"); //convert topic to int. int mytopic =atoi (topic); //Serial.print(mytopic); //convert payload to int payload[length] ='\0'; //add a line return so atof can parse correctly float mymsg =atof( (const char *) payload); //print MQTT message Serial.println(""); Serial.print("("); Serial.print(mytopic); Serial.print(", "); Serial.print(mymsg); Serial.println(")"); //led if (mytopic ==2822) { if (mymsg ==1) { digitalWrite(ledPin, HIGH); } if (mymsg ==0) { digitalWrite(ledPin, LOW); } } //servo 1, front door if (mytopic ==2832) { if (mymsg ==1) //opened { Serial.println("servo1 opened"); servo1_target =servo1Opened; } if (mymsg ==0) //closed { Serial.println("servo1 closed"); servo1_target =servo1Closed; } Serial.println(servo1_target); } /* //second garage door signal "closed" =off =send 1 "open" =on =send 0 */ //servo 2, garage door if (mytopic ==2842) { if (mymsg ==1) //opened { servo2_target =servo2Opened; } if (mymsg ==0) //closed { servo2_target =servo2Closed; } } //servo 3, energy meter if (mytopic ==2852) { //message =watts //error check if (mymsg> 6000) { mymsg =6000; } if (mymsg <0) { mymsg =0; } //bias meter from 180 degrees to 0 degrees //180 deg to 0 deg =0 watt to 6000 watts, for example //set max watts to what makes sense for you. servo3_target =180-((1-((6000-mymsg)/6000))*180); //servo3_target =mymsg; }}//end callbackvoid setup() { //ethernet //Ethernet.begin(mac, ip); //Wire.begin (MY_ADDRESS); Serial.begin (9600); Serial.println("starting"); pinMode(ledPin, OUTPUT); //LED indicating light on pinMode(statusPin, OUTPUT); digitalWrite(ledPin, HIGH); //wait for IP address while (Ethernet.begin(mac) !=1) { Serial.println("Error getting IP address via DHCP, trying again..."); 지연(5000); } Serial.println("ethernet OK"); keepalivetime=millis(); while (client.connect("smarthouse") !=1) { Serial.println("Error connecting to MQTT"); //delay(3000); 지연(4000); } MQTT_reconnect =millis(); Serial.println("setup complete"); client.publish("smarthouse","hello world"); //test publish //client.subscribe("#"); //test subscribe client.subscribe("2822"); //LED client.subscribe("2832"); //servo 1 topic client.subscribe("2842"); //servo 2 topic client.subscribe("2852"); //servo 2 topic digitalWrite(ledPin, LOW); //servo servo1.attach(servo1Pin); servo1.write(90); servo2.attach(servo2Pin); servo2.write(90); servo3.attach(servo3Pin); servo3.write(5);} // end of setupvoid loop() { client.loop(); //MQTT processing needs this to run //For servo positioning, don't want to move too fast. //Must crawl from current position to target position //but also avoid using "delay" cmd, that just freezes up microcontroller //servo 1 if ((millis() - servo1_time)> 20) { if (servo1_pos_cur> servo1_target) { servo1_pos_cur =servo1_pos_cur - 1; } if (servo1_pos_cur  20) { if (servo2_pos_cur> servo2_target) { servo2_pos_cur =servo2_pos_cur - 1; } if (servo2_pos_cur  20) { if (servo3_pos_cur> servo3_target) { servo3_pos_cur =servo3_pos_cur - 1; } if (servo3_pos_cur  60000) { conn_ok =client.connected(); if (conn_ok==1) { digitalWrite(statusPin, HIGH); Serial.println("MQTT connected OK"); } else { digitalWrite(statusPin, LOW); Serial.println("MQTT NOT connected OK"); } //no connection, reconnect if (conn_ok ==0) { client.disconnect(); 지연(5000); while (client.connect("smarthouse") !=1) { digitalWrite(statusPin, LOW); Serial.println("Error connecting to MQTT"); 지연(4000); } digitalWrite(statusPin, HIGH); } //Serial.println("reconnected to MQTT"); MQTT_reconnect =millis(); client.publish("smarthouse","heartbeat every minute!"); }//end Mosquitto connection check} // end of loop
    energy_monitor_yun.inoPlain text
    /*Eric Tsai2015-04-22Arduino Yun code for publishing energy use to MQTT brokerModify the "PubSubClient client" for your broker IP address*/#include #include #include #include "EmonLib.h" // OpenEnergy Monitor project libraryint LED =3;EnergyMonitor emon1; // open energy monitorunsigned long MQTT_reconnect=0;unsigned long read_energy=0;double Irms;bool conn_ok;YunClient yun; //equivalent of ethernet client//really shouldn't need call back, but just in case it's needed.void callback(char* topic, byte* payload, unsigned int length) { digitalWrite(LED, HIGH); // turn the LED on (HIGH is the voltage level) delay(500); // wait for a second digitalWrite(LED, LOW); // turn the LED off by making the voltage LOW}//use yunclient to bridge to networkPubSubClient client("192.168.1.101", 1883, callback, yun);//**********************************************************************void setup(){ // initialize digital pin 13 as an output. pinMode(LED, OUTPUT); digitalWrite(LED, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(LED, LOW); // turn the LED off by making the voltage LOW Bridge.begin(); client.connect("yun_energy"); client.publish("watch", "Energy Monitor Connected!"); client.subscribe("yun_energy"); digitalWrite(LED, HIGH); // turn the LED on (HIGH is the voltage level) delay(3000); // wait for a second digitalWrite(LED, LOW); // turn the LED off by making the voltage LOW emon1.current(5, 60); // Current:input pin, calibration.}//**********************************************************************void loop(){ char buff_message[12]; //message buffer for MQTT publish float value; client.loop(); //run this every loop to maintain MQTT connection Irms =emon1.calcIrms(1480); // Calculate Irms only, 1480 means read Irms. //publish current every 10 seconds. if (millis() - read_energy> 10000) { //amps value =Irms; dtostrf (value, 4, 5, buff_message); client.publish("2853", buff_message); read_energy =millis(); //watts value =Irms*115; dtostrf (value, 4, 5, buff_message); client.publish("2852", buff_message); } //maintain MQTT connection if ((millis() - MQTT_reconnect)> 60000) { conn_ok =client.connected(); if (conn_ok==1) { digitalWrite(LED, HIGH); } else { digitalWrite(LED, LOW); } //no connection, reconnect if (conn_ok ==0) { client.disconnect(); 지연(5000); while (client.connect("yun_energy") !=1) { delay(4000); } digitalWrite(LED, HIGH); client.publish("watch", "Energy Monitor reconnected"); } MQTT_reconnect =millis(); }//end Mosquitto connection check }

    회로도


    제조공정

    1. 가정 임신 테스트
    2. C# 인터페이스
    3. 자바 인터페이스
    4. 가정 자동화 애플리케이션
    5. RASPBERRY PI 홈 자동화
    6. Labman Automation
    7. IoT 및 홈 자동화:미래는 무엇입니까?
    8. C# - 인터페이스
    9. 인더스트리 4.0의 자동화
    10. 프레스 자동화 이해