반응형

거북항의 자동환수를 위해 만들었던 아두이노


혼자 끄적거렸던 것이라 공유 차원에서 좀 더 자세하게 수정한다.



밑에 거북이 ㅋㅋ



수중 모터로 배수시 값이 튀는 경우가 종종 있어서 센서 값이 재대로 입력될 때까지 스카치 테이프로 거치대를 감아서 센서 각도를 조금 올렸었다.




초음파 센서 + 릴레이 + 빵 판 + 수중모터 로 구성


흐름도는 일단 물은 자동적으로 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

+ Recent posts