스마트욕조(Smart Bath) 역설계

neulilanikka·2022년 11월 26일
0

프로젝트(Project)

목록 보기
18/27



수온과 수위를 앱으로 설정하고 블루투스 통신으로 수중 펌프 모터 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);
}
profile
Now: Mobile Developer

0개의 댓글

관련 채용 정보