이벤트
Quest 1
스마트폰 어항 온도 및 조명 제어기 작성자 : toymaster

스마트폰 어항 온도 및 조명 제어기

  1. 아이디어

사용자가 온도를 설정하고 이를 자동으로 유지시켜주는 어항이 있으면 좋겠다는 생각에 현재 판매되는 어항 온도 조절기를 살펴봤습니다. 시중에서 판매하는 제품들은 디자인이 투박하고 크기가 크며 버튼으로 온도를 설정하는 단순한 방식이어서 이를 개선하여 크기가 작으면서 디자인이 귀엽고 스마트폰으로 원격으로 온도를 설정할 수 있으며 어항의 조명도 같이 조절할 수 있는 제어기를 제작해보기로 하였습니다.

 

3D 디자인

 기구 설계는 Solidworks를 사용하였으며 메인 모듈과 조명 커버로 분리하여 설계하였습니다. 각 파트들을 3D프린터로 출력하여 구성된 회로와 함께 조립하였습니다.

 

회로 제작

 기본적으로 아두이노 UNO 회로를 적용하였으며 크기가 작은 공간에 들어갈 수 있도록 하기 위하여 보드를 그대로 적용할 수 없어서 ATmega328P MCU에 부트로더를 업로드하여 IC를 직접 납땜하여 회로를 구성하였습니다. LM35D 온도 센서 측정와 조명 LED PWM 제어, 히터 ON/OFF 제어, Bluetooth 모듈 통신 제어를 할 수 있도록 위와 같이 회로를 구성하였습니다.

< 실제 회로 구성 >

 

스마트폰 앱

Bluetooth Electronics 앱을 사용하여 HC-06 블루투스 모듈과 시리얼 통신으로 문자열 방식의 프로토콜을 사용하여 현재 온도 수신, 설정 온도 올림/내림 버튼 이벤트 송신, 조명 슬라이더 이벤트 송신을 프로그래밍하였습니다.

 

동작 영상

 

< 소스 코드 >

/*
  Name   : Fish_Tank_Thermostat_V1.ino
  Created: 2022-02-21
  Author : 권혁준
*/

#include 
#include 


#define LM35D_VOUT                               A0                            // LM35D analog input pin
#define HEATER                                   2                             // Heater output pin
#define LIGHT                                    3                             // Light output pin

int setTemp;
int setLight;

AltSoftSerial BT_Serial; 


// Initializer function
void setup()
{
	Serial.begin(57600);
    
	BT_Serial.begin(9600);   
    BT_Serial.setTimeout(10); 
    
	analogReference(INTERNAL); 
    
	pinMode(LM35D_VOUT, INPUT);
	pinMode(HEATER, OUTPUT);
	pinMode(LIGHT, OUTPUT);
	
	EEPROM.get(100, setTemp);
	EEPROM.get(100 + sizeof(int), setLight);
}


// Temperature read function
float get_Temperature()
{
	static float input[32] = {0.0, };
	static float total = 0.0;
	static int index = 0;
	float temp;
	
	total -= input[index];                                            
    input[index] = (float)analogRead(LM35D_VOUT) * 110.0 / 1023.0;
	total += input[index];                                              
    
	if(++index > 31) index = 0;
	
	temp = total / 32.0;

	return temp;
}


// Continuous loop function
void loop()
{
	static unsigned long lastTime = 0;                                         // Last update time
	unsigned long time = millis();                                             // Current time in msec
	
	if(BT_Serial.available()) {
		char rxData = BT_Serial.read();
		
		switch(rxData) {
		case 'U':
			setTemp++;
			EEPROM.put(100, setTemp);
			BT_Serial.print("*S" + String(setTemp) + "*");                     // Send set temperature text data
			break;
		case 'D':
			setTemp--;
			EEPROM.put(100, setTemp);
			BT_Serial.print("*S" + String(setTemp) + "*");                     // Send set temperature text data
			break;
		case 'L':
			setLight = BT_Serial.parseInt();
			EEPROM.put(100 + sizeof(int), setLight);
			BT_Serial.print("*L" + String(setLight) + "*");                    // Send set light brightness text data
			break;
		}
	}

	if((time - lastTime) > 100) {
        lastTime = time;

		float currentTemp = get_Temperature();                                 // Current temperature in ˚C

		if(currentTemp < (setTemp - 1.5)) digitalWrite(HEATER, HIGH);
		else if(currentTemp > (setTemp + 1.5)) digitalWrite(HEATER, LOW);

		analogWrite(LIGHT, map(setLight, 0, 10, 0, 255));
		
		BT_Serial.print("*T" + String(currentTemp, 1) + "*");

		BT_Serial.println("*G" + String((int)currentTemp) + "*");
	}
}






첨부파일 : 스마트폰 어항 온도 및 조명 제어기.pdf