본문 바로가기
아두이노

아두이노와 스프레드시트 연동하기 : 코드 구성하기

by fecu 2024. 6. 4.
728x90

지난 글에서는 아두이노와 스프레드시트 연동을 위한 시트 설정에 대해 알아보았다.

 


 

 

아두이노와 스프레드시트 연동하기 : 구글 시트 설정

최근에 학생들과 아두이노를 이용해 학교 주변의 온도, 습도를 관측해보고 값을 분석해보기로 했다. 아두이노에서 측정한 데이터를 저장하려니 SD카드가 필요했고, 데이터를 확인하기 위해서

fecu.tistory.com

 


 

이번 글에서는 아두이노 D1 보드에서 https 통신을 이용한 데이터 전송 방법에 대해 알아보자.

 

1. 아두이노 D1 보드 라이브러리 설치하기

아두이노 D1 보드를 이용하기 위해선 먼저 보드 라이브러리를 설치해야 한다.

 

아두이 IDE에서 파일-설정으로 들어간다.

 

 

아래의 추가적인 보드 매니저 urls에 아래의 주소를 입력해준다.

 

http://arduino.esp8266.com/stable/package_esp8266com_index.json

 

 

입력이 완료되었다면 확인을 눌러주자.

 

 

왼편의 보드 매니저에서 arduino D1 보드를 검색 한 뒤 설치해준다.

 

 

이렇게 하면 보드 라이브러리 설치는 끝이다. 

 

보드를 선택 후 파일-예제로 들어가서 ESP8266 예제가 잘 나타나는지 확인해보자. 

 

먼저 아래처럼 보드를 설정 한다.

 

 

이렇게 예제가 잘 보인다면 설치 성공이다.

 

 

2. 아두이노 코드 컴파일하기

이제 아두이노에 코드를 업로드 할 시간이다.

 

먼저 모듈을 호출하고 와이파이에 접속하기 위한 기본 설정을 한다.

 

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>

// int fan_pin = 8;

const char* ssid = "와이파이 이름";   // 와이파이 이름
const char* password = "와이파이 비밀번호"; // 와이파이 비밀번호

//----------------------------------------Host & https포트(https 는 443 고정)
const char* host = "script.google.com";
const int httpsPort = 443;
//----------------------------------------

WiFiClientSecure client; // WiFiClientSecure 객체 생성

// Google spreadsheet script ID
String GAS_ID = "구글 스프레드시트 스크립트 ID";

 

setup에서 시리얼 통신속도를 정하고 와이파이 연결을 한다.

 

ESP8266의 기본 시리얼 통신속도는 115,200이다.

 

WiFi.begin(ssid, password)를 통해 접속을 시도하고, WiFi.status()를 이용해 연결 상태를 확인한다.

 

client.setInsecure을 이용해 https 접속이 가능하도록 한다.

 

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password); // 와이파이 라우터와 연결
  Serial.println("");
  //----------------------------------------연결대기
  Serial.print("연결중");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(1000);
    };
  //----------------------------------------
  Serial.println("");
  Serial.print("와이파이 연결 성공 : ");
  Serial.println(ssid);
  Serial.print("IP 주소: ");
  Serial.println(WiFi.localIP());
  Serial.println();
  //----------------------------------------

  client.setInsecure();
}

 

이제 메인코드를 작성할 차례이다. 

 

현재 아두이노에 연결된 것이 없기에, 두 개의 지정된 변수만을 구글 시트로 전송해 보았다.

 

void loop() {
  delay(1000);
  int v1 = 2000;
  int v2 = 3000;
  if (!client.connect(host, httpsPort)) {
    Serial.println("호스트 연결 실패");
    return;
  };
  String value1 =  String(v1);
  String value2 =  String(v2);
  String url = "/macros/s/" + GAS_ID + "/exec?value1=" + value1 + "&value2=" + value2;
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
         "Host: " + host + "\r\n" +
         "User-Agent: BuildFailureDetectorESP8266\r\n" +
         "Connection: close\r\n\r\n");
  Serial.println("요청 전송");
};

 

시트를 보면 값이 잘 전송된 것을 볼 수 있다.

 

 

이제 값을 전송하는 부분을 함수로 만들어보자.

 

함수명은 sendData로 하고, 이 함수는 2개의 int를 파라미터로 받는다.

 

아래 함수를 보면 핵심적인 부분은 위와 같고, 응답을 처리하는 부분이 추가되어 있다.

 

void sendData(int data1, int data2) {
  Serial.println("==========");
  Serial.print("호스트 연결중");
  Serial.println(host);
  
  //----------------------------------------Connect to Google host
  if (!client.connect(host, httpsPort)) {
    Serial.println("호스트 연결 실패");
    return;
  }
  //----------------------------------------

  //----------------------------------------Processing data and sending data
  String value1 =  String(data1);
  String value2 =  String(data2);
  String url = "/macros/s/" + GAS_ID + "/exec?value1=" + value1 + "&value2=" + value2;
  Serial.print("요청 URL: ");
  Serial.println(url);

  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
         "Host: " + host + "\r\n" +
         "User-Agent: BuildFailureDetectorESP8266\r\n" +
         "Connection: close\r\n\r\n");

  Serial.println("요청 전송");
  //----------------------------------------

  //----------------------------------------Checking whether the data was sent successfully or not
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      Serial.println("헤더 수신");
      break;
    }
  }
  String line = client.readStringUntil('\n');
  if (line.startsWith("{\"state\":\"success\"")) {
    Serial.println("데이터 전송 성공");
  } else {
    Serial.println("데이터 전송 실패");
    Serial.println(line);
  }
  Serial.print("응답 : ");
  Serial.println(line);
  Serial.println("연결을 닫는중");
  Serial.println("==========");
  Serial.println();
  //----------------------------------------
}

 

이것을 loop문 안에 넣고 정상적으로 작동하는지 확인해보면 된다.

 

void loop() {
  delay(1000);
  int v1 = 2000;
  int v2 = 3000;
  sendData(v1, v2);
}

 

 

3. 전체코드

전체 코드는 아래와 같다. 유용하게 쓰길 바라며, 다음 글에서는 온습도 센서를 이용해 온도와 습도를 측정해보고자 한다.

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>

// int fan_pin = 8;

const char* ssid = "와이파이 이름";   // 와이파이 이름
const char* password = "와이파이 비밀번호"; // 와이파이 비밀번호

//----------------------------------------Host & https포트(https 는 443 고정)
const char* host = "script.google.com";
const int httpsPort = 443;
//----------------------------------------

WiFiClientSecure client; // WiFiClientSecure 객체 생성

// Google spreadsheet script ID
String GAS_ID = "구글 스프레드시트 스크립트 ID";

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password); // 와이파이 라우터와 연결
  Serial.println("");
  //----------------------------------------연결대기
  Serial.print("연결중");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(1000);
    };
  //----------------------------------------
  Serial.println("");
  Serial.print("와이파이 연결 성공 : ");
  Serial.println(ssid);
  Serial.print("IP 주소: ");
  Serial.println(WiFi.localIP());
  Serial.println();
  //----------------------------------------

  client.setInsecure();
};

void loop() {
  delay(1000);
  int v1 = 2000;
  int v2 = 3000;
  sendData(v1, v2);
};

// 구글 스프레드시트로 데이터 전송
void sendData(int data1, int data2) {
  Serial.println("==========");
  Serial.print("호스트 연결중");
  Serial.println(host);
  
  //----------------------------------------Connect to Google host
  if (!client.connect(host, httpsPort)) {
    Serial.println("호스트 연결 실패");
    return;
  };
  //----------------------------------------

  //----------------------------------------Processing data and sending data
  String value1 =  String(data1);
  String value2 =  String(data2);
  String url = "/macros/s/" + GAS_ID + "/exec?value1=" + value1 + "&value2=" + value2;
  Serial.print("요청 URL: ");
  Serial.println(url);

  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
         "Host: " + host + "\r\n" +
         "User-Agent: BuildFailureDetectorESP8266\r\n" +
         "Connection: close\r\n\r\n");

  Serial.println("요청 전송");
  //----------------------------------------

  //----------------------------------------Checking whether the data was sent successfully or not
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      Serial.println("헤더 수신");
      break;
    };
  };
  String line = client.readStringUntil('\n');
  if (line.startsWith("{\"state\":\"success\"")) {
    Serial.println("데이터 전송 성공");
  } else {
    Serial.println("데이터 전송 실패");
    Serial.println(line);
  };
  Serial.print("응답 : ");
  Serial.println(line);
  Serial.println("연결을 닫는중");
  Serial.println("==========");
  Serial.println();
  //----------------------------------------
}

 

 

728x90