극한의 아두이노 DIY생활 - 일정한 물을 따라주는 기계3

in kr-dev 커뮤니티2 years ago

안녕하세요! Jimae입니다!!

회로를 그려야하지만 현재 시간이 없어서 아마 다음에 바로 그려서 올릴게요.

그래도 대략 어떤식으로 구성을 할것인지 논하기 위해서는 대략적인 설명을 할까합니다.

하드웨어 구성은 제가 그때당시 만든 소프트웨어를 참고하면 됩니다.

#define ECHOPIN 13
#define TRIGPIN 12

#define PRESSUREPIN A0

#define WATERPUMPPIN 9

프로그램의 일부입니다.

12, 13번 Pin을 초음파 센서로 사용하였고

A0번 Pin을 압전센서

9번 Pin을 물펌프로 사용했습니다.

생각보다 들어가는 선이 적군요.

image.png

image.png

image.png

이것들을 각 Pin번호에 맞게 연결만 해주면 되는대요.

회로도는 내일 어느정도 시간이 남아서 그때 그리겠습니다.

우선 그렸다치고 현재 분량이 적으니까 프로그램을 여기서 공개를 하겠습니다.

#include <MsTimer2.h>

#define ECHOPIN 13
#define TRIGPIN 12

#define PRESSUREPIN A0

#define WATERPUMPPIN 9

#define START 1       
#define STOP 0

#define ULTRASONICDISTANCE 50   // 초음파 센서 감지 거리 cm 단위

#define ONESETTINGSECOND 1     // 첫번째 1초 셋팅 = 50mL
#define TWOSETTINGSECOND 30     // 두번째 30초 셋팅 = 100mL

#define MLCOUNTINITDATA 99      // mLCount 전역변수를 0, 1의 데이터로 쓰고 있기 때문에 아예 다른값으로 초기화

enum{DETECTION = 0, ANALYSIS, ACTION};

unsigned char timeFlag = STOP;
long second = 0;

unsigned char autoWateringStep = DETECTION;

unsigned char mLCount = MLCOUNTINITDATA;

// water pump 
// 50mL = 1210mS = 1.12초
// 100mL = 2260mS = 2.26초
// 150mL = 3260mS = 3.26초
unsigned int waterTime[2] = {1210, 2260}; // ms 단위 

void setup() {
  UltrasonicSensorInit();   // 초음파 센서 초기화

  WaterPumpInit();          // 워터 펌프 초기화

  TimeCountInit();          // 타이머 데이터 값 초기화
  TimerCountStop();
  
  Serial.begin(9600);       // 디버깅 사용 시리얼 초기화

  MsTimer2::set(1000, TimeCount); // TimeCount함수를 1초마다 호출한다
  MsTimer2::start();
}

void loop() {

  // 감지(센서감지) -> 분석(시간분석)(시간초기화 하고 감지루틴으로 다시 가기 또는 워터펌프 동작) -> 동작(워터펌프)

  AutoWateringProgram();    // 프로그램
}

void AutoWateringProgram(void)
{
  switch(autoWateringStep)
  {
    case DETECTION:   // 센서 감지
                   if(UltrasonicDetection() && PressureSensorDetection())   //센서 감지 됬을때 초음파와 압전센서 두개다 동시
                   {
                    TimerCountStart();  // 타이머 카운트 시작

                    autoWateringStep = DETECTION;  // 계속 감지하기 위해 대기
                   }
                   else   // 센서 감지 안될 경우
                   {
                    
                    TimerCountStop();             // 타이머 카운트 멈춤 
                    autoWateringStep = ANALYSIS;  // 카운트된 시간 분석        
                   }
                   break;
                   
    case ANALYSIS:    // 카운트된 시간 분석
                  if(second < ONESETTINGSECOND)   // 처음 세팅한 시간 값보다 작을시 감지 안된걸로 치고 다시 감지모드로
                  {
                    TimeCountInit(); 
                    autoWateringStep = DETECTION; // 시간 분석후 기준치에 못미칠때 다시 감지 모드로
                    break;
                  }

                  if(second >= ONESETTINGSECOND) mLCount = 0;        // 1초 이상 시간 경과 50mL 나온다
                  else if(second >= TWOSETTINGSECOND) mLCount = 1;   // 30초 이상 시간 경과 100mL 나온다


                  TimeCountInit();             // 타이머 데이터 초기화
                  autoWateringStep = ACTION;   // 시간 분석후 기준치에 충족할때 동작으로
                  break; 
                  
    case ACTION:
                
                WaterPumpStart();             // 워터 펌프 동작
                delay(waterTime[mLCount]);    // 각 설정된 시간에 따라 멈춤      
                WaterPumpStop();              // 워터 펌프 멈춤
                
                mLCount = MLCOUNTINITDATA;    // mLCount 변수 초기화
                autoWateringStep = DETECTION; // 다시 감지모드로
                break;
  }
}

void UltrasonicSensorInit(void)
{
  // trig를 출력모드로 설정, echo를 입력모드로 설정
  pinMode(TRIGPIN, OUTPUT);
  pinMode(ECHOPIN, INPUT);
}

float UltrasonicSensorRead(void)
{
  float duration, distance;
  
  // 초음파를 보낸다. 다 보내면 echo가 HIGH 상태로 대기하게 된다.
  digitalWrite(TRIGPIN, HIGH);
  delay(10);
  digitalWrite(TRIGPIN, LOW);
  
  // echoPin 이 HIGH를 유지한 시간을 저장 한다.
  duration = pulseIn(ECHOPIN, HIGH); 
  // HIGH 였을 때 시간(초음파가 보냈다가 다시 들어온 시간)을 가지고 거리를 계산 한다.
  distance = ((float)(340 * duration) / 10000) / 2;  
  
  return distance;
}

bool UltrasonicDetection(void)
{
  if(UltrasonicSensorRead() <= ULTRASONICDISTANCE) return true;
  else return false;
}

int PressureSensorRead(void)
{ 
  return analogRead(PRESSUREPIN);
}

bool PressureSensorDetection(void)
{
  if(PressureSensorRead() >= 500) return true;
  else return false;
}

void WaterPumpInit(void)
{
   pinMode(WATERPUMPPIN, OUTPUT);
   WaterPumpStop(); 
}

void WaterPumpStart(void)
{
  digitalWrite(WATERPUMPPIN, HIGH); 
}

void WaterPumpStop(void)
{
  digitalWrite(WATERPUMPPIN, LOW); 
}

void TimeCountInit(void)
{ 
  second = 0;
}

void TimerCountStart(void)
{
  timeFlag = START;
}

void TimerCountStop(void)
{
  timeFlag = STOP;
}

void TimeCount(void)
{
  if(timeFlag != START) return;
  
  second++;
}

이 프로그램의 정의는 압전센서와 초음파센서가 인식이되면 그때 물펌프를 작동시켜 일정시간동안 동작하게한뒤 꺼버리는 장치입니다.

그냥 물따르는거에요.

생가보다 프로그램이 긴것같지만 하드웨어가 적은만큼 소프트웨어도 기능이 별로 없을것입니다.

오늘은 여기까지 다들 좋은 하루 되세요!

극한의 아두이노 DIY생활 - 일정한 물을 따라주는 기계1
극한의 아두이노 DIY생활 - 일정한 물을 따라주는 기계2

Sort:  
 2 years ago 

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

애미야 물이 짜다

Coin Marketplace

STEEM 0.30
TRX 0.12
JST 0.032
BTC 58773.92
ETH 2988.08
USDT 1.00
SBD 3.74