본문 바로가기

Arduino

안드로이드로 아두이와 서버통신 제어하기(WIFI D1 R1, ESP8266, 모터제어, JSON)

반응형

저번에는 arduino nano33 iot를 이용해서 LED를 제어했었습니다.

 

https://pinlib.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%B1%EC%9D%84-%ED%86%B5%ED%95%B4-%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8-led-%EC%A0%9C%EC%96%B4%ED%95%98%EA%B8%B0

 

안드로이드 앱을 통해 아두이노 led 제어하기

처음으로 실습관련 이야기를 작성하게 되는 거 같습니다. 현재 전 직장 동료인 친구와 side project 하나를 준비중에 있습니다. 그런데 제가 아두이노를 손을 안댄지도 오래되었고 살짝 야매로 배

pinlib.tistory.com

 

이번에는 WIFI D1 R1보드를 이용하게 되었습니다.

해당 보드의 경우 arduino UNO랑 비슷한데 안에 network 통신을 위한 ESP8266이 내장되어 있습니다.

 

솔직한 제 생각으로는 WIFI D1 R1 가성비로는 최고인거 같습니다.

그래도 돈 많으면 arduino nano33 iot쓰세요. 

 

저번에는 포인트가 LED제어였다면 

이번에는 모터제어와 JSON전달에 초점을 맞췄습니다.

 

우선 보드 연결 사진입니다.

연결사진

이번에는 코드에 대하여 이야기 해볼게요.

 

우선 motor를 제어하기 위한 코드를 작성해보겠습니다.

#define AA D5
#define AB D6
if (request.indexOf("/water") > 0 ){ 
    Serial.println("please water");
    Serial.println("Turning motor on");
    digitalWrite(AA, HIGH); // 역방향은 low, high
    digitalWrite(AB, LOW);
    delay(3000);
    digitalWrite(AA, LOW);
    digitalWrite(AB, LOW);
  }

위 코드에 대하여 설명해보자면 

안드로이드에서 sever로 /water를 보내면 arduino에서 /water가 온 것을 확인하면 조건문을 수행합니다.

 

json구현의 경우

if (request.indexOf("/json") > 0){
    DynamicJsonDocument doc(1024);
    doc["sensor"] = "temperature";
    doc["value"] = 25;

    String jsonString;
    serializeJson(doc, jsonString);

    //client.println("HTTP/1.1 200 OK");
    //client.println("Content-Type: application/json");
    //client.println("Connection: close");
    //client.println();
    client.print(jsonString);

    Serial.println("JSON response sent");
  }

해당 코드를 사용하는데 사실 아직 임시용입니다.

단지 sever로 json형식을 보내는 것만 구현하면 다음 단계는 쉽기 때문에 이정도 코드로 마무리하였습니다.

그리고 arduino에서 json을 사용하려면 

#include <ArduinoJson.h> //json test code 

해당 라이브러리를 다운받아 사용해야만 합니다. 

 

아래는 전체 코드입니다.

#include <SPI.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <ArduinoJson.h> //json test code

#define AA D5
#define AB D6

const char* ssid = "wifi name";
const char* password = "wifi password";

//int AA = 2; //motor
//int AB = 3; //motor

WiFiServer server(80);

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);  //LED setup
  pinMode(AA, OUTPUT); //motor setup
  pinMode(AB, OUTPUT); //motor setup */
 
  digitalWrite(AA, LOW);
  digitalWrite(AB, LOW);

  digitalWrite(LED_BUILTIN, LOW);

  Serial.begin(115200);
  delay(1000);
  /*if(WiFi.status() == WL_NO_MODULE){
    Serial.println("Communication with WiFi module failed");
  }*/

  //WiFi 연결
  delay(1000);
  Serial.print("Connecting to ");
  Serial.print(ssid);
 
 
  WiFi.begin(ssid, password);
  while(WiFi.status() != WL_CONNECTED){
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP Address: ");
  Serial.println(WiFi.localIP());

  //Server 시작
  server.begin();
  Serial.println("Server started");
  Serial.print("Use this URL to connect: ");
  Serial.print("http://");
  Serial.print(WiFi.localIP());
  Serial.print("/");
}

void loop() {
  // put your main code here, to run repeatedly:
  //client 접속 확인
  WiFiClient client = server.available();
  if(!client){
    return;
  }


  //client가 보내는 데이터를 기다린다.
  Serial.println("new client");
  //client.setTimeout(5000);
  while(!client.available()){
    delay(1);
  }
 
  //요청을 읽는다.
  String request = client.readStringUntil('\r');
  Serial.println(request);
  client.flush();

  //요청에 url에 따라 LED를 ON/Off
  if (request.indexOf("/ledOn") > 0){
    digitalWrite(LED_BUILTIN, HIGH);
    Serial.println("real on");
  }
  if (request.indexOf("/ledOff") > 0){
    digitalWrite(LED_BUILTIN, LOW);
    Serial.println("real off");
  }

  //motor
  if (request.indexOf("/water") > 0 ){
    Serial.println("please water");
    Serial.println("Turning motor on");
    digitalWrite(AA, HIGH); // 역방향은 low, high
    digitalWrite(AB, LOW);
    delay(3000);
    digitalWrite(AA, LOW);
    digitalWrite(AB, LOW);
  }

  while(client.available()) {
    client.read();
  }

  client.print("HTTP/1.1 200 OK");
  client.print("Content-Type: text/html\r\n\r\n");
  Serial.println("클라이언트 연결 해제");

  if (request.indexOf("/json") > 0){
    DynamicJsonDocument doc(1024);
    doc["sensor"] = "temperature";
    doc["value"] = 25;

    String jsonString;
    serializeJson(doc, jsonString);

    //client.println("HTTP/1.1 200 OK");
    //client.println("Content-Type: application/json");
    //client.println("Connection: close");
    //client.println();
    client.print(jsonString);

    Serial.println("JSON response sent");
  }

  delay(50);
}

안드로이드 앱 구현의 경우 안드로이드 실습편에서 작성하도록 하겠습니다.

반응형