2019년 6월 2일 일요일

마리모 생존 수온 체크(arduino, water temperature ds18b20, buzzer)

최근들어 아들에게 프로그램을 재미있게 알려주고싶었다.
그러던 와중 예전부터 한번 해봐야지 했던 라즈베리 파이와 아두이노를 접하게 되었고,
실생활에 쓰이는 아이템을 골라 프로그램에 대한 흥미를 유발하고자 했는데
최근 "마리모"라는 담수에서 자라는 녹조를 학교 근처 서점에서 사왔다.
그런데 이 친구는 물이 35도가 넘으면 죽는단다.



<아들이 사온 마리모가 담긴 병>

오~ 그래? 그럼 수온을 재는, 그리고 특정 온도가 넘으면 알람을 주는걸 한번 만들어보자~ 해서 아래 프로젝트가 진행이 됐다.

결론부터 말하자면, 나만 재밌었던거 같다.
아들은 중간중간 보여줄때 마다 신기함과 놀라움의 리액션은 있었으나 그때 밖이었으니...
지금은 마리모 옆 반창통 안에서 열심히 마리모가 담긴 물의 온도를 측정하지만, 아들의 관심 밖에 있다.



초기 아들과 논의를 해서 구상한 구상도이다.
1. 아두이노에 스피커와 방수온도계를 연결
2. 상시 수온을 측정하여 30도 이상이면 부저 알림
 (초기엔 scratch를 이용해서 야옹이 소리를 내려고했으나, 스피커가 아닌 buzzer를 이용하여 구현하다보니 제외)

이렇게 초기 계획으로 시작을 해서 아래 제품을 ali에서 구매를 했다.

1. arduino uno board(나중에 nano board로 교체)
  1.1 uno
    https://s.click.aliexpress.com/e/b65Vs4DK
  1.2 nano
     https://s.click.aliexpress.com/e/b9ouQx3i
2. 수온계
     https://s.click.aliexpress.com/e/nUCJAFO
3. 부저(기초 패키지 내 있던 것으로 사용)
4. jump 선
5. 4.7k 저항
6. bread board(나중에는 제외)


<arduino uno board이용하여 완성한 모습>
센서와 보드를 연결하고 프로그래밍한 후 테스트한 사진

<arduino nano board와 캡슐화를 위한 통>
센서의 선이 bread board에서 자꾸 빠져서, 납땜하기 전 배선을 참고하기위해 찍은 사진

<납땜한 최종 모습>
부피도 적고 소모전력도 낮음





<테스트 동영상>


코드 및 특징(파란색 주석 참고)

/* YourDuino Electronic Brick Test
Temperature Sensor DS18B20
- Connect cable to Arduino Digital I/O Pin 10
 */

/*-----( Import needed libraries )-----*/
#include <OneWire.h>
#include <DallasTemperature.h>

/*-----( Declare Constants )-----*/
#define ONE_WIRE_BUS 10 /*-(Connect to Pin 10 )-*/
#define SPEAKER_BUS 8

/*-----( Declare objects )-----*/
/* Set up a oneWire instance to communicate with any OneWire device*/
OneWire ourWire(ONE_WIRE_BUS);

/* Tell Dallas Temperature Library to use oneWire Library */
DallasTemperature sensors(&ourWire);

/*-----( Declare Variables )-----*/


void setup() /*----( SETUP: RUNS ONCE )----*/
{
/*-(start serial port to see results )-*/
delay(1000);
Serial.begin(9600);
Serial.println("YourDuino.com: Electronic Brick Test Program");
Serial.println("Temperature Sensor DS18B20");
delay(1000);

/*-( Start up the DallasTemperature library )-*/
sensors.begin();
}/*--(end setup )---*/


void loop() /*----( LOOP: RUNS CONSTANTLY )----*/
{
Serial.println();
Serial.print("Requesting temperature...");
sensors.requestTemperatures(); // Send the command to get temperatures
Serial.println("DONE");

Serial.print("Device 1 (index 0) = ");
Serial.print(sensors.getTempCByIndex(0));
Serial.println(" Degrees C");
Serial.print("Device 1 (index 0) = ");
Serial.print(sensors.getTempFByIndex(0));
Serial.println(" Degrees F");

if(sensors.getTempCByIndex(0) > 35) /* limit */
{
  // 수온 35도는 극한이다. 0.5초 간격으로 빠른 알람을 주자.
  // buzzer
  tone(SPEAKER_BUS,200,500);  //500: 음의 높낮이(주파수), 500: 음의 지속시간(0.5초)
  delay(500);
}
else if(sensors.getTempCByIndex(0) > 30) /* buffer */
{
 //수온 30도를 임계치 설정하여 이때부터 인지를 하도록 알람을 주자. 1초 간격 알람.
  tone(SPEAKER_BUS,500,1000);  //500: 음의 높낮이(주파수), 1000: 음의 지속시간(1초)
  delay(1000);
  // buzzer
}
else
{
  //온도 체크 후 이상이 없으면 1분 후 체크하도록 DELAY 설정.
  //잘때 불을 다 끄고 있을건데 센서가 체크할때마다 깜빡이면 신경쓰일듯하여...
  delay(60000);
}



}/* --(end main loop )-- */

/* ( THE END ) */


댓글 없음:

댓글 쓰기