반응형

 

 

아두이노(Arduino)를 이용한 IoT (사물인터넷) 프로젝트에서 데이터 로거(Data logger)를 만드는 일은 흥미로운 작업입니다. 데이터 로거란 단순하게 보면 데이터 기록기, 저장기? 정도로 생각하시면 되는데 최근 데이터 로거의 기능이 많아져서 간단한 전산, 컨트롤러(controller) 및 그래프(graph) 출력 기능까지 되는 제품도 많이 나오고 있습니다. 아두이노를 활용하여 인터넷을 사용하지 않고 컴퓨터에만 연결하여 충분히 데이터 로거를 만들 수 있습니다.

 

데이터 로거

오늘은 아두이노로 간단한 데이터 로거를 만들어보겠습니다. 빠르신 분은 눈치채셨겠지만 이전에 소개했던 내용들을 조금만 응용하는 과정이 되겠지만 ㅎㅎ 끝까지 봐주시면 힘이 되겠습니다 ^^


1. 시간 표시하기

 

대부분의 계측기가 언제 어떤 상태였는지를 센서로 측정하여 데이터로 기록하는 게 목적(시간에 따른 데이터화)이기 때문에 데이터 로거의 기본은 시간이 표시되어야 합니다. 아두이노 자체적으로 시간을 표시해 주진 않기 때문에 시간을 표시하려면 몇 가지 작업이 필요합니다. 복잡한 거 싫어하고 오픈소스를 사용하는 걸 좋아하는 저는 오늘도 라이브러리를 이용하여 시간을 표시하겠습니다. ^^ 우선 아래 라이브러리를 다운로드하여 스케치(sketch)에 추가해 줍니다.

swRTC.zip
0.03MB

#include <swRTC.h>
swRTC rtc;

void setup() {
  rtc.stopRTC();            //정지
  rtc.setDate(17, 3, 2020); //일, 월, 년
  rtc.setTime(0, 0, 0);  //시, 분, 초
  rtc.startRTC();           //시작
  Serial.begin(9600);
}

void loop() {
  Serial.print(rtc.getHours(), DEC);
  Serial.print(":");
  Serial.print(rtc.getMinutes(), DEC);
  Serial.print(":");
  Serial.print(rtc.getSeconds(), DEC);
  Serial.print("\t"); 

  Serial.print(rtc.getYear(), DEC);
  Serial.print("/");
  Serial.print(rtc.getMonth(), DEC);
  Serial.print("/");
  Serial.println(rtc.getDay(), DEC);
  delay(1000);
}

코드블럭과 같이 프로그램을 코딩하고 스케치를 통해서 아두이노에 업로드합니다. 그리고 일, 월, 년, 시, 분, 초에 현재 시간 또는 원하는 시간을 세팅해줍니다. 저는 글을 포스팅하고 있는 현재 2020년 3월 17일 0시 0분 0초라고 설정하였습니다. 업로드 후 시리얼 모니터(Serial Monitor)를 실행하면 아래와 같이 시간이 표시됩니다.

 

아두이노(Arduino) 현재시간 표시하기

 

지금 보여드린 방법이 가장 간단하지만 아두이노에 자체적인 전원이 없으므로 전원이 꺼졌을 때는 시간이 가지 않습니다. 처음 현재 시간으로 설정하더라도 전원이 잠깐이라도 끊기는 순간 처음 설정한 시간으로 다시 리셋됩니다. 그래서 현재 시간이 반드시 필요하신 분들은 시계 역할을 하는 모듈을 연결하거나 인터넷을 연결하여 전원이 들어올 때 현재시간을 받는 방법을 채택해야 합니다.

 

 

 


 

2. 시간과 데이터 표시하기 

 

센서에서 측정하는 데이터를 시간과 동시에 표시하면 되는 과정이기 때문에 간단합니다. 이런 예시에 항상 사용하는 온습도 센서를 사용하여 프로그램을 코딩하겠습니다. 아두이노 및 온습도 센서 사용이 처음이신 분은 아래 링크 참조 부탁드립니다. 

 

Arduino 아두이노 온도 습도 센서(Temperature and Humidity sensor) 종류 및 사용법

온습도 센서(Temperature and Humidity sensor)는 환경 측정에서 중요하면서도 기본적인 센서로 많이 사용됩니다. 중요하지만 비교적 흔하게 구할 수 있는 센서라 시중에 다양한 종류의 제품이 있고 기능적으로는..

it-g-house.tistory.com

온습도 센서 프로그램 코드와 앞서 알아보았던 시간표시 프로그램과 함께 코드를 합쳐서 아래와 같이 프로그램을 재구성합니다.

#include <swRTC.h>
#include <dht.h>

swRTC rtc;
dht DHT; 
#define DHT22_PIN 2 
float hum; //Stores humidity value 
float temp; //Stores temperature value

void setup() {
  Serial.begin(9600); 
  rtc.stopRTC(); //정지 
  rtc.setDate(17, 3, 2020); //일, 월, 년 
  rtc.setTime(0, 0, 0); //시, 분, 초 
  rtc.startRTC(); //시작 

  }

void loop() { 
  DHT.read22(DHT22_PIN); 
  hum = DHT.humidity; 
  temp = DHT.temperature;

  Serial.print(rtc.getHours(), DEC); 
  Serial.print(":"); 
  Serial.print(rtc.getMinutes(), DEC); 
  Serial.print(":"); 
  Serial.print(rtc.getSeconds(), DEC); 
  Serial.print("\t"); 
  Serial.print(rtc.getYear(), DEC); 
  Serial.print("/"); 
  Serial.print(rtc.getMonth(), DEC); 
  Serial.print("/"); 
  Serial.print(rtc.getDay(), DEC); 
  Serial.print("\t"); 
  Serial.print("Humidity: "); 
  Serial.print(hum); 
  Serial.print(" %, Temp: "); 
  Serial.print(temp); 
  Serial.println(" Celsius"); 
  
  delay(1000);
  }

그 후 프로그램을 아두이노에 업로드하면 아래와 같이 시리얼 모니터에서 볼 수 있습니다. 데이터 스캔 간격을 delay(1000)으로 설정해서 1초 간격으로 표시되지만 delay명령어를 통해 조절 가능합니다. (일반적으로 평상시 실내 온습도는 1초 또는 1분 정도의 시간 동안 차이가 크지 않죠 ^^ 사용하시는 환경에 맞게 스캔 간격을 조절하시면 됩니다.)  

 

아두이노(Arduino) 시간에 따른 온습도 표시

 

 

 


 

3. 엑셀을 통해 시각화 하기 

 

단순 데이터만 보려면 시리얼 모니터로 충분하지만 엑셀을 이용하여 실시간으로 측정되는 데이터를 시각화(그래프)해서 좀 더 편하게 데이터를 모니터링하려 합니다. 앞서 시간과 날짜를 나타낼 수 있게 라이브러리를 도입한  방법보다 엑셀의 기능과 병합하여 좀 더 간단한 방법으로 만들 수 있습니다. 우선 아래와 같이 프로그램을 코딩한 뒤 아두이노에 업로드합니다.

#include <dht.h>

dht DHT; 
#define DHT22_PIN 2 
float hum; //Stores humidity value 
float temp; //Stores temperature value
float today = 43907; //2020-03-17
float timer; //00:00:00
float second = 0.0000115740741; //1/(24*60*60)


void setup() {
  Serial.begin(9600);
  Serial.println("CLEARDATA"); 
  Serial.println("LABEL,Date,Time,Temp,Humi");
  }

void loop() { 
  DHT.read22(DHT22_PIN); 
  hum = DHT.humidity; 
  temp = DHT.temperature;
  today = floor(today + timer);
  timer = timer + second;
  
  Serial.print("DATA,"); 
  Serial.print(today); 
  Serial.print(",");
  Serial.print(timer,10); 
  Serial.print(",");  
  Serial.print(temp); 
  Serial.print(","); 
  Serial.println(hum); 
  
  delay(1000);
  }

아두이노와 엑셀을 연동하기 위해 앞선 포스팅에서 소개한 프로그램으로 'PLX-DAQ'을 사용합니다. 아래 파일을 다운로드하여서 설치하시고, 사용방법은 아래 링크 참조 부탁드립니다.

PLX-DAQ-v2.11.zip
0.49MB

 

 

Arduino 아두이노 시리얼 통신 데이터를 엑셀에 저장/연동하기

지난 포스팅까지 아두이노(Arduino)를 사용하여 온습도 센서(Temperature and Humidity sensor)를 동작하고 측정된 데이터를 출력하고 저장하는 방법까지 알아보았습니다. 앞서 알아본 저장방법은 *.txt 파일로 저..

it-g-house.tistory.com

앞서 라이브러리를 사용한 방법은 2020/03/17 00:00:00 Temperature, Humidity 이런 포맷으로 출력하기 위한 거면 엑셀에서는 셀 서식 기능에 숫자를 '날짜', '시간'으로 표식이 되기 때문에 숫자만으로 프로그램이 구성됩니다. 아마 엑셀을 조금 사용해보셨으면 셀 서식 -> 표시 형식에서 설정 방법을 인지하고 계실 겁니다.

그래서 위 코드처럼 오늘 날짜(2020-03-17)에 해당하는 43907로 today를 값을 설정하고 하루가 지날 때마다 1씩 더해져서 날짜를 표시할 수 있습니다. 같은 방법으로 초기 시간 00:00:00에서 1초에 해당하는 값 즉, 1/(24시간*60분*60초) = 0.0000115740741... 을 1초 delay 마다 더하는 방법입니다. 컨셉을 이해하셨으면 상황에 맞게 시간이나 간격을 조절하셔서 사용하실 수 있을 거라 생각됩니다. 아두이노에 프로그램을 업로드 후 'PLX-DAQ' 프로그램을 사용하여 엑셀에 연동하면 아래와 같이 데이터가 들어옵니다.

 

아두이노(Arduino)로 Datalogger 만들기

아직 '표시 형식'을 변경하기 전이라 숫자로 표시되지만 셀 설정에서 표시 형식을 변경하면 원하는 포맷으로 날짜와 시간을 표시할 수 있습니다. 그리고 원하는 그래프로 시각화할 때 데이터의 셀 영역을 column 전체로 설정해놓으면 실시간으로 데이터가 들어올 때마다 그래프가 그려집니다.

 

아두이노(Arduino)로 Datalogger 만들기 엑셀에서 표시형식 변경
아두이노(Arduino)로 Datalogger 만들기 엑셀로 실시간 그래프 설정


오늘은 아두이노(Arduino)로 간단하게 데이터로거(Datalogger)를 만들어 보았습니다. 좀 단순하게 만드는 방법이다 보니 현 시간을 바로 반영할 수 없다는 점... 같은 게 허점이 될 수 있지만 가볍게 사용하기에는 파워풀한 방법입니다.

 

좀 더 정확한 시간 반영을 위해서는 인터넷을 사용하여 웹상에서 현재시간 정보를 받아 사용해야 합니다. 좀 복잡하죠 ^^ 인터넷이 안 되는 환경이나 현재 시간이 꼭 중요하지 않다면 쉽게 사용할 수 있을 듯합니다. 

 

기회가 되면 esp-01 (ESP8266) 모듈을 사용해서 구글 현재시간을 받아 정확한 시간을 표시하는 방법에 대해서 포스팅해보겠습니다. 긴 글 읽어주셔서 감사합니다.

 

 

 

 

반응형

+ Recent posts