계속해서 아두이노(Arduino) 스케치를 이용하여 프로그램을 코딩할 때 사용하는 명령어에 대해 알아보고 있는데요, 처음 아두이노를 시작할 때 접했던 생소한 느낌보다는 조금은 익숙해지고 있을 거라 생각됩니다. 익숙해지려면 계속 사용하고 적용하는 방법이 제일 빠르더라고요 ^^ 그럼 오늘도 지난번 포스팅에 이어 프로그램을 코딩할 때 유용한 몇 가지 명령어를 알아보겠습니다.
지난번 알아보았던 pinMode, digitalWrite, if 명령어들은 아래 링크 걸어놓을 테니 참고 부탁드립니다.
명령어 | 기능 | 사용법 |
Serial.read | 시리얼 통신으로 수신된 데이터를 읽음 | 변수 = Serial.read(); |
millis | 시간 카운팅 | 변수 = millis(); |
char | 문자형 값을 처리하기 위한 변수 설정 | char 변수; |
1. Serial.read( );
아두이노 Serial.read() 함수는 아두이노가 수신한 데이터를 읽어오는데 사용하는 명령어입니다. 보통 시리얼 통신을 통해 아두이노로 데이터를 송신할 수 있고, 가장 쉽게 시리얼 모니터에서 입력한 text를 아두이노가 수신할 수 있습니다. Serial.read() 명령어를 사용하여 호출 시 1바이트씩만 읽어오며 유효한 데이터가 있을 때까지 반복됩니다.
아래와 같이 코드를 입력하고 시리얼 모니터를 실행해 보겠습니다. void setup에서 Serial.begin에 통신속도 9600으로 설정하고, void loop에는 다른 명령어를 설정하지 않았습니다.
void setup(){
Serial.begin(9600);
}
void serialEvent(){
char Input;
Input = Serial.read();
Serial.println(Input);
}
void loop(){
}
void serialEvent 안에 Input이라고 char 변수를 설정하고 Input에 시리얼 통신으로 수신된 데이터를 Serial.read()로 읽어 Serial.println 명령어로 Input을 출력하라고 프로그래밍하였습니다. serialEvent는 시리얼통신에 대해서 우선적으로 응답할 때 사용하는데, 명령어가 loop 안에 있지 않아도 시리얼 통신으로 데이터가 수신되거나 하면 자동으로 호출되어 명령어를 실행합니다. 자세한 내용은 다음에 다루도록 하겠습니다.
스케치를 통해 아두이노로 업로드 후 시리얼 모니터를 실행시켜 상단 입력창에 text를 입력하면 아래와 같이 입력한 문자의 1바이트씩 출력되는 것을 확인할 수 있습니다. 차례로 a, ok, IT-G-House를 입력하였습니다.
2. millis( );
아두이노를 사용하다 보면 타이머나 시간을 설정하는 경우가 있습니다. millis() 명령어는 millisecond (1/1000) 초를 말하며, 아두이노가 동작한 시점으로부터 millisecond 단위로 나타내어 줍니다. 시간을 잴 수 있는 최대 값은 약 49.7일이며, 이 시간이 지나면 0부터 다시 시작합니다.
아쉬운 점은 아두이노가 시작하는 시점부터 시간을 잰다는 거라서 간혹 중간에 전원 공급이 끊긴다거나 어떠한 사정으로 리셋되면 아두이노가 재시작되면서 0부터 시작하는 큰 단점과 실제 시각과 맞추기 어렵다는 점입니다. 인터넷이 된다면 실시간과 맞춰 시간을 설정할 수 있지만 시계열 동작이나 측정이 필요한 경우는 보통은 DS1302 RTS 같은 시계 모듈을 사용합니다.
아래와 같이 코드를 입력하고 아두이노에 업로드하면 변수 now에 시간이 기록되고 시리얼 모니터에서 "time: 아두이노가 시작한 후 경과한 시간"을 볼 수 있습니다.
unsigned long now;
void setup(){
Serial.begin(9600);
}
void loop(){
now = millis();
Serial.print("time: ");
Serial.println(now);
}
3. char
char는 character(문자)의 약자로 문자형 변수를 설정할 때 사용합니다. 8비트 정수형 처리 변수로 -128~127까지의 숫자를 취급할 수 있습니다.
char는 if 문이나 조건에서 같다면을 표시하는 '=='을 사용할 수 있지만 String은 사용하더라도 원하는 결과와 달라질 수 있기 때문에 필요에 따라 char 또는 String을 적절하게 사용할 수 있습니다. char 사용 예시는 Serial.read() 예시에서 보셨으니 String 예시와 비교하여 살펴보면 좋을 것 같습니다.
아래와 같이 코드를 입력하고 아두이노에 업로드한 후 시리얼 모니터에 a, ok, IT-G-House를 입력하였습니다.
void setup(){
Serial.begin(9600);
}
void serialEvent(){
String Input;
Input = Serial.readString();
Serial.println(Input);
}
void loop(){
}
char로 변수를 입력했을 때와 다르게 1바이트씩 출력되는 게 아니라 입력한 그대로 출력되는 것을 볼 수 있습니다.
오늘은 아두이노(Arduino) 프로그램 코딩에 필요한 'Serial.read()', 'millis()', 'char'에 대해 알아보았습니다. 이런 명령어를 통해 시간제어를 한다던지 시리얼 통신으로 수신된 데이터를 신호를 통해 제어를 하는 등의 프로그램을 코딩할 수 있습니다. 최근 진행 중인 실내 식물 재배기 프로젝트를 예시로 응용 부분에서 더 자세하게 다루어 보겠습니다.
다음번 포스팅에도 더 쓰임이 좋은 명령어를 소개드리겠습니다.
긴 글 읽어 주셔서 감사합니다. 질문이나 추가적으로 필요하신 내용 있으면 언제든지 댓글로 남겨주세요~ ^^
'아두이노 (Arduino) > 프로그램 코딩 (Coding)' 카테고리의 다른 글
아두이노(Arduino) 프로그램 코딩 초급 (pinMode, digitalWrite, if 명령어) (0) | 2019.11.01 |
---|---|
Arduino (아두이노) 스케치 프로그램 코딩 입문 (0) | 2019.10.23 |
아두이노(Arduino) 응용, 적외선 FIR센서를 이용한 무드등 만들기
아두이노(Arduino)를 이용한 홈 IoT (생활응용)에 적용하는 시간으로 적외선 FIR센서를 이용하여 무드등을 만들어보겠습니다. 최근 집에 머무르는 시간이 길어지면서 인테리어에 많은 관심이 생겼는데요 ^^ 저는 침대 밑이나 등받이 쪽에 불이들어오는 무드등을 꾸며보고 싶더라고요 ㅎㅎ
적외선 FIR 센서와 RGB LED 스트랩을 사진처럼 이렇게 분위기 있는 침대를 만들 수 있습니다. 적외선 FIR 센서 사용방법은 지난 포스팅에서 소개해 드렸으니 아래 링크 참조 부탁드립니다.
1. 준비물
1) 아두이노 우노 R3 (Arduino UNO R3)
프로젝트가 간단해서 우노 R3 제품으로 충분한데 혹시 나노(Nano)를 보유하신 분은 나노가 더 적합한 거 같습니다.
▼ 아두이노 UNO R3 사러가기!! ▼
2) HC-SR501 적외선 FIR 센서
온라인에서 '적외선 센서'를 검색하면 아두이노에서 자주 사용되고 쉽게 사용할 수 있는 HC-SR501 적외선 PIR 센서 모듈입니다.
3) RGB LED 스트랩
주요 준비물인 LED 입니다. 저는 RGB 세 색상을 모두 낼 수 있는 LED PKG가 실장되어 있는 띠형태의 스트립(strip)을 사용할 생각입니다.
프로그램 코딩을 통해서 R(빨강), G(녹색), B(파랑)을 조절가능하고, 아두이노에서 사용하기 쉽게 5V 구동하는 LED 스트립 전등입니다.
2. 아두이노 배선
배선은 적외선 FIR센서와 LED 스트립이 둘다 5V 구동이기 때문에 아두이노 5V 에 같이 연결해 줍니다. 그리고 GND는 GND끼리, 적외선 FIR센서의 signal은 아두이노의 Digital 3pin에 LED의 Din는 4pin에 각각 연결합니다.
3. 동작 알고리즘
동작 알고리즘은 간단합니다. 적외선 센서가 동작을 감지하면 LED에 불이들어오고, 동작 감지가 끝나면 불이 꺼지게 또는 다른 색의 불이 들어오게 할 수 있습니다.
4. 아두이노 프로그램 코딩
#include <Adafruit_NeoPixel.h>
#define PIN 4
#define NUMPIXELS 18 // 제어하고 싶은 LED 개수
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int delayval = 5; // delay for half a second
int inputPIN = 3;
int FIRstatus = 0;
int Readinput = 0;
void setup() {
pinMode(inputPIN, INPUT);
Serial.begin(9600);
pixels.begin(); // This initializes the NeoPixel library.
}
void loop(){
Readinput = digitalRead(inputPIN);
if(Readinput == 1 && FIRstatus == 0){
Serial.println("Action!");
FIRstatus = 1;
for(int i=0;i<NUMPIXELS;i++){
// pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
pixels.setPixelColor(i, pixels.Color(0,0,50)); // Moderately bright green color.
pixels.show(); // This sends the updated pixel color to the hardware.
delay(delayval); // Delay for a period of time (in milliseconds).
}
}
if(Readinput == 0 && FIRstatus == 1){
Serial.println("End!");
FIRstatus = 0;
for(int i=0;i<NUMPIXELS;i++){
// pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
pixels.setPixelColor(i, pixels.Color(0,0,0)); // Moderately bright green color.
pixels.show(); // This sends the updated pixel color to the hardware.
delay(delayval); // Delay for a period of time (in milliseconds).
}
}
delay(1000);
}
오늘은 아두이노(Arduino)를 이용하여 센서 무드등을 만들어 보았습니다. 지난 포스팅에서 소개드린 적외선 FIR 센서 (HC-SR501)를 사용하여 동작 감지에 따라 RGB 삼색 LED 스트립을 켜고 끄고 하여 홈IoT 인테리어 조명으로 만들었습니다.
센서와 LED만 있으면 되니 아마도 다들 쉽게 만들 수 있을거라고 생각합니다. ^^
긴 글 읽어주셔서 감사합니다~
'아두이노 응용 > 생활응용 (홈 IoT)' 카테고리의 다른 글
아두이노(Arduino)를 이용한 센서(Sensor) 작동 자동 선풍기 만들기 (14) | 2020.06.18 |
---|
Arduino 아두이노 적외선 FIR 센서(HC-SR501) 사용하는 방법
아두이노(Arduino)에서 자주 사용하는 센서 및 모듈을 소개하는 시간으로 오늘은 적외선 센서에 대해 알아보겠습니다. 적외선 PIR (Passive Infrared Sensor) 센서는 외부에서 발생하는 적외선을 감지하는 센서입니다. 여기서 Passive가 붙은 이유는 센서가 수동적으로 주변의 적외선을 detecting하여 주변을 감지하기 때문입니다. 이와 반대로 센서에서 적외선을 방출하여 주변을 감지하는 적외선 센서도 있습니다.
지난 포스팅에서 초음파 센서 HC-SR04를 이용하여 사람의 동작을 감지할 수 있는 것을 살펴보았는데요. 초음파 센서에 비해 적외선 PIR 센서가 view angle이 더 넓습니다. 즉, 주변을 감지할 수 있는 범위가 더 넓은데, 이는 초음파 센서는 센서에서 초음파가 발생하여 물체에 반사되어 다시 센서가 detecting하기까지 경로가 있기 때문에 적외선 센서에 비해 좁은 영역을 감지할 수밖에 없습니다.
1. 적외선 PIR (Passive InfraRed) 센서 HC-SR501
아두이노에서 자주 사용되고 온라인에서 쉽게 구할 수 있는 HC-SR501 적외선 PIR 센서 모듈입니다. 가격도 저렴한 편인데 사용하기도 편하고 생각보다 많은 설정이 가능해서 널리 사용되는 듯 합니다. 오늘 예시는 이 HC-SR501 모듈로 진행하겠습니다.
동작전압 (Operating voltage) | 5~12VDC |
출력전압 (Output voltage) | 0 V (Low) / 3.3V (High) |
감지각도 (View angle) | 110~120도 |
설정 기능 (Setting option) | 감도(거리), 지연시간, 신호방식 |
설정 기능은 아래 사진에서 볼 수 있듯이 돌릴 수 있는 나사 두개와 접선을 해주는 점퍼대로 여러 가지 조절이 가능합니다.
감도(거리, Distance) 조절 : 시계방향으로 돌리면 감도가 낮아져 적외선을 sensing할 수 있는 거리가 줄어듭니다.
지연시간 (Delay Time) 조절 : 적외선 감지후 감지된 신호(High)를 얼마간 유지할지 조절이 가능합니다. 시계방향으로 돌릴수록 신호를 유지하고 있는 시간이 짧아집니다.
신호방식 조절 : 좌측의 점퍼대를 옮겨 연결하면 감지신호를 한번만 보내주는 모드이고, 다른 모드는 감지신호를 계속해서 보내 주는 모드입니다.
▶ 적외선 센서 사러가기 smartstore.naver.com/storeplant/products/5347527847
2. 아두이노 (Arduino) 적외선 PIR (Passive InfraRed) 센서 배선
3. 아두이노 (Arduino) 프로그램 코딩
int inputPIN = 3;
int PIRstatus = 0;
int Readinput = 0;
void setup() {
pinMode(inputPIN, INPUT);
Serial.begin(9600);
}
void loop(){
Readinput = digitalRead(inputPIN);
if(Readinput == 1 && PIRstatus == 0){
Serial.println("Action!");
PIRstatus = 1;
}
if(Readinput == 0 && PIRstatus == 1){
Serial.println("End!");
PIRstatus = 0;
}
delay(1000);
}
pinMode와 if 명령어를 사용하여 프로그램을 코딩합니다. 센서가 적외선을 감지(사람을 인지)하면 연결된 digital 3번 pin으로 High 신호를 보내고 아두이노가 신호를 읽어 시리얼 모니터에 "Action"이라고 메시지를 보냅니다. 사람이 지나가고 적외선 감지가 없으면 센서에 설정해놓은 감지시간이 지나고 아두이노에 Low 신호를 보내 "End" 메시지를 볼 수 있습니다.
pinMode와 if 명령어가 처음이신 분은 아래 링크 참조 부탁드립니다.
이번 포스팅에서는 아두이노(Arduino)에서 많이 사용하는 적외선 PIR 센서에 대해 알아보고 사용방법에 대해 살펴보았습니다. 다음 포스팅에서는 적외선을 응용하여 자동센서등이나 자동문 등을 만들 수 있는 방법에 대해 공부해 보겠습니다.
오늘도 긴 글 읽어주셔서 감사합니다. 궁금하신 부분이나 조언주실 내용은 댓글로 언제든지 남겨주세요 ^^
▽ 적외선 FIR 센서를 이용한 홈 IoT 무드등 만들기 응용편!!
'아두이노 (Arduino) > 아두이노 센서&모듈 (Sensor)' 카테고리의 다른 글
솔레노이드 밸브(Solenoid Valve)를 아두이노로 사용하는 방법 (1) | 2021.01.01 |
---|---|
Arduino 아두이노 광센서, 조도센서(Light sensor) 사용 방법 (0) | 2020.06.11 |
Arduino 아두이노 Wifi ESP8266 쉴드(shield) 모듈 사용방법 (2) | 2020.04.22 |
Arduino 아두이노 멀티플렉서(Multiplexer, MUX) 사용방법 (5) | 2020.04.21 |
아두이노(Arduino)에서 토양수분센서(soil moisture sensor) 사용 (3) | 2020.03.15 |
리눅스(Linux): 우분투(ubuntu) 16.04 환경에서 MySQL 설치 방법
아두이노(Arduino)를 활용하여 홈 IoT (사물인터넷) 프로젝트를 진행하다 보면 서버(Server) 구성의 필요성과 중요성을 느낄 때가 많습니다. 이전 포스팅까지는 아파치(Apache), PHP, MySQL DB(데이터베이스)를 이용하여 간단하게 서버를 구성하는 방법을 알아보았습니다. 또한 APMSetup 같은 프로그램을 이용하여 더 간편하게 가벼운 서버를 구성하기도 하였습니다.
그러나 아두이노를 사용해서 점점 더 복잡한 홈IoT 및 스마트팜 (Smart Farm) 시스템을 구성하고 프로젝트를 기획하다 보면은 서버의 비중이 커지는 것을 느끼고 서버를 잘 구성해야겠다는 생각이 듭니다 (제 이야기입니다..;;). 그래서 개인 컴퓨터가 아닌 Cloud 플랫폼에서 리눅스를 기반으로 서버를 구성하는 방법을 공부해 보도록 하겠습니다.
APMSetup을 이용하여 아파치, PHP, MySQL을 사용한 서버 구성을 알아보실 분은 아래 링크 참조 부탁드립니다.
1. 우분투(Ubuntu)
먼저 리눅스(Linux)가 운영체제(OS, Operating System)라는건 많이 들어보셨을 겁니다. 그중에 우분투(Ubuntu)는 "영국 기업 캐노니컬이 개발, 배포하는 컴퓨터 운영 체제이다. 데비안(Debian) 리눅스를 기반으로 개발되며, 데비안에 비해 사용 편의성에 초점을 맞춘 리눅스 배포판이다."라고 위키백과에서 설명하고 있습니다.
간단하게 사용 편의성에 초점을 맞춘 데비안 리눅스를 기반으로 한 운영체제다 정도로 이해할 수 있습니다. 일반적으로 새 버젼이 6개월마다 공개되는데, 장기지원판이라고 LTS: Long Term Support은 2년에 한 번씩 출시되어 장기간 지원을 하고 있습니다.
우분투 LTS는 현재 20.04가 최신 버젼이고 2020년 4월에 업데이트되어 20.04라고 합니다. 저는 우분투 16.04 LTS를 사용하고 예시도 16.04를 기본으로 보여드리겠습니다.
아래는 우분투 16.04 운영체제 기본 터미널 화면입니다.
운영체제마다 명령어가 조금씩 다른데 이부분은 사용하다 보면 자주 사용하는 명령어가 보통 중복되기 때문에 금방 익숙해질 수 있습니다. (저는 아직 헤매는 중인데요 ㅠㅠ)
먼저 리눅스 배포판 LSB (Linux Standard Base) 버젼을 확인하기 위해 :~$ lsb_release -a 명령어를 실행합니다. 그럼 아래와 같이 사용하고 있는 운영체제의 정보를 알 수 있습니다. 저는 앞에서 언급했듯이 우분투 16.04 LTS를 사용하고 있습니다.
2. MySQL 설치
리눅스(우분투)에서 mysql을 설치하기 위해
:~$ sudo apt-get install mysqp-server
명령어를 실행합니다.
그럼 아래와 같이 install이 실행되고, 중간에 mysql-server-core-5.7이라고 볼 수 있습니다. mysql 버전이 5.7인 것을 알 수 있습니다. 그리고 continue? 물음에 yes를 하면 본격적인 설치 진행이 됩니다. 대략 3~5분? 정도 진행하는 것 같습니다.
설치가 완료되면 아래와 같이 "root" user의 비밀번호를 입력하라고 합니다. 사용할 비밀번호를 설정하는 부분이니 적절한 비밀번호를 입력해 주면 됩니다. 비밀번호를 입력하면 한 번 더 확인하고 설치가 마무리됩니다.
설치가 완료되면 이전 포스팅에서 터미널로 mysql을 실행하는 방법과 같은 명령어로
:~$ mysql -u root -p
실행할 수 있습니다. mysql을 실행하면 앞서 설정했던 비밀번호를 입력하라는 메세지가 나오고 비밀번호를 입력하면 아래 화면과 같이 실행화면 mysql> 옆에 커서가 깜박이고 있는 것을 확인할 수 있습니다.
이전 포스팅에서 window10의 명령 프롬프트에서 mysql을 실행하는 방법과 실행 후 화면이 같은 것을 확인할 수 있습니다. 그럼 데이터베이스(DB, Database)를 생성해 보겠습니다.
3. 데이터베이스(Database) 생성하기
우선 현재 DB를 확인하기 위해 명령어 'show databases;'를 입력하면
기존 생성되어 있는 Database들을 볼 수 있고, 기존 DB들은 어디에 사용되고 있는지 잘 모르니.. 그냥 건드리지 말고~ Test용 데이터베이스를 하나 만들어 보겠습니다.
Database 생성 명령어
> create database "DB이름";
을 아래와 같이 실행하면 됩니다. 여기서 "DB이름"을 저는 test로 명명하였습니다.
명령어를 실행하고 성공적으로 실행되었으면 Query OK란 메시지를 볼 수 있습니다.
그럼 실제로 'test' 데이터베이스가 생성되었는지 다시 show databases; 를 입력하면 아래와 같이 'test'가 새로 생성된 것을 확인할 수 있습니다.
4. Table 만들기
이어서 Table도 생성할 수 있습니다. 명령어는
>create table "table이름"
인데 여기에 데이터의 형태, 컬럼 제목, primary key 등을 사용자의 용도에 맞게 설정하는 항목이 추가로 들어가기 때문에 자세한 내용은 아래 링크 참조 부탁드립니다.
참고로 아래 자주 사용하는 MySQL 명령어를 표로 첨부해 두겠습니다.
- MySQL 명령어
기능 | 명령어 | 사용예 |
시작하기 | mysql -u 'ID' -p 'DB이름' | mysql>mysql -u root -p (DB 최상위단으로 접속시) |
DB 검색 | show databases; | mysql>show databases; |
DB 만들기 | create database 'DB이름'; | mysql>create database Test; |
DB 사용 | use 'DB이름'; | mysql>use Test; |
Table 만들기 | create table 'table이름' |
mysql>create table tempnhumi( ->temp float not null, ->humi float not null, ->primary key(temp) ->); |
Table 검색 | show tables; | mysql>show tables; |
Table 조회 | select*from 'table이름'; | mysql>select*from tempnhumi; |
MySQL 종료 | exit | mysql>exit |
'아두이노 (Arduino) > 홈IoT 서버 (Sever)' 카테고리의 다른 글
아두이노 홈IoT 서버 활용 4: MySQL 데이터 내보내기, 추출 (data export) (5) | 2020.08.27 |
---|---|
아두이노 홈IoT 서버 활용 3: ESP8266(ESP-01) 이용하여 MySQL에 데이터 저장하는 프로그램 코딩 (30) | 2019.12.19 |
아두이노 홈IoT 서버 활용 2: ESP8266(ESP-01) 이용하여 DB서버(MySQL)에 온습도 데이터 저장하기 (45) | 2019.12.03 |
Arduino 아두이노 홈IoT 서버 활용 1: 웹브라우저를 통한 온습도 데이터 DB서버(MySQL)에 저장하기 (7) | 2019.11.30 |
Arduino 아두이노 홈 IoT(사물인터넷)을 위한 서버(Sever) 쉽게 만들기: APMSetup 프로그램 (5) | 2019.11.23 |
솔레노이드 밸브(Solenoid Valve)를 아두이노로 사용하는 방법
스마트팜(Smart Farm) 구축 중 하나인 자동관수 시스템에 자주 사용되는 솔레노이드 밸브(Solenoid Valve)에 대해 알아보겠습니다.
솔레노이드 밸브는 전자밸브 중 하나인데 전기신호를 받아 밸브를 on/off 할 수 있는 밸브를 전자밸브라고 합니다. 다양한 종류의 전자밸브가 있으며 그중에 솔레노이드 밸브는 솔레노이드의 특성을 이용한 밸브장치라고 생각하시면 되며, 솔레노이드 밸브 종류 또한 다양한 종류가 있습니다.
오늘 소개해 드릴 솔레노이드 밸브는 자동관수에 일반적으로 가장 많이 사용하는 형태로 아래와 같이 생긴 솔레노이드 밸브입니다.
위 제품은 관수밸브에서 꽤나 알려진 "버마드(Bermad)"라는 회사의 솔레노이드 밸브로 24VAC에 작동합니다. 솔레노이드 밸브의 구동전압이 다양한 제품들이 시중에서 판매되고 있지만 주로 12VDC 또는 24VAC를 많이 찾아볼 수 있습니다. 따라서 아두이노(Arduino)를 이용하여 솔레노이드 밸브를 작동하려면 12VDC/24VAC 또는 spec.에 맞는 외부전원을 사용해야 합니다. 외부전원을 사용하는 방법은 자동선풍기를 만들었던 방법과 동일하니 아래 링크 참조하시고, 뒤에서 다시 또 설명하도록 하겠습니다.
1. 솔레노이드 밸브(Solenoid Valve) 원리
앞서 설명한데로 솔레노이드 밸브는 솔레노이드 특성을 사용합니다. 다들 아시겠지만 솔레노이드는 긴 원통에 코일을 감아놓은 것입니다. 여기에 전류가 흐르면 자기장이 발생하는 데 그 원리를 이용하여 밸브를 열고 닫고 합니다.
동작 방식을 설명하기 앞서 솔레노이드 밸브 구성은 아래와 같이 빨간 점선 부분의 솔레노이드 부분과 파란색 점선 부분의 밸브로 두 부분으로 나눌 수 있습니다.
아래는 위키피디아에 있는 그림인데 동작 방식을 잘 설명해주고 있습니다. 빨간색 부분의 솔레노이드에 해당하는 부분이 E 부분이며 밸브가 나머지라고 생각하시면 됩니다. 위에 그림이 밸브가 닫혀 있을 때, 아래 그림이 밸브가 열렸을 때(솔레노이드에 전기신호를 주었을 때 = 전류가 흐를 때)입니다.
A- Input side (물의 주입구)
B- 영어로 Diaphragm라고 되어 있는데 실제로 고무 판막입니다.
C- Pressure chamber
D- Pressure relief passage
E- Electro-Mechanical Solenoid (솔레노이드)
F- Output side (물의 출구)
밸브가 닫힌 상태에서 A로 물이 들어오면 B의 고무 판막 중앙에 뚫려있는 작은 구멍을 통해 C에 물이 가득 찹니다. 그래서 F의 출구 쪽 압력과 C의 압력 차이로 인해 밸브가 열리지 않는 상태가 됩니다. 밸브를 열기 위해 E 솔레노이드에 전기신호가 들어가면 E의 검은색으로 막고 있는 부분이 열리고 C의 물이 D쪽 통로로 빠져나가면서 B의 고무 판막이 들리게 되어 밸브가 열리고 A에서 F로 물이 통할 수 있는 길이 열립니다.
2. 12VDC 솔레노이드 밸브(Solenoid Valve)
위에서 설명을 위해 보여드렸던 "버마드" 제품은 비싸기도 하고 구동전력이 24VAC라서 외부전원으로 어댑터(변압기)도 구하기 쉽지 않습니다. 그래서 가격도 저렴하면서 12VDC에 구동하는 제품을 추천드립니다.
3. 솔레노이드 밸브(Solenoid Valve) 아두이노(Arduino) 배선
어댑터 및 변압기의 전선작업을 하실 때는 위험하니 꼭 주의하셔서 진행하시기 바랍니다.
4. Test 프로그램 코딩
배선 후 간단하게 테스트할 수 있는 프로그램 코드 아래 첨부하겠습니다. 3초 동안 on 하고 5초 동안 off 되는 동작을 반복하기 때문에 연결해서 정상 동작하는지 확인 가능합니다.
int Relay = 3;
void setup(){
pinMode(Relay,OUTPUT); // 릴레이를 출력으로 설정
}
void loop(){
digitalWrite(Relay,HIGH); // 릴레이 ON
delay(3000); // 3초동안 ON
digitalWrite(Relay,LOW); // 릴레이 OFF
delay(5000); // 5초동안 OFF
}
오늘은 솔레노이드 밸브(Solenoid Valve)에 대해 알아보고, 아두이노(Arduino)를 이용하여 어떻게 사용하는지 보았습니다. 전자밸브는 꼭 관수뿐만 아니라 가스관이나 유체 등의 밸브에도 많이 사용될 수 있기 때문에 알아두시면 프로젝트를 진행할 때 많은 도움이 되실 겁니다.
이를 응용하여 스마트팜에 토양수분센서를 이용하여 자동으로 관수하는 시스템을 만들어 보겠습니다.
오늘도 긴 글 읽어 주셔서 감사합니다.
'아두이노 (Arduino) > 아두이노 센서&모듈 (Sensor)' 카테고리의 다른 글
Arduino 아두이노 적외선 FIR 센서(HC-SR501) 사용하는 방법 (0) | 2021.01.23 |
---|---|
Arduino 아두이노 광센서, 조도센서(Light sensor) 사용 방법 (0) | 2020.06.11 |
Arduino 아두이노 Wifi ESP8266 쉴드(shield) 모듈 사용방법 (2) | 2020.04.22 |
Arduino 아두이노 멀티플렉서(Multiplexer, MUX) 사용방법 (5) | 2020.04.21 |
아두이노(Arduino)에서 토양수분센서(soil moisture sensor) 사용 (3) | 2020.03.15 |
아두이노 홈IoT 서버 활용 4: MySQL 데이터 내보내기, 추출 (data export)
안녕하세요 IT-G-House입니다. 오랜만에 인사드리네요~
그동안 새로운 환경에 적응하고 준비하느라 포스팅도 못하고 프로젝트 진행도 지지부진했습니다.. 혹시 글을 기다리셨다면.. 죄송합니다 ㅠㅠ
이번 포스팅은 아래와 같이 댓글로 '1234'님과 '최승예'님의 질문에 공통으로 답을 드릴 수 있을 것 같아 답변이 될만한 글을 준비하였습니다.
아두이노(Arduino)와 esp-01 와이파이 모듈(wifi module)을 이용하여 센서의 측정값을 DB (데이터베이스)에 저장하는 것은 앞선 포스팅을 통해 진행해 보셨을 겁니다. 앞선 단계가 필요하시면 아래 링크 참고 부탁드립니다.
프로그램이 원활하게 작동하였으면 APMSetup의 MySQL을 통해 데이터도 저장되는 것을 확인할 수 있었고.. 오케이~ 그럼 저장된 데이터를 가공을 하든 출력을 하든 사용해야겠죠? 데이터를 사용하기 위해서 위에서 질문 주셨듯이 데이터를 가져오는 방법 또는 저장하는 방법, 엑셀로 여는 방법을 알아보겠습니다.
1. MySQL 콘솔 (Select 문)
먼저 MySQL 콘솔을 통해 DB의 table에 저장된 데이터를 불러오거나 파일로 저장하는 방법에 대해 알아보겠습니다. 앞서 진행하였듯이 저는 DB명은 'testdb'이고, table명은 'tempnhumi'입니다. 다들 각자 지정한 이름대로 진행 부탁드리며 MySQL에 대해 추가적인 내용은 아래 링크 참조 부탁드립니다.
MySQL 콘솔을 실행시킨뒤 아래와 같이 DB를 열고 table을 확인합니다.
그리고 'tempnhumi' table에 저장되어 있는 데이터를 select문을 통해 확인합니다.
데이터가 그렇게 많지는 않지만 중간에 생략하고 총 61 rows의 데이터가 저장되어 있습니다.
그럼 '*.txt' 파일로 저장해보겠습니다. 아래와 같이 'select*from' 다음에 'into oufile' 명령어를 통해 원하는 파일 경로에 원하는 파일명으로 저장할 수 있습니다. 저는 파일 경로는 D: 드라이브에 있는 'APM_Setup' 폴더에 'testdata.txt' 파일 이름으로 저장을 실행해보겠습니다.
명령이 정상적으로 진행되었으면 OK 메세지가 나오고 아래와 같이 원하는 파일 경로 안에 txt 파일이 생성된 것을 확인할 수 있습니다.
생각보다 간단합니다. 파일을 열어보면 MySQL 콘솔에서 확인한 데이터를 볼 수 있고, 그대로 엑셀로 파일을 실행시켜도 데이터를 볼 수 있습니다.
- MySQL 명령어
기능 | 명령어 | 사용예 |
시작하기 | mysql -u 'ID' -p 'DB이름' | mysql>mysql -u root -p (DB 최상위단으로 접속시) |
DB 검색 | show databases; | mysql>show databases; |
DB 만들기 | create database 'DB이름'; | mysql>create database Test; |
DB 사용 | use 'DB이름'; | mysql>use Test; |
Table 만들기 | create table 'table이름' |
mysql>create table tempnhumi( ->temp float not null, ->humi float not null, ->primary key(temp) ->); |
Table 검색 | show tables; | mysql>show tables; |
Table 조회 | select*from 'table이름'; | mysql>select*from tempnhumi; |
MySQL 종료 | exit | mysql>exit |
2. MySQL 관리 (phpMyAdmin)
앞선 포스팅에서 APMSetup으로 좀 더 쉽게 홈 IoT(사물인터넷)을 위한 서버를 구축할 수 있었습니다. APMSetup 설치 및 동작에 대한 내용은 아래 링크 참조 부탁드립니다.
'MySQL 관리' 실행을 통해 phpMyAdmin에 접속하면 아래와 같이 UI를 통해 MySQL의 데이터베이스와 그에 속한 테이블을 카테고리 형태로 확인할 수 있습니다. 여기서 상단 메뉴바에서 '내보내기'를 클릭하면 MySQL 콘솔에서 실행하였듯이 원하는 파일 형태로 데이터를 가져올 수 있습니다.
상단의 '내보내기'를 클릭하면 아래와 같이 CSV 또는 엑셀, txt, PDF로 까지 데이터를 파일로 저장할 수 있습니다. 원하는 파일 형태를 선택하고 아래에 있는 파일로 저장을 클릭 후 실행을 하면 테이블 이름의 파일이 생성됩니다.
제가 설정한 테이블명인 tempnhumi이름의 txt 파일이 생성되는 것을 확인할 수 있습니다. 엑셀로 선택하면 '*.xls' 파일, CSV로 선택하면 '*.csv' 형태로 파일이 생성됩니다.
여기까지 아두이노(Arduino)를 이용하여 측정한 센서 data를 eps-01 와이파이 모듈(wifi module)을 통해 서버 DB에 저장한 데이터를 MySQL을 이용하여 다시 불러오는 방법에 대해 알아보았습니다.
'1234'님과 '최승예'님 질문에 답이 되었는지 모르겠네요^^
오늘도 긴 글 읽어주셔서 감사합니다. 궁금한 부분 또는 보충해주실 내용 있으면 언제든지 댓글로 남겨주세요~
'아두이노 (Arduino) > 홈IoT 서버 (Sever)' 카테고리의 다른 글
리눅스(Linux): 우분투(ubuntu) 16.04 환경에서 MySQL 설치 방법 (0) | 2021.01.10 |
---|---|
아두이노 홈IoT 서버 활용 3: ESP8266(ESP-01) 이용하여 MySQL에 데이터 저장하는 프로그램 코딩 (30) | 2019.12.19 |
아두이노 홈IoT 서버 활용 2: ESP8266(ESP-01) 이용하여 DB서버(MySQL)에 온습도 데이터 저장하기 (45) | 2019.12.03 |
Arduino 아두이노 홈IoT 서버 활용 1: 웹브라우저를 통한 온습도 데이터 DB서버(MySQL)에 저장하기 (7) | 2019.11.30 |
Arduino 아두이노 홈 IoT(사물인터넷)을 위한 서버(Sever) 쉽게 만들기: APMSetup 프로그램 (5) | 2019.11.23 |
아두이노(Arduino)를 이용한 센서(Sensor) 작동 자동 선풍기 만들기
아두이노(Arduino)를 이용한 홈 IoT (생활응용)에 적용하는 시간으로 무더운 여름 시즌에 맞춰 자동 선풍기를 만들어보겠습니다. 2020년 여름은 예년보다 특히 더 덥다고 하니 똑똑한 자동 선풍기로 조금이나마 더위를 식혀보자고요 ^^
기획은 진작에 해놓고.. 여름 다 지나가고... 업로드 하게 되었네요 ㅠㅠ 그래도 아직은 8월이니까;; 도움이 되었으면 합니다..
1. 준비물
1) 아두이노 우노 R3 (Arduino UNO R3)
프로젝트가 간단해서 우노 R3 제품으로 충분한데 혹시 나노(Nano)를 보유하신 분은 나노가 더 적합한 거 같습니다.
2) HC-SR04 초음파 센서
온라인에서 '초음파 센서'를 검색하면 아두이노용으로 많이 사용하는 모델인 'HC-SR04' 모듈입니다. 초음파 센서에 관한 자세한 내용은 앞선 포스팅에서 소개해 드렸으니 아래 링크 참조 부탁드리며, 이번 포스팅에서는 넘어가도록 하겠습니다.
3) AM2305 온습도 센서 (Temperature and Humidity sensor)
DHT11와 DHT22에 비해 조금 더 비싸지만 측정오차가 가장 작고 회로를 감싸는 외부 케이스가 있어서 실외에서도 사용하기 좋아 개인적으로 AM2305 모듈을 많이 사용합니다. 이번 프로젝트는 DHT11 모듈으로도 충분하니까 AM2305 모듈이 없으신 분은 DHT11 또는 DHT22 모듈을 사용하시면 됩니다.
▼ 같은 제품 구매하시려면 아래 링크!! ▼
4) DC-DC 승압형 5V 600mA USB 모듈
아두이노 및 외부전력의 5V 전압을 활용하여 USB 구동 전자기기들을 사용할 수 있게 연결해주는 모듈입니다.
5) 릴레이(Relay)
아두이노에서 스위치로 자주 사용되는 릴레이 모듈로 1 채널짜리로 준비하였습니다. 초음파 센서와 온습도 센서의 측정 데이터를 기반으로 설정된 조건에 따라 전원의 스위치를 On/Off 하는 데 사용합니다. 릴레이 사용 방법에 대한 자세한 내용은 아래 링크 걸어두겠습니다 ^^
6) 220V AC-5V DC 어댑터
가정의 220V 교류(AC) 전원을 5V DC로 변환시켜 USB 선풍기로 공급을 위해 어댑터를 준비하였습니다. 릴레이(Relay)와 USB 모듈에 연결시켜 전원공급에 사용됩니다.
2. 아두이노 배선
온습도 센서와 릴레이는 앞서 포스팅한대로 아두이노와 연결하면 됩니다. 릴레이의 VCC와 GND는 아두이노의 5V와 GND pin에 연결하고, IN 단자는 아두이노의 디지털 3번 핀에 연결하였습니다. 온습도 센서의 VCC와 GND는 아두이노의 3.3V와 GND pin에 연결하고, data 선은 디지털 2번 핀에 연결하였습니다. 릴레이 COM 포트에 어댑터의 '+' 선을 연결하고 NO 포트와 USB 모듈의 '+' 부분과 연결합니다. 어댑터의 '-' 선은 USB 모듈의 '-'와 연결하고 USB 선풍기를 USB 모듈에 연결하면 모든 준비가 완료됩니다.
3. 동작 알고리즘
우선 실내 온도를 계속 모니터링 하면서 실내 온도를 기준으로 너무 덥지 않으면 선풍기가 작동하지 않게 설정 온도 이상일 때만 선풍기가 동작하도록 프로그램을 코딩합니다. 그리고 초음파 센서를 이용하여 사람이 가까이 오면 릴레이에 신호를 주어 어댑터를 통해 들어오는 전원이 USB 모듈에서 선풍기로 전달될 수 있게 스위치 ON 상태가 되도록 프로그램을 코딩합니다. 다시 사람이 멀어지거나 실내온도가 설정 온도 이하가 되면 선풍기는 릴레이가 스위치 OFF가 되어 선풍기가 자동으로 꺼지게 설계합니다.
4. 아두이노 프로그램 코딩
#include<dht.h>
dht DHT;
#define DHT21_PIN 2
float hum; //Stores humidity value
float temp; //Stores temperature value
int Relay = 3;
int echo = 8;
int trig = 12;
void setup() {
Serial.begin(9600);
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
pinMode(Relay, OUTPUT);
}
void loop() {
DHT.read21(DHT21_PIN);
hum = DHT.humidity;
temp = DHT.temperature;
float cycletime;
float distance;
digitalWrite(trig, HIGH);
delay(10);
digitalWrite(trig, LOW);
cycletime = pulseIn(echo, HIGH);
distance = ((340 * cycletime) / 10000) / 2;
Serial.print("Distance:");
Serial.print(distance);
Serial.println("cm");
Serial.print("Humidity: ");
Serial.print(hum);
Serial.print(" %, Temp: ");
Serial.print(temp);
Serial.println(" Celsius");
if(distance < 100 and temp > 25){
digitalWrite (Relay, LOW);
}
else{
digitalWrite (Relay, HIGH);
}
delay(1000);
}
프로그램은 앞서 포스팅한 온습도 센서, 릴레이(Relay) 모듈, 초음파 센서(HC-SR04)의 프로그램을 합치면 됩니다.
여기서 초음파 센서를 다룰때는 LED를 점멸하기 위해 'Power' 변수를 Pin 13으로 설정한 부분을 조건에 맞게 릴레이를 on/off 하기 위해 'Relay' 변수로 Pin 3번으로 변경합니다.
그리고 IF 조건문에서 원하는 distance 거리와 temp 온도 설정을 하면 됩니다. 저는 100 이하 25도 이상으로 설정하였습니다.
그리고 업로드 해주시면 완료~! 예시 동영상처럼 원하는 온도조건에서 사람이 가까이 있으면 선풍기가 켜집니다~ 와우!
여기까지 아두이노(Arduino)를 이용한 홈IoT (사물인터넷) 응용으로 스마트 자동 선풍기를 만들어 보았습니다.
역시나 이런 간단한 알고리즘을 더하고 더해서 좀 더 스마트하고 Fancy 한 기능을 가진 제품들이 탄생합니다. 더 나아가서 와이파이를 연결하여 원격제어 및 생성되는 데이터를 축적하여 빅데이터가 만들어지고, 빅데이터를 분석하여 학습시키면 인공지능이 탄생하는 겁니다.
세상이 급변하는 것처럼 보이지만 차근차근 하나씩 따라해봐도 늦지 않습니다. 다들 화이팅!!
오늘도 긴 글 읽어주셔서 감사합니다. 궁금한 점이나 추가적인 조언 있으면 언제든지 댓글로 남겨주세요~
'아두이노 응용 > 생활응용 (홈 IoT)' 카테고리의 다른 글
아두이노(Arduino) 응용, 적외선 FIR센서를 이용한 무드등 만들기 (1) | 2021.03.11 |
---|
Arduino 아두이노 광센서, 조도센서(Light sensor) 사용 방법
아두이노(Arduino)의 센서들을 알아보는 시간으로 앞선 포스팅에서 아두이노를 이용해 온실(식물) 재배 환경을 측정하는 시스템을 만들 때 사용했던 광센서, 조도센서(Light sensor)에 대해 알아보겠습니다.
광센서는 보통 일조량을 측정하거나 빛을 감지할 때 사용하곤 해서 일상생활에서는 쉽게 접하기는 사실 어려울 수도 있을 거 같습니다. 그러나 가시광선 영역 외 사람 눈으로 보기 어려운 자외선 및 적외선 파장대를 사용하는 기기의 빛을 감지하거나 빛을 이용한 통신을 할 때도 광센서를 사용하는 등 알게 모르게 생활 속 다양한 곳에서 다양한 종류의 광센서가 사용되고 있습니다.
지난 포스팅에서 광센서는 재배온실의 환경을 측정하거나 식물에게 필요한 광량을 정밀하게 측정하기 위해 사용하는 것으로 소개드렸습니다. 이처럼 이번 포스팅에서는 태양의 빛의 세기인 조도(Lux)를 측정하는 아두이노용 광센서를 소개해드리고 사용방법에 대해 알아보겠습니다.
1. bh1750 조도센서
아두이노에서 사용할 광센서를 검색하면 일반적으로 bh1750 조도센서를 많이 찾아볼 수 있습니다. 그중 위의 사진처럼 CY-30 또는 GY-302 모듈이 가장 많이 검색되는데 모두 Cds 타입의 조도 센서입니다.
Cds는 황화 카드뮴(Cadmium Sulfide) 약자로 빛에 반응하는 화합물로 빛을 Cds에 비추었을 때 내부의 전기전도도가 높아지는 광도전 효과(光導電效果, photoconductive effect)가 나타납니다. 빛이 많이 들어오면 저항이 작아지고 적게 들어오면 저항이 커지는 성질을 이용하여 빛의 유무를 측정할 수 있는 광도전소자에 많이 이용됩니다. CdS 광도전소자는 가시광선 대역에서 특히 높은 감도를 나타내기 때문에 가시광선 영역대의 빛의 세기(조도, Lux)를 측정하는 광센서로 사용됩니다.
보통 Cds 조도센서라고 하면 위 사진과 같은 제품을 많이 보셨을 거라 생각되고 이런 단품으로 생각이 됩니다. 그러나 아두이노에서 사용하려면 모듈 제품이 필요하고 실질적으로 실외나 사용 환경에 따라서 모듈의 회로까지 보호할 수 있는 형태면 더욱 좋습니다. 그래서 저는 bh1750fvi 모듈을 사용하고 오늘 포스팅에도 이 모듈을 가지고 진행하려고 합니다.
사진에서 볼 수 있듯이 외부환경으로부터 회로를 보호하고 태양의 직사광선을 확산시켜주는 덮개가 있어 실외에서 사용하기에도 적합합니다. 혹시 아두이노용으로 사용할 수 있는 더 괜찮은 조도센서가 있다면 추천 부탁드립니다 ^^
2. 아두이노(Arduino)와 bh1750 조도센서 배선
2-1. I2C 통신
bh1750 조도센서는 I2C 통신을 합니다. I2C (Inter-Integrated Circuit)은 실제로는 I²C (아이 스퀘어 씨)가 올바른 표기이지만 다들 I2C(아이 투 씨)라고 많이들 표기합니다.
I²C 는 풀업 저항이 연결된 직렬 데이터(SDA)와 직렬 클럭(SCL)이라는 두 개의 양 방향 오픈 컬렉터 라인을 사용합니다. 즉, 데이터(SDA)와 데이터의 전송 타이밍(SCL)을 위한 두 개의 선으로 통신을 하는 방식입니다.
I²C는 빠른 속도를 요구하지 않는 간단한 저비용 주변 장치들에 적합하며, 특히 아두이노 같은 Micro-controller에서 단지 2개의 입출력 핀과 소프트웨어만을 이용하여 여러 장치들을 제어할 수 있다는 장점이 있습니다. 또한 일반적으로 더 적은 전력을 소모하기 때문에 휴대전화나 이동형 장치들에서 사용하기에 편리합니다 (위키백과).
인터넷 상에서 'I2C 통신'이라고 검색을 하면 위와 같은 그림을 많이 볼 수 있습니다. 통신을 위해서 하나의 Master와 하나 이상의 Slave가 구성되는데 Master는 MCU, 아두이노가 되며, Slave는 device, 외부기기 및 센서가 됩니다.
Slave는 여러개 동시에 연결을 하여 통신할 수 있는데 이때 Slave 간 구별을 위해 각 Slave마다 개별 주소(address)가 필요합니다. 실제 아두이노 프로그램이나 라이브러리에 포함된 내용을 보게 되면 I2C통신을 하는 센서나 외부기기는 address가 부여되어 있습니다.
더 자세한 내용은 I2C통신으로 검색하여 찾아보시면 정말 다양한 정보가 있으니 참고 부탁드리며, 여기에서는 오늘 사용하려는 bh1750 광센서가 I2C 통신을 한다. 그래서 두 개의 선 (SDA, SCL)이 필요한데, SCL (직렬 클럭)이 데이터 전송 타이밍을 맞춰주는 방식으로 통신을 한다. 또한 각 Slave에는 address가 부여하여 구분을 하기 때문에 아두이노의 하나의 SDA, SCL 포트에 여러 개의 센서 및 외부기기를 병렬로 연결하여 사용할 수 있다! 정도만 기억하시면 됩니다.
2-1. 아두이노와 조도센서 배선
bh1750 센서에는 VCC/SCL/DAT/GND/ADD 로 총 5개의 연결 단자가 있습니다. 각각 아두이노의 적합한 pin에 연결하시면 됩니다. VCC는 5V, GND는 GND, ADD는 연결하지 않거나 GND에 연결하고, 앞서 소개해드린 SCL과 DAT (SDA)는 각각 아날로그 핀 (Analog pin) 5번과 4번에 연결하시면 됩니다.
2. 프로그램 코딩
먼저 라이브러리를 다운받습니다. 다운로드한 라이브러리는 스케치에서 추가해주시고, 혹시 라이브러리를 처음 사용하시는 분은 아래 링크 참조하셔서 스케치에서 라이브러리를 추가하는 방법을 알아두시면 유용합니다.
#include <BH1750.h>
BH1750 lightMeter;
void setup(){
Serial.begin(9600);
lightMeter.begin();
}
void loop() {
float lux = lightMeter.readLightLevel();
Serial.print("Light: ");
Serial.print(lux);
Serial.println(" lx");
delay(1000);
}
코드는 라이브러리를 사용하기 때문에 생각보다 간단합니다. 라이브러리에 속해있는 명령어 lightMeter.begin(); 명령어가 setup에서 실행되고, 변수 lux에 lightMeter.reaLightLevel(); 명령어로 측정된 조도 값을 저장한 뒤 Serial.print 명령어로 출력하는 순서입니다.
프로그램 코딩 후 컴파일/업로드를 진행하면 시리얼 모니터로 조도센서에 의해 측정된 조도 값이 1초 간격으로 나타나는 것을 확인할 수 있습니다.
여기까지 아두이노(Arduino) 센서 중 조도센서(Light sensor) bh1750 모듈의 사용 방법을 알아보았습니다. 이와 함께 I2C통신 방식에 대해서도 간단하게 설명드렸습니다. 추후 기회가 생기면 통신방식에 대해서 정리해보는 포스팅을 하도록 하겠습니다.
앞서 소개해드렸듯이 조도센서는 일상생활에서 알게모르게 많이 사용되기도 하고 특히 식물 재배 환경에서는 햇빛의 광량을 측정할 수 있기 때문에 아주 유용합니다. 식물에게 일일적산광량 (DLI, Day Light Integral) 매우 중요한 개념이고, 개화에 있어서 광량 및 주기 또한 큰 영향을 미치기 때문에 꼭 측정하는 항목이기도 합니다.
광이 식물에 영향을 미치는 부분은 아두이노 블로그에서는 다루지는 않도록 하겠습니다. ㅎㅎ 그럼 오늘도 긴 글 읽어주셔서 감사합니다. 궁금하신 부분이나 다양한 의견 댓글로 남겨주시면 감사하겠습니다.
'아두이노 (Arduino) > 아두이노 센서&모듈 (Sensor)' 카테고리의 다른 글
Arduino 아두이노 적외선 FIR 센서(HC-SR501) 사용하는 방법 (0) | 2021.01.23 |
---|---|
솔레노이드 밸브(Solenoid Valve)를 아두이노로 사용하는 방법 (1) | 2021.01.01 |
Arduino 아두이노 Wifi ESP8266 쉴드(shield) 모듈 사용방법 (2) | 2020.04.22 |
Arduino 아두이노 멀티플렉서(Multiplexer, MUX) 사용방법 (5) | 2020.04.21 |
아두이노(Arduino)에서 토양수분센서(soil moisture sensor) 사용 (3) | 2020.03.15 |
아두이노(Arduino)를 활용한 온실(식물) 재배 환경 측정
아두이노(Arduino)의 기본적인 몇 가지만 습득하면 정말 다양한 분야에서 활용 가능합니다. Micro-controller에 맞게 주로 외부기기나 센서를 제어하는데 탁월한 능력을 가지고 있기 때문에 홈 IoT나 온실 내부 환경 제어 같은 농업분야에 적합하다고 생각됩니다.
지난 포스팅에서는 대부분 기본과 간단하게 적용해볼 수 있는 내용을 위주로 포스팅하였지만 오늘은 실질적으로 농업 분야에 적용한 내용을 소개해 드리겠습니다. 아두이노를 처음 접하시는 분들은 아래 링크 내용 참고 부탁드립니다 ^^
식물재배를 위해서는 광, 수분, 온도, 습도, 이산화탄소, 양분 등의 식물이 생장하기에 적합한 환경을 조성하는 것이 필요합니다. 가정에서 인테리어용이나 취미로 식물을 기르시는 분들도 많고 실제 농업에 종사하시는 분도 많이 계신데 식물관리는 쉬운 듯하면서도 다들 시행착오가 많습니다. 최근에는 도시 근교 텃밭이나 옥상, 베란다 등에 무농약, 유기농 채소를 직접 재배하여 아이들 교육에도 건강에도 도움이 되는 도시농업이 트렌드로 자리 잡고 있습니다.
이런 트렌드에 IoT를 접목시켜 조금 더 효율적으로 식물을 관리할 수 있는 방법에 아두이노를 적용할 수 있습니다. 이번 포스팅은 아두이노로 온습도, 화분의 물의 양, 광량을 측정할 수 있는 간단한 계측기를 만들어 보겠습니다.
1. 준비물
1) 아두이노 우노 R3 (Arduino UNO R3)
센서 종류마다 한개의 센서만 사용하기 때문에 우노 R3 제품으로 충분합니다. 혹시 센서수를 많이 사용하시거나 하면 MEGA 보드나 멀티플렉서(Multi-plexer) 사용을 권장드립니다. 멀티플렉서 사용 방법은 아래 링크 참조 부탁드립니다.
2) 온습도 센서
온습도 센서는 AM2305 모델로 온실이나 식물 재배 환경을 측정하는 것이 용도이기 때문에 실내라고 하기에는 실외에 가깝기 때문에 실외환경에서도 측정 가능하며 미니 백엽상(radiation shield)도 사용할 수 있는 모델로 선택하는 게 용이합니다. 온습도 센서 종류와 사용 방법은 이전 포스팅에서 자세히 다루었으니 참고 부탁드립니다.
▼ 같은 제품 구매하시려면 아래 링크!! ▼
3) 토양수분센서
토양수분센서는 화분의 수분과 양분의 정도를 측정하기 위해 토양수분과 EC 동시에 측정 가능 한 제품으로 선택하였습니다. 또한 실제 재배 환경에서 내구성을 고려하여 방수가 가능하고 신뢰성이 괜찮은 제품으로 선택해야 합니다. 이전 포스팅에서 보여드린 아두이노에서 사용하기 쉬운 토양수분센서 중에서도 가격이 저렴한 몇몇 제품은 방수가 안되며 오래 사용하면 금방 녹이 끼는 제품이 있으니 주의해야 합니다. 토양수분센서에 대한 자세한 내용은 지난 포스팅 참고 부탁드립니다.
4) 광 센서
일반적으로 식물이 광합성을 하는 파장 영역은 400~700nm로 가시광선 영역입니다. 그렇기 때문에 광센서는 광합성 유효 복사, PAR (Photosynthetic active radiation)이라고 하는 영역의 빛의 세기를 측정하는 광센서를 사용하는 것이 광이 식물에 영향을 미치는 정도를 더 긴밀하게 알 수 있습니다. 그러나 일반적으로 조도(Lux)에 익숙하고 가이드라인도 조도를 기준으로 되어 있어서 조도센서를 많이 사용합니다. 그리고 PAR 센서는 비싸기도 하죠 ㅎㅎ
오늘 사용할 광센서인 BH1750 모델로 아두이노에서 사용하기 적합한 제품으로 가격도 저렴하고 나름 회로를 보호하기 위한 캡도 있어서 실외에서 사용하기 괜찮은 제품입니다. BH1750 센서의 자세한 사용 방법은 추후 포스팅하도록 하겠습니다.
5) 디스플레이
각 환경 센서가 측정하는 데이터를 실시간으로 출력하기 위해 LCD 디스플레이(display)를 사용하였습니다. 사용한 디스플레이는 20x04 LCD 디스플레이로 파랑 바탕에 하얀 글씨만 출력되는 제품으로 가로 20자 세로 4줄인 디스플레이입니다. 여기에 온도, 습도, 조도, 토양수분, EC의 정도를 실시간으로 출력합니다.
6) 하이박스
아두이노 및 다양한 전자제품을 만들고 외부로부터 보호를 위해 하이박스에 고정 및 배선작업을 합니다. 그래서 완성품을 컨트롤 박스라고 명명합니다. 철 재질이나 플라스틱 박스로 벽에 붙어 있는 배전함 같은 것들이 모두 컨트롤 박스입니다.
2. 식물 재배 환경 측정 시스템 배선
3. 작동 알고리즘
온습도 센서, 토양수분센서, 광센서에서 측정된 온도(℃), 습도(%), 수분량(%), 광량(Lux) 값을 디스플레이(20x04)에 실시간으로 출력되고 웹을 통해 사전에 구축한 데이터베이스(DB)에 저장되거나, 시리얼 통신을 활용한 컴퓨터 엑셀에 데이터를 받을 수 있는 있게 만들 수 있습니다. 웹 구축 및 컴퓨터 엑셀에 저장하는 방법은 아래 링크 참조 부탁드립니다.
1초 또는 2초 간격으로 측정되는 모든 데이터를 저장하려면 용량이 너무 크기도 하고, 식물 재배 환경은 1초 1분 촌각을 다루지 않기 때문에 아두이노에서 5분 또는 30분 이상의 평균값을 계산 후 저장해도 무방합니다.
데이터 베이스에 저장된 데이터는 다시 웹을 통해 그래프로 시각화하여 시간에 따른 환경 변화 추이를 한 번에 볼 수도 있으며 엑셀 역시 그래프에 연동되게 만들어 바로바로 확인이 가능합니다.
사진은 수국 재배 농장의 아는 사장님의 의뢰로 제작된 온실 재배 환경 계측기입니다. 앞서 설명드린 대로 아두이노 우노 R3 보드와 각 환경 센서와 제작되어 20x4 LCD 디스플레이에 실시간 측정값이 출력됩니다.
분화수국은 각 재배베드(plant growth bed)위에서 화분으로 재배되기 때문에 각 베드마다 작물 주기가 다르게 진행됩니다. 그래서 원하는 베드마다의 환경 제어가 필요하기 때문에 이동 가능하고 구역별로 설치할 수 있게 소형으로 제작되었습니다. (실제로 온실 시설에 내장되어 있는 환경 시스템은 온실 전체를 대변하기 때문에 온실 내부 구역 구역마다 환경이 다른 경우가 많습니다.)
측정된 데이터는 ESP-01 와이파이 모듈을 통해 웹서버 DB로 데이터가 저장되고 웹브라우저를 통해 시간에 따른 온도, 습도, 조도, 토양수분, EC의 그래프로 한눈에 볼 수 있게 출력할 수 있습니다.
농업도 4차 산업의 유망 업종 중 하나로 주목받고 있는 만큼 오늘은 아두이노(Arduino)를 이용해 IT를 농업에 접목하는 실제 적용 사례를 소개해 드렸습니다. 몇 가지 센서와 아두이노 보드만으로 필요한 부분에 꼭 맞게 맞춤 제작할 수 있는 것이 매력이죠 ^^
이렇게 재배 환경을 데이터화 하여 재배 작물의 일련의 작기를 거치면서 데이터가 쌓여 빅데이터가 되고 빅데이터가 인공지능 AI의 기반이 되는 겁니다.
여기까지 긴 글 읽어주셔서 감사합니다. 혹시 아두이노를 이용한 온실 내부 환경 측정 계측기에 대해 궁금하신 부분이나 제작에 관심이 있으신 분은 이메일 주소 farmerit@naver.com으로 문의주시면 최대한 빠른 시일 내에 답변드리도록 하겠습니다. 감사합니다.
이와 같이 측정된 데이터를 기반으로 자동으로 관수까지 할 수 있습니다. 스마트팜(Smart Farm)이라고 잘 알려져 있는데 이렇게 데이터를 기반으로 작물을 재배하는 분야를 정밀농업이라고 합니다.
스마트 팜에서 자동관수 시스템을 구성하는데 전자밸브/솔레노이드 밸브 (Solenoid Valve)를 많이 사용하고 있습니다. 관심 있으신 분은 아래 링크 참조 부탁드립니다.
Arduino 아두이노 Wifi ESP8266 쉴드(shield) 모듈 사용방법
아두이노(Arduino)를 다루다 보면 다양한 모듈을 사용할 기회가 많은데 그 중에 쉴드(shield) 제품을 사용할 경우가 있습니다. 아두이노 쉴드는 아두이노 보드 본체와 탑처럼 쌓을 수 있게 아두이노의 pin과 결합이 가능한 모듈을 말합니다. 각 쉴드마다 특정 기능을 탑재하고 있어서 마치 아두이노 본체를 하드웨어적으로 업그레이드하는 Flex 한 느낌이 드는 모듈입니다.
아두이노 쉴드 종류는 현재 시장에 나와있는 종류만 300가지가 넘고, Wifi, 이더넷, 블루투스, SD카드, USB, 등 정말 다양한 기능을 탑재한 쉴드제품이 있습니다. 쉴드 하나하나 자세히 다루고 싶긴 하지만 직접 사용해봐야 설명도 가능해서 우선 몇 가지 소개하고 있는 블로그를 아래 링크 걸어두게요 ^^ 참고하세요~
아두이노 쉴드를 직접 사용해보시면 아실 듯 하지만 다양한 장점이 있습니다. 우선 단일 모듈은 배선을 해야 해서 전선을 복잡하게 사용해야 하는 경우가 있지만 쉴드는 pin 결합을 통해 배선이 하나 없어도 사용 가능합니다. 또한 아래와 같이 다양한 기능을 탑재한 쉴드를 결합해서 하나의 제품처럼 콤팩트 하게 사용할 수 있는 장점이 있습니다. 좀 멋지죠? ㅎㅎ 하지만 역시나 단점이 많다는 것!! 단점은 각 쉴드에 따라 경중이 있어서 쉽게 말하기 어렵지만.. 치명적인 결함도 있는 경우도 다수 있으니 항상 주의해서 구입해야 합니다.
쉴드 제품에 대해서 설명은 이렇게 가볍게 넘어가고 오늘 주제인 가장 관심이 많은 Wifi ESP8266 쉴드 제품 사용 방법에 대해 알아보도록 하겠습니다.
1. ESP8266 Wifi 쉴드(shield) 모듈
ESP8266 Wifi 쉴드 제품은 ESP8266 Wifi 모듈과 같이 ESP8266 칩셋을 사용하기 때문에 Wifi 모듈과 동일한 역할을 합니다. 아두이노에는 일반적으로 기본보드에는 와이파이 칩이 없기 때문에 와이파이 기능이 되려면 Wifi 모듈을 사용하거나 Wifi 쉴드를 사용하면 됩니다. 제품 모양은 아래 사진같이 생겼는데 좌측 중앙에 있는 칩이 Wifi 칩셋이고 그 주위로 Chip의 각 GIPO (General Purpose Input/Output)에 연결할 수 있게 pin이 배치되어 있고 보드 뒷면에는 아두이노의 pin과 결합할 수 있게 pin 다리가 있습니다. 그리고 특이하게 프로그램을 업로드할 때 사용하는 스위치가 있는데 뒤에서 사용방법을 얘기할 때 자세하게 설명드리겠습니다.
2. ESP8266 Wifi 쉴드(shield) 모듈 라이브러리(Library) 추가
잠깐! ESP8266 Wifi 쉴드를 아두이노 본체에 먼저 결합하시지 마시고요 ㅎㅎ 그전에 라이브러리를 설치하고 스케치를 통해 프로그램을 아두이노를 통해서 쉴드에 업로드해야 합니다. 아마 여기저기 사용방법을 찾아보셨을 건데.. 일부 사용방법에서 펌웨어를 업로드해야 해서 추가로 모듈을 사용해야 한다고 포스팅되어 있는데도 많을 겁니다. 하지만! 매번 하는 이야기이지만 쉽게 복잡한 거 싫어하는 저는 아두이노만으로 충분히 동작하였습니다. 그럼 진행해 볼까요?
우선 라이브러리를 다운로드하기 전에 스케치 메뉴에서 File(파일) -> preferences(환경설정)에서 Additional Boards Manager URLs(추가적인 모드 매니저 URLs)에 http://arduino.esp8266.com/stable/package_esp8266com_index.json를 추가해줍니다.
그리고 라이브러리 포함하기(Include Library) 메뉴의 라이브러리 관리(Manage Libraries)에서 ESP8266 Community의 esp8266 라이브러리를 설치합니다.
esp8266 라이브러리가 정상적으로 설치되고 나면 스케치의 툴(Tool) 메뉴의 보드(Board)에서 NodeMCU 1.0 (ESP-12E Module)을 선택합니다.
NodeMCU 1.0 (ESP-12E Module) 보드를 선택하면 툴(Tiool) 메뉴에 보드명이 변경되고 그 아래로 Upload Speed, CPU Frequency 등의 정보가 표시되고 변경할 수 있는 메뉴들이 생성됩니다. 저는 따로 변경 없이 초기 설정되어 있는 그대로 사용하고 있지만 필요하신 분은 필요에 따라 설정을 변경하여 사용하시면 됩니다.
3. ESP8266 Wifi 쉴드(shield) 모듈 프로그램 업로드
ESP8266 Wifi 쉴드와 스케치와 연결이 완료되었으면 테스트 프로그램을 업로드해보겠습니다. 테스트 프로그램은 따로 코딩하지 않고 라이브러리를 설치하면 자동으로 생성되는 예제 프로그램을 사용합니다. 스케치 파일(File) 메뉴에서 예제(Examples) -> ESP8266WebServe에서 'HelloServer' 프로그램을 불러옵니다.
그럼 꽤 긴 프로그램이 열리는데 프로그램 내용은 와이파이에 접속하고 연결된 와이파이 망내에서 할당받은 IP주소에 "hellow from esp8266!" 문자를 출력하는 내용입니다. 프로그램을 업로드하고 나서 웹상으로 "hellow from esp8266!"가 출력되었는지 확인이 가능합니다. 프로그램을 모르시더라도 한 줄 한 줄 짚어보면 이해하실 수 있을 겁니다. 여기서 수정할 내용은 프로그램 상단에 나와있는 STASSID와 STAPSK를 접속하려는 Wifi의 SSID(아이디)와 비밀번호로 변경해주시면 됩니다.
프로그램을 업로드하기 전에 몇 가지 단계가 있어 까다롭지만 차근차근 진행하면 원활하게 업로드가 되니 반드시 하나도 빠짐없이 순서를 지켜주세요 ^^ 진행 예시로는 아두이노 우노(UNO) 제품으로 진행되지만 나노나 메가나 비슷하기 때문에 구분 없이 보셔도 됩니다.
3.1 아두이노 우노 보드 초기화
보통 아두이노 보드에 기존 사용하던 프로그램이 업로드되어 있는 경우가 많습니다. 그래서 보드를 초기화하는 작업으로 스케치에서 'BareMinimum' 프로그램을 업로드하면 됩니다.
스케치의 파일(File) 메뉴에서 예제(Examples) -> Basic에서 'BareMinimum' 프로그램을 찾을 수 있습니다.
'BareMinimum' 프로그램은 특별한 게 아니고 처음 스케치를 설치하고 실행하였을 때 보셨던 초기 화면입니다.
3.2 EPS8266 쉴드 보드 설정
앞서 잠깐 언급했던 ESP8266 쉴드 보드에 달려있는 스위치를 설정해야 합니다. 보드 설정에 따라 FLASH 모드와 통신 모드로 구분합니다.
스위치 DIP 업: FLASH모드 (펌웨어 업로드 및 스케치 업로드 시 사용)
스위치 DIP 다운: 통신 모드 (TX, RX 통신 및 아두이노 시리얼 통신 시 사용)
3.3 아두이노 보드와 ESP8266 와이파이 쉴드 보드 연결
ESP8266 와이파이 쉴드를 아두이노 보드 위에 탑재하기 전에 프로그램 업로드할 때는 다음과 같이 연결해야 합니다. 전원 공급을 위해 5V와 GND를 연결하고 아두이노의 Tx-1, Rx-0과 ESP8266 쉴드의 TXD와 RXD를 연결합니다. 여기서 주의하실 부분은 보통 아두이노의 Tx(전송)는 모듈의 Rx(수신)와 아두이노의 Rx(수신)는 모듈의 Tx(전송)하고 연결하는 게 일반적인데 반대로 Tx는 Tx와 Rx는 Rx와 연결해야 정상적으로 동작합니다.
3.4 스케치를 통해 프로그램 업로드
배선까지 정상적으로 완료되었으면 아래와 같이 램프에 불이 들어옵니다. 그럼 FLASH 모드 (DIP 스위치를 업)로 설정하고 스케치에서 업로드를 실행합니다.
그럼 아래와 같이 업로드가 진행되는데 아마 "Connecting......." 메시지에서 진행이 더 이상 안될 겁니다. 계속해서 업로드 실패를 보실 겁니다... 다 끝난 줄 알았는데... 완전 짜증....
재시도 끝에 해결방법을 찾았는데 방법은 DIP 스위치 오른쪽에 있는 ESP RST 버튼을 타이밍에 맞춰서 눌러줘야 하는 겁니다. 버튼을 누르는 타이밍은 "Connecting........." 메시지를 보고 바로 누르면 됩니다. (좀 복잡한가요..;; 이래서 예전에 한 번 언급했지만 저는 쉴드제품은 절대 구입을 안 합니다... ㅋㅋ)
프로그램이 정상적으로 업로드되면 로딩 퍼센트가 100%까지 로딩 메시지를 볼 수 있습니다.
3. ESP8266 Wifi 쉴드(shield) 모듈 작동 확인
프로그램 업로드가 완료되면 정상적인 동작 확인을 위해 시리얼 모니터(Serial Monitor)를 실행합니다. 이때 주의하실 점은 ESP8266Wifi 실드는 통신 모드 (DIP 스위치 다운)으로 설정한 후에 진행해야 합니다. 시리얼 모니터를 실행하고 통신속도를 115200 baud로 설정하면 아래와 같이 "Connected to 접속한 wifi아이디"와 함께 할당받은 IP address를 볼 수 있습니다.
저는 IP 192.168.0.101로 할당받았으며, 확인된 IP주소로 웹을 통해 접속하면 짠~ "hello from esp8266!" 메시지를 확인할 수 있습니다 ㅎㅎ
4. ESP8266 Wifi 쉴드(shield) 모듈 아두이노 쉴드에 탑재하기
ESP8266 와이파이 쉴드를 아두이노 보드에 탑재하기 전에 또 작업해야 할 일이 있습니다. 아마 쉴드 제작자의 실수로 인한 문제인 듯한데 아두이노의 디지털(Digital) 0번-Rx, 1번-Tx와 만나는 쉴드의 0, 1번 핀이 반대로 제작되어서 그대로 아두이노에 탑재하면 ESP8266 쉴드와 통신이 안 되는 문제가 발생합니다. 그렇기 때문에 아래 사진과 같이 두 핀을 구부려서 접촉되지 않게 한 후에 Tx와 Rx는 전선으로 연결해야 하는 번거로운 점이 있습니다. (여러분.. 쉴드제품 구매하기 전에는 반드시 이런 점들을 확인하셔야 합니다 ㅠㅠ)
여기까지 아두이노(Arduino)의 EPS8266 와이파이 쉴드(Wifi shield)를 사용하는 방법에 대해 알아보았습니다. 생각보다 까다롭긴 해도 아두이노 보드 위에 탑재된 모습을 보면 또 멋져 보이기도 하죠 ㅎㅎ
아두이노를 사용하시면서 쉴드(Shield)의 Flex 한 모습에 반해 많이들 구매하실 거라 생각하며 저 또한 여러 제품을 구매해서 사용하고 있지만 일반적으로 많이 보급되지 않은 제품은 문제점도 많고 스스로 해결하기 힘들면 아까운 돈을 사용하게 되므로 구매 전에는 반드시 확인하시고 구매하시길 권고하는 바입니다. ^^
오늘도 긴 글 읽어주셔서 감사합니다. 궁금하신 내용 있으면 언제든지 댓글로 남겨주세요 감사합니다~
'아두이노 (Arduino) > 아두이노 센서&모듈 (Sensor)' 카테고리의 다른 글
솔레노이드 밸브(Solenoid Valve)를 아두이노로 사용하는 방법 (1) | 2021.01.01 |
---|---|
Arduino 아두이노 광센서, 조도센서(Light sensor) 사용 방법 (0) | 2020.06.11 |
Arduino 아두이노 멀티플렉서(Multiplexer, MUX) 사용방법 (5) | 2020.04.21 |
아두이노(Arduino)에서 토양수분센서(soil moisture sensor) 사용 (3) | 2020.03.15 |
Arduino 아두이노 릴레이 (Relay, 스위치) 사용방법 (2) | 2020.03.08 |
Arduino 아두이노 멀티플렉서(Multiplexer, MUX) 사용방법
아두이노(Arduino)로 프로젝트를 진행하면서 다수의 저전력 센서나 모듈을 사용하다 보면 입력(input) 또는 출력(output) 단자(Pin)가 생각보다 부족하다는 것을 느낄 때가 많습니다. 아두이노 또는 컨트롤러(controller)를 여러 개 사용해서 해결할 수도 있지만 상황에 따라 비효율적일 수 있고 같은 센서를 여러 개 사용할 경우 딱 Pin 수만 더 많았으면... 하는 생각을 하게 됩니다. 이런 경우 사용하는 모듈이 멀티플렉서(Multiplexer, MUX)입니다.
'멀티플렉서(Multiplexer) 또는 MUX는 여러 아날로그 또는 디지털 입력 신호 중 하나를 선택하여 선택된 입력을 하나의 라인에 전달하는 장치이다.'라고 위키백과에 정의되어 있는데 이런 기능을 이용하여 controller의 단자를 확장해주는 역할을 할 수 있습니다.
오늘은 아두이노에서 쉽게 사용할 수 있는 멀티플렉서를 소개하고 사용방법에 대해 알아보겠습니다.
1. 멀티플렉서(Multiplexer) CD74HC4067 모듈
아두이노에서 많이 사용하는 멀티플렉서 모듈로 CD74HC4067입니다. C0~C15까지 총 16개까지 확장 가능한 모듈로 시중에서 쉽게 구할 수 있고 사용하기에도 어렵지 않은 것 같습니다.
Pin 코드를 설명하면 C0~C15는 입력 또는 출력할 센서 또는 모듈을 연결하는 확장 Pin이며, SIG은 받은 신호를 아두이노에 보내는 연결 Pin입니다. 그리고 S0~S3로 아두이노에서 신호를 보내 CD74HC4067 모듈을 컨트롤합니다.
간단한 동작 원리는 앞서 위키백과에 나온 멀티플렉서의 정의대로 여러 아날로그 또는 디지털 입력 신호(C0~C15) 중 하나를 선택하여 선택된 입력을 하나의 라인(SIG->아두이노)에 전달하는데.. 즉 C0~C15에 연결된 센서로 입력되는 데이터들을 하나씩 SIG를 통해 아두이노로 보내는 방식입니다. 이런 전달 방식이기 때문에 동시에 센서 데이터가 입력되는 것이 아니고 아주 짧지만 수 m초(설정 가능) 정도 간격으로 C0부터 C15까지 돌아가면서 데이터를 읽어 들입니다.
처음 보시면 이해가 안 가실 수도 있는데 사실 이해 안 하셔도 전혀 문제없습니다 ㅎㅎ 아마 뒤에서 코드를 보시면 이해하기 더 쉬울 거라 생각됩니다. ^^
2. 멀티플렉서 CD74HC4067 배선
앞서 CD74HC4067 Pin 코드 설명에서 보았듯이 C0~C15는 사용할 센서를 연결하고, S0~S1을 아두이노에서 신호를 보낼 디지털 Pin 8, 9, 10, 11과 차례로 연결합니다(프로그램에서 조정 가능). 저는 아날로그 센서를 사용하여 시험할 예정이라 SIG pin은 아날로그 Pin 0과 연결하는데, 아마 사용하시는 센서에 따라 디지털 신호를 받으시려면 디지털 Pin과 연결하면 됩니다. 마지막으로 VCC와 GND는 각각 아두이노의 5V, GND에 연결합니다.
▼ 같은 제품 구매하시려면 아래 링크!! ▼
3. 멀티플렉서 CD74HC4067 프로그램 코딩
스케치로 아래와 같이 프로그램을 코딩하여 아두이노에 업로드합니다.
//Mux control pins
int s0 = 8;
int s1 = 9;
int s2 = 10;
int s3 = 11;
//Mux in “SIG” pin
int SIG_pin = 0;
void setup(){
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);
digitalWrite(s0, LOW);
digitalWrite(s1, LOW);
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
Serial.begin(9600);
}
void loop(){
//Loop through and read all 16 values
//Reports back Value at channel 6 is: 346
for(int i = 0; i < 16; i ++){
Serial.print("Value at channel ");
Serial.print(i); Serial.print(": ");
Serial.println(readMux(i));
delay(1000);
}
}
int readMux(int channel) {
int controlPin[] = {s0, s1, s2, s3};
int muxChannel[16][4]={ {0,0,0,0},
{1,0,0,0}, //channel 1
{0,1,0,0}, //channel 2
{1,1,0,0}, //channel 3
{0,0,1,0}, //channel 4
{1,0,1,0}, //channel 5
{0,1,1,0}, //channel 6
{1,1,1,0}, //channel 7
{0,0,0,1}, //channel 8
{1,0,0,1}, //channel 9
{0,1,0,1}, //channel 10
{1,1,0,1}, //channel 11
{0,0,1,1}, //channel 12
{1,0,1,1}, //channel 13
{0,1,1,1}, //channel 14
{1,1,1,1} //channel 15
};
//loop through the 4 sig
for(int i = 0; i < 4; i ++){
digitalWrite(controlPin[i], muxChannel[channel][i]);
}
//read the value at the SIG pin
int val = analogRead(SIG_pin); //return the value
return val;
}
프로그램을 간단하게 설명하면 CD74HC4067를 컨트롤하는 S0~S3과 연결된 Pin 8, 9, 10, 11을 pinMode 명령어로 Output 상태로 만듭니다. 그리고 digitalWrite 명령어로 초기 값을 Low로 설정하는데 이때 Low =0, High = 1을 의미합니다.
아두이노에서 S0, S1, S2, S3에 신호를 Low(0)과 High(1)로 주면서 Channel 번호를 2진법에 의해 설정됩니다. 예를 들어 Channel 0 = {0, 0, 0, 0} : 2진법으로 0이 됩니다.
Channel 1 = {1, 0, 0, 0} : 2^0에 해당하는 자리에 High(1)로 신호를 주어 1을 표시합니다.
Channel 2 = {0, 1, 0, 0} : 2^1에 해당하는 자리에 High(1)로 신호를 주어 2를 표시합니다.
Channel 3 = {1, 1, 0, 0} : 2^0과 2^1에 해당하는 자리에 High(1)씩 신호를 주어 총 합 3이 되어 3을 표시합니다.
....
Channel 15 = {1, 1, 1, 1} : 1+2+4+8 = 15 표시
이런 식으로 각 채널을 표시하고, 이 채널을 For 반복 구문을 통해 하나씩 읽는 로직입니다. 생각보다 가.. 간단하죠?;;;
pinMode 명령어나, digitalWrite 명령어가 자주 나오는데 아두이노에서는 많이 사용하는 명령어라 혹시 처음 접하시면 아래 링크 참조하시면 도움될 듯합니다.
4. 데이터 확인
아두이노와 멀티플렉서 및 사용한 센서들을 연결한 후 스케치를 통해 프로그램을 업로드합니다. 멀티플렉서에 연결된 센서들은 따로 전원이 들어가야 하는 점 확인하세요^^
프로그램 업로드 후 시리얼모니터(Serial Monitor)를 실행하면 아래와 같이 channel 0부터 channel 15까지 연결된 센서의 데이터를 출력합니다. 프로그램에서 delay(1000)로 1초 간격으로 channel 값이 순차적으로 표시되는데 delay를 조절하면 더 짧은 간격으로도 표시 가능합니다.
여기까지 아두이노(Arduino)의 입출력 단자(Input&output pin)를 확장할 수 있는 멀티플렉서(Multiplexer, MUX) CD74HC4067 모듈에 대해 알아보고 사용방법을 알아보았습니다.
멀티플렉서를 사용하여 센서의 입력 데이터뿐만 아니라 릴레이(Relay) 같은 스위치나 외부기기를 여러 개 사용할 때도 활용 가능합니다. 기회가 되면 릴레이 16개를 확장해서 활용하는 예시를 포스팅하도록 하겠습니다.
오늘도 긴 글 읽어주셔서 감사합니다. 궁금하신 내용 있으면 언제든지 댓글로 남겨주세요^^
'아두이노 (Arduino) > 아두이노 센서&모듈 (Sensor)' 카테고리의 다른 글
Arduino 아두이노 광센서, 조도센서(Light sensor) 사용 방법 (0) | 2020.06.11 |
---|---|
Arduino 아두이노 Wifi ESP8266 쉴드(shield) 모듈 사용방법 (2) | 2020.04.22 |
아두이노(Arduino)에서 토양수분센서(soil moisture sensor) 사용 (3) | 2020.03.15 |
Arduino 아두이노 릴레이 (Relay, 스위치) 사용방법 (2) | 2020.03.08 |
Arduino 아두이노 초음파(거리) 센서(ultrasounds sensor) 활용: 사람 인식하는 전자기기 작동 시스템 (2) | 2019.12.14 |
Arduino 아두이노로 데이터 로거(Data logger) 만들기
아두이노(Arduino)를 이용한 IoT (사물인터넷) 프로젝트에서 데이터 로거(Data logger)를 만드는 일은 흥미로운 작업입니다. 데이터 로거란 단순하게 보면 데이터 기록기, 저장기? 정도로 생각하시면 되는데 최근 데이터 로거의 기능이 많아져서 간단한 전산, 컨트롤러(controller) 및 그래프(graph) 출력 기능까지 되는 제품도 많이 나오고 있습니다. 아두이노를 활용하여 인터넷을 사용하지 않고 컴퓨터에만 연결하여 충분히 데이터 로거를 만들 수 있습니다.
오늘은 아두이노로 간단한 데이터 로거를 만들어보겠습니다. 빠르신 분은 눈치채셨겠지만 이전에 소개했던 내용들을 조금만 응용하는 과정이 되겠지만 ㅎㅎ 끝까지 봐주시면 힘이 되겠습니다 ^^
1. 시간 표시하기
대부분의 계측기가 언제 어떤 상태였는지를 센서로 측정하여 데이터로 기록하는 게 목적(시간에 따른 데이터화)이기 때문에 데이터 로거의 기본은 시간이 표시되어야 합니다. 아두이노 자체적으로 시간을 표시해 주진 않기 때문에 시간을 표시하려면 몇 가지 작업이 필요합니다. 복잡한 거 싫어하고 오픈소스를 사용하는 걸 좋아하는 저는 오늘도 라이브러리를 이용하여 시간을 표시하겠습니다. ^^ 우선 아래 라이브러리를 다운로드하여 스케치(sketch)에 추가해 줍니다.
#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)를 실행하면 아래와 같이 시간이 표시됩니다.
지금 보여드린 방법이 가장 간단하지만 아두이노에 자체적인 전원이 없으므로 전원이 꺼졌을 때는 시간이 가지 않습니다. 처음 현재 시간으로 설정하더라도 전원이 잠깐이라도 끊기는 순간 처음 설정한 시간으로 다시 리셋됩니다. 그래서 현재 시간이 반드시 필요하신 분들은 시계 역할을 하는 모듈을 연결하거나 인터넷을 연결하여 전원이 들어올 때 현재시간을 받는 방법을 채택해야 합니다.
2. 시간과 데이터 표시하기
센서에서 측정하는 데이터를 시간과 동시에 표시하면 되는 과정이기 때문에 간단합니다. 이런 예시에 항상 사용하는 온습도 센서를 사용하여 프로그램을 코딩하겠습니다. 아두이노 및 온습도 센서 사용이 처음이신 분은 아래 링크 참조 부탁드립니다.
온습도 센서 프로그램 코드와 앞서 알아보았던 시간표시 프로그램과 함께 코드를 합쳐서 아래와 같이 프로그램을 재구성합니다.
#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분 정도의 시간 동안 차이가 크지 않죠 ^^ 사용하시는 환경에 맞게 스캔 간격을 조절하시면 됩니다.)
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'을 사용합니다. 아래 파일을 다운로드하여서 설치하시고, 사용방법은 아래 링크 참조 부탁드립니다.
앞서 라이브러리를 사용한 방법은 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' 프로그램을 사용하여 엑셀에 연동하면 아래와 같이 데이터가 들어옵니다.
아직 '표시 형식'을 변경하기 전이라 숫자로 표시되지만 셀 설정에서 표시 형식을 변경하면 원하는 포맷으로 날짜와 시간을 표시할 수 있습니다. 그리고 원하는 그래프로 시각화할 때 데이터의 셀 영역을 column 전체로 설정해놓으면 실시간으로 데이터가 들어올 때마다 그래프가 그려집니다.
오늘은 아두이노(Arduino)로 간단하게 데이터로거(Datalogger)를 만들어 보았습니다. 좀 단순하게 만드는 방법이다 보니 현 시간을 바로 반영할 수 없다는 점... 같은 게 허점이 될 수 있지만 가볍게 사용하기에는 파워풀한 방법입니다.
좀 더 정확한 시간 반영을 위해서는 인터넷을 사용하여 웹상에서 현재시간 정보를 받아 사용해야 합니다. 좀 복잡하죠 ^^ 인터넷이 안 되는 환경이나 현재 시간이 꼭 중요하지 않다면 쉽게 사용할 수 있을 듯합니다.
기회가 되면 esp-01 (ESP8266) 모듈을 사용해서 구글 현재시간을 받아 정확한 시간을 표시하는 방법에 대해서 포스팅해보겠습니다. 긴 글 읽어주셔서 감사합니다.
'아두이노 (Arduino) > 아두이노 시작하기 (Begin!)' 카테고리의 다른 글
Arduino 아두이노로 그래프(graph) 그리기 (1) | 2019.10.28 |
---|---|
Arduino 아두이노 시리얼 통신 데이터를 엑셀에 저장/연동하기 (12) | 2019.10.27 |
아두이노(Arduino) 홈 IoT 입문 - 온습도 센서 데이터 출력/저장 방법 (4) | 2019.10.26 |
아두이노(Arduino) 홈 IoT 입문 - 온습도 센서(DHT11) 사용하기 (5) | 2019.10.22 |
Arduino 아두이노 호환보드(CH340): DIP, SMD 타입? (0) | 2019.10.20 |
아두이노(Arduino)에서 토양수분센서(soil moisture sensor) 사용
2021.01.03 수정 업데이트
토양수분센서(soil moisture sensor)도 아두이노(Arduino)에서 많이 다루는 센서 중 하나입니다. 앞서 소개한 온습도 센서(Temperature and humidity sensor)와 초음파 센서(Ultrasounds sensor)처럼 외부환경을 데이터화하여 외부기기를 동작하기 좋습니다. 예를 들어 식물이나 농작물이 자라는 화분이나 토양의 수분함량을 데이터화해서 물을 자동으로 주거나 펌프를 작동하는 등에 적용할 수 있습니다.
최근 많은 사람들이 가정에서 취미나 인테리어로 식물을 기르는 일에 관심이 많아지고 있고, 플랜테리어(planterior) 혹은 그린테리어(greenterior)라고 식물(plant)과 인테리어(interior)의 합성어로 신조어가 생길 정도로 점점 트렌드로 자리 잡고 있죠 ^^ 이런 트렌드에 아두이노 IoT(사물인터넷)를 적용해보면 토양수분센서를 사용하여 화분의 토양에 물이 어느 정도 있는지 확인해서 식물관리에 조금 더 도움이 될 수 있을 듯하네요 ㅎㅎ
오늘은 토양수분센서에 대해 알아보고 아두이노에서 사용방법을 알아보겠습니다.
1. 토양수분센서 (soil moisture sensor)
토양수분센서 종류는 다양하게 있는데 싸게는 몇 천원부터 비싸게는 몇 십만 원까지 합니다. 아두이노에서 가볍게 사용할 수 있는 저렴한 제품들을 온라인상에서 쉽게 구할 수 있지만 정밀한 측정에는 어려움이 있습니다. 실험용이나 좀 더 정밀한 측정에 사용되는 센서 또는 토양의 온도나 전기전도도(EC, Electrical Conductance)도 같이 측정할 수 있는 TEROS 시리즈의 센서도 있지만 가격이 상당합니다.
대표적인 토양수분센서의 원리는 토양의 수분량에 따라 변하는 유전율(dielectric permittivity)을 이용하여 전기신호(voltage)로 출력합니다. 측정 방법에는 FDR (Frequency Domain Reflectometry), TDR (Time Domain Reflectometry) 등이 있는데 최근에 많이 사용되는 방법이 FDR 방법입니다. 자세한 내용은 제가 어설프게 설명하는거 보다 검색해보시면 쉽게 이해하실 수 있을 겁니다 ^^
2. 토양수분센서 배선
오늘 예시에서 사용할 토양수분센서는 모델명 SEN0114로 온라인에서 쉽게 구입할 수 있습니다. 여러 모델 중에서 SEN0114를 선택한 이유는 다양하게 점검해 본 결과 저렴한 가격에 비해 그나마 사용하기 유용하기 때문입니다. (뒤에서 추가 설명하겠습니다.)
그림과 같이 토양수분센서의 VCC (빨강) 선은 아두이노의 3.3 또는 5V, GND (검정) 선은 GND pin에 맞게 연결하고, Output (파랑) 선은 아날로그(Analog) pin 0번에 (프로그램에서 수정 가능) 연결합니다. 예시로 사용하는 토양수분센서는 아날로그로 출력 값을 송출하기 때문에 아날로그 pin과 연결하지만 센서에 따라 디지털 신호도 있으므로 사용하시는 센서의 사양을 잘 확인하고 사용하면 되겠습니다.
3. 토양수분센서 프로그램 코딩
void setup(){
Serial.begin(57600);
}
void loop(){
Serial.print("Moisture Sensor Value: ");
Serial.println(analogRead(A0));
delay(1000);
}
아날로그로 출력되는 토양수분센서라 스케치 프로그램가 아주 간단합니다. 아날로그 pin A0로 들어오는 신호만 읽어주면 끝입니다.
4. 토양수분센서 값과 Calibration
모든 센서는 정확한 측정을 위하여 calibration을 해야합니다. 보정한다는 뜻 정도로 생각할 수 있는데 저울 같은 경우 0점을 잡는 것과 같은 것입니다. 이처럼 calibration은 0점 보정 외에 원하는 값으로 변환하는 작업도 포함합니다. 예를 들어 토양수분센서로 토양의 수분 함량 (%) 값을 알고 싶은데 출력 값은 voltage 값인 경우 변환하는 수식(calibration equation)을 사용하여 수분 함량 (%) 값으로 표시할 수 있습니다.
앞서 오늘 소개드린 SEN0114 센서가 그나마 사용할만 했던 것도 이런 calibration 과정에서 판별됩니다. 아래 온라인에서 저렴하게 구입할 수 있는 센서 3가지를 비교 평가한 자료입니다.
x축이 출력 값 voltage (mV)이고, y축이 그에 상응하는 용적수분함량(VWC, Volumetric Water Content) (%)입니다. 오른쪽 두 센서보다 왼쪽의 SEN0114 그래프가 추세선이 제일 깔끔하고 (R squ 값 참조) 실제 측정 값을 모두 포함하고 있기 때문에 센서 선택의 근거가 될 수 있습니다. 용적수분함량은 (물의 양/토양의 부피) * 100 (%)으로 간단하게 이해하셔도 됩니다.
5. 아두이노 시리얼 모니터(Serial Monitor)에 토양수분센서 측정값 출력
센서를 아두이노와 연결하고 스케치를 통해 프로그램을 업로드한 후 시리얼 모니터를 출력하면 아래와 같이 "Moisture Sensor Value: " 뒤에 mV 단위로 voltage 값이 나올 겁니다.
센서가 아무것도 센싱하지 않을 때는 0으로 값을 읽다가 물에 넣으면 값이 상승합니다. SEN0114 센서 사양에 따르면
Value range: 0 ~ 300: dry soil
300 ~ 700: humid soil
700 ~ 950: in water
이라고 제시되어 있습니다. 음... 위에 calibration 자료와 비슷한가요? ^^
참고로 토양의 성질이나 공극으로 인해 물을 함유할 수 있는 정도가 달라지기 때문에 토양별로 calibration equation이 조금씩 달라진다고 알고 계시면 유용합니다.
여기까지 아두이노(Arduino)에서 사용하는 토양수분센서(soil moisture sensor)에 대해 알아보고 사용방법을 설명하였습니다. 다음 포스팅에는 토양수분센서를 사용하여 토양의 물이 일정 범위 아래로 떨어지면 (식물에 공급할 물이 부족하면) 물을 자동으로 주는 작은 프로젝트를 진행해 보도록 하겠습니다.
오늘도 긴글 읽어주셔서 감사합니다. 궁금한 점은 댓글로 언제든지 남겨주세요~ 감사합니다 ^^
▼ 토양수분센서 구매하시려면 아래 링크!! ▼
'아두이노 (Arduino) > 아두이노 센서&모듈 (Sensor)' 카테고리의 다른 글
Arduino 아두이노 Wifi ESP8266 쉴드(shield) 모듈 사용방법 (2) | 2020.04.22 |
---|---|
Arduino 아두이노 멀티플렉서(Multiplexer, MUX) 사용방법 (5) | 2020.04.21 |
Arduino 아두이노 릴레이 (Relay, 스위치) 사용방법 (2) | 2020.03.08 |
Arduino 아두이노 초음파(거리) 센서(ultrasounds sensor) 활용: 사람 인식하는 전자기기 작동 시스템 (2) | 2019.12.14 |
Arduino 아두이노 초음파(거리) 센서(ultrasounds sensor) 사용방법 (2) | 2019.11.26 |
Arduino 아두이노 릴레이 (Relay, 스위치) 사용방법
아두이노(Arduino)는 컨트롤러(controller)인 만큼 외부기기나 센서의 전원을 on/off 하는 경우가 많이 있습니다. 보통 이런 기능은 스위치(switch)가 하죠 ^^ 전자기기에서 전기신호를 받아서 스위치 역할을 하는 부품을 릴레이(Relay: 전자계전기)라고 합니다. 지난 포스팅에서 초음파 센서를 사용하여 사람이 접근하면 외부기기에 전원을 공급하는 방법에서도 릴레이 모듈을 사용할 수 있습니다. 오늘은 아두이노에서 주로 사용되는 릴레이 모듈을 알아보고 사용하는 방법을 알아보겠습니다.
1. 릴레이(Relay: 전자계전기)
우선 릴레이는 스위치입니다. 아두이노에서 제공하는 전력만으로 구동할 수 없는 외부기기를 컨트롤하고 싶을 때 외부 전원을 릴레이와 연결하여 (설정)조건이 만족할 때 아두이노에서 신호를 보내 컨트롤하기 위해 주로 사용합니다.
저희가 알고 있는 일반적인 스위치는 버튼(button)형이나 텀블러(tumbler)형 같이 손으로 수동으로 on/off 해야 하지만 릴레이는 전기신호로 자동으로 on/off 할 수 있습니다. 보통 릴레이는 '전자석(철심에 코일을 감은 것)'의 원리로 움직이는데 전자석은 전류가 흐르면 자기장이 형성되는 자석입니다. 그래서 릴레이 모듈에 전기신호가 들어오면, 즉 전류가 흐르면 자기가 형성되어 그림과 같이 자석이 열려있는 스위치를 끌어당겨 on 시켜줍니다.
릴레이 종류는 동작 방식이나 허용 전력 용량에 따라 여러 종류가 있습니다. 더 자세한 내용이 궁금하면 아래 '메카솔루션' 링크 참조 부탁드립니다.
2. 릴레이 모듈
위 사진은 1채널 릴레이 모듈이며, 채널 수에 따라 아래 4 채널 모듈과 같이 릴레이 수가 늘어납니다. 모듈에서 파란색 네모 박스가 실제적인 릴레이인데 상단에 JQC3F-5VDC-C (5VDC: 5V 직류 구동)라고 모델명이 있고 아래에 10A 250VAC (교류전압), 10A 30VDC (직류전압) 표시는 최대 입력전압(input voltage)을 나타내고, 하단에 10A 125VAC, 10A, 28VDC는 기본 입력 전압을 나타냅니다. 이에 맞게 허용 전력을 사용하면 됩니다.
제가 구입한건 중국산이라 한자 (常开, 公共端 ,常闭)로 적혀있는데 보통 NC (Normally Close), COM, NO (Normally Open) 이렇게 표시되어 있습니다.
NC (Normally Close, 常闭): 평상시에 닫혀있다는 뜻으로, 릴레이에 전류가 흐르면 Open 되므로 평상시에 전원을 on 상태로 유지하다가 신호를 주어 off 할 때 사용합니다.
NO (Normally Open, 常开): 반대로 평상시에 열려있다는 뜻으로, 릴레이에 전류가 흐르면 Close 되므로 평상시에 전원을 off 상태로 유지하다가 신호를 주어 on 할 때 사용합니다.
COM (Common port, 公共端)는 공통 단자로 전력 또는 외부기기의 한쪽 선을 항상 연결해야 하는 단자입니다.
VCC, GND, IN는 릴레이(전자석)을 구동하기 위한 전력 단자 (VCC, GND)와 신호를 주기 위한 IN (input) 단자입니다.
3. 릴레이 배선
그림과 같이 아두이노의 5V 단자와 릴레이 모듈의 VCC와 연결하고, GND는 GND pin에 연결합니다. 그리고 아두이노 프로그램에서 설정한 디지털 PIN 번호(저는 3번과 연결하겠습니다.)와 IN 단자와 연결합니다. 다음으로 전원을 컨트롤하고 싶은 전자기기와 외부 전력을 연결하고 한쪽 단자 중간에 릴레이(스위치)를 장착한다고 생각하시면 됩니다.
* 주의: 만약 전선작업을 직접 하시면 전원 반드시 뽑아서 안전 주의하세요!!!
4. 아두이노 프로그램
int Relay = 3;
void setup(){
pinMode(Relay,OUTPUT); // 릴레이를 출력으로 설정
}
void loop(){
if(조건)
{
digitalWrite(Relay,HIGH); // 조건 만족하면 1채널 릴레이 ON
delay(500);
}
else
{
digitalWrite(Relay,LOW); // 아니면 1채널 릴레이 OFF
delay(500);
}
}
릴레이를 동작하기 위한 아두이노 스케치 프로그램 코드입니다. 저는 아두이노의 디지털 pin 3번에 릴레이 IN 단자와 연결하였기 때문에 int Relay = 3; 으로 설정하고 pinMode를 OUTPUT으로 설정하였습니다. void loop()에서 if 조건문을 사용해서 조건에 맞으면 릴레이에 HIGH 신호를 줘서 릴레이 스위치를 on 하고, 조건이 맞지 않으면 off 되는 간단한 프로그램 코드입니다. 다양한 센서를 사용해서 if()에 원하는 설정 조건을 직접 작성하시면 됩니다.
아두이노 명령어가 익숙하지 않으신 분은 pinMode 및 if문에 대한 명령어는 아래 링크 참조하시면 됩니다.
여기까지 아두이노(Arduino)에서 자주 사용하는 릴레이(Relay: 전자계전기)에 대해 알아보았습니다. 릴레이는 앞으로 추진하는 IoT 프로젝트에 반드시 필요한 모듈 중 하나라 사용방법을 알아두면 좋습니다. 다음 포스팅에는 릴레이에 외부기기와 전원을 연결하여 동작하는 작은 프로젝트를 하나 진행해 보겠습니다.
오늘도 긴 글 읽어주셔서 감사합니다. 궁금한 부분은 댓글로 언제든지 남겨주세요 ^^
'아두이노 (Arduino) > 아두이노 센서&모듈 (Sensor)' 카테고리의 다른 글
Arduino 아두이노 멀티플렉서(Multiplexer, MUX) 사용방법 (5) | 2020.04.21 |
---|---|
아두이노(Arduino)에서 토양수분센서(soil moisture sensor) 사용 (3) | 2020.03.15 |
Arduino 아두이노 초음파(거리) 센서(ultrasounds sensor) 활용: 사람 인식하는 전자기기 작동 시스템 (2) | 2019.12.14 |
Arduino 아두이노 초음파(거리) 센서(ultrasounds sensor) 사용방법 (2) | 2019.11.26 |
Arduino 아두이노 온도 습도 센서(Temperature and Humidity sensor) 종류 및 사용법 (0) | 2019.11.03 |
아두이노 홈IoT 서버 활용 3: ESP8266(ESP-01) 이용하여 MySQL에 데이터 저장하는 프로그램 코딩
드디어 아두이노(Arduino) 홈IoT 서버 활용 세 번째 포스팅으로 아두이노에서 온습도 센서(Temperature and Humidity sensor)로 측정된 데이터를 Wifi(ESP-01: ESP8266) 모듈을 사용해서 MySQL (DB서버)에 저장하는 내용이 되겠습니다. 다들 아시겠만 서버를 만든 궁극적인 목적은 아두이노를 이용하여 홈IoT를 구축하는 것이고 그 과정 중 가장 핵심이 될 것 같습니다.
A.P.M (Apache, PMP, MySQL)으로 만든 서버를 홈IoT를 위해 사용하려면 센서에서 측정된 데이터가 DB서버에 수집이 되어야 하고 이는 무선 통신으로 이루어져야 IoT 구축의 의미가 있습니다. 그래서 우선 가장 기본적인 온습도 센서를 활용하여 Wifi를 통해 데이터를 송신하여 MySQL의 데이터테이블(Datatable)에 저장되는 방법에 대해 알아보겠습니다.
우선 온습도 센서 사용법과 Wifi를 사용하기 위해 ESP-01(ESP8266) 모듈 사용법을 알고 있어야 하고, APM 서버가 구축이 사전에 진행되어야 합니다. 혹시 준비가 필요하시면 내용이 정리된 포스팅을 링크 걸어두니 참조 하셔서 3가지 모두 준비된 상태에서 계속 진행 부탁드립니다.
준비가 다 되셨으면 진행해보겠습니다. 다음 순서로 진행하겠습니다.
1. ESP-01 모듈 및 온습도 센서 연결
2. 프로그램 코딩
3. 데이터 전송 확인
1. ESP-01 모듈 및 온습도 센서 연결
ESP-01(ESP8266) 모듈은 기존대로 연결하고 온습도 센서(DHT11) 모듈의 Data output pin을 아두이노 pin 4번과 연결합니다. 그리고 DHT11은 구동 전압이 3~5V로 3.3V로 구동 가능하기 때문에 VCC pin과 GND pin은 아두이노의 3.3V Pin 및 GND pin에 각각 연결합니다. 미리 양해 부탁드렸지만 각각 모듈의 자세한 내용과 사용방법은 앞서 링크드린 포스팅에서 참조 부탁드립니다.
2. 프로그램 코딩
스케치를 통해 프로그램을 코딩합니다. 프로그램 로직(logic) 순서는 void setup전에 Wifi 접속 명령어 'connetWifi()'및 데이터를 전송하는 명령어 'httpclient()', 온습도 센서(DHT11)를 설정합니다. 그리고 void setup에서 AT command를 통해 Wifi에 접속하고 void loop에서 온습도를 측정한 후 AT command를 통해 사전에 만들어둔 process.php 프로그램을 통해 MySQL에 온습도 데이터를 저장하는 순서로 이루어집니다.
프로그램 코딩 내용은 바로 앞 포스팅인 "아두이노 홈IoT 서버 활용2"에서 사용했던 명령어들과 방법을 기반으로 하고 있습니다. 코딩이 어려우신 분들은 반드시 앞의 포스팅을 참조 부탁드립니다.
#include <dht.h>
#include <SoftwareSerial.h>
dht DHT;
#define DHT11_PIN 4
float humi; //Stores humidity value
float temp; //Stores temperature value
SoftwareSerial mySerial(2,3); //RX,TX
String ssid = "WIFI 아이디";
String PASSWORD = "비밀번호";
String host = "내 컴퓨터 아이피";
void connectWifi(){
String join ="AT+CWJAP=\""+ssid+"\",\""+PASSWORD+"\"";
Serial.println("Connect Wifi...");
mySerial.println(join);
delay(10000);
if(mySerial.find("OK"))
{
Serial.print("WIFI connect\n");
}else
{
Serial.println("connect timeout\n");
}
delay(1000);
}
void httpclient(String char_input){
delay(100);
Serial.println("connect TCP...");
mySerial.println("AT+CIPSTART=\"TCP\",\""+host+"\",8787");
delay(500);
if(Serial.find("ERROR")) return;
Serial.println("Send data...");
String url=char_input;
String cmd="GET /process.php?temp="+url+" HTTP/1.0\r\n\r\n";
mySerial.print("AT+CIPSEND=");
mySerial.println(cmd.length());
Serial.print("AT+CIPSEND=");
Serial.println(cmd.length());
if(mySerial.find(">"))
{
Serial.print(">");
}else
{
mySerial.println("AT+CIPCLOSE");
Serial.println("connect timeout");
delay(1000);
return;
}
delay(500);
mySerial.println(cmd);
Serial.println(cmd);
delay(100);
if(Serial.find("ERROR")) return;
mySerial.println("AT+CIPCLOSE");
delay(100);
}
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
connectWifi();
delay(500);
}
void loop() {
DHT.read11(DHT11_PIN);
humi = DHT.humidity;
temp = DHT.temperature;
String str_output = String(temp)+"&humi="+String(humi);
delay(1000);
httpclient(str_output);
delay(1000);
//Serial.find("+IPD");
while (mySerial.available())
{
char response = mySerial.read();
Serial.write(response);
if(response=='\r') Serial.print('\n');
}
Serial.println("\n==================================\n");
delay(2000);
}
3. 데이터 전송 확인
우선 시리얼모니터(Serial Monitor)를 실행하여 프로그램이 정상적으로 동작하는지 확인합니다. 프로그램 코딩 시 출력 명령을 내린 문자가 아래와 같이 나오는지 확인할 수 있습니다. 프로그램 코딩에서도 알 수 있었듯이 AT Command로 먼저 Wifi를 접속 후 AT_CIPSEND 명령어를 통해 이전 포스팅에서 실행했던 거와 동일하게 process.php 프로그램을 통해 temp=30.5, humi=41.1로 전송하는 것을 확인할 수 있습니다. 그리고 반복으로 다음 측정 데이터인 temp=31.2, humi=40.1을 또 전송합니다. 이렇게 측정하고 송신하기를 계속 반복하여 동작합니다.
그럼 MySQL에 접속하여 데이터가 저장되었는지 확인해 보겠습니다. 앞서 APMSetup으로 웹서버와 DB서버 구성할 때 만들었던 데이터베이스 tempnhumi 안의 테이블에 측정된 데이터가 지속적으로 저장되는 것을 확인할 수 있습니다. 저는 여러 번 시험하느라 앞에 많은 데이터가 있는데요 ㅎㅎ 시리얼 모니터에서 확인한 온습도 데이터 temp=30.5, humi=41.1와 다음 측정 데이터 temp=31.2, humi=40.1가 네모 박스로 표시한 곳에 순서대로 저장된 것을 확인할 수 있습니다. 와~~ 우!! 놀랍죠? (제가 너무 놀라워서 ㅎㅎ) 그 뒤로도 계속 데이터가 들어오고 있습니다.
여기까지 아두이노(Arduino) 홈IoT 서버 활용으로 온습도 센서(Temperature and Humidity sensor)로 측정한 데이터를 DB서버 MySQL에 전송하여 저장하는 방법을 알아보았습니다.
이제 모든 것이 준비되었습니다 ㅎㅎ 이때까지 알아본 것들을 활용하여 집안의 온도나 습도에 따라 선풍기나 가습기를 동작되게 하거나 집의 밝기에 따라 전등을 켜거나 이런 식으로 집안의 각종 환경 상태에 따라 가전기기들을 동작할 수 있는 홈IoT를 구축할 수 있습니다. 이 모든 것은 사용하는 센서들이 달라지거나 프로그램들이 조금 더 스마트하게 복잡할 뿐 기본은 앞서 알아본 내용들을 기반으로 합니다.
다음 포스팅부터는 조금 더 단계를 넘어가서 활용하는 내용을 다뤄보겠습니다. 오늘도 긴 글 읽어 주셔서 감사합니다 ^^
'아두이노 (Arduino) > 홈IoT 서버 (Sever)' 카테고리의 다른 글
리눅스(Linux): 우분투(ubuntu) 16.04 환경에서 MySQL 설치 방법 (0) | 2021.01.10 |
---|---|
아두이노 홈IoT 서버 활용 4: MySQL 데이터 내보내기, 추출 (data export) (5) | 2020.08.27 |
아두이노 홈IoT 서버 활용 2: ESP8266(ESP-01) 이용하여 DB서버(MySQL)에 온습도 데이터 저장하기 (45) | 2019.12.03 |
Arduino 아두이노 홈IoT 서버 활용 1: 웹브라우저를 통한 온습도 데이터 DB서버(MySQL)에 저장하기 (7) | 2019.11.30 |
Arduino 아두이노 홈 IoT(사물인터넷)을 위한 서버(Sever) 쉽게 만들기: APMSetup 프로그램 (5) | 2019.11.23 |
Arduino 아두이노 초음파(거리) 센서(ultrasounds sensor) 활용: 사람 인식하는 전자기기 작동 시스템
아두이노(Arduino)의 센서들을 알아보는 시간으로 지난 포스팅에서 초음파 센서 사용법과 이를 이용하여 거리를 측정하는 방법을 알아보았습니다. 오늘은 이를 활용하여 사람이 다가가면 전자기기가 자동으로 작동하는 시스템을 만들어 보겠습니다. 원리는 간단한데 앞서 알아본 초음파 센서를 이용하여 설정 거리보다 가까이 사람이 있으면 전자기기에 전력을 공급하는 방식입니다. 초음파 센서로 거리를 측정하는 프로그램은 아래 링크 참조 부탁드리며, 그 이후부터 진행하도록 하겠습니다.
준비물은 아래와 같습니다.
- 아두이노 UNO R3 보드
- 초음파 센서(HC-SR04)
- DC-DC 승압형 5V 600mA USB 모듈
- 5V USB 구동 전자기기
새롭게 소개드릴 제품은 DC-DC 승압형 5V 600mA USB 모듈입니다. 저도 처음 사용해보는 건데요.. 아두이노의 출력 전압을 이용하여 5V USB 충전이나 기타 USB 구동 전자기기들을 사용할 수 있게 연결해주는 모듈입니다. 아마 온라인상에서 쉽게 구할 수 있을 거예요 ㅎㅎ
아두이노의 디지털 pin을 통한 출력 전압은 5V이니까 이번 프로젝트뿐만 아니라도 5V USB 구동 전자기기들을 이용할 때 유용하게 사용할 수 있을 듯합니다. ㅎㅎ 그리고 이번 프로젝트를 위해 USB 5V 전력으로 구동되는 전자기기를 사용해야 하는데 특별히 소유하신 전자기기가 없으면 휴대폰 USB 충전기로도 충분히 테스트해 볼 수 있습니다.
1. 아두이노와 초음파 센서, USB 모듈 연결하기
먼저 아두이노와 초음파 센서를 연결하고 전자기기의 USB 전원이 연결될 DC-DC 승압형 5V 600mA USB 모듈을 아두이노와 연결합니다. USB 모듈의 '+' 단자와 아두이노의 디지털핀(Digital Pin) 13번과 연결하고(프로그램에서 수정가능하니 꼭 13번이 아니어도 됩니다), '-' 단자는 그 옆의 GND에 연결합니다. 연결된 USB 모듈에 앞서 준비한 5V USB 구동 전자기기를 이용해서 사람이 다가가면 자동으로 켜지는 시스템을 만들 수 있습니다.
2. 프로그램 코딩
스케치에서 pinMode, digitalWrite, if 명령어를 사용해 앞서 링크드린 초음파 센서로 거리를 측정하는 프로그램과 조합하여 프로그램 코딩을 합니다. pinMode와 digitalWrite, if 명령어에 대해서는 아두이노 프로그램 코딩 초급 부분에서 정리하였으니 참고 부탁드립니다.
int echo = 8;
int trig = 12;
int power = 13;
void setup() {
Serial.begin(9600);
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
pinMode(power, OUTPUT);
}
void loop() {
float cycletime;
float distance;
digitalWrite(trig, HIGH);
delay(10);
digitalWrite(trig, LOW);
cycletime = pulseIn(echo, HIGH);
distance = ((340 * cycletime) / 10000) / 2;
Serial.print("Distance:");
Serial.print(distance);
Serial.println("cm");
if(distance < 50){
digitalWrite (power, HIGH);
}
else{
digitalWrite (power, LOW);
}
delay(500);
}
초음파 센서의 'echo'와 'trig' pin 설정을 각각 8, 12번으로 설정하고, 5V Output power pin을 13번으로 설정하였습니다. 그리고 초음파 센서로 거리를 측정한 후 거리가 50cm 이하가 되면 13번 pin에 연결되어 있는 USB 모듈을 통해 5V가 출력됩니다. 그러면 전자기기가 켜지겠죠? 아닐 경우는 출력 power가 없으니 자동으로 전원이 꺼지도록 'if 명령문'을 사용하였습니다.
3. 자동 동작 시스템 확인
저는 USB 5V 구동 소형 LED 전등으로 동작 테스트를 해보았습니다. 시리얼 모니터(Serial Monitor)에서 거리를 확인하면 아래와 같이 출력되고, 초음파 센서에 가까이 다가가면(사람과 센서 사이 거리가 50cm 이하 일 때) LED 전등이 자동으로 동작합니다. 와우~ ㅎㅎ
초음파 센서의 위치에 따라 거리는 적절히 조절하여 편하게 적용하시면 됩니다. ^^ 앞서 언급하였지만 USB 휴대폰 충전기로도 충분히 테스트 진행 가능합니다. 주의하실 부분은 아두이노의 디지털 Pin의 Output 최대 출력 전류가 40mA이기 때문에 소비전력이 높은 전자기기들은 따로 외부 전력이 필요합니다.
여기까지 아두이노(Arduino)의 초음파 센서(HC-SR04)를 활용해서 사람을 인식하여 자동으로 전자기기를 작동하는 시스템을 구성해 보았습니다. 너무 간단하게 구성해서 허접해 보일 수도 있지만 대부분 이런 방법의 응용으로 수가 많아지고 조금 더 디테일하게 복잡해질 뿐입니다. 쉽게 생각하셔도 괜찮습니다 ^^
오늘도 긴 글 읽어주셔서 감사합니다.
'아두이노 (Arduino) > 아두이노 센서&모듈 (Sensor)' 카테고리의 다른 글
Arduino 아두이노 멀티플렉서(Multiplexer, MUX) 사용방법 (5) | 2020.04.21 |
---|---|
아두이노(Arduino)에서 토양수분센서(soil moisture sensor) 사용 (3) | 2020.03.15 |
Arduino 아두이노 릴레이 (Relay, 스위치) 사용방법 (2) | 2020.03.08 |
Arduino 아두이노 초음파(거리) 센서(ultrasounds sensor) 사용방법 (2) | 2019.11.26 |
Arduino 아두이노 온도 습도 센서(Temperature and Humidity sensor) 종류 및 사용법 (0) | 2019.11.03 |
아두이노 홈IoT 서버 활용 2: ESP8266(ESP-01) 이용하여 DB서버(MySQL)에 온습도 데이터 저장하기
아두이노(Arduino)를 이용한 홈 IoT를 구축하는 프로젝트의 진행과정으로 웹서버(Web sever)와 데이터베이스(Database, DB)를 구성하였습니다. 이어서 지난 포스팅에서는 웹브라우저를 통해서 DB서버(MySQL)의 데이터베이스에 (온습도) 데이터도 저장해보았습니다. 오늘은 웹브라우저를 통하지 않고 ESP-01(ESP8266) Wifi 모듈을 사용해서 온라인으로 DB서버에 데이터를 보내는 방법을 알아보겠습니다. 지난 포스팅과 이어지기 때문에 "Arduino 아두이노 홈IoT 서버 활용: 온습도 데이터 DB서버(MySQL)에 저장하기" (아래 링크)를 참조하셔서 process.php 파일을 생성 후 진행하셔야 합니다.
진행 전에 아래 항목을 확인 부탁드립니다.
- APMSetup 프로그램 설치를 통한 AMP(Apache, MySQL, PHP) 서버 구성
- APMSetup 설치 하위 폴더 htdocs 폴더에 process.php 파일 확인 (PHP 프로그램: 아래 코드블록 참조)
- MySQL 데이터베이스 이름: testdb, 테이블 이름: tempnhumi, 각 칼럼(column) 이름: temp, humi
- esp-01 AT command 정상 동작 확인 및 Wifi 접속 (아래 링크 내용 참조)
<?php
header("Content-Type: text/html;charset=UTF-8");
$host = 'localhost';
$user = 'root';
$pw = 'apmsetup';
$dbName = 'testdb';
$mysqli = new mysqli($host, $user, $pw, $dbName);
if($mysqli){
echo "MySQL successfully connected!<br/>";
$temp = $_GET['temp'];
$humi = $_GET['humi'];
echo "<br/>Temperature = $temp";
echo ", ";
echo "Humidity = $humi<br/>";
$query = "INSERT INTO tempnhumi (temp, humi) VALUES ('$temp','$humi')";
mysqli_query($mysqli,$query);
echo "</br>success!!";
}
else{
echo "MySQL could not be connected";
}
mysqli_close($mysqli);
?>
모든 진행은 앞의 확인사항이 모두 정상적으로 구성 되었다는 가정하에 아래 순서와 같이 진행하도록 하겠습니다.
1. 포트포워딩 설정: 외부 통신(Wifi)을 통한 웹서버(Apache: 내 컴퓨터)로 접속이기 때문에 접근할 수 있는 포트 설정
2. 아두이노의 시리얼 모니터(Serial Monitor)를 통한 웹서버 접속
3. AT command를 통한 data 송신
4. MySQL 접속 후 데이터 확인
1. 포트포워딩 설정
아두이노의 ESP-01 모듈을 사용하여 Wifi를 통해 웹서버에 접속하기 때문에 외부 통신으로 내 컴퓨터의 웹서버에 접근하는 상황입니다. 이런 경우 접근할 수 있는 포트를 설정해야 하는데 이것을 '포트포워딩'이라고 합니다. 조금 더 상세히 설명드리고 싶으나.. 어설픈 설명보다 포트포워딩에 관해 정리를 잘하신 분의 포스팅을 아래 링크하니 참조 부탁드립니다.
그럼 포트포워딩의 이해가 어느 정도 됐으면 설정을 진행해 보겠습니다. 저희 집 공유기는 "tp-link"입니다. 웹브라우저 주소창에 '192.168.0.1'을 입력하면 공유기 설정이 가능하고 왼편 메뉴에서 '포워딩'을 클릭하면 아래와 같이 가상 서버를 설정할 수 있습니다. 여기서 서비스 포트에 사용하고 싶은 포트번호를 설정하면 됩니다. (4~5자리로 설정하시면 됩니다.) 저는 8787로 지정하였고, IP주소는 서버가 구성되어 있는 컴퓨터의 공유기 내부 IP주소를 입력하시면 됩니다.
다른 공유기를 사용하셔도 대부분 설정방법이 비슷하기 때문에 쉽게 설정하실 수 있습니다. 좀 더 자세한 이해를 위해서는 위에 링크를 참조 부탁드립니다. 정상적으로 포트포워딩이 설정되었으면 웹브라우저 주소창에서 "내 아이피:설정 포트"를 접속하면 이전에 APMSetup 설치 후 http://localhost로 확인한 화면과 동일한 화면이 출력됩니다. 이제 외부에서 내 아이피로 접속이 허용되는 상황입니다. (내 아이피 확인은 네이버에서 '내 아이피 주소 확인'이라고 검색하면 바로 나옵니다. ^^)
2. 아두이노 시리얼모니터(Serial Monitor)를 통한 웹서버 접속
다음은 시리얼 모니터를 통해 열려있는 포트로 웹서버에 접속을 진행하겠습니다. 우선 시리얼 모니터를 통해 와이파이까지 접속합니다. 그리고 AT+CIPSTART="TCP, "내 아이피 주소", 설정 포트(8787) 명령어로 웹서버에 접속합니다. 실행화면은 아래 그림 참조 부탁드립니다.
"CONNECT OK"라고 응답이 나오면 정상적으로 접속에 성공하였습니다.
3. AT command를 통한 data 송신
이제 process.php 프로그램을 통해 GET 방식으로 temp와 humi 값을 전송해 보겠습니다. 웹서버로 메시지를 보내기 위해 AT+CIPSEND 명령어를 사용합니다. 명령어 실행 후 GET /process.php?temp=20.7&humi=55.6 HTTP/1.0이라고 메시지를 보낼 겁니다. (temp=20.7, humi=55.6이라고 임의로 정하였습니다.) AT+CIPSEND 명령어는 보내고자 하는 text 수에 맞게 숫자를 설정해야 합니다. 그래서 명령어를 AT+CIPSEND=49라고 실행해야 합니다. 그럼 "OK" 응답이 나오면서 '>' 이렇게 메시지를 입력할 수 있습니다. 그럼 GET /process.php?temp=20.7&humi=55.6 HTTP/1.0 입력하고 엔터(Enter)를 한번 더 눌러줍니다.
메시지가 전송되면 "SEND OK" 응답은 무조건 나옵니다. 이 응답 말고 그 아래 '+IPD, 243:HTTP/1.1 200OK'란 응답이 와야 데이터가 정상적으로 전송된 겁니다. 그리고 맨 아래 줄의 응답 메시지를 보면 웹브라우저로 데이터를 DB서버로 보낼 때 (process.php 프로그램에서 설정된) 나왔던 응답 메시지와 동일하게 나온 것을 확인할 수 있습니다. ㅎㅎ
4. MySQL 접속 후 데이터 확인
그럼 MySQL에 접속하여 데이터가 저장되었는지 확인해 보겠습니다. 앞서 APMSetup으로 웹서버와 DB서버 구성할 때 만들었던 데이터베이스 tempnhumi 안의 테이블에 temp=20.7, humi=55.6이라고 저장된 것을 확인할 수 있습니다. 저는 여러 번 시험하느라 앞에 많은 데이터가 있는데요 ㅎㅎ 마지막에 데이터가 들어온 것을 확인하였습니다.
여기까지 아두이노(Arduino)로 ESP-01(ESP8266) Wifi 모듈을 사용해서 온라인으로 DB서버(MySQL)에 데이터를 보내는 방법을 알아보았습니다.
이제 모든 준비가 되었습니다. 여기까지 모두 정상적으로 진행하셨으면 온습도 센서(Temperature and Humidity sensor)에서 측정된 데이터를 ESP-01(ESP8266) Wifi 모듈을 통해서 온라인으로 DB서버(MySQL)에 저장하는 방법을 다 배웠습니다.
이 모든 것을 아두이노에서 실행이 되도록 스케치로 프로그램 코딩만 잘하면 됩니다. ㅎㅎ 다음 포스팅에는 코딩방법에 대해 알아보도록 하겠습니다.
긴 글 읽어주셔서 감사합니다. 궁금하신 부분이나 추가로 필요한 내용 있으면 언제든지 댓글로 남겨주세요 ^^
'아두이노 (Arduino) > 홈IoT 서버 (Sever)' 카테고리의 다른 글
아두이노 홈IoT 서버 활용 4: MySQL 데이터 내보내기, 추출 (data export) (5) | 2020.08.27 |
---|---|
아두이노 홈IoT 서버 활용 3: ESP8266(ESP-01) 이용하여 MySQL에 데이터 저장하는 프로그램 코딩 (30) | 2019.12.19 |
Arduino 아두이노 홈IoT 서버 활용 1: 웹브라우저를 통한 온습도 데이터 DB서버(MySQL)에 저장하기 (7) | 2019.11.30 |
Arduino 아두이노 홈 IoT(사물인터넷)을 위한 서버(Sever) 쉽게 만들기: APMSetup 프로그램 (5) | 2019.11.23 |
MySQL 시작하기: 데이터베이스(Database), 테이블(Table) 만들기 (0) | 2019.11.12 |
Arduino 아두이노 홈IoT 서버 활용 1: 웹브라우저를 통한 온습도 데이터 DB서버(MySQL)에 저장하기
아두이노(Arduino)를 이용한 홈 IoT(사물인터넷) 구축을 위해 웹서버(Web sever) 및 데이터베이스(Database, DB) 서버를 구성하는 방법을 지난 포스팅을 통해 알아보았습니다. 웹서버를 구성하는 도구로 AMP (Apache, MYSQL, PHP)를 알아보았고 이를 각각 사용하는 방법 또는 한번에 통합으로 설치하는 APMSetup 프로그램도 확인하였습니다. 이제 서버구성을 어느 정도 완료하였으니 아두이노의 센서에서 측정된 데이터가 DB서버에 저장되는지 확인이 필요합니다.
그래서 오늘은 웹브라우저를 통해서 데이터를 DB서버인 MySQL에 송신하여 저장하는 방법을 알아보고 정상적으로 MySQL에서 수신하여 저장되는지 확인해 보겠습니다. 진행에 앞서 서버 구성이 되지 않으신 분은 아래 서버 구성 방법에 대한 링크 참조 부탁드립니다. ^^
이번 포스팅은 아두이노의 센서에서 측정된 데이터를 DB서버인 MySQL로 데이터를 저장하기 위한 사전단계로 웹브라우저를 이용하여 입력된 데이터가 MySQL로 정상적으로 송수신되는지 확인하는 작업입니다. 따라서 아두이노는 잠깐 옆으로 밀어놓고 PHP 프로그램 코딩을 먼저 진행해 보겠습니다.
작업순서는 우선 PHP로 웹브라우저에 온도(Temperature)와 습도(Humidity)를 입력할 수 있는 창을 만드는 프로그램 코딩을 먼저하고, 임의의 숫자 데이터를 입력하면 아파치(Apache)로 구성된 웹서버를 통해 MySQL로 만들어진 DB서버의 테이블(Table)로 보내서 저장하는 프로그램을 역시 PHP로 만들 겁니다. 두 개의 PHP 파일을 만드는 거죠 ㅎㅎ
1. 데이터 입력 웹브라우저 프로그램
먼저 데이터를 입력할 수 있는 웹브라우저를 먼저 만들어보겠습니다. 메모장 또는 코딩 프로그램을 열어서 아래 코드블럭과 같이 코딩하고 파일명을 임의로 정하시고 *.php 확장자로 저장합니다. 메모장으로 작성하실 때는 지난번에도 설명드렸듯이 저장할 때 파일 형식을 모든 파일로, 인코딩은 UTF-8로 설정하고 저장하셔야 확장자가 php로 됩니다.
저는 파일명을 'input.php'로 저장하였습니다. 저장경로는 D:\APM_Setup\htdocs로 저는 APMSetup 프로그램을 통해 D 드라이버에 설치하였고 그 하위 폴더인 htdocs 폴더에 input.php 파일이 있어야 정상적으로 작동합니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<form action="process.php" method="get">
<p>Temperature : <input type="text" name="temp"></p>
<p>Humidity : <input type="text" name="humi"></p>
<p><input type="submit" /></p>
</form>
</body>
</html>
프로그램을 간단히 설명하면 전체 구성은 html(웹브라우저 프로그래밍 언어)로 작성되었고, 중간에 <body></body> 사이의 내용이 주된 내용입니다. 한 줄씩 아주 단순하게 보면
- //<form action="process.php" method="get"> : 데이터 입력하고 제출되면 "process.php" 프로그램이 실행되고, "get" 방식을 사용한다는 뜻입니다.
- //Temperature : <input type="text" name="temp">: Temperature를 "text" 형태로 입력할 수 있는 창을 만들고 입력된 데이터는 "temp"변수에 저장한다는 뜻입니다.
- //Humidity : <input type="text" name="humi">: Humidity를 "text" 형태로 입력할 수 있는 창을 만들고 입력된 데이터는 "humi" 변수에 저장한다는 뜻입니다.
- //<input type="submit"/> 입력된 데이터를 제출하는 버튼을 만듭니다.
저장 완료 후에 웹브라우저(저는 크롬을 사용)에서 http://localhost/input.php라고 입력하면 아래와 같이 Temperature와 Humidify를 입력할 수 있는 창이 만들어진 것을 확인할 수 있습니다.
2. 입력된 데이터를 MySQL에 저장하는 프로그램
앞서 만든 데이터 입력 웹브라우저에 Temperature와 Humidity를 입력하고 제출 버튼을 누르면 그 데이터를 MySQL로 저장하는 프로그램을 아래 코드 블록과 같이 코딩합니다. 역시 메모장이나 코딩 프로그램으로 작성하고 확장자를 php 파일로 저장하여 APMSetup 설치 폴더의 하위 폴더 htdocs 폴더에 저장합니다.
저장 파일명은 반드시 process.php로 하셔야 하는데 앞서 input.php 코딩 시 process.php를 다른 이름으로 임으로 정하셨으면 그 바꿔주신 파일명과 동일해야 합니다.
<?php
header("Content-Type: text/html;charset=UTF-8");
$host = 'localhost';
$user = 'root';
$pw = 'apmsetup';
$dbName = 'testdb';
$mysqli = new mysqli($host, $user, $pw, $dbName);
if($mysqli){
echo "MySQL successfully connected!<br/>";
$temp = $_GET['temp'];
$humi = $_GET['humi'];
echo "<br/>Temperature = $temp";
echo ", ";
echo "Humidity = $humi<br/>";
$query = "INSERT INTO tempnhumi (temp, humi) VALUES ('$temp','$humi')";
mysqli_query($mysqli,$query);
echo "</br>success!!";
}
else{
echo "MySQL could not be connected";
}
mysqli_close($mysqli);
?>
코딩하실 때 반드시 확인하실 점은 코드 첫 문단이 MySQL접속과 관련됩니다. 여기서 MySQL의 user명과 비밀번호, 데이터베이스 이름을 각자 설정한 대로 수정하셔서 사용하셔야 합니다.
그리고 $query 설정에서 데이터를 저장할 테이블 이름도 본인이 만든 테이블명과 각 칼럼(Column) 이름을 맞춰야 합니다. 아래 코드에서 저는 테이블 명이 'tempnhumi'이고 각 칼럼의 이름이 'temp', 'humi'라고 만들었기 때문에 아래와 같이 작성하였습니다. 코드 설명은 직관적으로 tempnhumi 테이블의 temp, humi 칼럼에 변수(VALUES) 값 $temp, $humi를 각각 저장해라("INSERT INTO")라는 내용이 됩니다.
파일을 저장 후 다시 웹브라우저에서 http://localhost/input.php을 주소창으로 실행 후 Temperature와 Humidity에 실수 범위의 숫자를 입력하고 (저는 임의 온도는 25.1, 습도는 55.3으로 입력하였습니다.) 제출을 누르면 "MySQL successfully connected!"라고 MySQL 접속을 성공적으로 하고, Temperature와 Humidity 값을 제가 입력한 값인 25.1, 55.3으로 각각 확인할 수 있습니다. 그리고 최종적으로 "success!!"라고 출력되면 정상적으로 진행이 완료된 것입니다.
주소창을 보면 'localhost/process.php?temp=25.1&humi=55.3'이라고 input.php 프로그램에서 코딩하였듯이 데이터가 제출되면 자동으로 process.php가 실행되어 온습도 값이 MySQL에 저장되는 과정을 나타냅니다.
그럼 데이터가 정말 저장되었는지 확인해 보겠습니다. MySQL 관리를 실행하여 phpMyAdmin을 통해 데이터 베이스의 테이블에서 확인 가능합니다.
지난번 'Arduino 아두이노 홈 IoT(사물인터넷)을 위한 서버(Sever) 쉽게 만들기: APMSetup 프로그램 (https://it-g-house.tistory.com/entry/AMPSetup)' 포스팅에서 만든 데이터베이스 'testdb'의 테이블 'tempnhumi'에서 온도는 25.1, 습도는 55.3으로 데이터가 저장되어 있는 것을 확인할 수 있습니다.
와~우!! 신기하죠? ㅎㅎ 전 너무너무 신기해서 몇 번씩 계속 저장해봐서 저렇게 데이터가 많이 쌓였습니다. ^^ PHP 코드에 관해서는 추후에 자세히 정리해 보도록 하겠습니다.
여기까지 웹브라우저를 통해 온습도(Temperature and Humidity) 데이터를 MySQL의 데이터베이스(Database, DB) 서버에 저장하는 방법을 알아보았습니다. 앞서 얘기했듯이 오늘 포스팅은 아두이노(Arduino)의 DHT11 온습도 센서로 측정된 데이터를 MySQL에 저장하기 위한 사전 작업으로 다음 포스팅에서는 측정된 데이터를 MySQL에 연동하는 방법을 알아보도록 하겠습니다.
오늘도 긴 글 읽어주셔서 감사합니다.
'아두이노 (Arduino) > 홈IoT 서버 (Sever)' 카테고리의 다른 글
아두이노 홈IoT 서버 활용 3: ESP8266(ESP-01) 이용하여 MySQL에 데이터 저장하는 프로그램 코딩 (30) | 2019.12.19 |
---|---|
아두이노 홈IoT 서버 활용 2: ESP8266(ESP-01) 이용하여 DB서버(MySQL)에 온습도 데이터 저장하기 (45) | 2019.12.03 |
Arduino 아두이노 홈 IoT(사물인터넷)을 위한 서버(Sever) 쉽게 만들기: APMSetup 프로그램 (5) | 2019.11.23 |
MySQL 시작하기: 데이터베이스(Database), 테이블(Table) 만들기 (0) | 2019.11.12 |
아두이노(Arduino) 홈 IoT(사물인터넷)을 위한 서버(Sever) 구성 3: PHP 설치 방법 (4) | 2019.11.10 |
Arduino 아두이노 초음파(거리) 센서(ultrasounds sensor) 사용방법
앞서 포스팅에서 온습도 센서(Temperature and Humidity sensor)만 가지고 아두이노의 기본적인 동작법이나 파일 저장법, 그래프 그리기, 엑셀(Excel)과 연동하는 방법들을 알아보았습니다. 그리고 인터넷(Internet) 사용법과 웹서버(Web server) 만드느라 많은 시간을 보냈는데요 ^^ 오늘은 재미있는 센서를 하나 소개드리려고 합니다.
바로 초음파(ultrasound(s), ultrasonic wave) 센서입니다. 인터넷에 찾아보면 거리 센서라고 많이 검색되는데 초음파를 쏴서 돌아오는 시간을 계산해서 거리를 측정할 수 있는 예제가 많이 알려져서 그런 것 같습니다 ^^ 이번 포스팅에서는 초음파 센서 사용방법과 프로그램 코딩에 대해 알아보겠습니다.
- HC-SR04 초음파 센서
온라인에서 '초음파 센서'를 검색하면 아두이노용으로 많이 사용하는 모델은 'HC-SR04' 모듈입니다. 생긴건 마치 스피커처럼 생겼는데요 ㅎㅎ 아두이노 작품들 중에 로봇류는 대부분 이 HC-SR04 센서로 눈처럼 꾸며서 사용하는걸 많이 보았습니다.
"초음파(超音波, 영어: ultrasound(s), ultrasonic wave)는 인간이 들을 수 있는 가청 최대 한계 범위를 넘어서는 주파수를 갖는 주기적인 '음압'(音壓, sound pressure)을 의미한다." (출처: 위키피디아) 즉, 사람이 들을 수 없는 고주파수 영역대의 음파를 말합니다. 건강하고 젊은 사람이 대략 20KHz의 영역을 들을 수 있고 사람이 들을 수 있는 이상의 영역이 초음파 영역이라고 생각하시면 됩니다.
아두이노에서 사용할 HC-SR04 초음파 센서는 대락 40KHz 영역대의 초음파를 방출합니다. 송신기와 수신기인 두개의 초음파 트랜스 듀서(Ultrasonic transducer)가 있고, 수신기(Chirp: 주파수 변조 방식을 사용하는 펄스 압축의 하나)에서 방출된 초음파가 물체에 반사되어 수신기(Echo)에 돌아온 시간을 통해서 거리를 계산하는 방법을 사용합니다.
동작 전압 | 5V DC |
동작 전류 | 15mA |
발생 초음파 | 약 40kHz |
effectual angle | <15도 |
측정 범위 | 2 ~ 400 cm |
오차 | 0.3 cm |
초음파 속도 | 340 m/s |
- HC-SR04 초음파 센서 연결방법
HC-SR04 초음파 센서는 5V 구동입니다. 모듈의 VCC 핀을 아두이노의 5V에 연결하고 GND는 GND에 연결합니다. 위에서 설명한 송신부인 Chirp는 모듈에서 Trig 핀이며 아두이노 12번 Pin에 연결하고, 수신부 Echo 핀을 8번 Pin에 연결합니다. Trig와 Echo 핀이 연결된 아두이노의 디지털 핀(DIGITAL Pin)은 프로그램상으로 변경 가능하니 원하시는 데로 임의로 연결하셔도 됩니다.
- HC-SR04 초음파 센서 프로그램 코딩 방법
HC-SR04 초음파 센서는 따로 '라이브러리(Library)'가 없어도 됩니다. 앞서 아두이노 프로그램 코딩 초급편에서 다루었던 'pinMode'와 'digitalWrite' 명령어를 주로 사용하고 추가로 'pulseIn' 명령어를 사용하여 거리를 측정하는 프로그램을 코딩하도록 하겠습니다. 'pinMode'와 'digitalWrite' 명령어에 대한 내용과 간단한 예제는 아래 링크 참조 부탁드립니다.
명령어 | 기능 | 사용법 |
pinMode | I/O 핀의 입출력 설정 | pinMode(pin#, mode); |
digitalWrite | 디지털 핀에 High, Low 값 출력 | digitalWrite(pin#, HIGH); or digitalWrite(pin#, LOW); |
pulseIn | 아두이노 핀으로 입력되는 펄스의 시간을 측정하는 함수 | pulseIn(pin#, High); or pulseIn(pin#, Low); |
int echo = 8;
int trig = 12;
void setup() {
Serial.begin(9600);
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
}
void loop() {
float cycletime;
float distance;
digitalWrite(trig, HIGH);
delay(10);
digitalWrite(trig, LOW);
cycletime = pulseIn(echo, HIGH);
distance = ((340 * cycletime) / 10000) / 2;
Serial.print("Distance:");
Serial.print(distance);
Serial.println("cm");
delay(500);
}
HC-SR04 모듈을 아두이노에 연결한대로 trig = 12, echo = 8로 지정해주고 pinMode를 통해 trig는 Output(송신), echo는 Input(수신)으로 설정하였습니다. 그리고 cycletime(시간), distance(거리)를 실수(float)로 변수 지정을 하고, digitalWrite를 통해 trig에서 초음파가 송신하도록 'High' 명령을 주고 10 msec delay 후 'Low'로 신호를 끕니다. 그럼 송신된 초음파가 물체에 반사되어 echo에 수신 (신호가 High로 전환)될 때까지의 시간을 pulseIn 명령어를 통해 distance 변수에 저장합니다. 마지막으로 초음파가 물체를 맞고 돌아온 시간과 초음파의 속도 340 m/s를 이용하여 cm 단위로 거리를 계산합니다. 왕복거리라 마지막에 나누기 2가 들어갑니다. ^^
프로그램 코딩 완료 후 스케치(Sketch)를 통해 아두이노에 업로드 후 시리얼 모니터(Serial Monitor)를 실행하면 아래와 같이 거리를 계속 센싱하여 출력해서 보여줍니다. 통신속도(Baudrate) 맞추는 건 이제 기본으로 하시죠? ㅎㅎ
여기까지 아두이노(Arduino)로 HC-SR04 초음파 센서(ultrasounds sensor) 사용방법 과 거리를 측정하는 간단한 프로그램을 코딩해보았습니다. 정말 재미있는 센서인 거 같습니다. ^^ 조만간 초음파 센서를 이용하여 거리를 측정하는 것뿐만 아니라 적외선 센서처럼 물건이나 사람을 감지할 수도 있으니 사람을 감지하여 외부기기를 동작하거나 멈추는 간단한 프로젝트를 진행해 보도록 하겠습니다.
오늘도 긴 글 읽어주셔서 감사합니다. 질문이나 추가적으로 필요하신 내용 있으면 언제든지 댓글로 남겨주세요~ ^^
'아두이노 (Arduino) > 아두이노 센서&모듈 (Sensor)' 카테고리의 다른 글
Arduino 아두이노 멀티플렉서(Multiplexer, MUX) 사용방법 (5) | 2020.04.21 |
---|---|
아두이노(Arduino)에서 토양수분센서(soil moisture sensor) 사용 (3) | 2020.03.15 |
Arduino 아두이노 릴레이 (Relay, 스위치) 사용방법 (2) | 2020.03.08 |
Arduino 아두이노 초음파(거리) 센서(ultrasounds sensor) 활용: 사람 인식하는 전자기기 작동 시스템 (2) | 2019.12.14 |
Arduino 아두이노 온도 습도 센서(Temperature and Humidity sensor) 종류 및 사용법 (0) | 2019.11.03 |
Arduino 아두이노 홈 IoT(사물인터넷)을 위한 서버(Sever) 쉽게 만들기: APMSetup 프로그램
아두이노(Arduino)를 사용해서 홈 IoT(사물인터넷)을 구축하는 프로젝트를 위해서는 인터넷을 통한 데이터 전송이 기본적으로 가능해야 합니다. 인터넷을 사용하여 웹을 통해 데이터를 송수신하려면 웹서버(Web sever)가 필요하고, 지난 포스팅에서는 웹서버를 구축하는 방법으로 가장 많이 알려진 A.M.P(Apache, MySQL, PHP) 프로그램 설치 방법과 연동하는 방법에 대해서 알아보았습니다.
여기서 Apache로 웹서버를 만들어 데이터를 수신하고, 받은 데이터를 데이터베이스 서버(DataBase server), DB서버에 쌓아놓고 필요할 때 출력하거나 가공할 수 있는 데이터베이스 프로그램이 MySQL, 그리고 프로그램 언어 PHP (Professional HyperText Preprocessor) 소프트웨어를 통해 Apache와 MySQL과 연동하여 코딩을 할 수 있습니다.
'아두이노(Arduino) 홈 IoT(사물인터넷)을 위한 서버(Sever) 구성 1: Apache 아파치 설치방법'을 시작으로 MySQL, PHP 프로그램 각각을 설치하니 너무 복잡하고 어렵고, 문제가 발생하면 문제 해결에도 많은 난항을 경험하셨을 겁니다... (컴퓨터 던져 버릴 뻔한 적이 많죠...ㅠㅠ 마우스는 이미..) 그래서!! 역시 쉽게 편하게를 추구하는 저는!! 또 찾았습니다 ㅎㅎ 패키지 프로그램이 있다는 사실을요!!! 와~~ 씨!! 진작에 좀 알려주지!! 정말 죄송합니다... 그래서 앞서 사용했던 Apach와 MySQL, PHP를 한방에! 설치와 연동까지! 해주는 프로그램 'APMSetup'!! 사용방법에 대해서 알아보겠습니다.
- APMSetup 프로그램 설치
APMSetup 프로그램은 http://kldp.net/apmsetup/release/에서 다운로드할 수 있습니다. 'APMSETUP7' 설치 파일 다운로드하여 설치를 진행합니다.
기본적인 프로그램 설치와 같이 동의할 거 동의하고 '다음'을 누르면 구성요소 선택이 나옵니다. 그럼 설정되어 있는 그대로 '다음'으로 진행하면 됩니다. 설치에 필요한 디스크 공간은 116.8MB로 꽤 커서 저는 D드라이브에 설치를 진행하였습니다.
설치를 진행하다 보면 Apache 프로그램 액세스 허용 여부가 나오는데 액세스 허용으로 계속 진행합니다. 설치가 완료되면 APMSETUP Monitor 바로가기 아이콘이 생깁니다.
프로그램을 실행하면 공지 창이 뜨고 업데이트를 진행하라고 창이 또 뜰겁니다... 업데이트는 어차피 진행이 안되고 공지 내용도 아무 내용이 없어서 그냥 무시하면 되는데 실행할 때마다 창이 뜨는 걸 방지하기 위해 '서버 환경설정'에서 '자동 업데이트 사용'과 'APMSETUP NOTICE 표시'의 체크를 지우면 더 이상 창이 뜨지 않을 겁니다.
모니터 보기를 하면 아래와 같이 'Apache2: 정상 동작중, MySQL 5: 정상 동작중'이라고 표시되어 있는 창을 볼 수 있습니다.
그럼 이전 포스팅에서 Apache 단독 설치 때 확인하였듯이 'http://localhost' 또는 '127.0.0.1' 주소로 정상 작동 중인지 확인해 보겠습니다. 웹브라우저에서 'http://localhost' 입력해주면 "APMSETUP이 정상적으로 설치 되었습니다." 라고 확인할 수 있습니다. PHP info 도 바로 확인 가능합니다!! PHP와 Apache 연동을 위해 이런저런 설정을 바꿔주던걸 하지 않아도 됩니다 ㅠㅠ 역시 단독으로 설치해서 서로 연동하는 거보다 훨~씬 편하네요 ^^
- MySQL 데이터베이스(Database), 테이블(Table) 만들기
APMSETUP 설치가 완료되었으니 MySQL을 통해 데이터베이스와 테이블을 만들어 보겠습니다. 지난 포스팅에서는 명령 프롬프트(MySQL 콘솔)를 통해 명령어를 직접 입력하면서 데이터베이스와 테이블을 만들었습니다. 관련 내용은 아래 링크 참조 부탁드립니다.
프로그램을 정상적으로 운영하려면 명령 프롬프트의 사용을 권장하는 편이지만 APMSETUP에서는 'MySQL관리'인 'phpMyadmin 프로그램'을 통해 보다 직관적으로 쉽게 데이터베이스와 테이블 및 MySQL 전반적인 부분까지 운영할 수 있도록 도와줍니다. APMSETUP Monitor 메뉴에서 MySQL 관리를 실행해주세요~
MySQL 관리를 실행하면 아래와 같이 로그인 화면이 나옵니다. 사용자명은 'root', 암호는 'apmsetup'으로 초기 설정되어 있습니다. 로그인을 진행합니다.
로그인을 진행하는데 간혹 아래와 같이 오류가 발생할 수도 있습니다. 그러면 앞에서 확인하였던 http://localhost 웹페이지를 통해서 접속을 다시 해보시면 정상적으로 로그인이 가능합니다. 혹시 그래도 안되면.. 오류 해결 방법으로 검색해보세요.. 많은 고수들의 다른 방법들도 찾을 수 있을 거예요 ^^
phpMyAdmin에 접속하면 아래와 같이 UI를 통해 MySQL의 데이터베이스와 그에 속한 테이블을 카테고리 형태로 확인할 수 있습니다. 하나하나 클릭하면서 내용을 확인해보시면 직관적으로 금방 내용을 확인하실 수 있습니다.
그럼 이제 새로운 데이터베이스를 만들어 보겠습니다. 로그인 후 첫 화면 중앙을 보면 '새 데이터베이스 만들기'를 확인할 수 있습니다. 새로 만들 데이터베이스 이름을 정하고 '만들기'를 클릭합니다. 저는 "testDB"로 새로 만들어 보겠습니다. 이어서 바로 새로운 테이블 만드는 창을 확인할 수 있습니다. 그럼 새로 만들 테이블의 이름을 정하고 fields 수는 칼럼(column) 수라고 생각하시면 됩니다. 저는 우선 계속해서 다루고 있는 DHT11을 이용한 온습도 데이터를 DB서버로 보낼 생각이기 때문에 테이블 이름은 "tempnhumi"로 fields 수를 2개로 진행하였습니다.
fields (columns) 수까지 정하고 '실행'을 클릭하면 아래와 같이 각각 칼럼(column)에 대한 정보를 입력하는 창을 확인할 수 있습니다. 필드는 각 칼럼의 이름이고 종류는 데이터의 종류로 정수(int)나 실수(Float) 및 text 등을 정할 수 있습니다. 길이/값은 데이터의 bit수로 숫자나 영문의 경우 한자리가 1 bit라고 생각하시면 됩니다. 저의 경우 온도나 습도의 최고 값은 100.0일 테니 소수점 포함 5자리로 정하였습니다. 그리고 인덱스에서 PRIMARY key가 될 데이터를 지정하고 '저장'을 클릭하면 됩니다.
이렇게 하면 다 만들어졌습니다 ㅎㅎ 완~전 편하죠? 의심스럽나요? ㅎㅎ 저 역시 의심이 많아서 MySQL 콘솔을 통해서 확인해 보았습니다. MySQL콘솔은 이전 포스팅에서 설명한 명령 프롬프트로 실행하는 것과 똑같습니다. 콘솔을 실행하면 비밀번호를 입력하면 되는데 변경하지 않으셨으면 초기 비밀번호인 'apmsetup'을 입력하면 됩니다.
로그인 후 데이터베이스 확인과 테이블 확인, 테이블 내부 사항까지 다 확인해 봤는데 놀랍도록 정확하게 만들어져 있습니다. 와~ 우!! (그동안 고생한 거 생각하면... ㅠㅠ) 아래 명령어는 앞서 링크드린 'MySQL 시작하기: 데이터베이스(Database), 테이블(Table) 만들기'를 확인 부탁드립니다.
여기까지 웹서버(Web server) 구성 통합 프로그램 APMSetup 설치 및 사용방법에 대해 알아보았습니다. 4번에 걸쳐서 포스팅한 내용이 한방에 진행되어 어찌 좀 허무하긴 한데요... 그래도 이렇게 편한 프로그램이 있으니 얼마나 고맙나요~ 고수님들 감사합니다 ^^
웹서버를 구성해주는 통합 프로그램은 APMSetup뿐만 아니라 Wamp64, Xampp, Autoset 등 많이 사용하는 프로그램이 몇 개 더 있습니다. 사실 APMSetup은 업데이트된 지 좀 오래되어 MySQPL이나 PHP 버전이 낮지만 통합 프로그램에 따라 DB서버 프로그램이 MySQL 또는 MariaDB 기반으로 좀 다를 수 있기 때문에 MySQL 기반으로 하는 APMSetup으로 먼저 진행하였습니다. 그리고 한글이 지원된다는 거가 강점!! Wamp64, Xampp, Autoset 등은 추후 하나씩 알아보도록 하겠습니다.
오늘도 긴 글 읽어 주셔서 감사합니다. 궁금하신 거나 추가로 필요한 내용 있으면 언제든지 댓글로 남겨주시면 열심히 연구하여 답변드리도록 하겠습니다 ^^
'아두이노 (Arduino) > 홈IoT 서버 (Sever)' 카테고리의 다른 글
아두이노 홈IoT 서버 활용 2: ESP8266(ESP-01) 이용하여 DB서버(MySQL)에 온습도 데이터 저장하기 (45) | 2019.12.03 |
---|---|
Arduino 아두이노 홈IoT 서버 활용 1: 웹브라우저를 통한 온습도 데이터 DB서버(MySQL)에 저장하기 (7) | 2019.11.30 |
MySQL 시작하기: 데이터베이스(Database), 테이블(Table) 만들기 (0) | 2019.11.12 |
아두이노(Arduino) 홈 IoT(사물인터넷)을 위한 서버(Sever) 구성 3: PHP 설치 방법 (4) | 2019.11.10 |
아두이노(Arduino) 홈 IoT(사물인터넷)을 위한 서버(Sever) 구성 2: MySQL 설치방법 (0) | 2019.11.10 |