[아두이노] 릴레이 모듈+온도센서+DC모터 응용
[아두이노] 릴레이 모듈+온도센서+DC모터 응용
- 온라인 가상시뮬레이터 : https://www.tinkercad.com/
- 참고자료 : [아두이노] 릴레이 모듈 제어
[아두이노] 온도센서(TMP36) 제어 - 회로도 공개 : https://www.tinkercad.com/things/8u2XtwS8VxA
다른 주제로 포스팅을 끝냈는데 @ellenalee 님이 릴레이 모듈로 선풍기를 제어 해보셨다고 하셔서 이걸 한번 비슷하게 구현해보면 릴레이 모듈의 응용으로 괜찮을 것 같아서 가상시뮬레이터에서 느낌만 비슷하게 한번 구현해 보도록 하겠습니다.
1. 회로도 구성
- 준비물 : relay DPDT 1개, DC Motor 1개, Temperature Sensor[TmP36] 1개, Power Supply, 아두이노우노
- 내용 : 온도센서의 값에 의해서 모터가 회전할 수 있게 회로도를 구성해 보자.
대충 DC Motor가 선풍기라고 생각해 봅시다. 느낌은 그런데로 비슷해가 표현 했네요.
3. 코딩
- 사용함수 : analogRead(), map()
- 내용 : LED 깜박이는 소스를 이용해서 그 값을 제어값으로 해서 Light bulb 깜박이게 해보자.
- 참고소스 : [아두이노] 온도센서(TMP36) 제어
복습
- analogRead(아날로그핀) : 아날로그신호값을 읽음
- map(입력값,입력최소값,입력최대값,출력최소값,출력최대값) : 입력값이 입력범위에 기준에 맞게 출력범위의 해당값을 출력.
변형함수(만든함수)
- fmap(입력값,입력최소값,입력최대값,출력최소값,출력최대값) : map()함수와 동일하지만 자료형 타입을 float형으로만 변경했습니다. 계산값이 실수형 값이라서 map()함수를 사용하기가 애매해서 인자들을 전부 float형으로 변경했네요.
[ 온도센서 측정 소스 ]
[아두이노] 릴레이 모듈+온도센서+DC모터 응용1 2 3 4 5 6 7 8 9 10 11 12 13 14 | void loop(){ float V =fmap(analogRead(A0), 0 , 1023 , 0 , 5 ); //map함수 원리를 이용한 다이렉트 Voltage계산 //공식 //float V = analogRead(A0)*5.0/1023; float C = (V- 0.5 )* 100 ; //섭씨 C = (F-32)*1.8; float F = C* 9.0 / 5.0 + 32 ; //화씨 F = C*1.8+32; } float fmap( long x, long in_min, long in_max, float out_min, float out_max) { return (x - in_min) * (out_max - out_min) /( float ) (in_max - in_min) + out_min; } |
여기서 대충 온도 C변수 값에 따라서 릴레이모듈를 제어하면 되겠죠
[아두이노] 릴레이 모듈+온도센서+DC모터 응용1 2 3 4 5 6 | if (C> 35 ){ //35도 이상이면 참 digitalWrite( 2 , HIGH); //스위치 켜라 } else { digitalWrite( 2 , LOW); //스위치 꺼라 } |
끝! 간단하게 느낌만 살렸습니다.
전체적인 코드를 살펴보면,
[아두이노] 릴레이 모듈+온도센서+DC모터 응용1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | void setup() { Serial.begin( 9600 ); pinMode( 7 , INPUT_PULLUP); pinMode( 2 , OUTPUT); } void loop() { float V =fmap(analogRead(A0), 0 , 1023 , 0 , 5 ); //map함수 원리를 이용한 다이렉트 Voltage계산 float C = (V- 0.5 )* 100 ; //섭씨 C = (F-32)*1.8; if (C> 35 ){ digitalWrite( 2 , HIGH); } else { digitalWrite( 2 , LOW); } } float fmap( long x, long in_min, long in_max, float out_min, float out_max) { return (x - in_min) * (out_max - out_min) /( float ) (in_max - in_min) + out_min; } |
4. 결과
[ 35도 이하일때 ] : 그림에서는 25도 위치
[ 35도 이상일때 ] : 그림에서는 57도 위치
동영상을 찍어야 했지만 그냥 이미지로 간단히 차이점을 화살표로 표시 해 놨습니다. 25도일때는 0.00A로 전류가 흐르지 않는 상태이고 57도 위치에서는 79.9mA로 전류가 흐르는 상태입니다. 그 차이점으로 확인해주시기 바랍니다.
코딩에서는 35도 이상이면 모터가 회전되게 되어 있습니다. 실제 시뮬레이터로 돌아가는 장면을 보고 싶으면 공개되 회로도에서 바로 시뮬레이터를 실행 시켜서 그 결과를 확인 할 수 있습니다.
링크된 곳으로 가면 위 그림과 같은 창이 뜹니다. 거기서 1번 눌러주셔서 2번의 시뮬레이터 실행버턴의 창이 뜹니다. 그리고 2번을 누르시면 실행을 시킬 수 있습니다. 한번 온도조절을 해보시고 결과를 확인해 보세요.
마무리
상상이 어렵지만 표현은 그렇게 어렵지 않습니다. 매번 상상의 나래를 펼치라는 멘트를 날리는 이유가 바로 그 이유입니다. 온도에 따라서 선풍기를 자동을 켜볼까라는 상상력이 뭔가를 만들어 냅니다.
여러분들도 어떤 원리를 배우게 되면 그 원리에서만 멈추지 말고 상상력을 더해서 새로운 뭔가를 창조할 수 있는 능력을 키우시면 엄청난 결과를 얻을 수 있을 거에요.
언제나 그럴듯이 상상의 나래를 펼쳐 보세요.
'IOT > 아두이노' 카테고리의 다른 글
[아두이노] 8x8 도트매트릭스 제어 (0) | 2019.03.30 |
---|---|
[아두이노] 아두이노 변수란 (0) | 2019.03.29 |
[아두이노] 릴레이 모듈 제어 (0) | 2019.03.27 |
[아두이노] 2진수 계산법 암기 (0) | 2019.03.26 |
[아두이노] 3x3x3 CUBE LED 패턴 놀이 (0) | 2019.03.25 |