아!두이노, 라즈베리, 코딩 노가다
지능형 온도 경고 시스템 #4 (아두이노 우노 R4 러닝 키트) 본문
본 리뷰는 IC뱅크에서 제품을 무상 제공받아 작성된 체험 리뷰 입니다. 스폰서 배너 삽입 및 표시 광고법 문구 포함이 됩니다.
본 포스팅은 제품을 무상 제공받아 작성된 체험단 리뷰입니다.
아두이노 우노 R4러닝 키트 https://vo.la/ITrP1f3
아두이노 우노 R4 러닝 키트 : 신제품 > NEW 코딩교육몰
아두이노 기본 실습과 IoT 프로젝트 실습에 효율적인 키트입니다.아두이노 UNO R4 WiFi 메인보드를 사용하고 26개의 전자 모듈을 하나의 PCB에 통합하였습니다. - 130000원 국내 최대 전자부품 전문 쇼
www.icbanq.com

이전 코딩에 대하여 알아보자.
이전 코딩은 아주 단순해서 크게 문제시 되지는 않는다.
그러나 다른 제어센서를 달면 문제를 야기 할 수도 있다.
예를 들어 온도에 따라 팬을 작동하거나 가열기 히트를 작동한다고 하면 이야기는 달라 진다.
쉽게 이야기 하면 주위 온도가 팬을 작동했을때 다시 낮게하면 팬은 꺼졌다가 다시 켜지는것을 반복 할 수가 있다.
또 다른 예로 온도가 낮아져 히트를 작동하는 경우 히트가 켜졌다 다시 꺼지는것을 반복 할 수가 있다.
단순 가정용이면 큰 문제는 없다. 그러나 정밀한 시스템인 경우 문제를 야기 하여 기계의 고장이 발생 할 수가 있다.
그래서 적용하는 개념이 대드밴드 라는 개념이다. 죽은밴드를 설정하는것이다.
참고로 이 코드가 설명하는 개념은 데드밴드(dead band), 다른 말로 히스테리시스(hysteresis) 제어입니다.
동작 원리
control() 함수는 다음 한 줄로 요약됩니다.
출력 = (현재값 ≤ 25) 그리고 (현재값 ≤ 15 또는 직전 출력이 ON)
여기서 핵심은 static 변수 case4입니다. static 변수는 함수 호출이 끝나도 값이 사라지지 않습니다. 그래서 case3 = case1 || case4;를 계산하는 순간의 case4에는 직전 호출의 출력값이 들어 있습니다. 이것이 릴레이 회로의 자기유지 접점과 같은 역할을 해서, 한 번 ON이 되면 상한값을 넘을 때까지 ON이 유지됩니다.
실행 결과
| 입력값 | 상승할 때 (-10 → 45) | 하강할 때 (50 → -10) |
|---|---|---|
| 50 | OFF | |
| 45 ~ 30 | OFF | OFF |
| 25 | ON | OFF |
| 20 | ON | OFF |
| 15 | ON | ON |
| 10 ~ -10 | ON | ON |
20과 25에서 결과가 다른 것이 데드밴드의 특징입니다. 같은 입력값이라도 값이 올라오는 중이었는지(직전에 ON), 내려오는 중이었는지(직전에 OFF)에 따라 출력이 달라집니다.
데드밴드를 쓰는 이유
기준값을 하나만 두고 "20 이하면 ON, 20 초과면 OFF"로 제어하면, 온도가 20 근처에서 조금만 흔들려도 히터나 릴레이가 1초에도 여러 번 켜졌다 꺼졌다를 반복합니다. 이를 채터링(chattering)이라고 하며, 릴레이 접점과 모터, 압축기의 수명을 크게 줄입니다.
ON 기준과 OFF 기준 사이에 간격(이 코드에서는 15~25)을 두면, 그 구간에서는 상태를 바꾸지 않으므로 잦은 전환이 사라집니다. 앞의 온도 경보 시스템에도 이 방식을 적용하면, 온도가 28℃ 경계에서 오락가락할 때 LED와 부저가 계속 바뀌는 문제를 막을 수 있습니다.
상승할 때와 하강할 때 출력이 바뀌는 지점이 다르다는 것이 핵심이라, 두 경로를 한 그래프에 겹쳐 그렸습니다.

빨간 실선(상승)은 ON 상태로 출발해 15~25 구간을 지나도 계속 ON을 유지하다가, 25를 넘는 순간 OFF로 떨어집니다. 파란 점선(하강)은 OFF 상태로 출발해 같은 구간을 지나도 계속 OFF를 유지하다가, 15 이하가 되는 순간 ON으로 올라갑니다.
두 경로가 사각형 모양의 고리를 이루는 것이 히스테리시스의 전형적인 모습입니다. 가운데 주황색 구간이 데드밴드이며, 같은 20이라도 상승 중이면 ON, 하강 중이면 OFF가 되는 이유가 그래프에서 바로 보입니다.
참고로 코드는 5 단위로 값을 바꾸기 때문에 실제로는 25에서 30으로 넘어갈 때 OFF가 됩니다. 그래프에서는 기준값이 잘 보이도록 전환선을 25 위치에 그렸습니다
/*
데드밴드(Dead Band) / 히스테리시스(Hysteresis) 제어 예제
하한값(15) 이하가 되면 출력이 ON 되고,
상한값(25)을 넘어서면 출력이 OFF 됩니다.
15 ~ 25 사이(데드밴드 구간)에서는 출력이 바뀌지 않고 직전 상태를 유지합니다.
예) 히터 제어: 15도 이하가 되면 히터를 켜고, 25도를 넘으면 끔.
그 사이 온도에서는 켜져 있던 히터는 계속 켜져 있고,
꺼져 있던 히터는 계속 꺼져 있음.
*/
#include <stdio.h> // printf 사용 (원본 코드에 없어 추가)
#include <stdbool.h> // C에서 bool, true, false 사용 (원본 코드에 없어 추가)
// main보다 아래에 정의된 함수를 먼저 사용하기 위한 함수 원형 선언 (원본 코드에 없어 추가)
bool control(double _1st, double _2st, double value);
int main(int argc, char** argv)
{
// [1] 값이 상승하는 경우: -10부터 45까지 5씩 증가
for(double i = -10; i < 50; i+=5)
{
bool onoff = control(15, 25, i); // 하한 15, 상한 25로 제어 결과 계산
printf("i = %lf, onoff %s\n", i , onoff ? "true" : "false");
}
// [2] 값이 하강하는 경우: 50부터 -10까지 5씩 감소
for(double i = 50; i >= -10; i-=5)
{
bool onoff = control(15, 25, i);
printf("i = %lf, onoff %s\n", i , onoff ? "true" : "false");
}
return 0;
}
/*
데드밴드 제어 함수
_1st : 하한값 (이 값 이하이면 ON 시작)
_2st : 상한값 (이 값을 넘으면 OFF)
value : 현재 입력값 (예: 현재 온도)
반환값 : 출력 상태 (true = ON, false = OFF)
*/
bool control(double _1st, double _2st, double value)
{
bool case1; // 현재 값이 하한값 이하인가?
bool case2; // 현재 값이 상한값 이하인가?
static bool case3 = false; // ON 조건 (static: 함수가 끝나도 값이 유지됨)
static bool case4 = false; // 최종 출력 (static: 직전 출력 상태를 기억함)
case1 = value <= _1st ? true:false; // 하한값 이하이면 true
case2 = value <= _2st ? true:false; // 상한값 이하이면 true
// ON 조건: 하한값 이하로 내려왔거나, 이미 ON 상태였으면 true
// (case4에는 아직 "직전" 출력값이 들어 있음 → 자기유지 역할)
case3 = case1 || case4;
// 최종 출력: ON 조건을 만족하면서 상한값을 넘지 않았을 때만 ON
// 상한값을 넘으면 case2가 false가 되어 강제로 OFF
case4 = case2 && case3;
return case4;
}'아두이노 > 센서' 카테고리의 다른 글
| 지능형 온도 경고 시스템 #6 (아두이노 우노 R4 러닝 키트) (0) | 2026.10.02 |
|---|---|
| 지능형 온도 경고 시스템 #5 (아두이노 우노 R4 러닝 키트) (0) | 2026.10.02 |
| 지능형 온도 경고 시스템 #3 (아두이노 우노 R4 러닝 키트) (0) | 2026.10.01 |
| 지능형 온도 경고 시스템 #2 (아두이노 우노 R4 러닝 키트) (0) | 2026.10.01 |
| 지능형 온도 경고 시스템 #1 (아두이노 우노 R4 러닝 키트) (0) | 2026.10.01 |