작업장

스마트 램프를 만드는 방법 : 3 단계 (그림 포함)

아폴론 징글벨락

아폴론 징글벨락

차례:

Anonim

이 Instructable은 스마트 램프를 만드는 것에 관한 것입니다! 이 Instructable은 꽤 깊을 것이고, 우리는 당신이 당신 자신의 아름다운 스마트 램프를 설계하고 건축하는데 성공하는데 필요한 모든 것을 다룰 것입니다! 이 Instructable은 여러분이 Fusion 360에 대해 아주 잘 알고 있다고 가정하고 전자 제품에 대한 경험은 조금 더 진보되었지만 이것은 매우 철저하며 3D 프린터로 업로드하고 램프를 인쇄하는 데 필요한 모든 STL 파일을 포함합니다 모든 회로도와 코드가 포함되어 있습니다! 이것들은 당신 자신의 스마트 램프를 만드는 데 도움이 될 것입니다!

사물의 인터넷 : "더 똑똑한"램프

사물의 인터넷은 오늘날 첨단 기술 분야의 전문 용어입니다. 어디에서나 그 소리를들을 수 있지만, 아무도 그것이 정의라고 지적 할 수는 없습니다. 진정으로 다른 사람들에게 다른 것을 의미합니다. Tech 세계에서 가장 큰 선수들, 즉 Google의 Google 및 Facebook은 정의에 동의하지 않는 것 같습니다. 그러나 이것에도 불구하고 모든 회사가 현재 IoT 관련 내부 그룹 또는 부서를 보유하고있는 것처럼 보입니다. 왜냐하면 ' 2020 년까지 연결된 장치 400 억 개 '와' 기업들은 향후 5 년간 6 조 달러를 연결 장치 솔루션 ' 기업들이 잠재적 인 성장 기회를 놓칠 여유가 있는지 재평가하도록하십시오. 그러나 이것으로 누구든지 IoT를 방해해서는 안됩니다. 사실, IoT는 믿을 수 없습니다. 이전에는 결코 대량의 데이터를 실제로 사용할 기회가 없었습니다. 우리는 당신의 차가 서비스 될 필요가있을 때 식물의 어떤 유형이 당신의 주위 지방 날씨 패턴의 결과로 당신의 가정 정원에서 번영 할 필요가있을 때와 같은 것에서 우리가 정밀도로 전에 알 수 없었던 많은 재미있는 것을 말할 수 있습니다. 토양 유형 및 포화 수준. IoT는 기기 유지 보수에서 추측 작업을 수행합니다. 짧게 말해서, 인생을 좀 더 쉽게 만들 수 있습니다. 우리는 항상 데이터를 가지고 있습니다. 우리는 지금까지 실제로 그걸로 무엇을 할 것인지 알지 못했습니다. IoT는 초기 단계에 있습니다. 엄청난 속도로 성장하고 있으며, 업계에서 점점 커지는 IoT 문제를 해결하기 시작하면서 진정한 의미의 연결 장치를 만나게 될 것입니다. 토스터가 냉장고에 대해 이야기하는 미래의 이미지를 볼 수 있으며 둘 다 TV와 대화합니다. 이러한 비전은 네트워킹 프로토콜의 문제가 해결 될 때까지 실현 될 수 없습니다. 즉, 필립스와 같은 특정 회사는 I²C와 같은 장치 간 통신에 대한 매우 전통적인 방법에 대한 복제 권한을 갖고 있습니다 (이러한 기능이 무엇인지 모르는 경우 걱정하지 마십시오. 램프를 완료하는 데 영향을 미치지 않습니다. :)), 거기에 사용되는 언어의 성격으로 인해, 많은 칩 제조업체가 특정 프로토콜의 변형을 만들어이 저작권을 침해 할 수있었습니다. 이것은 SPI, UART, ANT 등과 같은 다른 주요한 것들에서도 발생합니다. 이로 인해 디바이스 간의 핸드 쉐이킹에 많은 수의 순열이 생겨 회사의 연결된 디바이스가 다른 디바이스와 통신 할 수 없게되었습니다. 어쨌든, IoT는 아직 초기 단계에 있으며 성장하여 일상 생활에서 유용하게 사용될 수있는 잠재력이 매우 큽니다.

그래서 당신이 아직도 읽고 있다면, 끝내 주네! 그것은 당신이 IoT에 열렬한 것을 의미하거나,이 램프 또는 두 가지를 정말로 좋아했습니다! 어느 쪽이든, 나는 스마트 램프를 분해 할 것이다. 이것은 인터넷에 연결되어 있고 흥미로운 목적으로 데이터가 사용된다는 것을 의미하는 IoT 장치입니다 (자세한 내용은 아래에서 자세히 설명합니다). 이 스마트 램프는 WiFi 칩과 마이크로 컨트롤러를 통해 인터넷에 연결됩니다. 또한 용량 성 터치 보드는 터치 버튼 인터페이스에 사용됩니다. 선택적으로 앰비 라이트 센서를 포함하여 램프가 현재 어떤 종류의 조명인지 읽을 수 있습니다 (이 코드에는이 기능이 포함되어 있음).이 데이터를 사용하여 램프를 켤 시간을 결정할 수 있습니다. 램프는 WPA 또는 WPA2 개인 네트워크 (유감스럽게도 엔터프라이즈 지원이 없음) 또는 WEP에 연결되도록 구성 할 수 있으며 데이터는 구성한 개인 홈 서버로 보낼 수 있습니다. 램프를 구성하고 데이터가 게임 엔진으로 가져온 원격 서버에 연결합니다. 이 램프는 인터넷 연결 램프보다 훨씬 더 많이 제공됩니다.

스마트 램프의 목적은 램프 (또는 장치)에 대한 완전한 액세스 권한을 가지며 시스템에 대해 항상 흥미로운 정보를 얻는 것입니다. 우리는 게임 엔진을 사용하여 가상 환경에서 램프의 가상 모델을 구축했습니다. 우리는 두 개의 램프를 서로 연결하고 서로 영향을 미치기 위해 네트워킹을 사용했습니다. 가상 모델에서는 램프를 켜고 끄고 밝기를 조정할 수 있으며 실제 램프는 이러한 변경 사항을 즉시 및 원격으로 반영합니다. 다른 방향에서 밝기를 변경하는 것뿐만 아니라 램프를 켜고 끌 수 있으므로 모델에 정확하게 반영됩니다. 또한 램프가 네트워크에 연결되어 있지 않으면 램프가 레거시 모드로 전환되고 정상 작동 램프로 되돌아갑니다. 게임 엔진에이 정보의 가상 모델을 구축하는 것은 완전히 선택 사항입니다. 당신은 쉽게 어떤 프런트 엔드 웹 클라이언트 또는 안드로이드 또는 iOS 응용 프로그램을 구축하여 데이터를 보내거나 게임 엔진 모델이 제공 할 원격 제어 장치를 제공 할 수 있습니다.

왜 와이파이 가능 램프가 필요하겠습니까?

이 프로젝트의 진정한 가치는 실제 램프가 아닙니다. 모니터가 아름답게 디자인되어 있고 연결되어있는 장치의 네트워크를 모니터링하고 제어 할 수있는 아주 멋진 램프가 모든 가치를 지닙니다. 예를 들어 공장을 예로 들어 보겠습니다. 공장에는 일반적으로 유사한 작업을 수행하는 많은 기계가 있습니다. 산업용 기계 네트워크를 연결하면 관리자가 원격으로 공장을 운영하고 데이터를 수집하고 기계 상태를 모니터링하는 데 도움이됩니다. 수집 한 데이터는 실제로 매우 중요하며 다른 방법으로는 분명하지 않은 결론을 내리는 데 도움이 될 수 있습니다. 예를 들어 자동차의 경우 엔진 온도, 자동차의 힘, 분당 회전 수 및 주행 거리 등을 모니터링하는 IoT 센서를 사용할 수 있습니다. 이러한 결합을 통해 차의 전반적인 건강 상태를 확실하게 파악할 수 있습니다. 귀하의 기름이나 타이어를 언제 교체해야 하는지를 알 필요없이 자동차는 이미 귀하의 휴대 전화에 대한 알림을 통해 알려줍니다. 또한 자동차가 포함 된 데이터 세트의 데이터 레이어와 마일리지와 관련된 평균 서비스 시간을 추가하면 예측을 훨씬 정확하게 할 수 있습니다. 또 다른 예로, 3D 프린터를 사용하여 산업 부품을 가공하는 공장은 야간 작업이 완료된 시점을 알면 크게 도움이됩니다. 그런 일이 발생하면 관리자는 유틸리티를 사용하여 비활성 프린터를 모두 끌 수있는 앱을 통해 전화로 알림을 받게됩니다. 기계에서 일어나는 일을 아는 편리함, 더 똑똑하고 원격으로 작동 할 수 있다는 점, 그리고 그 과정에서 돈을 절약 할 수있는 이유는 IoT가 오늘날 첨단 기술 분야에서 큰 비중을 차지하는 이유입니다. 즉, 스마트 램프는 돈을 절약 할 수 있습니까 ???

용품:

1 단계 : 램프의 설계 및 총회

디자인

무엇이든을 디자인 할 때, 제한과 목표를 확인해서 시작하는 것이 중요합니다. 우리의 경우 인터페이스는 누군가가 걸어서 사용할 수있을 정도로 직관적이어야했습니다. 하루가 끝날 무렵 우리는 여전히 램프를 만들고 있었고 기술을 추가하는 것이 램프를 손상시킬 수는 없었습니다. 버튼은 디지털 램프의 사용자 입력 때문에 "상태 비 저장"상태를 유지해야했습니다. 상태없는 (stateless) 것은 물리적 인 상태를 가진 토글 스위치와 입력을 명확하게 조종해야한다는 의미입니다. 표준 스위치를 사용하면 스위치의 상태가 빛의 상태와 일치하지 않아 사용자에게 혼동을 줄 수 있습니다.

유기체 형태는 또한 램프의 몸체를 3D 인쇄하는 결정에 영향을 받았습니다. 3D 인쇄를 통해 우리는 시체를 가공하는 데 소요되는 시간을 줄이고 수작업으로는 불가능했던 복잡성을 초래할 수있었습니다. 단점은 표면을 여러 번 청소하고 마무리해야한다는 것이 었습니다. 3D 인쇄가 종종 생성하는 거친 표면은 램프를 최종 생산 품질로 마무리하기 위해 페인트 칠되기 전에 샌딩되고 채워집니다.

인쇄

이 램프를 인쇄해야하는 모든 STL 파일은 GrabCAD에서 찾을 수 있습니다.

충분한 봉투가있는 모든 3D 프린터는이 부분을 인쇄 할 수 있지만 사용 가능한 공차와 재료는 다를 수 있음을 이해하는 것이 중요합니다. 램프의 몸체는 Stratasys Fortus 450mc에 인쇄되었습니다. 단추와 확산기는 Stratasys Objet Connex500에 인쇄되었습니다.

방향은 나무처럼 3D 인쇄물에도 나뭇결이 있기 때문에 램프 본체를 인쇄 할 때 매우 중요합니다. 목에 최대 강도를 줄 수 있도록 램프가 측면에 인쇄되어 있는지 확인하고 싶습니다. 첨부 된 사진을 참조하여 인쇄물을 시각적으로 표시하십시오.

마무리 손질

다음 단계는 3D 인쇄의 표면을 더 이상 "인쇄 된"것으로 보지 않고 디퓨저를 제외한 모든 부분에 적용하는 과정을 개략적으로 설명합니다.

3D 프린터는 여전히 제조업체와 소비자 커뮤니티에서 온갖 종류의 과장된 개념이 있지만, 주로 3D 도구가 도구라는 것을 이해하는 것이 중요합니다. 그것은 당신이 당신의 육체적 인 모형에 그 어느 때보다도 빨리 가까이 갈 수있게합니다. 비록 (다른 대부분의 방법에 비해) 속도를 높이고 (사출 성형에 비해) 비용을 절감 할지라도, 정화 과정이 꽤있을 수 있습니다.

1 단계 : 모든지지 소재를 제거 / 용해합니다.
2 단계 : 중간 코스 (120 그릿) 사포로 인쇄물을 가볍게 짠다.
3 단계 : 플라스틱과 호환되는 에폭시 접착제로 램프의 상단과 하단을 접착합니다 (5 ~ 10 분 에폭시를 권장합니다.) 인쇄물의 나머지 부분과 매끄럽게 연결될 때까지 접착제를 발라줍니다.
4 단계 : Bondo의 얇은 층을 적용하여 인쇄물 층에 의해 생성 된 융기 부분을 채 웁니다.
5 단계 : 일단 건조되면, Bondo를 인쇄물이 보일 때까지 내려주십시오. 120 그릿은 여전히 ​​괜찮지 만, 80 그릿으로 시작할 수 있습니다. 항상 마스크를 착용하고 환기가 잘되는 곳에서 작업하십시오. 인쇄물에 모래가 묻지 않도록 원본 지오메트리를 수정하지 않고 돌출부를 채우려고합니다.
6 단계 : 완벽하게 부드러워 질 때까지 4 단계와 5 단계를 반복 한 다음 220 그릿을 모래에 묻 힙니다.
7 단계 : 보푸라기가없는 젖은 헝겊으로 인쇄물을 닦아냅니다.

몸을 그리다.

최종 인쇄물은 샌드 블 프라이머, 에나멜 페인트 (모든 색상), 무광택 에나멜의 3 가지 레이어로 칠해졌습니다. 프라이밍과 페인팅 단계를 분리하여 (2-in-1 유형의 페인트를 사용하지 않고) 페인트를 내려 놓기 전에 마지막 표면 결함을 잡을 수 있습니다. 나는 광택이 나는 에나멜이 쉽게 긁히지 않는다는 것을 발견했다. 부담없이 사용해보십시오!

1 단계 : 내부 표면을 덮어 둡니다 (LED 및 LED가 후드에 놓이는 곳)
2 단계 : 램프를 건드리지 않고 돌려 놓을 수 있도록 램프를 배치 / 고정합니다. 내부 탭에 거꾸로 매달 수있는 치구를 만드는 것이 좋습니다. 기본 모자는 같은 페인트를 얻을 것이다.
3 단계 : 2 층의 프라이머를 도포합니다. 1 시간 이상 건조시킨 다음 검사하십시오.
4 단계 : 모든 초벌칠 된 표면을 220 그릿 샌드페이퍼로 살짝 모래에 담그십시오. 표면 결함이있는 영역에 집중하지만 지나치게 많지는 않습니다. 우리는 구덩이에 모래를 뿌리려고하지 않습니다.
5 단계 : 프라이머 층을 다시 걸고 가볍게 댄다. 채우기가 어려운 부분이 있으면이 부분에 약간 무거운 코트를 바르면 도움이됩니다. 1 시간 이상 말리십시오.
6 단계 : 최종 샌딩에는 320 그릿 샌드페이퍼를 사용할 수 있습니다. 날카로운 모서리를 날카롭게 유지하고 고르게 샌딩하는 데 중점을 둡니다.
7 단계 : 이제 페인트 에나멜의 중간층을 얇게 적용하고 싶습니다. 하루 종일 말리십시오.
8 단계 : 400 그릿 사포로 가볍게 모래에 묻혀서 축축하고 가벼운 헝겊으로 닦아냅니다.
9 단계 : 투명하고 매트 한 법랑질의 얇은 층과 중간 층을 다시 걸고 바릅니다. 적어도 하루 동안 말리십시오.

이제 램프의 몸체와 바닥을 마감 처리했습니다. 다음으로 버튼에 대해서도 비슷한 과정을 거칩니다. 그들은 아주 적은 허용 오차로 모델링되었으므로 220 그릿 사포로 완벽한 적합성을 찾은 다음 페인트 두께를 고려하여 조금 더 줄이십시오.

단추를 칠하십시오

버튼을 페인트하는 단계는 LED에서 빛이 통과해야하므로 전원 버튼의 뇌관 단계를 뺀 위와 동일합니다. 램프에 다시 들어 가지 않으므로 버튼에 너무 두껍게 쌓이지 않도록하십시오.

버튼 설치

버튼에는 정확한 깊이를 찾는 데 도움이되는 작은 탭이 있습니다. 램프의 목에 사용했던 동일한 에폭시 접착제를 사용하여 각 버튼을 제자리에 붙입니다. 접착제로 아름다운 페인트 작업을 엉망으로 만들 기회를 제한하기 위해 바닥을 둘러싼 외부 영역을 테이프로 감아 야합니다.

주변 광선 센서 설치

이 램프에 사용 된 주변 광 센서는 Adafruit TSL2561 광 센서입니다. LED가 설치되기 전에 들어가야합니다. 리본 케이블은 센서 보드의 밑면에서 최대한 평평하게 설치해야합니다. 그런 다음 여분의 느슨 함으로 램프의 목 아래로 공급됩니다. 프린터 / 솔더 작업에 따라 적합성이 다소 떨어질 수 있습니다. 좀 더 많은 공간이 필요하면 날카로운 # 11 Exacto 칼이 열쇠가 될 것입니다.

LED 스트립 설치

LED 스트립은 3 개의 4 세그먼트로 절단해야합니다 (사진에서 볼 수 있음). LED에 접착제가 내장되어있어 LED를 고정시킬 수 있습니다. 이들을 모두 같은 방향으로 설치하면 쉽게 납땜 할 수 있습니다. 모든 색상과 12V +는 병렬로 납땜되어야합니다. 스트립이 설치되면 목을 아래로 내리고 4 색 코드 리드를 중앙 스트립에 납땜합니다. 뜨거운 접착제는 솔더 조인트에 강도를 추가합니다. 12V + 와이어를 전원 공급 장치에 연결하고 R, G 또는 B 와이어 중 하나를 접지하십시오. 세 가지가 모두 켜지면 다음 단계로 넘어갑니다.

기관총 설치

우리는 후드 어셈블리를 마무리하고 디퓨저를 설치할 준비가되었습니다. 페인트에 접착제를 칠 할 기회가 없도록 LED 배열 주변을 조심스럽게 테이프로 감습니다. LED 캐비티 수준으로 등판을 등지에 고정시킵니다. 작은 스틱을 애플리케이터로 사용하여 LED 캐비티의 양면에있는 양각 표면에 접착제를 조심스럽게 추가하십시오. 접착제가 양쪽면에 골고루 붙어 있으면 접착제가 스며 나오는지주의 깊게 관찰하십시오. 어떤 것이 있으면 빠르게 설정할 수 있습니다.

2 단계 : Electronics Rock!

전자 공학 : 현대 일 Wizardry

기술은 오늘날 우리 기술의 기능과 함께 마술처럼 보일 수 있습니다. 그러나, 나는 누구든지 전자 제품을 배우거나 할 수 있음을 확신합니다. 우리는 여러분이이 램프를 복제 할 수 있도록 모든 것을 무너 뜨 렸고 잘하면 두 가지를 배울뿐만 아니라 일부 전자 제품의 기본 원리를 설명했습니다.

부품 목록:

다음은이 램프의 네트워킹과 전자 장치를 완성하는 데 필요한 모든 것들입니다.

  • 3D 프린터
  • Adafruit의 WINC1500 브레이크 아웃 보드
  • N 채널 MOFSETS의 3 배
  • Adafruit TSL2561 광 센서
  • Adafruit MPR121 커패시 티브 터치 보드
  • 백라이트 용 LED 전원 버튼 (두 개의 LED 만 필요함)
  • 좌초 된 심선
  • 와이어 커터
  • 와이어 스트리퍼
  • 솔리드 코어 와이어 (용량 성 터치 버튼 용)
  • LED 스트립
  • 양방향 스위칭 일반 (12V ~ 5V)
  • Teensy 3.2 또는 Arduino Mega (확장 메모리 필요)
  • sparkfun protoboards의 3 배 (또는 유사한 크기의 무언가 - 더 큰 것은 아닙니다!)
  • 12V DC 전원 공급 장치 및 2.1mm 배럴 잭 (링크 된 것을 모두 포함합니다!)
  • 3x 68 옴 저항 (백라이트 LED 당 하나)
  • 열 수축 관 1/8 ''
  • 브레드 보드 (비 영구 버전을 먼저 프로토 타입하려는 경우)
  • 히트 건
  • 납땜 인두 (모든 납땜 관련 링크 - 납땜 포함)
  • 땜납
  • 물 (솔더 패드 청소용)

1 단계 : Teensy에 WIFI 브레이크 아웃 연결

이 램프의 연결성은이 소자의 '냉각'요소의 50 %와 IoT 부분의 100 %이므로 매우 중요합니다. 위의 그림은 Teensy의 올바른 핀에 각 핀을 연결하는 방법을 정확하게 보여줍니다.

이 링크는 Adafruit의 튜토리얼이며 각 핀을 마이크로 컨트롤러에 연결하는 방법을 단계별로 보여줍니다. 그들은 핀 아웃이 다른 Arduino를 사용했습니다. 그러나 위의 두 가지 버전의 독수리 설계도 이미지를 포함하여 WiFi 보드를 Teensy와이 램프에 포함 된 다른 보드에 올바르게 연결할 수 있도록해야합니다. 더 많은 "고급 회로도"에서 회로도는 각 브레이크 아웃 보드 및 하위 회로의 기능을 분해하고 고급 제조사가 보드를 단일 보드에 통합하려는 경우 적합한 모든 치수를 충족시킵니다. "Basic Schematic"에서 WiFi 보드는 추상화되어 핀이 튀어 나와있는 블랙 박스가되었습니다. 그 핀들은 정확한 네이밍으로 Teensy에 연결되어야하는 핀과 일치하는 그물 라벨로 모두 라벨이 붙어 있습니다! 이 회로도는 통합 보드 설계의 기초로 사용해서는 안됩니다. 보드에 정확한 치수 나 적절한 회로가 없습니다.

각 부분을 테스트하고 연결을 확인하려는 경우 브로드 캐스트 할 수 있습니다. 이 지침은 현재 프로토 타이핑위원회에서 작업하고 있다고 가정합니다. 우리는 독립적으로 테스트와 여러번의 빵 굽는 작업을 반복 했으므로 연결을 솔더링 할 때 편안하게 똑바로 뛰어 넘을 수 있습니다.

이 지침서는 솔더링 방법을 알고 있다고 가정합니다.. 당신이 아직도 배우고 있다면,이 링크를 확인하십시오!

헤더 핀을 먼저 Teensy에 납땜해야합니다. 그 방법을 잘 모르는 경우이 링크를 확인하십시오!

헤더 핀을 십대에 납땜 한 후, Teensy를 SparkFun 보드에 놓고 십자형을이 특정한 방향으로 맞 춥니 다. 십자형의면에 두 개의 수직 기둥이 있어야합니다. 반짝 이는 금속 직사각형은 일반적으로 숫자가 새겨 져 있습니다.) 여기에서 자세히 알아보십시오! 반대편은 세 개의 수직 기둥에만 맞아야합니다. 주변 장치 때문에이 방향이 필요합니다. 용량 성 터치 보드, WIFI 보드 및 Lux 센서는 모두 SPI 통신 핀을 통해 통신합니다. 램프베이스의 크기 제한으로 인해 부품 목록에 지정된 프로토 타입 보드 크기 만 사용할 수 있습니다. 결과적으로 LED 드라이버 회로 (게이트로부터의 PWM 핀)에 대한 모든 연결에 적합 할 수있는 두 가지 방향 만이 한쪽에 2 또는 3 개의 세로 열을 가지며 반대쪽에는 열 수 당신은 다른 쪽에서 선택하지 않았습니다 (즉, 하나는 2, 다른 하나는 3).

적절한 방향을 잡은 후에는 연결을 영구히 만들 수 있고 Teensy를 SparkFun Prototype 보드에 납땜 할 수 있습니다. 와이어 클립핑 장치를 사용하여 헤더 핀이 튀어 나와있는 보드의 바닥을 클립 할 수 있습니다.

Teensy를 납땜 한 후 헤더 핀을 WIFI 보드에 납땜합니다. 이것은 WIFI 보드가 들어있는 포장에 포함되어야합니다. WIFI 보드에 헤더 핀을 납땜 한 후 WIFI 보드를 별도의 프로토 타입 보드에 납땜해야합니다.

시간을 절약하기 위해 어떤 회로에 사용할 보드를 지정하십시오. 1 번 보드에만 십대가 있어야하고 그 외에는 아무것도 없어야합니다. 2 번 보드에는 Wi-Fi 보드 만 있습니다. 보드 3에는 LED 드라이버 회로, 양방향 스위칭 레귤레이터 및 DC 벽 전원 공급 장치에서 LED / 나머지 회로에 전원을 공급하는 커넥터 부품이 있습니다

와이퍼 보드를 프로토 타입 보드에 거꾸로 땜납. (참조 용으로 연결된 3 개의 보드의 그림 참조) 헤더를 클립하십시오. 이 방향은 3 개의 보드가 램프 바닥에 깔끔하게 접힐 수 있기 때문에 가능합니다.

마지막 단계는 위의 도식 이미지를 사용하여 연결 경로를 지정하는 것입니다. 약간의 여유를주기 위해 연결 길이보다 약간 긴 꼬임 된 심선을 잘라내어 벗겨냅니다. 그런 다음 양쪽 끝 부분에 납땜을 납땜하십시오.

일반적인 팁 : 컬러 코드를 사용하여 전체 회로에서 일관되게 유지하십시오! 전원 라인을 모두 빨간색의 좌선 심선과 검정색으로 만들어야합니다. 이것은 디버깅 프로세스를 돕고 일을 깔끔하고 질서있게 유지하는 데 도움이됩니다.

LED 드라이버 회로 및 레벨 쉬프터

이 섹션은 여러 부분으로 나누어 져 있으므로 작은 부분으로 나누어 여기를 모두 살펴 보겠습니다. 전원 회로부터 시작합시다!

전원 회로에는 직류 전원 공급 장치 (벽 벽돌)에서 양극 및 음극 리드 (빨간색과 검은 색 전선)를 연결할 수있는 커넥터 부품이 있습니다. 첫 번째와 두 번째 줄의 마지막 지점에서 대각선으로 보드의 윗면에이 부분을 납땜하고 싶습니다. 위 사진에서도 볼 수 있습니다. 그 후에 MOSFET 드라이버 회로쪽으로 초점을 옮겨 봅시다.

시작하려면 MOSFET이 무엇인지 모르는 사람들을 위해 MOSFET에 대한 배경 지식을 제공하십시오. MOSFET의 약자 etal 영형방해하다 에스에미 콘 에프ield 이자형완벽한 트랜지스터. 이것의 첫 번째 부분은 트랜지스터가 만들어지는 재료의 유형을 나타냅니다 (선택한 재료의 유형과 트랜지스터의 결과적인 특성에 대한 함의가 매우 단순 해짐). 이 문장의 후반부는 좀 더 복잡합니다. 필드 효과는 채널 사이를 이동하는 전하를 통해 유도 된 전류를 통해 끌어 당겨지는 트랜지스터의 게이트를 의미합니다 (이해하지 못하더라도 걱정하지 않아도되지만 더 많은 정보가 있습니다!). 트랜지스터는 기본적으로 스위치입니다. 게이트에 전압을가함으로써 회로의 특정 부분에 전력을 공급함으로써 전력 흐름을 제어 할 수 있습니다. 트랜지스터는 꽤 복잡합니다. 즉, 모든 트랜지스터에는 게이트, 드레인 및 소스가 있습니다. 드레인 및 소스는 회로의 입력 및 출력으로 취급 될 수 있습니다. MOSFET에는 여러 가지 종류가 있지만 제조업체로 실행할 주요 기능에 대해 설명하겠습니다. NMOS 및 PMOS는 포지티브 및 네거티브 채널 MOSFET을 나타냅니다. 소스에서 드레인으로 또는 드레인에서 소스로 전류가 흐르도록 게이트에 적용 할 수있는 전압의 종류가 결정되므로이 구분이 중요합니다. NMOS 게이트는 게이트와 소스 사이에 양의 전위 전압이 필요합니다. PMOS는 게이트와 소스 사이에 음의 전위를 필요로한다. 여기 MOSFET에 대한 모든 정보를 얻을 수 있습니다!

파워 잭을 납땜 한 후에 MOSFET을 내려 놓으려고합니다. 동일한 보드 위에 놓고 각각의 보드 사이에 하나의 구멍 공간이 있어야합니다. 그들은 각각의 MOSFET이 동일한 방향을 향하도록 수직으로 라인을 따라 가야합니다. 위 그림에서 볼 수 있듯이 쓰기 방향이있는면이 올바른 방향입니다. 그림에서 MOSFET은 폴딩되어 있으므로 문제가 발생하여 올바른 위치를 파악할 수 없다고 상상해보십시오. 방향이 맞으면 핀을 납땜하십시오.

MOSFET이있는 회로도에서 Diodes (수평선이있는 삼각형)는 LED 조명 스트립을 나타냅니다. LED 스트립에는 4 개의 금속 패드 (전원, 적색, 녹색, 청색)가 있습니다.이 패드는 납땜 인두에서 열을 가할 수 있으며 더 많은 꼬인 코어 선 (물론 색으로 구분)을 패드에 연결할 수 있습니다. 견고한 연결이되면 스트립 12V를 공급합니다. 즉, DC 전원 공급 장치의 전원 선을 보드에 납땜 한 커넥터 부품에 연결하고자 할 것입니다. 커넥터 조각의 전원 핀과 같은 행에있는 보드의 빈 구멍에 전력을 나타내는 Led 스트립에서 전선을 납땜하여 쉽게 수행 할 수 있습니다. 이렇게하면 LED에 전원이 공급됩니다. 이 시점에서 올바르게 전원을 연결하면 LED가 켜지는 것을 볼 수 있습니다. 이제는 LED 스트립에서 나머지 리드를 연결해야합니다. 빨간색, 녹색 및 파란색 제어 코드가 있어야합니다. 당신이해야 할 일은 각 와이어를 MOSFET의 중간 핀이 연결된 행에 연결하는 것입니다. MOSFET의 세 개의 다른 게이트에 연결된 세 개의 와이어가 있어야합니다. 그런 다음 Teensy의 드레인에서 디지털 핀에 연결하기 위해 세 개의 와이어 (적색, 녹색 및 파란색)가 필요합니다. 드레인은 MOSFET의 가장 왼쪽 핀이며, 각 행을 해당 행의 빈 구멍 중 하나에 납땜하면됩니다.

LED 스트립을 연결 한 후에는 양방향 스위칭 조절기를 연결합니다. 우리의 LED는 켜기 위해 12 볼트에서 작동합니다. 그러나 나머지 회로와 보드는 최대 5V 로직에서만 작동합니다. 즉, 전자 제품을 파괴하지 않으려면 회로의 나머지 부분으로가는 전압을 낮추어야합니다. 스위칭 레귤레이터를 통해이 작업을 수행합니다! 스위칭 레귤레이터는 높은 전압에서 낮은 전압으로 전압을 떨어 뜨리는 장치입니다 (이 경우 12V ~ 5V). 이제 저항을 사용하여 전압을 떨어 뜨리거나 전압 분배기 회로를 사용하지 않는 이유는 무엇입니까? 이 작업에는 여러 가지 문제가 있습니다. 우리는 이것을 반대하는 것이 좋습니다. 왜? 저항기는 원하는 전압을 떨어 뜨리지 만 열을 많이 생성합니다! 사실, 저항이나 선형 레귤레이터를 잘 알고 있다면 쉽게 회로를 녹일 수 있습니다. 그러나 방열판을 사용하고 회로에서 열을 멀리 떨어 뜨릴 수는 없습니까? 그렇습니다. 그렇지만 에너지 효율 문제에서 우리는 발생할 수 있습니다! 이것은 매우 비효율적입니다! 고등학교 물리학을 생각해 보면, 힘은 현재 시간 전압 또는 현재 제곱 시간 저항의 산물입니다. 전력은 와트로 측정되며 12 볼트에서 5 볼트를 떨어 뜨리려면 상당한 저항이 필요합니다. 이로 인해 소비되는 전력이 상당히 커집니다. 이렇게하면 램프가 매우 비효율적이게됩니다. 양방향 스위칭 레귤레이터를 사용하면이 문제를 피할 수 있습니다! 이 레귤레이터는 쉽게 달성 할 수있는 85 % 효율로 12 볼트에서 5 볼트까지 떨어 뜨립니다. 이것은 온도를 낮추고 램프 수명을 늘리는 데 도움이됩니다!

스위칭 레귤레이터를 연결하려면이 데이터 시트를 참조하십시오! 좋은 기술은 데이터 시트를 읽는 것입니다! 모든 평판이 좋은 부품에는 장치 사용 방법 및 특성 및 작동 범위가 나와있는 데이터 시트가 있습니다. 이 레귤레이터의 경우 12 페이지 중 8 페이지의 왼쪽 하단 모서리에는 핀 테이블과 해당 레이블이 있습니다. 핀 1은 가장 왼쪽 핀이며 전원 입력입니다. 전원 커넥터와 동일한 행의 구멍에서 핀 1과 같은 행의 구멍에 와이어를 납땜해야합니다. 핀 2는 접지 와이어입니다. 따라서 전원 커넥터의 접지 핀 행에있는 빈 구멍에서 핀 2와 동일한 행의 빈 구멍에 와이어를 납땜하십시오. 핀 3은 출력입니다. 이것은 회로의 나머지 부분에 대한 전원 라인 역할을합니다. 우리는 디버깅을 더 쉽게하기 위해 각 보드에 전용 전원 레일 열을 만들었습니다. 위의 그림에서 각 보드의 전원 레일을 볼 수 있습니다. 커넥터의 출력 (접지 전용)과 전원용 스위칭 레귤레이터의 출력에서 ​​접지 및 전원을위한 단일 연결. 각 보드는 행의 큰 간격 (행이 보드 전체에 걸쳐 직접 연결되지 않음)과 프로토 타이핑 보드 사이에 작은 점프가 필요하며 솔더링 연결도 필요합니다. 요지를 얻으려면 위 사진을보십시오!

커패시 티브 터치 브레이크 아웃 보드

주변 광 센서를 포함하도록 전자 장치를 확장하는 데 관심이없는 사람들을위한 전자 장치의 마지막 부분입니다. 이 부분에서는 헤더 핀이 필요 없으며 보드를 Sparkfun 프로토 타이핑 보드에 부착 할 필요가 없습니다. 이 보드는 가능한 한 버튼 가까이에있는 램프 내부에 붙어있어 가능한 한 짧게 각 버튼에 대한 활성 용량 성 터치 리드를 유지합니다. 이것은 간섭을 방지하기위한 것이며, 깨끗한 용량 성 터치 판독 값을 수신 할 수 있습니다. 보드 자체에는 위에서 설명한 독수리 회로도의 "단순한"버전에 나열되어있는 여러 핀이 있습니다. 이 지시기의 WIFI 모듈 섹션에서와 마찬가지로 십대에 연결할 핀을 정확하게 알려줍니다. 이 연결을 함께 솔더링하면 전원뿐만 아니라 보드에 대한 SPI 통신 링크가 제공되어야합니다.

다음 단계는 버튼에 연결하는 리드입니다. 앞에서 설명한 것처럼 용량 성 터치 버튼을 가능한 한 민감하게 만들기 위해 가능한 한 짧게하고 싶습니다. 이렇게하려면 위에서 본 것처럼 와이어를 사용하여 일종의 접촉 패드를 생성해야합니다. 견고한 심선을 감아 단선의 원형 코일로 편조하십시오. 코일의 다른 쪽 끝은 와이어의 직선 부분이어야하며 핀에 납땜되어야합니다. 각 버튼마다 3 개의 버튼 접촉 선이 자연스럽게 필요하며 핀 0, 1, 2에 납땜됩니다. 11 번 핀에는 전원 LED 용으로 다른 선을 납땜합니다. 이것은 GPIO 핀 (범용 입 / 출력 핀)이며 PWM (펄스 폭 변조) 기능을 갖추고 있습니다. 이 핀을 사용하여 전원 버튼의 백라이트가되는 LED의 로직을 제어합니다. 이것이 어떻게 행해지는지 프로그래밍 및 코드 섹션에서 설명합니다.

주변 광 센서

이 섹션은 주위에서 빛을 받아들이고 IR 및 가시 광선 판독 값뿐만 아니라 실내의 광도에 대한 사용자 데이터를 제공하기 위해 필터링 기능을 갖춘 브레이크 아웃 보드 인 주변 광선 센서에 사용됩니다. 이 브레이크 아웃은 매우 간단하며 독수리 도식에 포함되어 있지 않습니다. 그러나 Adafruit에는 여기에 링크 된 아주 훌륭한 자습서가 있습니다! 이 링크는 주변 광 센서를 십대에 연결하는 방법을 단계별로 안내합니다. 연결의 위 그림이있다; Teensy의 핀 배치를 제공하고 전선을 연결하는 데 도움이되는 링크가 포함되어 있습니다. 보드의 전원을 켜려면 브레이크 아웃 보드의 전원을 연결해야합니다. 가장 편리한 전원 레일에이 연결을 연결하는 것이 좋습니다. 위 그림은 우리의 전원 연결 배치를 포함합니다. 다음으로 SDA와 SCL 핀을 Teensy에 연결해야합니다. 십대의 핀은 독수리 도식으로 표시되어 있으며 연결을 영구적으로 유지하기 만하면됩니다. 십대의 SDA 핀에서 광 센서의 SDA 핀까지 와이어를 솔더링하고 마찬가지로 십대의 SCL 핀 (핀 13)에서 십자형의 SCL 핀에 와이어를 연결합니다. 그 후에 마지막 연결을 GND로해야합니다. 브레이크 아웃 보드의 접지를 가능한 모든 접지 레일에 연결하십시오. 다시 한번, 전자 제품을 쉽게 납땜하고 조립할 수있는 장소를 선택하십시오. 우리의 버전은 위의 그림을 참조하십시오. 모든 지상 및 전력선은 각각 검은 색과 빨간색으로 표시됩니다.

3 단계 : 프로그래밍 찹 : MQTT 네트워킹

소프트웨어 : 멍청한 개체를 스마트하게 만들기

이제이 프로젝트의 소프트웨어 측면을 만들었습니다! 이걸 멀리 만들었다면, 축하해! 기본적으로 똑똑한 램프가 있습니다. 왜냐하면 우리는이 지침에 모든 코드를 포함 시켰기 때문에 코드를 업로드하고 스마트 램프를 준비 할 준비가되었습니다! 코드가하는 일에 대해 더 많은 것을 배우고 싶다면 코드 섹션의 주석이 자세하게 설명되어 있고 모든 것을 설명합니다!

단순히 코드를 업로드하는 데 관심이있는 사용자는 더 이상 읽을 필요가 없습니다. instructable의이 부분은 십대에 코드를 업로드하는 방법에 대해 이야기 할 것입니다. 배경으로, 십대는 프로세서를 프로그래밍 모드로 전환하는 수동 / 자동 부트 로더 (프로그램)가 필요한 마이크로 컨트롤러입니다. 이전에 Arduino를 사용한 적이있는 사용자의 경우 Arduino 프로젝트 용 프로그램을 코딩 할 때 오른쪽 상단의 확인 표시가 스케치 오류를 확인하고 코드가 컴파일되면 화살표를 클릭하여 코드를 업로드 할 수 있습니다. Arduino의 IDE는 자동으로 Arduino를 프로그래밍 모드로 전환하고 보드에 새로운 코드를 깜박입니다. Teensy에서는이 기능이 Teensy 부트 로더에 추상화되었습니다. 모든 Teensy 사용자는 부트 로더를 다운로드해야하며 아직 설치하지 않았다면 여기에있는 Arduino IDE를 다운로드하십시오. 설치를 완료하면 위에 포함 된 코드를 다운로드하십시오. Arduino IDE에서 열립니다. 라이브러리가 많이 포함되어 있으며 코드를 컴파일해야합니다. 아래에는 .zip 파일을 다운로드하여 라이브러리에 설치하는 데 필요한 라이브러리에 대한 링크가 있습니다. 라이브러리를 Arduino 스케치에 설치하는 방법을 모른다면, 여기에 지시 사항에 대한 링크가 있습니다.

도서관 :

  • Adafruit MQTT 라이브러리
  • 용량 성 터치 보드 MPR121
  • WINC1500 wifi 보드
  • Adafruit 럭스 센서
  • Wire.h (사전 설치되어 있지 않으므로 라이브러리가 없음)
  • String.h (기본 라이브러리이기 때문에 라이브러리가 없음)
  • SPI.h (미리 설치되었으므로 라이브러리 없음)
  • Adafruit_Sensor.h
  • ArduinoJSON

이러한 라이브러리를 모두 설치하면 코드가 컴파일됩니다. arduino IDE에서 코드 확인 버튼 (확인 표시)을 누른 후 Teensy의 부트 로더 창을 엽니 다. Teensy의 가상 버전이있는 작은 창을보아야합니다. 자동 버튼을 클릭하고 (실제로 버튼을 눌렀을 때처럼 … 우리가 의미하는 바를보기 위해 십대 부트 로더 링크를보십시오.) 그런 다음, USB 반대쪽 보드의 끝에있는 Teensy 자체의 실제 버튼을 누릅니다. 스케치가있는 arduino IDE를 확인하고 도구를 클릭하십시오. 보드에 Teensy 3.1 / 3.2, USB 유형이 Serial, CPU 속도가 96MHz로 최적화 된 오버 클럭으로 설정되어 있고 포트가 "긴 숫자와 문자로 구성된 usb"로 설정되어 있는지 확인하십시오. 작업을 마쳤 으면 arduino의 업로드 버튼 (옆쪽 화살표)을 누릅니다. Teensy는 보드에 LED가 있어야하며 코드를 업로드 할 때 깜박입니다. 업로드가 끝나면 전자 제품을 램프 바닥에 놓기 만하면됩니다. 다 끝났습니다!

코드가하는 일에 관심이 있다면 아래 코드에 포함 된 주석을 확인하십시오!

#include #include #include #include #include #포함 #포함 #include #include
#포함 #포함
#포함 #define WINC_CS #define WINC_IRQ 7 #define WINC_RST 4 #define AIO_SERVER "mqtt2.seecontrol.com"#define AIO_SERVERPORT 1883 #define AIO_USERNAME "IoTLamp"#define AIO_KEY "b184b39888dc43fea40fd55e5da0a360"#define halt (s) {Serial.println (F (들)); 동안 (1); } #define LEDPIN 3 #define LED_RED 23 #define LED_GREEN 5 #define LED_BLUE 6 #define touch_pin0 0 #define touch_pin1 1 정의 # touch_pin2 2 char ssid = ""; // 네트워크 SSID (이름) char pass = ""; // 네트워크 비밀번호 (WPA에 사용하거나 WEP 용 키로 사용) int keyIndex = 0; // 네트워크 키 인덱스 번호 (WEP에만 필요) int status = WL_IDLE_STATUS; // wifi status const char MQTT_SERVER PROGMEM = AIO_SERVER; const char MQTT_CLIENTID PROGMEM = __TIME__ AIO_USERNAME; const char MQTT_USERNAME PROGMEM = AIO_USERNAME; const char MQTT_PASSWORD PROGMEM = AIO_KEY; const char IOTLAMP_FEED PROGMEM = "/ IoTLampDemo"; // 게시 및 구독 채널 이름 const char RETURN_FEED PROGMEM = "/ IoTLampDemo"; uint32_t x = 0; // uint8_t POWER_STATE = 0; uint8_t pinNum; uint8_t led_brightness = 100; uint8_t redVal = 0; uint8_t greenVal = 0; uint8_t blueVal = 0; uint16_t lux; bool Network_Mode = false; bool cap_touch_activated = false; const int irqpin = 2; // activity-indicator의 핀 번호 volatile boolean flagIrq; struct JSON {const char * targetVal; const char * codeVal; int lamponVal; int brightnessVal; }; / * 모든 선언 * / Adafruit_WINC1500 와이파이 (WINC_CS, WINC_IRQ, WINC_RST); Adafruit_TSL2591 tsl = Adafruit_TSL2591 (2591); // 광 센서 Adafruit_WINC1500Client 클라이언트; // wifi 칩 Adafruit_MQTT_Client mqtt (& 클라이언트, MQTT_SERVER, AIO_SERVERPORT, MQTT_CLIENTID, MQTT_USERNAME, MQTT_PASSWORD); // mqtt 선언 Adafruit_MQTT_Publish IOTLAMP = Adafruit_MQTT_Publish (& mqtt, IOTLAMP_FEED); Adafruit_MQTT_Subscribe VIRTUAL_LAMP = Adafruit_MQTT_Subscribe (& mqtt, RETURN_FEED); / * *이 함수는 설정입니다. 설정 과정에서 버튼에 붙이는 인터럽트는 물론 * LED의 모든 핀을 초기화했습니다. 우리는 wifi 보드, 용량 성 터치 보드 및 정확한 주제 경로에 가입 할 기능을 설정하는 기능을 호출했습니다. * * / void setup () {pinMode (irqpin, INPUT); Serial.begin (9600); // 설정 인터럽트 Serial.println ( "starting program"); attachInterrupt (irqpin, isrIrqPin, 변경); // irq 핀 인터럽트 & RISING / HIGH / CHANGE / LOW / FALLING을 첨부하십시오. MPR121.setInterruptPin (irqpin); pinMode (LED_RED, OUTPUT); pinMode (LED_BLUE, OUTPUT); pinMode (LED_GREEN, OUTPUT); digitalWrite (LED_RED, LOW); digitalWrite (LED_GREEN, LOW); digitalWrite (LED_BLUE, LOW); capacitiveTouch_Setup (); wifi_module_config (); // wifi를 구성합니다. mqtt.subscribe (& VIRTUAL_LAMP); } / * *이 함수는 루프입니다. 인터럽트가 발견되지 않는 한이 함수에서 무한히 반복되는 것을 반복합니다.이 경우에는 다른 함수가 실행되고 나머지는 중지됩니다. *이 함수는 인터럽트가 발생했는지 확인한 후 resetButton 함수를 실행합니다. * 우리가 네트워킹 모드 (우리는 와이파이 연결을 의미)에 있다면, 네트워킹 * 기능을 실행하십시오. 둘 다 사실이 아니라면 일반 램프처럼 행동하십시오. * * / void loop () {if (flagIrq == true) {ResetBUTTONFlag (); // BUTTON 인터럽트가 발생하면 플래그를 리셋합니다. } else {if (Network_Mode) {networking (); }}} / * *이 함수는 인터럽트가 발생하면 커패시 티브 버튼 함수 *가 호출되고 flag boolean이 true로 설정되면 호출됩니다.* / void isrIrqPin () {capacitiveTouch_buttons (); flagIrq = true; } / * *이 함수는 단지 상태를 처리합니다. 인터럽트가 시작될 때만 호출되고 flag 부 울린은 false로 바뀌고 커패시 티브 터치 부울은 true로 설정됩니다. * / void ResetBUTTONFlag () {// 재설정 버튼 1 플래그 + 표시 led 활동 표시기 flagIrq = false; cap_touch_activated = true; } // 확장 된 lux 센서 판독 값에 대해이 함수의 주석을 제거하고 원하는 곳 어디에서나 호출하십시오. // void luxSensor_Readout (void) {// sensor_t sensor; // tsl.getSensor (& sensor); // Serial.println ( "------------------------------------"); // Serial.print ( "Max Value :"); Serial.print (sensor.max_value); Serial.println ( "lux"); // Serial.print ( "Min Value :"); Serial.print (sensor.min_value); Serial.println ( "lux"); // Serial.print ( "Resolution :"); Serial.print (sensor.resolution); Serial.println ( "lux"); // Serial.println ( "------------------------------------"); // Serial.println ( ""); // 지연 (500); //} / * *이 함수는 보드를 설정합니다. 용량 성 터치 보드가 올바르게 구성되었는지 알기 위해 디버깅 문을 제공하는 것으로 시작합니다. 그런 다음 버튼 및 전원 버튼에 대해서도 보드 자체의 디지털 핀을 초기화합니다. 감도를 설정하고 보정 * 데이터가 시작되도록합니다. 그러면 POWER LED가 켜지면서 켜집니다. * * / void capacitiveTouch_Setup () {if (! MPR121.begin (0x5A)) {Serial.println ( "오류 설정 MPR121"); switch (MPR121.getError ()) {case NO_ERROR : Serial.println ( "no error"); 단절; case ADDRESS_UNKNOWN : Serial.println ( "잘못된 주소"); 단절; case READBACK_FAIL : Serial.println ( "readback failure"); 단절; case OVERCURRENT_FLAG : Serial.println ( "REXT 핀의 과전류"); 단절; case OUT_OF_RANGE : Serial.println ( "전극이 범위를 벗어남"); 단절; case NOT_INITED : Serial.println ( "초기화되지 않음"); 단절; 기본값 : Serial.println ( "unknown error"); 단절; } while (1); } Serial.println ( "MPR121 found!"); MPR121.setTouchThreshold (2); // 터치의 경우 기본값은 40입니다. MPR121.setReleaseThreshold (1); // touch의 기본값은 20입니다. 항상 터치 임계 값보다 작아야합니다. MPR121.setNumDigPins (1); // LED 출력 MPR121.pinMode (11, OUTPUT); MPR121.updateTouchData (); // 초기 데이터 업데이트 MPR121.digitalWrite (11, HIGH); } / * * 이것은 wifi 구성 함수입니다. 이것은 * WIFI 모듈에 전원이 공급되었는지 확인한 다음 전원 *이 제공되었는지에 따라 네트워킹 부울을 true 또는 false로 설정합니다. 그렇다면 연결되어 있는지 인쇄하십시오. * * / void wifi_module_config () {Serial.println (F ( "Adafruit MQTT demo for WINC1500")); Serial.print (F ( " n WiFi 모듈을 삽입하십시오 …")); // (WiFi.status () == WL_NO_SHIELD) {// 브레이크 아웃이 있는지 확인합니다. Serial.println ( "WINC1500 not present"); // 계속하지 않음 : Network_Mode = false; while (true); } Serial.println ( "ATWINC OK!"); Network_Mode = true; } / * *이 함수는 RGB 값에 대한 매핑을 생성합니다. 램프가 출력 할 흰색 *의 최대 음색을 조절합니다. 그런 다음 각 색상 Red Green 및 Blue에 대한 매핑을 만든 후 LED의 색상 톤을 설정하는 도우미 함수를 호출합니다. * / void map_white (int new_brightness) {redVal = map (new_brightness, 0, 255, 0, 255); // 빨강 값 매핑 greenVal = map (new_brightness, 0, 255, 0, 255); // 녹색 값 매핑 blueVal = map (new_brightness, 0, 255, 0, 240); // 파란색 값을 매핑하십시오. set_leds (redVal, greenVal, blueVal); } / * *이 함수는 실제로 LED 색상 값을 설정하고 LED를 켭니다. * * / void set_leds (uint8_t redVal, uint8_t greenVal, uint8_t blueVal) {analogWrite (LED_RED, redVal); // 현재 값을 LED 핀에 쓰십시오. analogWrite (LED_GREEN, greenVal); 아날로그 쓰기 (LED_BLUE, blueVal); } / * *이 함수는 광 센서를 설정합니다. 먼저 센서가 전원에 연결되어 있는지 확인합니다. 일단 그것이 있으면, 이득을 설정합니다. 센서를 둘러싸고있는 빛이 낮 으면 높은 이득으로 증폭됩니다. 그런 다음 측정을 위해 걸리는 시간 인 통합 시간을 설정합니다. 나머지 기능 *은 직렬 모니터에서 선택 항목의 정보를 인쇄합니다. * / void configureSensor (void) {Serial.println ( "Adafruit TSL2591 테스트 시작!"); if (tsl.begin ()) {Serial.println ( "TSL2591 센서 발견"); } else {Serial.println ( "센서를 찾을 수 없습니다 … 배선을 점검 하시겠습니까?"); 동안 (1); } // 밝고 밝게 빛의 상황에 적응하기 위해 즉석에서 게인을 변경할 수 있습니다 //tsl.setGain(TSL2591_GAIN_LOW); // 1x 게인 (밝은 빛) tsl.setGain (TSL2591_GAIN_MED); // 25x gain // tsl.setGain (TSL2591_GAIN_HIGH); // 428x gain // 통합 시간을 변경하면 빛을 감지하는 데 더 많은 시간이 소요됩니다. // 더 긴 타임 라인은 더 느리지 만 매우 낮은 조명 위치에서는 좋습니다! //tsl.setTiming(TSL2591_INTEGRATIONTIME_100MS); // 가장 짧은 통합 시간 (밝은 빛) // tsl.setTiming (TSL2591_INTEGRATIONTIME_200MS); tsl.setTiming (TSL2591_INTEGRATIONTIME_300MS); // tsl.setTiming (TSL2591_INTEGRATIONTIME_400MS); // tsl.setTiming (TSL2591_INTEGRATIONTIME_500MS); // tsl.setTiming (TSL2591_INTEGRATIONTIME_600MS); // 가장 긴 집적 시간 (희미한 빛)

/ * 참조를 위해 이득 및 적분 시간 표시 * / Serial.println ( "-------------------------------- ---- "); Serial.print ( "Gain :"); tsl2591Gain_t gain = tsl.getGain (); 스위치 (이득) {경우 TSL2591_GAIN_LOW : Serial.println ( "1x (낮음)"); 단절; case TSL2591_GAIN_MED : Serial.println ( "25x (보통)"); 단절; case TSL2591_GAIN_HIGH : Serial.println ( "428x (High)"); 단절; case TSL2591_GAIN_MAX : Serial.println ( "9876x (Max)"); 단절; } Serial.print ( "Timing :"); Serial.print ((tsl.getTiming () + 1) * 100, DEC); Serial.println ( "ms"); Serial.println ( "------------------------------------"); Serial.println ( ""); } / * *이 함수는 버튼을 누르기 만하면 시작됩니다. 그런 다음 용량 성 보드에 저장된 데이터를 업데이트합니다. 그런 다음 사용 가능한 핀을 통과합니다 (우리는 버튼에 3 개의 핀만 연결했기 때문에 0-2 *부터 시작합니다). 그런 다음 접촉 한 핀 번호를 반환합니다. * * / uint8_t capacitiveTouch_pinTouched () {MPR121.updateTouchData (); for (pinNum = 0; pinNum <= 2; pinNum ++) if (MPR121.isNewTouch (pinNum)) {return pinNum; }} pinNum = 4; 리턴 핀 없음; } / * * 커패시 티브 터치 버튼은 실제로 버튼을 터치 한 경우 다루는 모든 로직을 유지합니다. 이 시점까지는 버튼이 눌려 졌다고 가정하고 이제는 터치 된 특정 버튼으로 무엇을 할 것인지를 알아낼 것입니다. 전원 상태 및 전원 LED 및 밝기 제어에 대한 모든 논리를 제어합니다. * * / void capacitiveTouch_buttons () {uint8_t touchedPin = capacitiveTouch_pinTouched (); switch (touchedPin) {case 0 : {if (POWER_STATE == 1) {if (led_brightness> 230) {led_brightness = 255; map_white (led_brightness); } else {led_brightness = led_brightness + 25; map_white (led_brightness); }} else {MPR121.digitalWrite (11, LOW); map_white (led_brightness); POWER_STATE = 1; }} 중단; 사례 1 : {if (POWER_STATE == 1) {MPR121.digitalWrite (11, HIGH); POWER_STATE = 0; map_white (0); } else {MPR121.digitalWrite (11, LOW); POWER_STATE = 1; map_white (led_brightness); } 휴식; 사례 2 : {if (POWER_STATE == 1) {if (led_brightness <= 30) {led_brightness = 25; map_white (led_brightness); } else {led_brightness = led_brightness - 25; map_white (led_brightness); }} else {MPR121.digitalWrite (11, LOW); map_white (led_brightness); POWER_STATE = 1; }} 중단; 기본값 : {} 중단; }}} / * *이 함수는 광 센서의 고급 읽기 함수입니다. 광 센서는 적외선 및 가시 광선 스펙트럼을 나타내는 32 비트를 제공합니다. 가시 스펙트럼의 16 비트 *를 잡고 가시 스펙트럼에 대해 계산 된 lux 값을 반환합니다. * * / uint16_t advancedRead (void) {uint32_t lum = tsl.getFullLuminosity (); // 상위 16 비트로 32 비트 읽기 IR, 하위 16 비트 전체 스펙트럼 uint16_t ir, full; ir = lum >> 16; full = lum & 0xFFFF; lux = tsl.calculateLux (full, ir); 리턴 럭스; } / * *이 함수는 JSON 형식의 데이터 패킷 전송을 처리합니다. 채널 이름이 올바른지 확인합니다 *. 그렇다면 해당 채널에 패킷을 게시합니다. * / void mqtt_transmit (char buf ) {// 이제 우리는 물건을 게시 할 수 있습니다! Serial.print (F ( " n JSON 보내기")); Serial.print ( "…"); if (! IOTLAMP.publish (buf)) {Serial.println (F ( "Failed")); } else {Serial.println (F ( "OK!")); Serial.println (buf); }} / * *이 함수는 MQTT를 설정하고 그것을 설정한다. Wifi 연결이 설정된 후 프로그램이 MQTT에 연결하려고 시도하는 시간 초과 및 * 문제를 처리합니다. * 연결되면 녹색으로 깜박이고 연결이 해제되었음을 알려줍니다. 연결되어 있지 않으면 Wi-Fi 절차 검색 기간 동안 빨간색으로 유지됩니다. * * / void MQTT_connect () {int8_t ret; uint8_t 시간 초과 = 10; // 연결 대기 10 초 : bool timedOut = false; while WiFi.status ()! = WL_CONNECTED && timedOut == false) {// Wi-Fi 네트워크에 연결하려고 시도합니다. digitalWrite (LED_RED, HIGH); Serial.print ( "SSID에 연결 시도 중 :"); Serial.println (ssid); status = WiFi.begin (ssid, pass); // WPA / WPA2 네트워크에 연결합니다. 열 또는 WEP 네트워크를 사용하는 경우이 줄을 변경하십시오. timeout--; 지연 (10); if (timeout == 0) {timedOut = true; digitalWrite (LED_RED, LOW); } Network_Mode = false; } while (timedOut) {Network_Mode = false; Serial.println ( "입력 된 레거시 모드"); } if (mqtt.connected ()) {// 이미 연결되어 있으면 중지하십시오. Network_Mode = true; 반환; } Serial.print ( "MQTT에 연결 중 …"); while (ret = mqtt.connect ())! = 0) {// 연결은 연결된 Serial.println (0)을 반환합니다 (mqtt.connectErrorString (ret)); Serial.println ( "5 초 후에 MQTT 연결 재시도 중 …"); mqtt.disconnect (); Network_Mode = false; 지연 (500); // 5 초 대기} Network_Mode = true; Serial.println ( "MQTT Connected!"); digitalWrite (LED_RED, LOW); digitalWrite (LED_GREEN, HIGH); 지연 (1000); digitalWrite (LED_GREEN, LOW); } / * * JSON의 형식을 지정하는 함수입니다. 지금은 어렵지 않게 코드화되어 있지만 유연하지는 않습니다. * 전달 된 매개 변수를 기반으로 쉽게 변경할 수 있습니다. * * / String json_Packet () {String pubString = "{"target ": "램프 ", "코드 ": "램프 ", "; 문자열 값 = ""값 ": {"; String onOff = ""lampon ":"; // int는 JSON 포맷팅을 위해 따옴표를 사용하는 대신 int로 남았습니다. String lampState = onOff + POWER_STATE + ","; String brightnessState = ""lampintensity ":"; 문자열 lamp_brightness = 밝기 상태 + led_brightness + ","; String lamp_luminosity = ""luminosity ":"; 문자열 initial_string = pubString + 값 + lampState + lamp_brightness + lamp_luminosity; return initial_string; } / * *이 함수는 구독 채널에서 들어오는 데이터의 논리입니다. * 서브 스크립 션 채널에서 전송 된 값에 따라 LED 전원 백라이트를 켜고 끕니다. 또한 해당 데이터에 따라 실제 LED 밝기가 변경됩니다. * / void subscribe_StateChange (JSON & json) {POWER_STATE = json.lamponVal; led_brightness = json.brightnessVal; if (POWER_STATE == 1) {MPR121.digitalWrite (11, LOW); map_white (led_brightness); } else {MPR121.digitalWrite (11, HIGH); map_white (0); }} / * *이 함수는 모든 네트워킹을 다루는 고급 함수입니다. MQTT 연결을 설정하는 * 함수를 호출합니다. 설정이 완료되면 데이터를 가져올 서브 스크립 션 인스턴스 *를 초기화하십시오. 그런 다음 구독 패킷에서 구문 분석 한 필드를 저장하는 앞에서 만든 구조체의 인스턴스를 만듭니다. 모든 구독 데이터를 저장할 버퍼를 만듭니다. 그런 다음 버튼에 손이 닿았는지 확인하여 가벼운 데이터를 읽고 데이터를 패키징 한 다음 패킷을 전송합니다. * 램프 상태를 변경하지 않으면 (버튼을 건드린 다) 읽을 패킷이 있는지 확인하십시오. 그렇게하면 구문 분석하고 앞에서 만든 JSON 구조체의 필드를 채 웁니다. * * / void networking () {MQTT_connect (); Adafruit_MQTT_Subscribe * 구독; JSON json; String basic_string = json_Packet (); StaticJsonBuffer <5000> jsonBuffer; 동안 (cap_touch_activated) {럭스 = advancedRead (); // lux 값을 가져와 lux와 동일하게 설정합니다. String finalString = basic_string + lux + "}}"; char buf finalString.length () + 1; finalString.toCharArray (buf, finalString.length () + 1); mqtt_transmit (buf); cap_touch_activated = false; } while ((subscription = mqtt.readSubscription (5000))) {if (subscription == & VIRTUAL_LAMP) {JsonObject & root = jsonBuffer.parseObject (char *) VIRTUAL_LAMP.lastread); if (! root.success ()) {Serial.println ( "parseObject () failed"); 반환; } json.targetVal = 루트 "대상"; json.codeVal = 루트 "코드"; json.lamponVal = 루트 "값" "lampon"; json.brightnessVal = root "values" "lampintensity"; subscribe_StateChange (json); }}}

네트워킹 : WIFI, MQTT & MQTT.fx

MQTT가 무엇인지 설명하고 네트워크를 전반적으로 설명하는 섹션입니다. 시작하자!

MQTT에 들어가기 전에이 개별 장치에 대한 WIFI 네트워킹 자격 증명을 설정해야합니다. 이제이 램프는 보안상의 이유로 WPA2 엔터프라이즈 네트워크에 연결할 수 없습니다. 라이브러리는 사용자 이름 필드를 처리하도록 설계되지 않았습니다. 현재로서는 네트워크 기능을 제공하지 않는 네트워크 SSID 및 암호 만 제공됩니다. 현재 WPA, WPA2 개인 및 WEP 네트워크에 대한 지원이 있습니다. 사용하려는 네트워크 자격 증명의 SSID와 암호를 변경해야합니다. 아래 라인을 참조하십시오 :

char ssid = ""; // 네트워크 SSID (이름)
char pass = ""; // 네트워크 비밀번호 (WPA에 사용하거나 WEP 용 키로 사용) int keyIndex = 0; // 네트워크 키 인덱스 번호 (WEP에만 필요)

WEP 네트워크를 사용하지 않는 한 KeyIndex 값을 변경할 필요가 없습니다.

따라서 MQTT … MQTT는 연결성 프로토콜을 처리하는 기계입니다. 그게 무슨 뜻입니까? 우선 MQTT는 장치가 많은 전력을 사용하지 않고도 서로 대화 할 수있는 방법입니다. 그것은 매우 작은 데이터 패킷을 가지므로 더 빠른 전송을 가능하게합니다. MQTT는 이전에 MQ Telemetry Transport로 알려져있었습니다. 어떤 경우든지, MQTT는 공개 W 서브 스크립 션 모델을 사용하여 데이터를 송수신합니다.

MQTT는 publish W subscribe를 사용하여 디바이스간에 데이터를주고 받고이를 수행하기 위해 데이터 브로커가 필요합니다. 즉, 게시 및 구독 데이터 전용 채널 또는 "주제"를 설정하는 데이터를 전송하는 중개 장소가 필요합니다. 이 브로커는 데이터를 보내고받는 논리를 처리합니다. 물론이 브로커에서 데이터를 가져 오거나 데이터를 보내려는 위치를 지정하는 함수를 작성해야하지만이 브로커에서 수신 및 전송되는 데이터를 모니터링 할 수 있습니다. 게시는 전송과 동일합니다. 원하는 형식으로 데이터를 패키지 한 다음 게시 할 채널 이름을 지정하십시오. 이렇게하면 adafruit에서 다운로드 한 라이브러리를 사용하여 실제로이 채널로 데이터를 보낼 수 있으며 브로커를 설정하면 수신중인 데이터를 볼 수 있습니다.

구독은 기기에 실제로 데이터를 수신하는 것과 관련하여 게시하는 것보다 약간 어렵습니다. 게시하면 전송하면됩니다. 유스 케이스에 따라 데이터가 다른 쪽에서 수신되거나 파싱되는 것이 반드시 중요하지는 않습니다. 그러나 구독을 사용하면 클라이언트 측 (장치 제조업체)이 구독 채널 항목에서 데이터를 제대로 읽었는지, 손실 된 패킷이 없는지, 데이터를 구문 분석하고 해당 데이터에 따라 적절하게 반응하는지 확인합니다. 구독을 사용하면 끊임없이 데이터 수신 여부를 확인하고 장치 상태가 곧 변경되어 패킷을 수신하기 때문에 다른 모든 현상이 발생하지 않도록해야합니다. 구독은 게시 방법과 비슷하게 작동합니다. 채널을 설정하고 Adafruit MQTT 라이브러리에서 함수 호출 (subscription *. readSubscription (int timeout))을 통해 데이터를 읽습니다. 끊임없이 패킷을 반복하고 파싱 한 후 결과로 실제 램프의 상태에 대한 사항을 즉시 변경할 수 있습니다. 모든 패킷이 수신되었고 어떤 품질인지를 구체적으로 알아야하는 무언가를하고 있다면, 전송 된 각 패킷의 서비스 품질에 대한 추가 필드가 있습니다. 이것은 전송 품질이 무엇인지 알려주는 데 사용됩니다. 모든 패킷을 받으면 2가 반환됩니다. 즉, 패킷을 성공적으로 보내고 ping 패킷을 받았습니다. 하나를 얻으면 패킷이 전송되었지만 모두 다시 받았음을 확신 할 수는 없습니다. QoS가 0이면 전송했음을 알리고 패킷의 수신 여부 또는 모든 패킷 수신 여부에 대한 추가 정보는 없습니다.

우리가 사용한 중개인은 MQTT.fx이며 여기서 다운로드해야한다. MQTT.fx는 모든 데이터 관리를 처리하는 클라이언트 브로커입니다. 그것을 사용하려면, 그것을 설정해야합니다. 우선 MQTT.fx에 연결을 시도하기 전에 설정에 대한 장비를 클릭하십시오. 일단 클릭하면 포트 번호는 물론 데이터를 보낼 서버의 URL (브로커 주소)을 제공해야합니다. 우리에게 물건을 똑바로 유지하기 위해 만들어진 프로파일 이름을 제공하십시오. 우리는 그 프로파일 이름을 사용하여 프로파일 이름 앞에 "/"기호로 채널 이름과 구독 채널 이름을 만들었습니다. 모든 정보를 입력 한 후 임의의 키를 생성하고 해당 키의 기록을 유지하십시오. 코드의 AIO_KEY 값을 생성 한 새 키로 대체합니다. 일반 탭으로 이동하여 사용자 이름과 비밀번호를 제공 할 수도 있지만, 특별히 필요하지는 않습니다. 그런 다음 적용 버튼과 확인 버튼을 누른 다음 연결 버튼을 누를 준비가되었으므로 작동중인 서버에 맞게 구성해야합니다. 그런 다음 공개 및 구독 채널 이름을 드롭 다운 탭에 입력하면 채널 이름 앞에 백 슬래시를 포함하는 한 데이터가 표시됩니다. 이것은 중요합니다; MQTT의 하드 코딩 된 형식이며 사용자가 지정한 채널 이름 앞에 백 슬래시가없는 경우 데이터가 나타나지 않습니다. 이 후, 당신은 모든 설정!