거북항의 자동환수를 위해 만들었던 아두이노
혼자 끄적거렸던 것이라 공유 차원에서 좀 더 자세하게 수정한다.
밑에 거북이 ㅋㅋ
수중 모터로 배수시 값이 튀는 경우가 종종 있어서 센서 값이 재대로 입력될 때까지 스카치 테이프로 거치대를 감아서 센서 각도를 조금 올렸었다.
초음파 센서 + 릴레이 + 빵 판 + 수중모터 로 구성
흐름도는 일단 물은 자동적으로 1초에 2~3방울씩 떨어짐
30분 마다 초음파로 물 높이를 측정 => 일정 물 높이 이상 측정시
반복문을 통해 10번 체크 평균 값이 물 높이 이상이 맞는지 확인
맞다면 릴레이에 전원을 넣어서 수중모터 작동시킴으로써 자동 배수다.
struct Perse
{
int trig;
int echo;
int relay;
int moterOFF_cm = 0;
int moterON_cm = 0;
bool moter = false;
void Init(int t, int e, int r, int on_cm, int off_cm)
{
trig = t;
echo = e;
relay = r;
moterON_cm = on_cm;
moterOFF_cm = off_cm;
moter = false;
pinMode(trig, OUTPUT); //센서 Trig 핀
pinMode(echo, INPUT); //센서 Echo 핀
pinMode(relay, OUTPUT);
digitalWrite(relay, HIGH); //High => OFF
}
void getData()
{
int cm=0, duration=0, avg = 0;
digitalWrite(trig,HIGH); // 센서에 Trig 신호 입력
delayMicroseconds(10); // 10us 정도 유지
digitalWrite(trig,LOW); // Trig 신호 off
duration = pulseIn(echo,HIGH); // Echo pin: HIGH->Low 간격을 측정
cm = microsecondsToCentimeters(duration); // 거리(cm)로 변환
Serial.print(cm);
Serial.print("cm");
if(cm > 0)
{
if(cm > moterOFF_cm && moter)
{
digitalWrite(relay, HIGH);
moter = false;
Serial.println("");
Serial.print("Moter Off");
}
else if(cm < moterON_cm && !moter)
{
for(int i = 0; i < 10; i++)
{
digitalWrite(trig,HIGH);
delayMicroseconds(10);
digitalWrite(trig,LOW);
duration = pulseIn(echo,HIGH);
cm = microsecondsToCentimeters(duration);
avg += cm;
delay(5000);
}
avg = avg / 10;
if(avg < moterON_cm)
{
digitalWrite(relay, LOW);
moter = true;
Serial.println("");
Serial.print("Moter Done");
}
}
}
else
{
digitalWrite(relay, HIGH);
moter = false;
}
}
long microsecondsToCentimeters(long microseconds)
{
return microseconds / 29 / 2;
}
};
//=================================//
Perse perseList[2];
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
perseList[0].Init(2, 3, 12, 16, 18);
perseList[1].Init(4, 5, 13, 23, 25);
}
void loop() {
// put your main code here, to run repeatedly:
bool moterDone = false;
for(int i=0; i<2; i++)
{
perseList[i].getData();
Serial.println(" Perse" + String(i + 1));
}
Serial.println("---------------------------------------------------------------");
for(int i=0; i<2; i++)
{
if(perseList[i].moter)
{
moterDone = true;
break;
}
}
if(moterDone)
{
delay(5000);
}
else
{
// delay(5000);
delay(1800000);
}
}
'개발관련 > C&C++' 카테고리의 다른 글
Convert Json To Xml (0) | 2018.01.17 |
---|---|
Xmllite SAX(Simple Api for Xml) TreeNode 구현 및 LIB (XMLParser) (0) | 2018.01.11 |
IOCP ThreadPool 구현 Lib 및 사용 방법 (0) | 2018.01.11 |
임계영역(Critical Section) (0) | 2018.01.05 |
DataTable (0) | 2017.12.15 |