로그인회원등록 내글장바구니주문조회현재접속자
 상품 검색








 게시판 검색





 
 
회원등록 비번분실


온라인 입금계좌
ㆍ기업은행
ㆍ219-043192-01-028
ㆍ이건영

      거래은행 바로가기
 
 Sensor Applications
아듀이노 응용소스
작성자 avrtools™        
작성일 2016/03/03
첨부#1 esp8266_lamp_module.zip (24KB) (Down:486)
첨부#2 Ai-Thinker-AT-0.25.0.0-SDK1.1.1-150623.zip (200KB) (Down:208)
ㆍ추천: 0  ㆍ조회: 178   
  ESP8266 MQTT Relay Control
ESP8266 MQTT Relay Control
저자: JUSTIN COOPER
참조: AdaFruit MQTT API
 
ESP-01 (4,600원) 혹은 ESP-12E를 사용하는 WiFi Relay의 제작.
와이파이 2 릴레이 제어장치는 Arduino 2 Relay 기판(4,400원)이 필요하다.

AdaFruit Fuzza ESP 모듈의 예
 

Adafruit ESP8266 Lamp Controller Module
 

MQTT Realy 장치가 인터넷을 통해서 MQTT 서버에 연결이 된 상태로 제어된다.
사용자가 인터넷으로 연결하고, Switch 단추를 누르면 ON -> OFF, OFF -> ON으로 전환된다. 
글씨 부분을 눌러야 잘 된다.  너무 빨리 누르면 글자만 바뀌지 제어는 잘 안된다.

현재 녹색 ON 이면, 표시된대로 MQTT Relay의 포트는 ON으로 출력되고 있다는 것이다. 
이 MQTT 서비스는 beta 버전을 종료하고 정식 버전인데 잘 안된다. 이 MQTT 서버는 시험용이다.

MQTT API
MQTT, or message queue telemetry transport, is a protocol for device communication that Adafruit IO supports. 
Using a MQTT library or client you can publish and subscribe to a feed to send and receive feed data.

If you aren't familiar with MQTT check out this introduction from the HiveMQ blog. 
All of the subsequent posts in the MQTT essentials series are great and worth reading too.
To use the MQTT API that Adafruit IO exposes you'll need a MQTT client library. 

For Python, Node.js, and Arduino you can use Adafruit's IO client libraries as they include support for MQTT (see the client libraries section). 
For other languages or platforms look for a MQTT library that ideally supports the MQTT 3.1.1 protocol.
 
Connection Details
You will want to use the following details to connect a MQTT client to Adafruit IO:
Host: io.adafruit.com
Port: 1883
Username: your Adafruit account username (see the accounts.adafruit.com page here to find yours)
Password: your Adafruit IO key (click the AIO Key button on a dashboard to find the key)
If the MQTT library requires that you set a client ID then use a unique value like a random guid. 
Most MQTT libraries handle setting the client ID to a random value automatically though.
 
Topics
Adafruit IO's MQTT API exposes feed data using special topics. 
You can publish a new value for a feed to its topic,
 or you can subscribe to a feed's topic to be notified when the feed has a new value. 
Any one of the following topic forms is valid for a feed:
(username)/feeds/(feed name, ID, or key)
(username)/f/(feed name, ID, or key)

 

Where (username) is your Adafruit IO username
(just like as specified when connecting to the MQTT server)
and (feed name, ID, or key) is the feed's name, ID or key. 
The smaller '/f/' path is provided as a convenience for small embedded clients that need to save memory.

For example if your username is mosfet and you're accessing a feed called photocell
(which has a feed ID of 42) you can use any of these paths:

mosfet/feeds/photocell
mosfet/f/photocell
mosfet/feeds/42
mosfet/f/42

To append a new value to a feed perform a MQTT publish against the feed path
and provide the new feed value as the payload of the request.
To be notified of a change in a feed perform a MQTT subscribe against the feed path. 
When a new value is added to the feed
then the Adafruit IO MQTT server will send a notification with the new feed value in the payload.

You can also subscribe to the parent 'feeds' path to be notified when any owned feed changes. 
For example the mosfet user could subscribe to either:
mosfet/feeds/#
mosfet/f/#

Once subscribed to the path above any change to a feed owned by mosfet will be sent to the MQTT client. 
The topic will specify the name of the updated feed, and the payload will have the new value.
Be aware the MQTT server sends feed updates on all possible paths,
like (username)/feeds/(feed name), (username)/feeds/(feed ID), etc. 
Make sure to check the topic of a changed feed and filter to just the feed name, ID,
or key you're interested in watching.
 
Publish QoS Levels
One feature of MQTT is the ability to specify a QoS, or quality of service, level when publishing feed data.  This allows an application to confirm that its data has been sucessfully published. 
If you aren't familiar with MQTT QoS levels be sure to read this great blog post explaining their meaning.
For publishing feed values the Adafruit IO MQTT API supports QoS level 0 (at most once) and 1 (at least once) only. 
QoS level 2 (exactly once) is not currently supported.
 
Rate Limit
Adafruit IO's MQTT server imposes a rate limit to prevent excessive load on the service. 
 If a user performs too many publish actions in a short period of time then some of the publish requests might be rejected. 
The current rate limit is at most 2 requests per second (or 120 requests within 60 seconds).

If you exceed this limit, a notice will be sent to the (username)/throttle topic.
You can subscribe to the topic if you wish to know when the Adafruit IO rate limit has been exceeded for your user account.
This limit applies to all connections so if you have multiple devices or clients publishing data be sure to delay their updates enough that the total rate is below 2 requests/second.
Projects The following are useful guides and examples to help learn more and get started using Adafruit IO:

?Adafruit IO Basics: Feeds https://learn.adafruit.com/adafruit-io-basics-feeds
?Adafruit IO Basics: Dashboards https://learn.adafruit.com/adafruit-io-basics-dashboards
?Adafruit IO Basics: Digital Output https://learn.adafruit.com/adafruit-io-basics-digital-output
?Adafruit IO Basics: Button Input https://learn.adafruit.com/adafruit-io-basics-button
?A Sillier Mousetrap: Logging Mouse Data To Adafruit IO With The Raspberry Pi
https://learn.adafruit.com/a-sillier-mousetrap-logging-mouse-data-to-adafruit-io-with-the-raspberry-pi
Check out the Adafruit IO section https://learn.adafruit.com/category/adafruit-io
of the learning system for more recent guides too.

Changelog
 The following are the recent major additions or potentially breaking changes to Adafruit IO APIs and libraries:
-2015-01-06
*Update to MQTT paths,
now they are of the form <username>/feeds/<feed name>.
-2015-16-01
*Initial Closed Beta
 
Data Policies
We're currently locking in how much and how long data should be retained.
We had to set some values for the beta, and will definitely be adjusting these as time goes on.
1.Each feed can have 50k data points. It's a FIFO (first in first out) queue.
2.Right now we allow 10 data feeds, 10 groups & 5 dashboards
3.Write data to a feed up to 125 times in 60 seconds
   - that lets you stream data at approximately 2 updates every second or burst data if you need.
4.You may read your data an unlimited amount of time,
   as long as you remain within the throttle times.
5.Data is retained for 30 days.
6.10k rows of "Activity" data is maintained.
   Activity data just tracks the last actions of your IO account on your Activities page for your information.
 
How much data does that mean you can store? Well...
?At max-rate of ~2 updates per second you can stream data for ~6 1/2 hours before hitting the FIFO queue
?At 1-update-per-minute, you can store 34 days (1 month) at a time
?At 1-update-every-10-minutes, your 50K datapoints will last you 347 days (almost a year)

MQTT Relay 펌웨어 부팅
 
 
MQTT Relay 펌웨어 작동
 

MQTT Realy 소스
/***************************************************
Must use ESP8266 Arduino from:
https://github.com/esp8266/Arduino
Works great with Adafruit's Huzzah ESP board:
----> https://www.adafruit.com/product/2471

Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
Written by Tony DiCola for Adafruit Industries.
Adafruit IO example additions by Todd Treece.
MIT license, all text above must be included in any redistribution
****************************************************/

// Libraries
#include " ESP8266WiFi.h "       // 첨부파일 링크의 "   " 를 < >로 교체해야 한다 
#include " Adafruit_MQTT.h "    // 웹페이지 게시판은 특수-문자열을 표시하지 못한다.
#include " Adafruit_MQTT_Client.h "    // 가급적 첨부파일의 소스를 사용한다.

// Lamp pin
const int lamp_pin = 15;  // ESP-12 모듈 GPIO 15 번 핀. 다른 포트로 변경 가능.

// WiFi parameters
#define WLAN_SSID "leekyap-2"       // 자신의 AP 이름 (AP SSID)
#define WLAN_PASS "1050043312"     // 인터넷이 있는 AP의 비밀번호 (AP password)
// Adafruit IO
#define AIO_SERVER "io.adafruit.com"  // MQTT 서버 이름 (user name)
#define AIO_SERVERPORT 1883           // MQTT 포트 번호 (port number)
#define AIO_USERNAME "acleds"         // MQTT 서버의 가입 이름 (user name)
#define AIO_KEY "eecec91f6a494e7a"    // MQTT 서버의 API 인증 번호(key) 

// Functions
void connect();
// Create an ESP8266 WiFiClient class to connect to the MQTT server.
WiFiClient client;

// Store the MQTT server, client ID, username, and password in flash memory.
// This is required for using the Adafruit MQTT library.
const char MQTT_SERVER[] PROGMEM = AIO_SERVER;

// Set a unique MQTT client ID using the AIO key + the date and time the sketch
// was compiled (so this should be unique across multiple devices for a user,
// alternatively you can manually set this to a GUID or other random value).

const char MQTT_CLIENTID[] PROGMEM = AIO_KEY __DATE__ __TIME__;
const char MQTT_USERNAME[] PROGMEM = AIO_USERNAME;
const char MQTT_PASSWORD[] PROGMEM = AIO_KEY;

// Setup the MQTT client class by passing in the WiFi client and MQTT server and login details.
Adafruit_MQTT_Client mqtt(&client, MQTT_SERVER, AIO_SERVERPORT, MQTT_CLIENTID, MQTT_USERNAME, MQTT_PASSWORD);

/****************************** Feeds ***************************************/
// Setup a feed called 'lamp' for subscribing to changes.
// Notice MQTT paths for AIO follow the form: /feeds/
const char LAMP_FEED[] PROGMEM = AIO_USERNAME "/feeds/Switch";
Adafruit_MQTT_Subscribe lamp = Adafruit_MQTT_Subscribe(&mqtt, LAMP_FEED);

/*************************** Sketch Code ************************************/
void setup() {
  // Set lamp pin to output
  pinMode(lamp_pin, OUTPUT);
  Serial.begin(115200);
  Serial.println(F("Adafruit MQTT Switch"));

  // Connect to WiFi access point.
  Serial.println(); Serial.println();
  delay(10);
  Serial.print(F("Connecting to "));
  Serial.println(WLAN_SSID);

  WiFi.begin(WLAN_SSID, WLAN_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(F("."));
  }
 
  Serial.println(); 
  Serial.println(F("WiFi connected"));
  Serial.println(F("IP address: "));
  Serial.println(WiFi.localIP());

  // listen for events on the lamp feed
  mqtt.subscribe(&lamp);
  // connect to adafruit io
  connect();
}

void loop() {
  Adafruit_MQTT_Subscribe *subscription;
  // ping adafruit io a few times to make sure we remain connected
  if(! mqtt.ping(3)) {
    // reconnect to adafruit io
    if(! mqtt.connected()) connect();
  } 

  // this is our 'wait for incoming subscription packets' busy subloop 
  while (subscription = mqtt.readSubscription(1000)) {

    // we only care about the lamp events
    if (subscription == &lamp) {
      // convert mqtt ascii payload to int
      char *value = (char *)lamp.lastread;
      Serial.print(F("Received: "));
      Serial.println(value);

      // Apply message to lamp
      String message = String(value);
      message.trim();
      if (message == "ON") {digitalWrite(lamp_pin, HIGH);}
      if (message == "OFF") {digitalWrite(lamp_pin, LOW);}
    }
  }
}

// connect to adafruit io via MQTT
void connect() {
Serial.print(F("Connecting to io.adafruit.com "));
int8_t ret;

while ((ret = mqtt.connect()) != 0) {
  switch (ret) {
  case 1: Serial.println(F("Wrong protocol")); break;
  case 2: Serial.println(F("ID rejected")); break;
  case 3: Serial.println(F("Server unavail")); break;
  case 4: Serial.println(F("Bad user/pass")); break;
  case 5: Serial.println(F("Not authed")); break;
  case 6: Serial.println(F("Failed to subscribe")); break;
  default: Serial.println(F("Connection failed")); break;
}
 
if(ret >= 0) mqtt.disconnect();
  Serial.println(F("Retrying connection..."));
  delay(5000);
}
 
Serial.println(F("Adafruit IO Connected!"));
}

MQTT API 시험 (USB-Serial, ESP-12E 모듈과 아두이노 2 릴레이 기판을 사용했다) 
 

평가
유동 IP 때문에 MQTT 서버에서 연결된 client로 데이터를 보내는 방식이다.
그러나 MQTT 서버의 설정이 까다롭고, 펌웨어의 사용도 쉽지 않다.
시판하는 WiFi  Relay 모듈들은 전용 스마트폰 앱으로 간단히 설정한다.

서버의 용량을 감안하여 있지도 않은 트랙픽을 걱정하여 규제하고 있기 때문에
지금은 없는 접속자를 걱정해서, 처음부터 바보를 만들면 접속자는 늘지 않는다.
많은 사용자가 생겼다고 가정해보자, 느려터진 오동작 서버에 누가 오겠는가?
 
모든 제어장치는 리셋할 때 임의로 출력이 ON-OFF 되면 이런 장치는 사용할 수 없다. 
가장 큰 문제는 ESP 모듈의 펌웨어가 부팅시에 Relay 포트가 임의로 ON-OFF 된다. 

문제 해결
먼저 ESP 모듈의 펌웨어를 신형 정품으로 바꾸는 것도 중요하다.
이전에 올린 ESP 펌웨어 업그레이드를 보고 AT 펌웨어 0.25.0.0을 굽는다. (첨부파일 #2)
 
다음은 USB 직렬포트에서 AT+ 명령으로 펌웨어를 자동 업그레이드한다.
Ai-Thinker Technology Co., Ltd. 와 사용자 펌웨어가 없다는  invalid 가 나오면,

AT+CWMODE=3 으로 모드를 바꾸고
AT+CWLAP 으로 AP를 찾는지 확인한다.
AT+CWJAP="AP SSID","AP PASSWORD" 로 AP에 연결한다.
AT+CIFSR 로 연결된 상태를 확인하고
AT+CIUPDATE 로 펌웨어를 업그레이드 한다.
 
모듈의 청색 LED가 깜빡거리고 업그레이드 되면, AT 펌웨어 버전이 0.30.0.0으로 된다.

 
다음은 부팅이나 리셋에서 발생하는 임의 출력문제를 해결하기 위해 소스를 수정해야 한다.
ESP 모듈의 특성을 감안하여 방법을 찾았다. 다음 적색의 소스를 setup()에 추가한다.

void setup() {
// Set lamp pin to output

digitalWrite(lamp_pin, HIGH);    // relay off for active sink output
pinMode(lamp_pin, OUTPUT);   // pin mode to output

다음 부분을 찾아서 HIGH와 LOW를 바꾸어 준다. (적색이 변경된 것)
물론 출력 relay 구동 회로를 sink active (LOW로 relay를 작동)로 하드웨어를 변경한다.

// Apply message to lamp
String message = String(value);
message.trim();
if (message == "ON") {digitalWrite(lamp_pin, LOW);}
if (message == "OFF") {digitalWrite(lamp_pin, HIGH);}

이제는 하드웨어 리셋에서도 MQTT 릴레이는 임의로 작동하지 않는다.
전원도 차단해 보았지만, 이상 증상은 보이지 않고, 포트도 정상적으로 잘 작동한다.
ESP 모듈의 특징을 파악하지 못하고 하드웨어와 펌웨어를 설계했기 때문일 것이다.

NodeMCU ESP-12E SDK 모듈(USD 6.79)로 동일한 소스를 굽고 전원을 흔들었지만 오동작은 없다.
 
 
NodeMCU SDK 모듈은 NodeMCU 1.0 (ESP-12E)으로 설정하고 컴파일 한다.
 

만일 General ESP8266로 설정하면 부트로더만 남고 SDK 펌웨어가 지워진다.
NodeMCU SDK 모듈을 선택하면 사용자 펌웨어를 구워도 SDK 펌웨어는 지워지지 않는다.

이 프로그램은 무료 소프트웨어로, 신체와 재산 상의 어떤 위험과 손해를 보상하지 않습니다.
이 프로그램은 GNU 무료 소프트웨어 배포규정을 따릅니다.
Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
 AVRTOOLS™
   
윗글 아듀이노 응용소스 게시판
아래글 2 채널 ESP8266 WiFi Switch의 제작
    N         제목    글쓴이 작성일 조회 추천
아듀이노 응용소스 게시판 avrtools™ 2016/02/05 (금) 129 0
25 ESP8266 MQTT Relay Control avrtools™ 2016/03/03 (목) 178 0
24 2 채널 ESP8266 WiFi Switch의 제작 avrtools™ 2016/02/25 (목) 209 0
23 ESP-12E SDK 0.9.5 사용방법 avrtools™ 2016/02/18 (목) 258 0
22 ESP8266 ESP-12E WiFi 센서 서버의 제작 avrtools™ 2016/02/17 (수) 241 0
21 Arduino DS3231 RTC to 5110 LCD avrtools™ 2016/02/16 (화) 300 0
20 ESP8266 Weather Server의 제작 avrtools™ 2016/02/15 (월) 276 0
19 Arduino 온습도 센서 DHT-22 avrtools™ 2016/02/12 (금) 244 0
18 ESP8266 WiFi 펌웨어 업그레이드 avrtools™ 2016/02/11 (목) 430 0
17 Arduion ESP8266 WiFi 설정 방법 avrtools™ 2016/02/10 (수) 342 0
16 Arduino 정전용량식 수분센서의 분석과 제작 avrtools™ 2016/02/07 (일) 205 0
15 Arduino 전극식 수분센서의 분석과 제작 avrtools™ 2016/02/07 (일) 269 0
14 Arduino 정밀 전력계의 ADC avrtools™ 2016/02/02 (화) 337 0
13 Arduino 정밀 전력계의 LPF avrtools™ 2016/02/02 (화) 304 0
12 Ardunio 16비트 ADC Data Logger avrtools™ 2016/01/31 (일) 182 0
11 Arduino AC/DC Power Meter의 제작 avrtools™ 2016/01/29 (금) 296 0
10 Arduino 교류 역율계(power factor)의 제작 avrtools™ 2016/01/29 (금) 269 0
9 Arduino DUE based DDS Synthesizer avrtools™ 2016/01/24 (일) 161 0
8 QTouch ADC 근접검출 스위치 avrtools™ 2016/01/21 (목) 288 0
7 Arduino 음성인식 Speech/Voice Recognition avrtools™ 2013/09/14 (토) 1581 0
6 Arduino Uno로 만드는 3축 CNC avrtools™ 2013/09/10 (화) 2421 0
5 Arduino로 만드는 mySpectral 분광기 avrtools™ 2013/09/04 (수) 1981 0
4 8채널 12비트 ADC MCP3208 오실로스코프 avrtools™ 2012/03/29 (목) 370 0
3 교류저항 (impedance) 측정 AD5933 avrtools™ 2012/03/17 (토) 297 0
2 Arduino DMX512 수신기 제작 avrtools™ 2012/03/15 (목) 3557 0
1 TSL2561 조도 측정기의 제작 avrtools™ 2011/09/11 (일) 2540 0
1

바구니 : 0
 보관함 : 0
오늘뷰 : 0
HOME   |   회사소개   |   제휴안내   |   회사위치   |   서비스이용 약관   |   개인정보 보호정책   |   사이트맵
17015 경기도 용인시 기흥구 동백중앙로16번길 16-25, 508호. 전화 : 031-282-3310
사업자 등록번호 : 697-47-00075 / 대표 : 이건영 / 업태 : 제조업 / 종목 : LED조명, LED전원, 제어장치.
개인정보 관리책임자 : 홈페이지 관리자 . Copyright ⓒ2016 아크레즈 (ACLEDS INC.)
HOME TOP PREVNEXT 0 0 0