한국어

Solar :: 태양열발전

오픈소스 하드웨어는 오픈소스 코드와 어우러질 때 빛을 발합니다. 하드웨어를 제어할 수 있는 핵심 코드를 공유함으로써 더 많은 사용자들이 직접 제작에 참여해볼 수 있기 때문입니다. 서영배 하드카피월드 대표와 강순구 디자인스튜디오 365대표는 이러한 취지에 공감해 기꺼이 설계 도면과 아두이노 미세먼지 제어 코드를 공개해주셨습니다. 미세먼지 측정기를 필요로 하시는 분들께 도움이 되었으면 하는 바람입니다. [편집자주]

# 설계 도면

dust sensor

# 제어 코드


#include
#include "bitmap.h"

// Demo using DHCP and DNS to perform a web client request.
// 2011-06-08 http://opensource.org/licenses/mit-license.php
#include

///////////////////////////////////////////////////////////////////
//—– Ethernet instance

// ethernet interface mac address, must be unique on the LAN
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

byte Ethernet::buffer[500];
static uint32_t timer;

const char website[] PROGMEM = “www.bloter.net”; // use your website domain

//timing variable
int res = 0;

///////////////////////////////////////////////////////////////////
//—– OLED instance

// IMPORTANT NOTE: The complete list of supported devices
// with all constructor calls is here: http://code.google.com/p/u8glib/wiki/device

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // I2C / TWI

///////////////////////////////////////////////////////////////////
// Dust sensor
/*
Interface to Sharp GP2Y1010AU0F Particle Sensor
Program by Christopher Nafis
Written April 2012

http://www.sparkfun.com/datasheets/Sensors/gp2y1010au_e.pdf

http://sensorapp.net/?p=479

Sharp pin 1 (V-LED) => 5V (connected to 150ohm resister)
220uF capacitor between pin1 and pin2
Sharp pin 2 (LED-GND) => Arduino GND pin
Sharp pin 3 (LED) => Arduino pin 2
Sharp pin 4 (S-GND) => Arduino GND pin
Sharp pin 5 (Vo) => Arduino A0 pin
Sharp pin 6 (Vcc) => 5V
*/

int dustPin = 0;
int dustVal=0; // analog read
int count=0;
float ppm=0; // sum of analog read
char s[32];
float voltage = 0; // average voltage
float dustdensity = 0; // average dust density
float ppmpercf = 0; //
unsigned long lastSensingTime = 0;
const unsigned long SENSING_INTERVAL = 3000;

int ledPower=2;
int delayTime=280;
int delayTime2=40;
float offTime=9680;

unsigned long lastConnectionTime = 0; // last time you connected to the server, in milliseconds
const unsigned long POSTING_INTERVAL = 30*1000; //delay between updates to Pachube.com

void setup() {
pinMode(ledPower,OUTPUT);
pinMode(4, OUTPUT);

//showInfo(“initializing…”, 3);

//Initialize Ethernet
initialize_ethernet();
}

void loop(){
//if correct answer is not received then re-initialize ethernet module
//if (res > 220){
// //initialize_ethernet();
//}
//es = res + 1;

// Monitoring incoming packets
ether.packetLoop(ether.packetReceive());

// Read dust sensor
if(millis() – lastSensingTime > SENSING_INTERVAL) {
readDustSensor();
lastSensingTime = millis();
}

if(millis() – lastConnectionTime > POSTING_INTERVAL) {
// calculate average voltage and dust density
voltage = ppm/count*0.0049;
dustdensity = 0.17*voltage-0.1;
ppmpercf = (voltage-0.0256)*120000;
if (ppmpercf < 0)
ppmpercf = 0;
if (dustdensity 0.5)
dustdensity = 0.5;

// display result
String dataString = “”;
dataString += dtostrf(dustdensity, 5, 4, s);
dataString += ” mg/m3″;
showInfo(dataString, 2);

// send to remote server
sendData();

// initialize parameters
count=0;
ppm=0;
lastConnectionTime = millis();
}

}

//////////////////////////////////////////////////////
// Read analog voltage value from dust sensor

void readDustSensor() {
count = count + 1;
// ledPower is any digital pin on the arduino connected to Pin 3 on the sensor
digitalWrite(ledPower,LOW); // power on the LED
delayMicroseconds(delayTime);

dustVal=analogRead(dustPin); // read the dust value via pin 5 on the sensor
ppm = ppm+dustVal;
delayMicroseconds(delayTime2);

digitalWrite(ledPower,HIGH); // turn the LED off
delayMicroseconds(offTime);

String strVoltage = “Voltage=”;
strVoltage += dtostrf(dustVal, 5, 2, s);
showInfo(strVoltage, 3);
}

//////////////////////////////////////////////////////
// Ethernet functions

// Send data to remote server
char url_buf[113];
void sendData() {
// initialize buffer
for(int i=0; i>> Received”, 3);
//showInfo((char*) Ethernet::buffer + off);
}

// Initialize ethernet module
void initialize_ethernet(void){
for(;;){ // keep trying until you succeed
//Reinitialize ethernet module
//pinMode(5, OUTPUT);
//digitalWrite(5, LOW);
//delay(1000);
//digitalWrite(5, HIGH);
//delay(500);

if (ether.begin(sizeof Ethernet::buffer, mymac) == 0){
showInfo(“Failed to access Ethernet controller”, 3);
continue;
}
showInfo(“Ethernet begin”, 3);

if (!ether.dhcpSetup()){
showInfo(“DHCP failed”, 3);
continue;
}

//ether.printIp(“IP: “, ether.myip);
//ether.printIp(“GW: “, ether.gwip);
//ether.printIp(“DNS: “, ether.dnsip);

if (!ether.dnsLookup(website)) {
showInfo(“DNS failed”, 3);
}

ether.printIp(“SRV: “, ether.hisip);
showInfo(“Ethernet initialized!!”, 3);
delay(3000);

//reset init value
res = 0;
break;
}
}

//////////////////////////////////////////////////////
// Display

// Draw screen
const int DISP_CHAR_LEN = 13;
const int DISP_CHAR_LEN2 = 24;
char str_line1[] = “Dust density “;
char str_line2[] = “00.0000 mg/m3″;
char str_line3[] = “Initializing…………”;

void showInfo(String strDisp, int line_index) {
if(strDisp == NULL) {
return;
}

int posY = 45;
if(line_index == 1) {
for(int i=0; i<DISP_CHAR_LEN; i++)
str_line1[i] = 0x00;
strDisp.toCharArray(str_line1, DISP_CHAR_LEN – 1);
} else if(line_index == 2) {
for(int i=0; i<DISP_CHAR_LEN; i++)
str_line2[i] = 0x00;
strDisp.toCharArray(str_line2, DISP_CHAR_LEN – 1);
} else {
for(int i=0; i<DISP_CHAR_LEN2; i++)
str_line3[i] = 0x00;
strDisp.toCharArray(str_line3, DISP_CHAR_LEN2 – 1);
}

// picture loop
u8g.firstPage();
do {
// draw icon
u8g.drawBitmapP( 13, 11, 3, 24, IMG_logo_24x24);

// draw text
u8g.setFont(u8g_font_fixed_v0);
u8g.setFontRefHeightExtendedText();
u8g.setDefaultForegroundColor();
u8g.setFontPosTop();
u8g.drawStr(50, 10, str_line1);
u8g.drawStr(50, 26, str_line2);
u8g.drawStr(8, 47, str_line3);
} while( u8g.nextPage() );
}

 

URL: http://www.bloter.net/archives/225462


WindBoy

2015.04.15 09:13:48
*.53.140.98

센서+저널리즘. 국내 언론 생태계에선 생경한 조합이다. 센서로 저널리즘 행위를 실천한다는 의미지만 친숙하진 않다. 어떤 센서로 어떤 뉴스에 활용할지 사례가 딱 떠오르지 않는다. 여전히 이 조합이 모호하기만 하다.

지난 1월30일, ‘사물인터넷, 센서 저널리즘을 부른다’ 기사를 작성했다. 곧이어 한국언론진흥재단이 발행하는 신문과방송 4월호에 ‘저렴하고 손쉽게, 데이터 수집의 무한도전’이라는 글도 기고했다. 센서 저널리즘이 미국 언론사를 중심으로 하나둘씩 실험되고 있다는 내용이다.

글을 쓰면서 욕심이 났다. ‘기자들이라고 못할 이유가 있을까? 직접 따라해보면 되지 않겠나.’

때마침 주류 언론에선 여느 해 봄날처럼 ‘미세먼지의 심각성’을 경고하는 기사들이 연일 터져나왔다. 페이스북 타임라인에선 그린피스의 ‘초미세먼지 줄이기 캠페인’ 포스트가 눈길을 잡아챘다. 자연스럽게 ‘미세먼지를 센서로 측정해 보도하면 어떨까’라는 구상으로 이어졌다. 단, 환경부가 제공하는 실외 미세먼지 농도가 아니라 실내를 확인해보자는 데까지 생각이 미쳤다. 필요하다면 실외와 실내를 비교해볼 수도 있겠다 싶었다.

남은 과제는 실행이다. 미세먼저 측정 센서를 어떻게 제작할지, 이를 작동시키는 코드를 어떻게 짤지, 서버에선 데이터를 어떻게 수집할지, 데이터를 어떻게 표현할지, 생각만 해도 쉬운 작업이 없었다. 아두이노로 미세먼지 측정 센서를 개발해보겠노라 결심은 굳힌 상태였지만 이를 구현할 공개된 설계도면도, 제어할 소스코드로 가진 것이 없었다.

제작을 결심하기까지

arduino

미세먼지 측정을 위해 구매한 부품들. 왼쪽부터 아두이노 나노, 미세먼지 측정 센서, 브레드보드, 이더넷포트, OLED 스크린. 상단에는 연결 케이블들.

3월26일, 서영배 하드카피월드 대표에게 도움을 청했다. 취지를 설명하고 함께 미세먼지 측정 센서를 제작해볼 것을 제안했다. 서 대표는 흔쾌히 승낙했다. 그는 아두이노로 공기질 측정 센서를 제작해 적용해보고 있는 터였다고 했다. 공기질 측정 센서를 미세먼지 센서로 교체해 다시 제작해볼 수도 있겠다 싶었다.

부품 구매는 서 대표에게 부탁했다. 내가 직접 하자니, 경험이 일천해 고르는 데만도 며칠이 걸릴 듯했다. 서 대표는 대부분의 소재들을 해외 쇼핑몰에서 구매했다. 4세트를 사는 데 들인 비용은 108.91달러, 우리돈으로 12만원에 불과했다. 2세트는 실 측정 기기용으로, 2세트는 테스트용 버전과 추가 부품용으로 주문했다. 미세먼지 측정 센서를 제작하기 위해 구매한 부품은 아래와 같다.

미세먼지 측정 센서 제작을 위해 ‘아두이노 나노’를 선택했다. 아두이노는 우노, 레오나르도 등 그 종류만 20종이 넘는다. 복잡한 기능이 필요 없고 브레드보드와의 조립이 간편하다는 이점 때문에 나노를 택했다. 물론 개당 3.15달러에 불과한 ‘착한’ 가격도 한몫했다.

아두이노란?

아두이노는 오픈소스로 제작된 마이크로제어 보드다. 센서나 외부 기기를 부착해 다양한 목적으로 조작할 수 있다. 이탈리아 개발자 마시모 반지와 데이비드 꾸아르띠에예스가 제작해 2005년 처음으로 소개했다. 전세계적으로 수백만대가 판매될 만큼 높은 인기를 구가하고 있다. 이미 출시된 보드 종류만 해도 20여종에 이른다. 아두이노의 활용 범위는 상상력에 달려있다. 무엇이든 제작할 수 있고 무엇이든 조작할 수 있다.

아두이노 나노로 미세먼지 측정 센서를 조립하는 작업은 의외로 간단했다. 설계 도면에 따라 저항과 축전지를 연결하고 선을 뜯어 부품을 연결하는 게 전부였다. 한 세트 조립에 소요된 시간은 대략 40분 남짓이었다. 조립은 간단했지만 설계도면 작성에는 며칠이 걸렸다. 서영배 하드카피월드 대표와 강순구 디자인스튜디오36.5 대표가 도움을 줬다

#1. 미세먼지 센서 부착

arduino

미세먼지 측정 센서를 테스트하기 위해 브레드보드에 아두이노 나노를 부착한 뒤 미세먼지 센서를 도면에 따라 선으로 연결했다.

조립은 미세먼지 센서가 정상적으로 작동하는지 테스트하는 작업부터 시작됐다. 브레드보드에 아두이노 나노를 가운데쯤 부착했다. 브레드보드는 일종의 확장 기판이다. 각종 연결선과 부품을 장난감 조립하듯 브레드보드에 끼워넣는 형태로 진행했다. 별도의 납땜질은 필요 없었다. 벗겨진 선 끝부분을 손가락으로 힘차게 밀어넣으면 ‘똑’하며 탈착되는 방식이었다.

미세먼지 센서는 샤프의 ‘GP2Y1010AU0F’ 모델을 사용했다. 광학 방식의 먼지센서로 대기 중에 적외선을 쏘면 포토트랜지스터가 대기 중의 먼지 농도를 검출해낸다. 담배 연기와 같은 미세입자를 감지하는 데 도움이 된다고 했다. 고가의 미세먼지 측정 기기와 이 센서의 측량치를 비교하는 것은 무리다. 정밀도도 떨어질뿐더러 결과값의 보정도 필요하다. 그렇지만 추이를 확인하는 데는 도움이 된다.

#2. 아두이노 개발 환경으로 작동 여부 테스트

미세먼지 센서를 가동시키기 위해서는 아두이노 나노에 제어 코드를 등록해야 한다. 이를 위해 아두이노 개발 환경인 ‘아두이노 1.6.0′ 소프트웨어를 내려받아 실행했다. USB 케이블로 아두이노 나노와 노트북을 연결한 뒤 작성된 코드를 업로드하면 작업은 완료된다.

일반적으로 제어 코드는 공개돼있는 경우가 많지만 용도에 맞춰 변경하고 추가하는 수고로움이 필요하다. 관련 코드 작성은 서영배 대표가 미리 완성해 제공했다.

#3. OLED 스크린과 이더넷 포트 연결

arduino

OLED 스크린을 브레드보드에 끼워붙인 뒤 이더넷 포트를 연결한 상황. 아두이노 나노를 USB로 연결해 전원을 공급했다.

아두이노 미세먼지 센서가 측정한 데이터를 서버로 전송하기 위해 이더넷 포트를 사용했다. 와이파이로 데이터를 전송받는 방식도 가능했지만 전송 오류 확률이 높다는 조언을 듣고 안정적인 송·수신 방식을 선택했다. 이더넷 포트를 구매해 브레드보드에 연결했다. 케이블 끝부분이 구부러지거나 부러질까 조심스레 다뤄야 했다. 기기에서 측정된 먼지농도 현황을 확인하기 위해 OLED 스크린도 장착했다. 서버와의 교신 여부를 눈으로 체크하기 위해서라도 필요한 부품이었다.

#4. 블로터 사무실 미세먼지 농도 데이터 수집

IMG_2985

랜선과 이더넷 포트를 연결해 서버로 데이터를 전송하는 상황. 전원 공급은 노트북에 의존해야 했다.

조립된 아두이노 미세먼지 측정기로 사무실 실내 농도를 계측하기 위해선 안정적으로 전원이 공급돼야 했다. 아두이노는 일반적으로 USB로 전원을 공급받는다. 따라서 이동형으로 제작할 경우 전원 공급 장치를 별도로 부착해야만 한다. 임시로 노트븍 USB 포트와 아두이노 나노를 연결했다.

전원을 연결하자 OLED 스크린에 데이터 측정을 시작한다는 메시지가 떴다. 30초 단위로 집계하도록 코드를 변경했다. 그 다음은 수집한 데이터를 서버로 보내는 작업이다. 이를 위해 이더넷 포트에 랜선을 연결, 유선으로 데이터를 전송했다. 안정적인 전원 공급장치만큼이나 인터넷 접속의 안정성도 필요해 보였다.

11일 21:0012일 00:0012일 03:0012일 06:0012일 09:0012일 12:0012일 15:0012일 18:0012일 21:0013일 00:0013일 03:0013일 06:0013일 09:0013일 12:0013일 15:0013일 18:0013일 21:0014일 00:0014일 03:0014일 06:0014일 09:0014일 12:0014일 15:0014일 18:0014일 21:0015일 00:0015일 03:0015일 06:0015일 09:000102030405060708090먼지 농도(㎍/㎥)17

▲현재 시각 ‘블로터’ 사무실의 미세먼지 측정치. ‘F5′ 키를 누르면 업데이트된 측정치를 확인할 수 있습니다.

아두이노 활용 센서 저널리즘 한계와 가능성

미세먼지 측정 센서의 데이터시트에는 출력 전압값과 미세먼지 농도간의 비교젼환표가 제시돼있다.(이미지 출처 : GP2Y1010AU0F 데이터시트)

미세먼지 측정 센서의 데이터시트에는 출력 전압값과 미세먼지 농도간의 비교젼환표가 제시돼 있다.(자료 : GP2Y1010AU0F 데이터시트)

아두이노로 센서 저널리즘을 구현하는 작업은 비교적 수월한 편이었다. 하지만 저널리즘이 요구하는 정밀한 데이터를 수집하기 위해선 다양한 작업이 뒤따를 필요가 있었다. 특히 데이터의 신뢰를 확보하기 위한 정밀 센서 장비 구비는 전제 조건에 해당한다.

저가 센서만으로 환경부나 기상청의 미세먼저 측정 장비를 대신하기는 어려웠다. 주변 온도와 바람의 영향에 따라 미세먼지 농도는 들쑥날쑥하는 경우가 빈발했다. 먼지센서의 위치를 조금이라도 변경하면 농도가 갑작스럽게 ‘튀는’ 현상도 자주 발생했다. 일정 정도의 데이터 보정이 뒷받침되지 않으면 측정치 자체를 뉴스 보도용으로 활용하는 것은 무리다.

데이터 측정 과정의 투명성도 센서 저널리즘이 보편화하기 위한 충분조건이다. 예를 들어 센서마다 측정 방식이 다르고 그에 따라 미세먼지 농도로 전환하는 과정도 바뀐다. 샤프사의 미세먼지측정 센서는 적외선 방식으로 계측한 데이터를 전압 단위로 제공한다. 이를 아두이노 소스코드를 이용해 미세먼지 단위인 ㎍/㎥로 변환해야 한다. 때문에 과정을 투명하게 제공하지 않으면 데이터 신뢰도엔 금이 가기 마련이다.

분명 아두이노와 같은 오픈소스 하드웨어는 센서 저널리즘의 가능성을 열어젖히고 있다. 측정 시간대를 뉴스 기획에 맞춰 조절할 수 있는 이점도 있다. 정부가 제공하는 계측 지점도 얼마든지 확대할 수 있다. 하지만 몇 가지 요건을 충족시키지 못한다면 보도용으로 활용하기엔 결함이 뒤따른다.

사물인터넷 시대, 센서의 중요성은 두말할 나위가 없다. 아두이노나 라즈베리파이와 같은 오픈소스 하드웨어가 보편화하면서 센서를 제어하는 하드웨어 제작은 한결 손쉬워졌다. 3D 프린팅 기술까지 보태진다면 보기 좋은 완결품을 내놓는 건도 어렵지 않다. 단지 저널리스트의 상상력이 관건이 될 뿐이다. 하드웨어 제작이 간편해진다고 저널리즘의 품질이 높아지지는 않는다. 결과적으로 센서 저널리즘은 하드웨어보다 데이터를 다루는 기술이 향상될 때 빛을 발할 것으로 보인다.

도움을 준 사람들

List of Articles
번호 제목 글쓴이 날짜 조회 수
77 제로 에너지 하우스에 다시 한번.... 수텐리 2018-09-05 78
76 [과학을 읽다]태양전지 효율 최고기록 또 깼다 WindBoy 2017-06-30 70
75 태양광 패널, 일반 가정에서 투자 대비 효과는? 구글 툴로 계산 WindBoy 2015-08-20 132
74 "빗물이 태양 전지 패널 수명을 단축시킨다" 나사 연구원 WindBoy 2015-08-18 86
73 펌] 태양전지의 종류와 용도 3 (3세대태양전지) - 솔라센터 WindBoy 2015-08-14 128
72 전기료 인하를 가져올 재생에너지 열풍 WindBoy 2015-07-21 104
71 “IT기업이 ‘쿨’해지는 법, 재생가능에너지 활용입니다” WindBoy 2015-07-20 45
70 공기중에서 물을 얻는 와카워터(Warka Water) [2] WindBoy 2015-07-08 444
69 한글시계 - 한글로 흐르는 시간의 즐거움 WindBoy 2015-07-07 113
68 휴대폰 케이블로 충전하는 건전지, 크라우드펀딩 ‘똑똑’ WindBoy 2015-07-02 66
67 웹사이트, ‘착한’ 전력으로 돌아가고 있을까 WindBoy 2015-07-01 83
66 아두이노로 만드는 ‘태양 쫓는 솔라트래커’ WindBoy 2015-06-25 992
65 에코돔을 소개 합니다. WindBoy 2015-06-16 86
» [공개] 아두이노 미세먼지 측정기 소스코드와 설계도면 [1] WindBoy 2015-04-15 579
63 ‘슬기로운’ 태양광 벤처, 이든스토리 WindBoy 2015-04-15 761
62 기름 한 방울 쓰지 않고, 전 세계 여행하기- 석유와의 공생을 실현하는 Solar Impulse의 두 파일럿 file WindBoy 2014-10-24 512
61 4인승 태양광 전기차 스텔라(Stella) 도로주행 성공 [1] WindBoy 2014-09-26 586
60 우리집햇빛발전소 - 노원구편 WindBoy 2014-08-21 932
59 태양의 고도 file WindBoy 2014-07-30 1078
58 태양광 발전소 진행 시 주의할 점 WindBoy 2014-07-30 919