찜질용 빨간색 고무 주머니 아시죠? 사실 그거를 사려고 했었거든요? 그런데 인터넷에 들어가보니 맨 이거만 나오더라구요. 가격차이가 좀 나기는 하는데 (물론 이게 훨씬 작고 훨씬 비쌈) 독일제고 뚜껑이 확실하게 닫힐것 같아 구입을 해 보았습니다.
쿠팡에서 주문을 하였고 바로 다음날 받아 봤습니다.
크기는 생각했던거보다 더 작아 처음엔느 실망이었습니다. 좀 큼직해서 등에 깔고 누워 자려했는데요. 한뼘보다 조금 크네요. 물론 제 손이 거인족 스러운 손은 아닙니니다.
약간 단단한 실리콘 같은 재질이며 Made in Germany 가 떡하니 찍혀있으니 중국산은 아닌것 같아 마음에 드네요. 그 아래는 뭐라 써있는 지 모르겠습니다.
물을 따르는 입구는 아래와 같이 생겼습니다. 음료병 뚜껑이 거꾸로 된것 처럼 마개가 들어가는 구멍이 있고요. 옆에 하얀 동그란 것은 고리 입니다. 매달아 놓고 보관할 수 있도록 고리가 장착이 되어 있습니다.
아래 사진은 마개 입니다. fashy 가 찍혀있고요. 별다른건 없는 그냥 뚜껑입니다. 재질은 실리콘 같은 재질은 아니고 플라스틱 같은 느낌 입니다.
자 사실 이 제품을 구입한 것을 포스팅 하려던 것은 아니었고 이 물주머니의 옷을 만들어보자 해서 작성된 포스트 입니다. 이 제품 판매 링크에 가보면 여러가지 스타일의 커버를 함께 판매하고 있었는데요. 아무래도 펄펄 끓는 물을 넣다 보니 직접 피부에 닿으면 뜨겁기도 하고 보온 효과도 커버가 있는 것이 훨씬 도움이 되겠죠.
그래서 커버를 함께 살까 했는데 뭐 대단할 것도 없는것들이 1만원씩 하더라구요. 물주머니가 1만원 정도인데 스킨이 같은 가격이라니...
그래서 만들어 보기로 하였습니다.
먼저 집에서 입지 않는 와이프의 폴라폴리스 옷을 하나 기증 받았습니다.
거기에 네임펜으로 찍찍 물주머니를 올려 놓고 아래와 같이 그렸습니다.
가위로 대충 잘라준 후 아래와 같이 테두리를 따라 미싱으로 박아 줍니다.
엄청 쉬운데요? 30분도 걸리지 않아 모두 만들었습니다.
박음질이 끝낫으니 철을 뒤집으면 되겠네요.
아래 그림은 만들어진 모습이며 아직 입히지는 않은 상태 입니다.
자 모두 완성이 되었습니다.
이제 끌어않고 자도 어느정도는 따사로울 것같습니다.
다 완성했더니 위와 같은 모습이 나왔습니다.
별거 없긴하네요. 다음번에는 다른 천이나 다른 방식으로 커버를 제작해 봐야 겠습니다.
1주일 정도 사용한 결과 만족!
일단 둥근 형태의 주둥이 때문에 정확하게 놓고 눕은것이 좀 어려운 점도 있었으나 허리부분에 집중적으로 댄다고 생각하면 그렇저억 괜앗던것 같습니다.
욕실 비데 대신 베트남에서 사용해본 비데용 샤워기를 사용한지 약 서너달이 지났는데 생각보다 만족도가 높아서 기존 설치되어 있는 비데를 사용한 적이 단 한번도 없었습니다.
사용시간, 위치 등을 자유롭게 이용할 수 있고 수량도 비데와 비교했을때 월등히 좋기 때문에 사실상 비데를 사용할 필요가 없겠다 싶었는데 한가지 문제점이 있었습니다.
이제 곧 겨울이 다가오는데 변기용 수도에 온수가 나올리가 없으므로 얼음장 같은 물줄기로 소중한 그곳에 뿌려댄다는 것은 상상도 할 수 없는 일이죠. 거의 고문 아니겠습니까?
그래서 알리익스프레스를 뒤져보던 중 상당히 저렴한 가격에 적당해 보이는 제품이 보였습니다.
25000 원 정도면 구입할 수 있는 전기 순간 온수기였는데요.
음...
구매하였습니다.
생각보다 배송이 빠르더군요. 2주 정도 걸렸습니다.
요렇게 생긴 녀석이고 아래쪽(파란색) 부분이 입수부, 위쪽 (빨간색) 부분이 온수가 나오는 출수부 입니다. 조작을 위한 버튼 같은 것은 전혀 없고 오직 220V 용 전원 코드와 입수부, 출수부만 존재 합니다.
옆에 크기 비교를 위하여 30cm 자를 두었습니다.
동작하는 것은 출수부쪽에서 물을 틀어주게 되면 수압변화를 인식하여 자동으로 동작이 되고 꼭지를 잠그면 자동으로 전원이 꺼지는 방식입니다. 간단해서 사용자다 뭘 할것은 없고 벽에 부착하고 호스를 연결한 뒤 전원을 꼽으면 끝입니다.
장점이라 할만한 점은 220V 코드가 알리에서 흔히 파는 유럽 타입의 헐거운 코드가 아닌 한국 콘센트에 딱 맞는 접지가 있는 코드가 달려있다는 점 입니다.
막상 설치하려고 보니 불안한 마음이 없지 않습니다.
과연 온도 조절은 어떻게 해야 하는걸까... 음.... 제 엉덩이가 수육이 되는 것은 싫거든요.
설치를 해보겠습니다.
먼저 양면 테이프를 바른뒤 사진에는 없지만 몇군데 실리콘 본드도 붙여 주었습니다.
벽에 부착한 상태. 실리콘이 단단히 굳을 수 있도록 하루를 말려 두었습니다.
좀더 아래에 달았다면 좋았겠지만 전원 코드선이 짧아 어쩔수 없이 저위치에 달게 되었습니다. ㅉㅉ
그리고 구성품 사진에서 느끼셨는지 모르겠지만 연결 호스가 들어있지 않습니다.
그래서 쿠팡에서 하나 주문 하였습니다. (뭐가 자꾸 추가가 되네요)
옆에 보이는 정수 필터는 예전에 비데 구입 시 함께 온 필터입니다. 아무래도 물에서 이물질이 나와 온수기로 들어간다면 고장의 원인이 될 수 있으니 달아주는것이 좋겠다고 생각했습니다. 없으면 그냥 설치해도 문제는 없을 것 같간합니다.
아래쪽에 보이는 필터는 기존 비데로 들어가는 필터고요. 옆으로 튀어나온 필터가 온수기로 들어갈 필터 입니다. 분배기로 나온 출수구쪽에 장착합니다.
설치 완료!
설치가 완료 되었습니다.
이제 테스트에 들어갑니다.
물을 인입 되는 부분의 먼저 틀어준 뒤 전원 코드를 끼워 줍니다.
우선 사용하는 전력량을 체크해 보기로 하였습니다.
전원만 연결하였을 때 0.4W 의 전력을 소모합니다. 사실상 전류를 사용하지 않는다고 보면 되겠습니다.
그리고 물을 틀어보면 ~
샤워기 헤드에 있는 손잡이를 이용하여 물을 틀게 되면 자동으로 스위치가 동작이 되는데 무려 3200W 의 전력을 먹고 있습니다.
엄청나군요.
생각해보면 흐르는 물을 바로 데워서 내보내야 하니 저정도 먹는것도 이상할 건 없다는 생각은 드는데요, 적지 않은 양인 만큼 동시에 같은 콘센트에서 다른 기구가 전기를 사용하지 않는 것이 좋겠습니다.
뭐 따지고보면 실제 사용시간이 짧은 만큼 전기 사용량이 많지는 않을 것 같습니다.
소중이 청소를 10분씩 할 것도 아니니까요.
물온도를 비교해 보겠습니다.
냉수를 그대로 받았을 때 20 도 정도의 온도가 나옵니다. 10월 말경에 테스트 한것임을 고려하면 한겨울에는 조금더 떨어질 것 같습니다. 그럼 온수기를 사용했을 때는 얼마가 나오는지 보겠습니다.
두구두구두구..
쨔잔
네 32도 입니다. 양호한 수준입니다. 미지근한 정도의 온도가 되겠습니다.
그런데 사실 저온도를 맞추기 위해 수압을 좀 낮추었습니다. 나오는 물의 양을 올리니 온도가 뚝뚝 떨어져 온수기를 사용하는 의미가 없는 수준이었습니다.
사실 엉덩이 청소를 위해 촤악 뿌려지는 시원한 물줄기가 필요하긴 하지만 엉덩이가 얼어버리는 것보다는 조금 살살 뿌려주는 것으로 만족하는 방법 밖에는 없겠습니다.
그리고 또하나 중요한 것은
저 온수기 자체가 저장 탱크가 없는 방식이다 보니 흐르는 상태에서 바로 가열이 되기 때문에 사용하다가 잠시 멈추면 중간에 있던 물이 매우 뜨거운 상태가 되어 버립니다. 사용하다가 잠시 멈추고 다시 사용할때는 반드시 3~5 초정도 변기 속으로 물을 빼 버리고 사용해야 할 것 같습니다.
안 그랬다가는 엉덩이가 매우 따근한 경험을 하게 될 수도 있어 보입니다.
이상으로 싸구려 중국산 전기 순간 온수기 설치 후기 였습니다.
너무나도 쉬운 설치 후기였네요. 보일러 없는 시골 집에 하나쯤 달아 드려도 좋지 않겠습니까?
과연 한 겨울에 몇도의 온수를 보내 줄 지 기대가 됩니다.
올겨울에 한번 올려 보겠습니다.
뎃글, 공감 은 블로그 작성자에게 큰 힘이 된답니다. 도움이 되었다 생각되시면 클릭!! 부탁드려요~
아두이노는 정말 놀라운 하드웨어가 아닐수 없죠. 우리가 생각하는 이런건 자동으로 해주는거 없나? 이런게 자동으로 되면 좋을텐데... 이런걸 왜 자동으로 안하는거야?? 같은 대부분의 자동화 장치, 기계장치를 원하면 직접 만드는것을 가능하게 끔 만드는 것을 아두이노는 가능하게 합니다.
사실 아주 많은 부분에서 자동화 또는 그런 류의 장치들은 간단한 로직만을 필요로 합니다. 실제 상용화된 제품에서는 보다 많은 기능과 안정성, 수익성, 또 제품화 되기 위한 여러가지 복합적인 문제들을 안고 있기 때문에 제품화 되지 않는 것일 뿐이죠.
오늘 포스트에서 올릴 내용은 바로 "아두이노를 이용한 수경재배" 에 대한 내용입니다.
회사에서 DIY 동호회를 운영중인데 이번 프로젝트가 바로 수경재배가 되시겠습니다.
수경재배를 하기 위하여 알아야 할 것들이 많이 있는데 사실 원천적으로는 복잡하지 않습니다. 식물이 생장에 필요로 하는 물과 양분을 공급해주는것. 바로 이게 핵심인데 그 과정에서 발생되는 인간의 개입 정도를 좀 줄여보는게 이번 프로젝트의 핵심이라 할 수 있겠습니다.
양액은 인터넷에서 저렴하게 구입이 가능하므로 일정 농도로 희석된 양액을 통에 담아두고 수경 재배용 통에 항상 부족하지 않게 공급하는 장치를 만들어 볼 계획입니다.
실제 수경재배를 위하여는 양액의 Ph 농도와 전해질의 양의 측정이 매우 중요하지만 이번 프로젝트를 위하여 엄청난 수확량을 기대한다거나 하는 것이 아니기 때문에 우리는 자동으로 부족한 물 (양액)을 보충해 주어 인간의 개입을 최소화 하는데에 의의를 두기로 하였습니다.
뎃글, 공감 은 블로그 작성자에게 큰 힘이 된답니다. 도움이 되었다 생각되시면 클릭!! 부탁드려요~
먼저 필요한 구조를 고민해 보았습니다.
- 식물이 자라기 위한 pot 이 필요할 것이고 pot을 잠기에하여 양액을 공급할 수 있는 양액통이 필요할 것입니다. 그리고 보조 양액통을 만들어 주 양액통에 양액이 부족해지면 보조 양액통으로 부터 양액을 보충해주는 역할을 하도록 만들어 볼 계획입니다. 그리고 양액통 내 용존 산소량을 확보하기 위하여 일정 수준의 공기 주입을 지속적으로 해주는 장치 정도를 만들어 볼 계획입니다.
필요한 재료는 아래와 같은데 이전에 소개했던 자동으로 식물에 물을 공급하는 장치와 거의 유사합니다.
아두이노 나노
DRV8883 듀얼 모터 드라이버
미니 DC 펌프 x 2 (양액 공급용, 공기 펌프용)
수위 측정용 스위치 (물주기에 사용했던 센서는 사용불가... 나중에 설명하겠습니다)
일반적인 리미트 스위치
어항용 공돌 (다이소 500원 짜리)
어항용 호스, 링거 호스
양액통 2개,
싱크대 수채구멍용 거름망
전체적으로 보면 아래와 같은 구조입니다. 배선은 제외한 그림이기는 한데요.
두개의 DC 모터를 컨트롤 하기 위한 모터 드라이버와 아두이노 나노, 중간에 수량 체크를 위한 스위치 (탁구공의 부력을 이용합니다) 그리고 각각의 식물의 재배를 위한 pot (하수구 거름망), 두개의 양액 통이죠.
스위치에 의하여 상단 박스의 수량이 부족하면 계속해서 우측 펌프가 물을 끌어 올릴 겁니다. 물이 차오르고 필요한 높이가 되면 탁구공을 매단 수량 체크용 스위치가 신호를 보낼것이고 해당 신호를 받아 필요한 양이 보충되게 되면 양액 공급펌프는 멈출것입니다.
좌측의 에어 공급 펌프는 계속해서 상단 양액내 공기를 뿜어 넣음으로써 산소량을 높이는 역할을 하게 됩니다.
반응형
이론적으로는 간단하죠?
네 실제로 간단 합니다. 아래와 같은 형태로 제작이 되었다고 보시면 됩니다.
중간에 CDS 로 보이는 부품은 네.. CDS 가 맞습니다. CDS가 필요한 이유는 뒤에 설명을 드리도록 하겠습니다.
프로토 타입으로 제작한 이미지를 보시죠
탁구공의 부력이 스위치를 작동시키이에 약간 부족함이 있어 날개 길이를 조금 연장하였습니다.
통에 양액을 채우고 모종도 pot 에 옮겨 담아 준뒤 시스템을 가동하였습니다.
물과 공기가 예상데로 잘 공급이 되는 것을 확인하였으나 모터 구동시 소음이 좀 있는 편이고 에어의 경우 하루종일 동작하게 되어 있어 모터에 열이 좀 나는 것이 문제가 될 것 같았습니다. 워터 쪽 모터도 물을 끌어올려야하는 상황이다보니 부하가 걸려 모터에서 열이 많이 발생되었습니다.
나중에 브래드보드 대신 만능기판에 보드를 옮길 계획인데 해당 작업이 완료되면 별도의 포스팅을 진행할 예정입니다.
그리고 위에 잠깐 소음에 대하여 언급을 했었는데요. 아무래도 사무실에서 키우는 것이다 보니 소음으로 인한 민원이 바로 올라오더군요. 시끄럽다고 꺼달라고 하더라구요. - -;;
그래서 긴급 조치로 CDS 를 하나 달아서 사무실 조명이 모두 꺼지면 동작하도록 간단한 기능을 추가하였습니다. 이제 아무도 없는 밤에 열심히 산소를 공급해주게 될겁니다.
앞으로 진행할 내용은 아래와 같습니다.
만능기판에 기자재 납땜으로 부착
현재 상태는 보기에 좋지 않으므로 케이스를 제작
식물이 자라는것을 타임랩스로 보여주기 위한 카메라 장착 (안쓰는 블랙박스 활용)
준비가 되면 포스팅을 하도록 하겠습니다.
아두이노 소스코드는 아래를 참고해 주세요.
const int waterLevelCheckerSW = 2;
const int airPumpSpeedControlPin = A3;
const int motor_waterpump = 9; // pin 9 (D9) is waterpump action
const int motor_airpump = 10; // pin 10 (D10) is waterpump action
const int lightSensor_pin = A4;
int airPumpSpeed = 0;
int buttonState = 0;
int count = 0;
int lightTotal = 0;
void setup() {
pinMode(13, OUTPUT); // status LED
pinMode(motor_waterpump, OUTPUT); // water pump pin
pinMode(motor_airpump, OUTPUT); // air pump pin
pinMode(waterLevelCheckerSW, INPUT_PULLUP); // water level checker switch pin
Serial.begin(9600);
}
void loop() {
count++;
//air pump speed control
airPumpSpeed = analogRead(airPumpSpeedControlPin); //
int pumpSpeed = map(airPumpSpeed, 0, 1023, 0, 128);
int lightValue = analogRead(lightSensor_pin);
lightTotal += lightValue;
if (count == 10)
{
// the air pump run when dark
if (lightTotal/10 < 1 )
{
analogWrite(motor_airpump, pumpSpeed);
}else{
analogWrite(motor_airpump, 0);
}
lightTotal = 0;
count = 0;
}
Serial.print(airPumpSpeed);
Serial.print("/");
Serial.print(pumpSpeed);
Serial.print("///");
Serial.println(lightValue);
// water pump control
buttonState = digitalRead(waterLevelCheckerSW);
if (buttonState == HIGH )
{
digitalWrite(13, LOW); // turn the LED off by making the voltage LOW
// stop water pumping
digitalWrite(motor_waterpump, LOW);
}
else
{
digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)
// start water pumping when dark
if (lightValue < 2 )
{
analogWrite(motor_waterpump, 128);
}
}
delay(10); // wait for a second
}
끝으로 수위 측정 센서관련하여
참고로 물주기에 사용하였던 수분 측정 센서(알리익스프레스에서 구입)의 경우 양극단에서 흐르는 전류에 의해 물의 전기분해가 이루어 진 탓인지 센서 표면에 수많은 기포가 발생되었습니다.
결국 센서 표면중 한쪽면이 심하게 부식이 되며 양액을 변질 시키는 것을 보고 사용할 수 없겠다 판단 하였습니다.
결국 수위 측정은 위 사진에서 보여드린 탁구공을 이용하는 방법을 사용해야 했습니다.
토양의 수분 측정시에도 유사한 현상이 있어 결국 센서를 빼버렸었는데요. 해당 센서를 사용한다면 측정 주기를 매우 길게 하고 측정 시간을 짧게 여러번 하여 결과값을 사용하는 방식을 이용하는 것이 좋을 것으로 판단됩니다. 해당 센서를 이용하여 토양의 수분을 측정하려는 목적이시라면 연속해서 측정을 진행하지 마시고 일정 주기를 두고 실제 측정 시간은 짧게 측정을 하는 것이 센서의 수명에 도움이 될것으로 생각됩니다. 참고하세요~
뎃글, 공감 은 블로그 작성자에게 큰 힘이 된답니다. 도움이 되었다 생각되시면클릭!! 부탁드려요~
참고로 이전에 사용하였던 해당 센서를 이용한 토양 수분 측정을 통한 자동으로 물주는 시스템 관련 포스트
어떤 엑셀 페이지에 늘 사용하는 스크립트를 작성하였으나 매번 실행하기 위하여 vba 창을 눌러 F5를 누르는 것은 사실 본인이 직접 스크립트 코드를 개발하는 입장이라면 조금도 번거로울 것이 없는 것이지만 누군가에게 스크립트를 작성하여 엑셀 파일을 건내 주는 경우라면, 실제 사용하는 사람이 개발과 거리가 있는 사람이라면 더더욱 이와 같은 방법으로 스크립트를 실행시키는 것은 불편한 방법이 됩니다.
게다가 스크립트가 딱 하나가 아니고 어떤 스크립트는 정렬을 해주고, 어떤 스크립트는 불필요한 값을 숨겨주고, 또 어떤 스크립트는 데이터를 새로 읽어 들여 전체 시트를 리프레쉬 하는 등의 여러개의 기능을 개발한 상태라면 vba 창에서 실제 해당 스크립트 위치에 마우스 커서를 가져다 놓는 등의 추가 행위가 필요합니다.
이럴때 버튼을 이용하여 특정 스크립트 (엑셀에서는 매크로라고 합니다) 를 연결하게 되면 지정된 버튼을 누를때 마다 필요한 스크립트가 동작하게 됩니다.
말하자면 간단한 툴이 만들어 지는 것이죠.
사실 엑셀의 각 셀은 함수나 계산식을 포함할 수 있으므로 왠만한 복잡한 것들은 워크시트의 함수와 계산식으로 처리가 가능하지만 이미지를 불러온다거나 어떤 데이터의 속성을 알아내거나 약간은 복잡한 관계의 셀 값들을 이용하여 결과값을 얻는다든가 하는 등의 일은 워크시트 함수로는 조금 어려운 부분이 있습니다. 그래서 매크로 스크립트를 작성하는 것이죠. 이런 기능기능이 모여 마치 어떤 툴처럼 제작이 가능합니다.
영업사원들에게는 견적서 프로그램을 만드는 것이 가능할 것이고 세무, 회계부서에서는 각종 세금 관계 계산을 위한 처리가 가능할것입니다.
오늘은 그렇게 만들어진 스크립트 들을 버튼을 이용하여 동작하도록 하는 방법을 소개해 드릴까 합니다.
먼저 제가 초등학교 저학년 학생들을 위한 간단한 덧셈 연산을 자동으로 생성하는 엑셀파일을 만든적이 있습니다.
해당 파일을 보면 아래와 같은 화면을 볼 수 있는데요. 우측의 버튼을 누를 때 마다 버튼의 텍스트에 해당하는 기능으로 좌측 값이 자동으로 생성이 됩니다. 위 링크된 페이지에 가면 실제 엑셀 파일을 받으실 수 있으니 해당 파일을 받으셔서 참고해보셔도 좋을 것 같습니다.
우선 단추(버튼)르르 이용한 동작을 확인할 간단한 스크립트를 작성해 보겠습니다.
첫번째 스크립트로 셀 A1~C1 번에 숫자 1, 2, 3 을 넣어 보겠습니다.
만약 이미 숫자가 들어있다면 현재 들어있는 숫자에 각각 1, 2, 3을 더하도록 해보죠.
두번째 스크립트는 A2 ~ C2 에 A1 + A1, B1 + B1, C1 + C1 까지의 값을 넣는 동작을
세번째 스크립트는 A3 ~ C3 에 A1 * A2, B1 * B2, C1 * C2 의 값을 넣는 동작을
네번째 스크립트는 A4 ~ C4 에 C1 ~ C3 의 값을 이용하여 셀의 색상을 채워 넣어 보겠습니다.
컬러를 지정하기 위한 숫자는 RGB 로 각각 0~255만 가능하므로 255 보다 크면 255로 설정 하겠습니다.
그리고 255보다 값이 커진다면 첫번째 행의 값을 낮은 값으로 바꾸어 보겠습니다.
스크립트를 작성해 보겠습니다.
먼저 엑셀을 열고 VBA 창 (alt + F11) 을 실행한 뒤 아래와 같이 입력해 보겠습니다.
Sub function_a()
'cells(rowIndex, columnIndex) 와 같은 형식으로 셀을 지정하는 방법'
If Len(Cells(1, 1)) Then
Cells(1, 1).Value = Cells(1, 1).Value + 1
Else
Cells(1, 1).Value = 1
End If
If Len(Cells(1, 2)) Then
Cells(1, 2).Value = Cells(1, 2).Value + 2
Else
Cells(1, 2).Value = 2
End If
If Len(Cells(1, 3)) Then
Cells(1, 3).Value = Cells(1, 3).Value + 3
Else
Cells(1, 3).Value = 3
End If
End Sub
Sub function_b()
' Range(name) 의 형태로 셀을 지정하는 방법'
Range("A2").Value = Range("A1").Value * 2
Range("B2").Value = Range("B1").Value * 2
Range("C2").Value = Range("C1").Value * 2
End Sub
Sub function_c()
' range 라는 변수를 설정하여 정의하는 방법'
Dim a3, b3, c3
Set a3 = Range("A3")
Set b3 = Range("B3")
Set c3 = Range("C3")
a3.Value = a3.Offset(-2, 0).Value * a3.Offset(-1, 0).Value
b3.Value = b3.Offset(-2, 0).Value * b3.Offset(-1, 0).Value
c3.Value = c3.Offset(-2, 0).Value * c3.Offset(-1, 0).Value
End Sub
Sub function_d()
Dim a3, b3, c3, rngAll
Set a3 = Range("A3")
Set b3 = Range("B3")
Set c3 = Range("C3")
Set rngAll = Range("A4", "C4")
If a3.Value > 255 Then
a3.Value = 255
a3.Offset(-2, 0).Value = 1
End If
If b3.Value > 255 Then
b3.Value = 255
b3.Offset(-2, 0).Value = 2
End If
If c3.Value > 255 Then
c3.Value = 255
c3.Offset(-2, 0).Value = 3
End If
rngAll.Interior.Color = RGB(a3.Value, b3.Value, c3.Value)
End Sub
Sub ~ End Sub 까지가 하나의 매크로 스크립트가 되겠습니다. 총 4개의 스크립트가 작성이 되었는데요. 내용은 위에서 기술한 내용데로 작성하였으며 각각의 스크립트에는 셀을 지정하는 방법을 달리하여 작성해 보았습니다. 여러분들도 직접 타이핑 해보시면서 어떤방법으로 셀을 지정하는 것이 편리한지 경험해보시는 것이 도움이 되실 것 같습니다.
끝으로 rngAll 이라는 Range 개체를 만들었는요 현재 시트의 4번째 행의 A~C 열을 한꺼번에 설정해주었습니다. 그리고 한꺼번에 해당 셀의 색상을 변경을 하는 코드를 넣어 봤습니다.
자 스크립트를 모두 작성하였으면 이제 단추를 만들어 보아야 겠죠?
그런데 엑셀의 기본 기능 중에는 단추가 보이지 않습니다. 리본 메뉴가 만들어 지면서 사용하지 않는 기능들은 꺼내져 있지 않기 때문인데요. 사용하기 위하여 꺼내 보겠습니다. 처음 한번만 하시면 됩니다.
파일 메뉴로 가셔서 아래와 같은 창이 나오면 제일 아래 옵션을 선택합니다.
그럼 옵션창이 팝업으로 뜨게 됩니다.
팝업으로 뜬 창에서 '리본 사용자 지정' 텝으로 이동해보면 아래와 같이 아주 많은 기능이 나열된 것을 볼 수 있습니다.
위 그림에서 좌측은 엑셀이 가지고 있는 모든 기능을 보여주고 있고 우측은 현재 사용자의 리본메뉴에 추가되어 있는 기능들이라고 생각하시면 되겠습니다.
아래 1번의 드롭다운 메뉴에 리본에 없는 메뉴를 선택하신 뒤 리스트에서 2번 '단추(양식컨트롤)' 이 바로 우리가 필요한 단추를 넣는 기능입니다. 단추라고 하면 좀 이상한데요, 익숙한 용어로는 버튼입니다. 버튼.
우측은 해당 기능을 넣을 리본 메뉴라고 했는데요, 저는 삽입 이라는 탭에 넣을 계획 입니다. 이미 있는 그룹에 넣는 것은 불가능하고 새로운 그룹을 만들어서 넣어야 하기 때문에 3번 삽입 을 선택하여 메뉴를 확장 시킨 뒤 아래 '새 그룹' 이라는 버튼을 이용하여 새로운 그룹을 추가해 줍니다.
새로 추가한 그룹의 이름을 바꾸어 볼 차례 입니다. 저는 제 블로그 이름인 "DIY_DEV_DESIGN" 라고 변경하였습니다. 아래 이름 바꾸기라는 버튼을 이용하여 변경하시면 됩니다.
이제 단추를 선택한뒤 가운데에 있는 "추가>>" 를 이용하여 방금 만든 그룹에 추가를 해 보겠습니다.
자 이제 단추를 추가하는 기능은 완료가 되었습니다. 확인 버튼을 눌러 옵션 창을 닫고 엑셀의 리본메뉴를 살펴보면 아래와 같이 단추가 추가되어 있을 것입니다.
이제 해당 버튼을 누르게 되면 엑셀 시트에 단추를 만들수 있게 됩니다.
만드는 방법은 아래와 같습니다.
단추 버튼을 누른다
원하는 위치에 마우스를 클릭한뒤 드래그 하여 필요한 크기가 되면 마우스 버튼을 뗀다
팝업으로 나오는 매크로 선택창에서 아까 만들어둔 스크립트를 선택해 준다.
이미 만들어진 단추의 크기나 위치, 레이블을 수정하기 위하여는 마우스 우클릭으로 선택해주면 됩니다.
총 4개의 스크립트를 연결할 것이므로 4개의 스크립트를 차례로 연결해 보겠습니다
이제 위의 버튼부터 차례로 눌러 볼까요?
네 잘 동작되네요.
만약 스크립트를 수정해야 하면 해당 버튼을 마우스 우클릭한 뒤 "매크로 지정" 기능으로 이동하여 설정되어 있는 매크로를 다른 메뉴로 변경하거나 선택되어 있는 매크로에서 "편집" 버튼을 눌러주게 되면 해당 매크로 스크립트를 바로 편집할 수 있는 비주얼 베이직에디터가 나타나게 됩니다.
자 이렇게 해서 엑셀에 버튼을 추가하고 스크립트를 연결하는 방법을 알아 보았습니다.
설정창에서 단추 기능을 꺼내는 단계부터 처음하시는 분은 조금 복잡하다고 생각하실 수도 있겠는데요. 막상 해보시면 정말 간단한 작업이고 어렵지 않습니다.
순서가 뒤죽박죽이 되었죠? 제일 왼쪽이 가장 밝은 픽셀, 오른쪽이 어두운 픽셀에 매칭될 문자 입니다.
총 85개의 숫자인데요. 이미지의 픽섹의 밝기값을 0 ~ 100 사이의 밝기값으로 구한 뒤 x0.85 를 해주면 85 단계 정도로 리스케일이 됩니다. 그런 다음 각각의 리스케일 된 밝기를 저 글자의 해당 되는 위치의 글자로 표현해 주면 되는겁니다.
그럼 이미지를 준비해 볼까요?
네. 유명한 영화 매트릭스의 주인공인 네오 포스터 입니다.
이제 코드를 짜보겠습니다. 주석을 달아 놓았으니 한줄 한줄 따라 적어 보시면서 읽어 보시면 됩니다.
코딩이 익숙치 않은 분은 좀 어려울 수도 있겠는데요. 기본적으로 for 를 이용한 반복 문이나 배열의 내용을 넣고 꺼내는 등의 기본적인 코딩이 가능하시면 크게 어려울 것은 없습니다.
var lset = ".-':,;>^!~Lci/*1l?zC+±tsr2=JIT}[x75FvZ3eSYEfukjnayKoPXV9h6qdRp4bAG$8wDUO&%#Bg0mHQMWN@@"
var cDoc = app.activeDocument
cDoc.colorSamplers.removeAll();
//현재 다큐먼트를 복제
dDoc = cDoc.duplicate();
var pointSample = dDoc.colorSamplers.add([1,1]);
// 이미지의 가로 사이즈를 정해준다.
var imageWidth = 24;
// 이미지의 세로사이즈는 가로사이즈에 맞추어 비율에 맞게 자동으로 구한다.
var imageHeight = Math.floor(dDoc.height * (imageWidth / dDoc.width));
// 이미지를 리사이즈 한다.
dDoc.resizeImage(imageWidth, imageHeight);
// 흑백으로 전환. 모드가 변경되는 것은 아니고 컬러만 흑백으로 변경하게 된다.
dDoc.layers[0].desaturate()
//밝기가 저장될 배열을 생성
var brightArray = [];
// 이미지의 모든 필셀의 밝기를 배열에 저장함
for (var yy = 0; yy < imageHeight ; yy++)
{
for (var xx = 0; xx < imageWidth; xx ++)
{
pointSample.move([xx,yy]);
brightArray.push(Math.floor(85 - pointSample.color.hsb.brightness * 0.85))
}
}
// 글자를 10pt 로 표시할 것이므로 이미지의 가로 세로 픽셀 수 x 10 한 만큼의 크기로 리사이즈를 한다.
dDoc.resizeImage(imageWidth * 10, imageHeight * 10, 72, ResampleMethod.NEARESTNEIGHBOR);
//이전의 유닛 단위를 미리 저장해 놓는다.
var rulerUnits = app.preferences.rulerUnits;
// 유닛을 포인트로 변경한다.
app.preferences.rulerUnits = Units.POINTS;
// 레이어를 하나 만들어 준뒤 텍스트 레이어로 정해준다.
var aLyr = dDoc.artLayers.add();
aLyr.kind = LayerKind.TEXT;
aLyr.name = "myTxt";
var cTxtItem = dDoc.artLayers["myTxt"].textItem;
cTxtItem.font = "Consolas";
cTxtItem.useAutoLeading = false
cTxtItem.size = 10;
cTxtItem.leading = 10.0;
cTxtItem.tracking = 445; // 몇차례 테스트 후 얻어진 값
cTxtItem.position = [0,0];
var cid = 0;
var ct = "";
for (var yy = 0; yy < imageHeight ; yy++)
{
for (var xx = 0; xx < imageWidth; xx ++)
{
ct += lset.charAt(brightArray[cid]); // 저장된 배열의 값에 해당되는 글자를 가져옴
cid++;
}
ct += "\r"; // 가로행이 끝나면 리턴을 입력하여 줄바꿈을 해준다.
}
cTxtItem.contents = ct; // 텍스트 아이템의 내용을 수집한 문자열로 입력한다.
cTxtItem.leading = 10.0;
//저장해 두었던 유닛으로 설정을 되돌린다.
app.preferences.rulerUnits = rulerUnits;
pointSample.remove();
이렇게 하고 실행을 해보면 글자로 만들어진 그림이 표시됩니다.
이렇게요.
가로를 32px 로 하면 아래와 같이 됩니다.
코드의 imageWidth 의 값을 변경하면 그에 해당하는 디테일의 이미지가 만들어 집니다. 24px 에 비하여 32px의 이미지가 좀더 디테일한 것을 알 수 있습니다. 다만 포토샵의 colorSampler 가 색상을 취득하는 과정이 매우 속도가 느려서 좀 큰 해상도로 하게 되면 상당히 오래 걸려야 표시가 되더군요.
아무래도 포토샵이 실시간으로 이미지를 프로세싱하기에는 역부족인 듯 합니다만 포토샵 스크립트로도 이런 작업이 가능하구나 정도로 이해하시면 좋을 것 같습니다.
참고로 이런류의 작업을 아주 빠르게 수행할 수 있는 툴도 있습니다. cycling74 라는 회사의 MAX 라는 툴이고요. JITTER 라는 툴이 MAX 와 함께 설치되면 영상 처리를 아주 빠른 속도로 할 수 있습니다. 실시간 영상도 위와 같이 표현이 가능할 정도로요. 포토샵에서도 이런게 되는구나 정도로 보시면 될 것 같습니다.
이렇게 만들어진 텍스트 이미지를 이용하여 제 휴대폰 배경화면을 하나 만들어 봤습니다.
좀 더 매트릭스의 텍스트 이펙트가 살아있는 배경화면은 아래 페이지에서 다운 로드 받으세요~