수온과 수위를 앱으로 설정하고 블루투스 통신으로 수중 펌프 모터 2개를 사용하여 수온과 수위를 맞추는 스마트 욕조 시스템을 연구했다.
그림은 너무 비루하지만,,,
욕조를 직접 사용하여 급수와 배수를 확인할 수 없어서
플라스틱 용기를 사용했다
부품은 온도센서(수온센서), 수위측정감지센서모듈, ATmega328P, 아두이노 우노, 수중 펌프모터, HC-06 블루투스 모듈을 사용했다.
이번에는 수중펌프모터를 제어하는 연구를 담당했다.
모터 테스트 코드이다
#define PWMpin 3 //PWM 제어를 위한 핀 3번으로 지정
#define DIRpin 4 //방향 제어를 위한 핀 4번으로 지정
void setup() {
pinMode(DIRpin, OUTPUT);
}
void loop() {
Motor(HIGH,150);//150의 출력으로 정방향 회전
delay(3000); //3000ms 즉 3초간 대기
Motor(HIGH,255);//255(최대)의 출력으로 정방향 회전
delay(3000);
Motor(HIGH,0);//정지
delay(3000);
}
/*
펌프의 모터를 제어를 위해 정의한 함수, Motor(HIGH 또는 LOW, 0~255의 출력)
*/
void Motor (boolean DIR, byte Motorspeed) {
analogWrite(PWMpin, (DIR) ? (255 – Motorspeed) : Motorspeed);
digitalWrite(DIRpin, DIR);
}
최종으로 작성한 스마트욕조 시스템 코드이다
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SoftwareSerial.h>
#define ONE_WIRE_BUS 2 // 온도센서 핀 설정
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
SoftwareSerial BTSerial(8,9); // 블루투스 핀 설정
char message;
#define waterlevel_Pin A1 // 수위센서 핀 설정
#define PWMpin1 3 //모터1 핀 설정, PWM 제어를 위한 핀
#define DIRpin1 4 //방향 제어를 위한 핀
#define PWMpin2 5//모터2 핀 설정, 방향 제어를 위한 핀
#define DIRpin2 6 //PWM 제어를 위한 핀
void setup() {
Serial.begin(9600);
Serial.println("Begin Smart Bath System");
sensors.begin();
BTSerial.begin(9600);
Serial.setTimeout(50);
pinMode(DIRpin1,OUTPUT);
pinMode(DIRpin2,OUTPUT);
}
void loop() {
int level = analogRead(waterlevel_Pin);
float temp =sensors.getTempCByIndex(0);
String tempstr = String(temp);
sensors.requestTemperatures(); // Send the command to get temperature readings
Serial.print("water level : ");
Serial.print(level);
Serial.print(" ");
Serial.print("Temperatures : ");
Serial.print(temp);
Serial.println(" *C\t");
BTSerial.print(temp);
if(BTSerial.available()){
message=BTSerial.read();
//Serial.println(message);
switch(message){
case'1':Motor1(HIGH,150); Motor2(HIGH,150);delay(50);break;
case'2':Motor1(HIGH,150);digitalWrite(PWMpin2,LOW);delay(50);break;
case'3':digitalWrite(PWMpin1,LOW);Motor2(HIGH,150);delay(50);break;
case'4':digitalWrite(PWMpin1,LOW);digitalWrite(PWMpin2,LOW);delay(50);break;
}
}
if(level<700)
{
if(sensors.getTempCByIndex(0)<=25) //물이 25도 이하일 경우
{
Motor1(HIGH, 150);
delay(3000);
}
else
{
Motor2(HIGH, 150);
delay(3000);
}
}
delay(500);
}
void Motor1(boolean DIR, byte Motorspeed){ //온수
analogWrite(PWMpin1,(DIR)?(255 -Motorspeed):Motorspeed);
digitalWrite(DIRpin1,DIR);
}
void Motor2(boolean DIR, byte Motorspeed){ //냉수
analogWrite(PWMpin2,(DIR)?(255 -Motorspeed):Motorspeed);
digitalWrite(DIRpin2,DIR);
}