아두이노프로세싱 프로그래밍

ESP8266 ESP-01 와이파이 모듈을 장착한 아두이노 우노 보드의 LED ON OFF

coding art 2017. 9. 4. 21:34
728x90

아두이노 코딩의 소중한 경험을 시작하고 싶으신가요?

이 책에서 해답을 찾으세요.

교보문고에서 절찬리에 판매중입니다



_______________________________________________________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
}