ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Android 앱에서 ESP8266 WiFi 모듈을 연결한 Arduino Uno 제어하기
    Arduino Uno/WiFi ESP8266 2018. 9. 2. 19:03

    안드로이드 앱에서  ESP8266 WiFi 모듈을 연결한 Arduino Uno에 명령을 내려서 LED를 제어하는 과정을 설명합니다.



    마지막 업데이트 2018. 9. 2




    ESP8266 WiFi 모듈을 Arduino Uno에 연결하는 방법과 모듈을 Arduino Uno에서 사용하기 위해 필요한 WeeESP8266 라이브러리 설치 방법은 아래 포스팅을 참고하세요.


    Arduino Uno에 연결한 ESP8266 WiFi 모듈을 사용하여 컴퓨터에 구성한 TCP 서버와 통신 테스트한 과정을 설명하고 있어서 먼저 해보는 것도 좋을 듯합니다.



    Arduino Uno에 ESP8266 WiFi 모듈을 연결하여 사용하는 방법

    http://webnautes.tistory.com/755





    이전 포스팅과 달리 Arduino Uno가 서버 역활을 하고 안드로이드 앱이 클라이언트입니다.

    안드로이드와 ESP8266 WiFi 모듈을 연결한 Arduino Uno가 같은 네트워크(공유기)인 상황에서 테스트했습니다.



    WeeESP8266 라이브러리에 포함되어 있는 TCPServer 예제 코드를 수정하여 사용했습니다.

    원본 코드는 Arduino IDE 메뉴에서  파일 > 예제 > ITEADLIB_Arduino_WeeESP8266 >  TCPServer 를 선택하면 불러올 수 있습니다.



    포스팅 마지막에 있는 아두이노 코드를 Arduino IDE에 복사해줍니다.

    상단에 있는 다음 2줄을 환경에 맞게 수정한 후,  Arduino Uno에 업로드시켜줍니다.

    안드로이드 폰에서도 사용중인 공유기 접속 정보를 입력해줘야 합니다.

    #define SSID        "공유기의 SSID"  
    #define PASSWORD    "공유기의 비밀번호"  





    접속 과정을 확인하기 위해 Arduino IDE의 메뉴에서 툴 > 시리얼 모니터를 선택합니다.


    공유기로부터 IP를 할당 받았다면 Join AP success 문자열과 함께 할당받은 IP를 출력해줍니다.

    안드로이드 앱에서 접속시 사용해야 하므로 IP: 항목에 출력된 IP 중 두번째 아이피를 안드로이드 코드에 넣어 주어야 합니다.


           new Thread(new ConnectThread("192.168.25.20", 8090)).start();



    아두이노 코드에서 설정한 포트로 접속하는 클라이언트를 위한 준비가 성공하면 start tcp server ok  문자열을 보여줍니다.





    안드로이드앱에서 명령을(Me:)  전송하여 Arduino Uno 13번핀에 연결되어 있는 내장 LED를 제어할 수 있습니다.

    명령을 받은 아두이노에서 수행한 작업 내용을(/192.168.0.7:8090) 다시 안드로이드 앱으로 전송해줍니다.

    최근에 내린 명령이나 아두이노의 응답이 위로 올라오도록 되어 있습니다.





    Arduino IDE의 시리얼 모니터에서는 안드로이드앱이 보낸 명령(Received from :)이 출력됩니다.





    아두이노에서 지원하지 않는 명령을 내리면 사용 가능한 명령들을 보내줍니다.




    현재 해결되지 않은 문제점은 테스트 하다 보면 안드로이드앱에서 명령을 전송했는데 아두이노로부터 응답이 안오는 경우가 있습니다.

    대부분 다시 명령을 전송하면 응답이 오지만  가끔 제대로 동작안해서 다시 앱을 실행해야 합니다.

    아직 원인을 못찾았습니다.


    아두이노 코드에서 사용한 WeeESP8266 라이브러리에서  클라이언트 접속시 감지할 수 있는 방법이 없는 듯합니다.

    그래서 아두이노에서 접속 관련 메시지를 클라이언트로 먼저 보내주지 못하고 있습니다.

    대신 안드로이드앱에서 서버에 접속되면 connected to라는 메시지를 상단에 보여줍니다.




    안드로이드 코드

    AndroidManifest.xml

    앱에서 인터넷을 사용하기 위해 필요한 퍼미션을 추가해줍니다.


    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
       package="com.tistory.webnautes.tcp_client">
       
       <uses-permission android:name="android.permission.INTERNET" />
       
       <application
           android:allowBackup="true"
           android:icon="@mipmap/ic_launcher"




    activity_main.xml


    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
       xmlns:android="http://schemas.android.com/apk/res/android"
       android:orientation="vertical"
       android:paddingBottom="10dp"
       android:paddingTop="10dp"
       android:layout_width="match_parent"
       android:layout_height="match_parent">

       <LinearLayout
           android:orientation="horizontal"
           android:layout_width="match_parent"
           android:layout_height="wrap_content">

           <TextView
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:text="connection state : "/>

           <TextView
               android:id="@+id/connection_status_textview"
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:text=""/>

       </LinearLayout>

       <LinearLayout
           android:weightSum="1"
           android:orientation="horizontal"
           android:layout_width="match_parent"
           android:layout_height="wrap_content">

           <EditText
               android:id="@+id/input_string_edittext"
               android:hint="input text here"
               android:layout_weight="0.8"
               android:layout_width="0dp"
               android:layout_height="wrap_content"/>

           <Button
               android:id="@+id/send_button"
               android:layout_weight="0.2"
               android:layout_width="0dp"
               android:layout_height="wrap_content"
               android:text="Send" />
       </LinearLayout>

       <ListView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:id="@+id/message_listview"/>

    </LinearLayout>




    MainActivity.java


    package com.tistory.webnautes.tcp_client;

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.net.SocketTimeoutException;
    import java.net.UnknownHostException;

    import android.content.DialogInterface;
    import android.os.Bundle;
    import android.support.v7.app.AlertDialog;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    import android.view.View;
    import android.widget.ArrayAdapter;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ListView;
    import android.widget.TextView;
    import android.widget.Toast;


    public class MainActivity extends AppCompatActivity
    {

      private TextView mConnectionStatus;
      private EditText mInputEditText;
      private ArrayAdapter<String> mConversationArrayAdapter;

      private static final String TAG = "TcpClient";
      private boolean isConnected = false;

      private String mServerIP = null;
      private Socket mSocket = null;
      private PrintWriter mOut;
      private BufferedReader mIn;
      private Thread mReceiverThread = null;


      @Override
      public void onCreate(Bundle savedInstanceState)
      {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);


          mConnectionStatus = (TextView)findViewById(R.id.connection_status_textview);
          mInputEditText = (EditText)findViewById(R.id.input_string_edittext);
          ListView mMessageListview = (ListView) findViewById(R.id.message_listview);
          Button sendButton = (Button)findViewById(R.id.send_button);
          sendButton.setOnClickListener(new View.OnClickListener(){
              public void onClick(View v){

                  String sendMessage = mInputEditText.getText().toString();
                  if ( sendMessage.length() > 0 ) {

                      if (!isConnected) showErrorDialog("서버로 접속된후 다시 해보세요.");
                      else {
                          new Thread(new SenderThread(sendMessage)).start();
                          mInputEditText.setText(" ");
                      }
                  }
              }
          });


          mConversationArrayAdapter = new ArrayAdapter<>( this,
                  android.R.layout.simple_list_item_1 );
          mMessageListview.setAdapter(mConversationArrayAdapter);

          new Thread(new ConnectThread("192.168.0.7", 8090)).start();
      }

      @Override
      protected void onDestroy() {
          super.onDestroy();

          isConnected = false;
      }


      private static long back_pressed;
      @Override
      public void onBackPressed(){

          if (back_pressed + 2000 > System.currentTimeMillis()){
              super.onBackPressed();

              Log.d(TAG, "onBackPressed:");
              isConnected = false;

              finish();
          }
          else{
              Toast.makeText(getBaseContext(), "한번 더 뒤로가기를 누르면 종료됩니다.", Toast.LENGTH_SHORT).show();
              back_pressed = System.currentTimeMillis();
          }

      }


      private class ConnectThread implements Runnable {

          private String serverIP;
          private int serverPort;

          ConnectThread(String ip, int port) {
              serverIP = ip;
              serverPort = port;

              mConnectionStatus.setText("connecting to " + serverIP + ".......");
          }

          @Override
          public void run() {

              try {

                  mSocket = new Socket(serverIP, serverPort);
                  //ReceiverThread: java.net.SocketTimeoutException: Read timed out 때문에 주석처리
                  //mSocket.setSoTimeout(3000);

                  mServerIP = mSocket.getRemoteSocketAddress().toString();

              } catch( UnknownHostException e )
              {
                  Log.d(TAG, "ConnectThread: can't find host");
              }
              catch( SocketTimeoutException e )
              {
                  Log.d(TAG, "ConnectThread: timeout");
              }
              catch (Exception e) {

                  Log.e(TAG, ("ConnectThread:" + e.getMessage()));
              }


              if (mSocket != null) {

                  try {

                      mOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream(), "UTF-8")), true);
                      mIn = new BufferedReader(new InputStreamReader(mSocket.getInputStream(), "UTF-8"));

                      isConnected = true;
                  } catch (IOException e) {

                      Log.e(TAG, ("ConnectThread:" + e.getMessage()));
                  }
              }


              runOnUiThread(new Runnable() {

                  @Override
                  public void run() {

                      if (isConnected) {

                          Log.d(TAG, "connected to " + serverIP);
                          mConnectionStatus.setText("connected to " + serverIP);

                          mReceiverThread = new Thread(new ReceiverThread());
                          mReceiverThread.start();
                      }else{

                          Log.d(TAG, "failed to connect to server " + serverIP);
                          mConnectionStatus.setText("failed to connect to server "  + serverIP);
                      }

                  }
              });
          }
      }


      private class SenderThread implements Runnable {

          private String msg;

          SenderThread(String msg) {
              this.msg = msg;
          }

          @Override
          public void run() {

              mOut.println(this.msg);
              mOut.flush();

              runOnUiThread(new Runnable() {
                  @Override
                  public void run() {
                      Log.d(TAG, "send message: " + msg);
                      mConversationArrayAdapter.insert("Me - " + msg, 0);
                  }
              });
          }
      }


      private class ReceiverThread implements Runnable {

          @Override
          public void run() {

              try {

                  while (isConnected) {

                      if ( mIn ==  null ) {

                          Log.d(TAG, "ReceiverThread: mIn is null");
                          break;
                      }

                      final String recvMessage =  mIn.readLine();

                      if (recvMessage != null) {

                          runOnUiThread(new Runnable() {

                              @Override
                              public void run() {

                                  Log.d(TAG, "recv message: "+recvMessage);
                                  mConversationArrayAdapter.insert(mServerIP + " - " + recvMessage, 0);
                              }
                          });
                      }
                  }

                  Log.d(TAG, "ReceiverThread: thread has exited");
                  if (mOut != null) {
                      mOut.flush();
                      mOut.close();
                  }

                  mIn = null;
                  mOut = null;

                  if (mSocket != null) {
                      try {
                          mSocket.close();
                      } catch (IOException e) {
                          e.printStackTrace();
                      }
                  }
              }
              catch (IOException e) {

                  Log.e(TAG, "ReceiverThread: "+ e);
              }
          }

      }


      public void showErrorDialog(String message)
      {
          AlertDialog.Builder builder = new AlertDialog.Builder(this);
          builder.setTitle("Error");
          builder.setCancelable(false);
          builder.setMessage(message);
          builder.setPositiveButton("OK",  new DialogInterface.OnClickListener() {
              @Override
              public void onClick(DialogInterface dialog, int which) {
                  dialog.dismiss();
                  finish();
              }
          });
          builder.create().show();
      }


    }



    아두이노 코드


    #include "ESP8266.h"
    #include <SoftwareSerial.h>

    #define SSID        "공유기의 SSID"

    #define PASSWORD    "공유기의 비밀번호"



    SoftwareSerial mySerial(11, 10); /* RX:D11, TX:D10 */
    ESP8266 wifi(mySerial);


    void printUsage(uint8_t mux_id)
    {
       char buf[]="사용가능한 명령어\n1 : LED 켜기\n2 : LED 끄기\nS : LED 상태정보\n\n";
       wifi.send(mux_id, buf, strlen(buf));
    }


    void setup(void)
    {
       Serial.begin(9600);
       Serial.print("setup begin\r\n");
       
       Serial.print("FW Version:");
       Serial.println(wifi.getVersion().c_str());
         
       if (wifi.setOprToStationSoftAP()) {
           Serial.print("to station + softap ok\r\n");
       } else {
           Serial.print("to station + softap err\r\n");
       }

       if (wifi.joinAP(SSID, PASSWORD)) {
           Serial.print("Join AP success\r\n");
           Serial.print("IP: ");
           Serial.println(wifi.getLocalIP().c_str());    
       } else {
           Serial.print("Join AP failure\r\n");
       }
       
       if (wifi.enableMUX()) {
           Serial.print("multiple ok\r\n");
       } else {
           Serial.print("multiple err\r\n");
       }
       
       if (wifi.startTCPServer(8090)) {
           Serial.print("start tcp server ok\r\n");
       } else {
           Serial.print("start tcp server err\r\n");
       }
       
       if (wifi.setTCPServerTimeout(360)) {
           Serial.print("set tcp server timout 360 seconds\r\n");
       } else {
           Serial.print("set tcp server timout err\r\n");
       }
       
       Serial.print("setup end\r\n");

        pinMode(LED_BUILTIN, OUTPUT);
    }

    void loop(void)
    {
       uint8_t buffer[128] = {0};
       uint8_t mux_id;
       uint32_t len = wifi.recv(&mux_id, buffer, sizeof(buffer), 100);
       
       if (len > 0) {
           Serial.print("Status:[");
           Serial.print(wifi.getIPStatus().c_str());
           Serial.println("]");
           
           Serial.print("Received from :");
           Serial.print(mux_id);
           Serial.print("[");


           Serial.print("Received:[");
           for(uint32_t i = 0; i < len; i++) {
               Serial.print((char)buffer[i]);
           }
           Serial.print("]\r\n");


           char command = buffer[0];
           int ledStatus = digitalRead(LED_BUILTIN);
           

           switch (command){
           
               case '1':
                 
                 if (ledStatus == LOW){
                   digitalWrite(LED_BUILTIN, HIGH);
                   sprintf(buffer, "LED가 켜졌습니다.\n");
                   wifi.send(mux_id, buffer, strlen(buffer));
                 }
                 else{
                   sprintf(buffer, "이미 LED가 켜져있습니다.\n");
                   wifi.send(mux_id, buffer, strlen(buffer));
                 }
                 break;
           
               case '2':
               
                 if (ledStatus == HIGH){
                   digitalWrite(LED_BUILTIN, LOW);
                   sprintf(buffer, "LED가 꺼졌습니다.\n");
                   wifi.send(mux_id, buffer, strlen(buffer));
                 }
                 else{
                   sprintf(buffer, "이미 LED가 꺼져있습니다.\n");
                   wifi.send(mux_id, buffer, strlen(buffer));
                 }
                 break;
           
               case 'S':
               case 's':
                   
                 if (ledStatus == LOW){
                   sprintf(buffer, "LED 상태: 꺼짐\n");
                   wifi.send(mux_id, buffer, strlen(buffer));
                 }
                 else {
                   sprintf(buffer, "LED 상태: 켜짐\n");
                   wifi.send(mux_id, buffer, strlen(buffer));
                 }
                 break;
                 
               default:
                   printUsage(mux_id);
                 break;
                 
           }
       }
           
    }


          




    포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
    댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

    여러분의 응원으로 좋은 컨텐츠가 만들어집니다. 지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

    유튜브 구독하기


    댓글 46

    • 이전 댓글 더보기
    • 2016.06.08 00:15


      비밀댓글입니다

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2016.06.08 00:18 신고


        아두이노 시리얼 모니터를 켜놓고.. 아두이노 리셋시키고 보시면..
        어디서 에러가 나는지 확인 가능할겁니다.

    • 2016.06.08 00:30


      비밀댓글입니다

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2016.06.08 01:02 신고


        혹시 공유기 접속 암호를 잘못 적었나 확인해보세요..
        아래처럼 나와야 정상입니다..

        그래도 안되면 펌웨어 업데이트를 해보심이 좋을듯 합니다..
        http://webnautes.tistory.com/742

        setup begin
        FW Version:0018000902
        to station + softap ok
        Join AP success
        IP: 192.168.4.1
        192.168.0.23
        multiple ok
        start tcp server ok
        set tcp server timout 10 seconds
        setup end
        setup begin
        FW Version:0018000902
        to station + softap ok
        Join AP success
        IP: 192.168.4.1
        192.168.0.23
        multiple ok
        start tcp server ok
        set tcp server timout 10 seconds
        setup end
        Status:[STATUS:3
        +CIPSTATUS:0,"TCP","192.168.0.7",50679,1]
        Received from :0[���� ����'������]
        Status:[STATUS:3
        +CIPSTATUS:0,"TCP","192.168.0.7",50679,1]
        Received from :0[1]
        Status:[STATUS:3
        +CIPSTATUS:0,"TCP","192.168.0.7",50679,1]
        Received from :0[2]
        Status:[STATUS:3
        +CIPSTATUS:0,"TCP","192.168.0.7",50679,1]
        Received from :0[1]
        Status:[STATUS:3
        +CIPSTATUS:0,"TCP","192.168.0.7",50679,1]
        Received from :0[2]

    • 2016.06.08 01:33


      비밀댓글입니다

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2016.06.08 01:36 신고


        이미 하셨으면 안해도 되긴 한데..
        공유기와 접속이 안되는 게 문제 같네요..

        공유기랑 거리가 멀어서 안될 수 도 있어요..

    • 2016.06.08 01:54


      비밀댓글입니다

    • bwj 2016.11.21 11:48


      위의 와이파이 센서는 esp-01로 보이는데 esp-12e 버전으로 구성해도 무방한가요??

    • 최재혁 2017.12.18 12:15


      E/TcpClient: ConnectThread:failed to connect to /192.168.0.4 (port 54415) from /:: (port 48667): connect failed: ECONNREFUSED (Connection refused)
      이런오류가뜨는데 포트설정을 따로 해야하는건가요??ㅠㅠ

    • Favicon of https://hibee.tistory.com BlogIcon 슈퍼마리호 2018.02.19 14:33 신고


      안드로이드에서 6자리의 2진수를 보내고싶은데 연결 거절이 뜹니다...
      이 코드를 그대로 써도 되는건지 궁금합니다

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2018.02.19 21:42 신고


        안드로이드 앱쪽 코드는 그대로 사용해도 될듯합니다.
        안드로이드앱에서 접속 완료시 보여지는 connected to가 보이나요?

    • son 2018.12.10 21:59


      좋은 자료 올려주셔서 감사합니다
      위의 코드를 그대로 따라했는데
      아두이노 코드 wifi.send(mux_id, buffer, strlen(buffer));에서
      invalid conversion from 'uint8_t* {aka unsigned char*}' to 'const char*' [-fpermissive]라고 에러가 뜹니다.
      왜이러는 걸까요? ㅠㅠ

    • 2019.03.14 18:20


      비밀댓글입니다

    • seen 2019.04.04 17:49


      혹시 외부 접속도 되나요 핸드폰 lte로 접속한다던지 하려면 웹서버가 필요한가요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.04.04 21:56 신고


        외부나 핸드폰 LTE로 접속하려면 고정 아이피가 필요합니다.

        공유기에서 제공하는 고정아이피로 변환하는 방법을 사용하거나 고정 아이피를 배정해주는 서버를 신청해야 합니다.

    • 변준수 2019.06.09 01:16


      혹시 안드로이드 스튜디오로 editText를 하나 더 만들어서 2개의 값을 전송 시킬 수 있는 방법이 있을까요???

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.09 07:12 신고


        다음 부분에서 문자열을 전송합니다.
        sendMessage외에 추가할 문자열이 있다면 두 문자열 사이에 구분할 문자를 두고 한번에 전송하거나 순서대로 2개의 문자열을 전송하면 될듯합니다.


        if (!isConnected) showErrorDialog("서버로 접속된후 다시 해보세요.");
        else {
        new Thread(new SenderThread(sendMessage)).start();
        mInputEditText.setText(" ");
        }

    • job 2019.07.19 18:58


      안녕하세요 글 잘봤습니다. 혹시 wemos d1 보드에서도 저 코드를 써서 안드로이드 스튜디오랑 연동할 수 있을까요?

    • 2019.07.23 18:00


      비밀댓글입니다

    • 김성민 2019.08.15 12:08


      Unresolved reference: v7
      Unresolved reference: v7
      com/tistory/webnautes.tcp_client/MainActivity.kt
      Unresolved reference: v7
      Unresolved reference: v7
      Unresolved reference: test
      Unresolved reference: activity_main
      Unresolved reference: connection_status_textview
      Unresolved reference: input_string_edittext
      Unresolved reference: message_listview
      Unresolved reference: send_button
      Unresolved reference: AlertDialog
      =================================================
      귀하의 설명되로 코딩을 했읍니다.
      그런데 빌드하면 위와 같은 에러가 발생합니다.
      해결방법이 없을까요.

      > Task :app:buildInfoGeneratorDebug

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.08.15 12:42 신고


        안드로이드 프로젝트를 Kotlin를 사용하도록 생성해서 발생한 문제로 보입니다.

        Java를 사용하도록 다시 생성해서 진행하세요.

    • ㄷㅂㄷㅂ 2019.11.16 01:46


      안녕하십니까 선생님코드를 사용하면서 조금 변경하려고하는데요 선생님은 어플에서 정보를 보내면 아두이노가 제어돼는데 저는 아두이노 시리얼모니터에 정보가 입력되면 어플로 보내려고합니다. 어떻게하면 좋을까요?

    • 2019.11.16 21:49


      비밀댓글입니다

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.11.16 21:53 신고


        wifi가 전역변수이기때문에 어디서든 호출가능해야 하지 않을까 싶습니다.

        하지만 테스트해봐서..

        loop 내부에서 해보고 동작하는데 loop 밖 함수에서 안된다면 loop 안에서만 사용가능할 듯합니다.

    • 2019.11.18 22:24


      비밀댓글입니다

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.11.19 08:41 신고


        안드로이드 코드와 아두이노 코드에서 포트번호를 똑같이 바꾸어주면 어떤 포트든 사용할 수 있습니다.

        그래도 안되는 것은 이미 사용중인 포트이거나 방어벽 문제일 가능성이 높습니다.

    • 2019.11.26 13:20


      비밀댓글입니다

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.11.26 21:04 신고


        다음처럼 시리얼로부터 문자열을 입력받아야 하지 않을까 싶네요..

        다음 포스트를 참고하세요
        https://webnautes.tistory.com/629

        String readSerial()
        {
        String str = "";
        char ch;

        while( Serial.available() > 0 )
        {
        ch = Serial.read();
        str.concat(ch);
        delay(10);
        }

        return str;
        }

    • 1234 2019.12.02 23:29


      wifi was not declared in this scop 이건 왜뜨는거죠..?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.12.03 08:18 신고


        wifi 변수 선언이 잘못되었나봅니다.

        아래 포스트를 진행한 후 다시 해보세요.


        Arduino Uno에 ESP8266 WiFi 모듈을 연결하여 사용하는 방법

        http://webnautes.tistory.com/755

    • 3131 2019.12.25 22:51


      안드로이드앱은 어떤 프로그램을 사용하셨나요..

Designed by Tistory.