ESP8266 ESP-01 와이파이 모듈을 장착한 아두이노 우노 보드의 LED ON OFF
아두이노 코딩의 소중한 경험을 시작하고 싶으신가요?
이 책에서 해답을 찾으세요.
교보문고에서 절찬리에 판매중입니다
_______________________________________________________upto here, commercial!______________________
2016년 6월 29일자 블로그에 올렸던
ESP8266 ESP-01모듈 AT 명령어 테스트 코드 ESP_01 과 안드로이드 앱 “Mobile Telnet”에 의한 데이터 송신:III
http://blog.daum.net/ejleep1/434
에서 안드로이드 스마트폰에서 꽁짜로 다운 받을 수 있는 Mobile Telnet 앱을 사용하여 연결은 가능하였으나 완성하지 못했던 LED를 on OFF를 시도해 보도록 한다.
반면에 2017년 7월 1일자로 블로그에 올렸던
ESP8266 ESP-01 DIY 쉴드모듈을 장착한 아두이노의 와이파이 LED on OFF:IV
ESP_01_LEDCONTROL_01
ledcontrol.html
http://blog.daum.net/ejleep1/436
코드 에서는 수차례 실험 결과 10,11,12,번 핀에서 LED on OFF 가 가능하나 7번 또는 그 이하의 디지털 핀에서 LED on OFF 가 불가능했었다.
이 2개의 블로그에서 디지털 핀 8번과 9번 은 SoftwareSerial을 위해 배당하였음에 유의하자.
따라서 본 블로그에서는 이 LED 배선을 그림과 같이 7번 이하인 5번으로 SoftwareSerial에 할당했던 8번과 9번을 순서를 바꾸어 9번과 8번으로 변경하고 Mobile Telnet 앱을 사용해서 LED를 on OFF 해 보도록 한다.
블로그 끝 부분의 ESP_Telnet_led_02 코드를 컴파일 업로드 하도록 한다.
AT+RST
AT+CWMODE=1
AT+CIFSR
AT+CIPMUX=1
AT+CIPSERVER=1,80
명령들이 실행되었다.
무선공유기나 핫스팟 ID 와 비밀번호를 설정하는 AT+CWJAP=⚫⚫⚫ 명령이 안보이지만 가상 IP를 알기 때문에 Mobile Telnet이 잘 연결되는 듯하다.
안드로이드 스마트 폰 하단 왼쪽 버튼을 누르면 그림과 같은 선택 메뉴을 볼 수 있다. Telent Settings 메뉴를 선택하여 IP 와 포트 번호를 입력하도록 한다.
ESP-01을 장착한 아두이노 우노의 가상 IP는 시리얼 모니터에서 AT+CIFSR 명령 실행을 통해 얻을 수 있는 데이터이다.
포트 번호는 80번으로 하기로 한다.
데이터가 설정되었으면 OK를 누르고 빠져 나간다.
다음 스텝은 위 그림의 메뉴에서 Connect 명령을 선택하면 스마트 폰 하단에 이력 창과 함께 SEND 버튼이 활성화 된다.
입력 창에 LED=ON을 입력하고 Send 버튼을 눌러 LED on 여부와 함께 시리얼 모니터를 관찰해 보도록 한다.
그 다음에는 LED=OFF 버튼을 눌러 LED 가 OFF 되는지 확인해 보도록 한다.
현재 2가지 기능으로 하나의 LED on OFF 가 가능하지만 전송데이타에 LED 핀을 지정하는 정보를 추가하여 Send 버튼을 누를 경우 아두이노 우노 코드에서 string.indexOf() 명령에서 지정된 LED 핀 번호를 식별해 내도록 코드를 수정해 보기 바란다.
esp_telnet_led_02
#include <SoftwareSerial.h>
#define TIMEOUT 5000 // mS
#define LED 5
SoftwareSerial mySerial(9, 8); // RX, TX
void setup() {
pinMode(LED,OUTPUT);
Serial.begin(9600);
mySerial.begin(9600);
SendCommand("AT+RST", "Ready");
delay(5000);
SendCommand("AT+CWMODE=1","OK");
SendCommand("AT+CIFSR", "OK");
SendCommand("AT+CIPMUX=1","OK");
SendCommand("AT+CIPSERVER=1,80","OK");
}
void loop(){
String IncomingString="";
boolean StringReady = false;
while (mySerial.available()){
IncomingString=mySerial.readString();
StringReady= true;
}
if (StringReady){
Serial.println("Received String: " + IncomingString);
if (IncomingString.indexOf("LED=ON") != -1) {
digitalWrite(LED,HIGH);
}
if (IncomingString.indexOf("LED=OFF") != -1) {
digitalWrite(LED,LOW);
}
}
}
boolean SendCommand(String cmd, String ack){
mySerial.println(cmd); // Send "AT+" command to module
if (!echoFind(ack)) // timed out waiting for ack string
return true; // ack blank or ack found
}
boolean echoFind(String keyword){
byte current_char = 0;
byte keyword_length = keyword.length();
long deadline = millis() + TIMEOUT;
while(millis() < deadline){
if (mySerial.available()){
char ch = mySerial.read();
Serial.write(ch);
if (ch == keyword[current_char])
if (++current_char == keyword_length){
Serial.println();
return true;
}
}
}
return false; // Timed out
}