Adventure Design

본 토픽은 현재 준비중입니다. 공동공부에 참여하시면 완성 되었을 때 알려드립니다.

10. 시리얼 머신 V2의 완성

코드를 많이 손보고, 부족한 부분을 더 채웠습니다.

대체로 잘 돌아가는 모습이네요.

저 시리얼 튀어나가는 부분(?)이랑, 우유 공급하는 장치 호스 연결해서 확인해보면

정말 정말 완성되지 않을까 싶습니다.

 


소스 코드


#include <LiquidCrystal_I2C.h>
#include <Wire.h>

LiquidCrystal_I2C lcd(0x3F, 16, 2);

int switch_ = 0; // while 문 탈출을 위한 변수
unsigned long previousMillis = 0; //delay를 쓰지 않으려는 발악
long interval = 5000; //delay를 쓰지 않으려는 발악

int IN1 = 3;
int IN2 = 4;
int ENA = 5;
int trig_1 = 7;
int echo_1 = 6;

int trig_2 = 9;
int echo_2 = 8;

int trig_3 = 10;
int echo_3 = 11;

int button_a = 12;
int button_b = 13;

int a_status = 0;
int b_status = 0;
int preva_status = 0;
int prevb_status = 0;

long distance_return(int trig, int echo);
void motor_go(int IN1, int IN2, int ENA);
void motor_go_slow(int IN1, int IN2, int ENA);
void motor_stop(int IN1, int IN2);
void sensor_Print(long distance);
void motor_too_slow(int IN1, int IN2, int ENA);

void setup() 
{

Serial.begin(9600);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(trig_1, OUTPUT);
pinMode(echo_1, INPUT);
pinMode(trig_2, OUTPUT);
pinMode(echo_2, INPUT);
pinMode(trig_3, OUTPUT);
pinMode(echo_3, INPUT);
pinMode(ENA, OUTPUT);

pinMode(button_a, INPUT);
pinMode(button_b, INPUT);

lcd.init();
lcd.backlight();
}

void loop() 
{
  while (switch_ == 0)
  {
  /* ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ 거리 받아오는 코드 ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥*/
  long new_distance_1 = distance_return(trig_1, echo_1);
  long new_distance_2 = distance_return(trig_2, echo_2);
  long new_distance_3 = distance_return(trig_3, echo_3);

  /* ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ 거리 받아오는 코드 ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥*/

  /* ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ if 문 1번 ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥*/
  if (new_distance_1 < 50)
  {

    lcd.setCursor(0,0); 
    lcd.print("  a) Chocolate  ");     // 문구를 출력합니다.

    lcd.setCursor(0,1);
    lcd.print("    b) Berry    ");
    
    unsigned long currentMillis = millis(); 
    previousMillis = currentMillis;
    char num;
    a_status = digitalRead(12);
    b_status = digitalRead(13);
    
    
    
    while (currentMillis - previousMillis <= 10000)
    { 
      
      a_status = digitalRead(12);
      b_status = digitalRead(13);

      delay(300);
      motor_stop(IN1, IN2);
      
      if(a_status > preva_status)
      {
        lcd.clear();
        lcd.setCursor(0,0);           // 1번째 줄 0번째 셀부터 입력하게 합니다.
        lcd.print("◇ Good Choice! ◇");

        lcd.setCursor(0,1);           // 1번째 줄 0번째 셀부터 입력하게 합니다.
        lcd.print("   Chocolate!   ");
        Serial.print("A");
        
      }

      else if(b_status > prevb_status)
      {
        lcd.clear();
        lcd.setCursor(0,0);           // 1번째 줄 0번째 셀부터 입력하게 합니다.
        lcd.print("◇ Good Choice! ◇");

        lcd.setCursor(0,1);           // 1번째 줄 0번째 셀부터 입력하게 합니다.
        lcd.print("     Berry!     ");
        Serial.print("B");
        
      }
      
      currentMillis = millis(); 

      
    }
  
    if (currentMillis - previousMillis >= 10000)
    { 
      lcd.clear(); 
      motor_go(IN1, IN2, ENA);
      delay(2000);
      
    }
    
  }
/* ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ 두번째 if 문 ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥*/


  else if (new_distance_2 < 50)
  {

    lcd.setCursor(0,0); 
    lcd.print("    Topping?    ");     // 문구를 출력합니다.

    lcd.setCursor(0,1);
    lcd.print("  a) YES b) NO  ");
    
    unsigned long currentMillis = millis(); 
    previousMillis = currentMillis;
    a_status = digitalRead(12);
    b_status = digitalRead(13);
    
    char num;

       
    while (currentMillis - previousMillis <= 10000)
    { 
      a_status = digitalRead(12);
      b_status = digitalRead(13);

      delay(300);//일단지워본다
      motor_stop(IN1, IN2);

      
      if(a_status > preva_status)
      {
        lcd.clear();
        lcd.setCursor(0,0);           // 1번째 줄 0번째 셀부터 입력하게 합니다.
        lcd.print("  Good Choice!  ");

        lcd.setCursor(0,1);           // 1번째 줄 0번째 셀부터 입력하게 합니다.
        lcd.print("      YES!      ");
        Serial.print("a");
        
      }

      else if(b_status > prevb_status)
      {
        lcd.clear();
        lcd.setCursor(0,0);           // 1번째 줄 0번째 셀부터 입력하게 합니다.
        lcd.print("  Good Choice!  ");

        lcd.setCursor(0,1);           // 1번째 줄 0번째 셀부터 입력하게 합니다.
        lcd.print("       NO       ");
        Serial.print("b");
        
      }

    currentMillis = millis();
    
      
    }
  
    if (currentMillis - previousMillis >= 10000)
    { 
      lcd.clear();
      motor_go(IN1, IN2, ENA);
      delay(2000);
    }
    
  }

/* ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ 세번째 if 문 ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥*/


  else if (new_distance_3 < 50)
  {

    lcd.setCursor(0,0); 
    lcd.print("  a) Cow Milk   ");     // 문구를 출력합니다.

    lcd.setCursor(0,1);
    lcd.print("  b) Soy Milk   ");
    
    unsigned long currentMillis = millis(); 
    previousMillis = currentMillis;
    
    char num;
    a_status = digitalRead(12);
    b_status = digitalRead(13);
    
    
    while (currentMillis - previousMillis <= 20000)
    { 

      a_status = digitalRead(12);
      b_status = digitalRead(13);

      delay(300);
      motor_stop(IN1, IN2);

      
      if(a_status > preva_status)
      {
        lcd.clear();
        lcd.setCursor(0,0);           // 1번째 줄 0번째 셀부터 입력하게 합니다.
        lcd.print("  Good Choice!  ");

        lcd.setCursor(0,1);           // 1번째 줄 0번째 셀부터 입력하게 합니다.
        lcd.print("    Cow Milk    ");
        Serial.print("c");
        
      }

      else if(b_status > prevb_status)
      {
        lcd.clear();
        lcd.setCursor(0,0);           // 1번째 줄 0번째 셀부터 입력하게 합니다.
        lcd.print("  Good Choice!  ");

        lcd.setCursor(0,1);           // 1번째 줄 0번째 셀부터 입력하게 합니다.
        lcd.print("    Soy Milk    ");
        Serial.print("d");
        
      }
      currentMillis = millis(); 
       

      
    }
  
    if (currentMillis - previousMillis >= 20000)
    { 
      lcd.clear();
      switch_ = 1;
      // previousMillis = 0;
      motor_go_slow(IN1, IN2, ENA);
      break;
    }
    
  }


 //마지막 센서 달아서는 거기서 완전히 끝나게 하기
 // 아마 while이랑 break를 쓰면 될것같긴함...
 prevb_status = b_status;
 preva_status = a_status;
 motor_go(IN1, IN2, ENA);
 

 /* ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ while 문 끝났다 ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥*/
}

}

/* ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥사랑이 넘치는 함수 정의 파트♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥*/
/* ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥사랑이 넘치는 함수 정의 파트♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥*/
/* ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥사랑이 넘치는 함수 정의 파트♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥*/

long distance_return(int trig, int echo)
{
  long duration, distance;

  digitalWrite(trig, LOW);
  delayMicroseconds(2);
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);

  duration = pulseIn(echo, HIGH);

  distance = duration * 170 / 1000 ;


  return distance;
  
  
}

void sensor_Print(long distance)
{
  Serial.print("거리: ");
  Serial.print(distance);
  Serial.println("mm");
  delay(100);
}

void motor_go(int IN1, int IN2, int ENA)
{
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW); 
  analogWrite(ENA, 125); 
}

void motor_go_slow(int IN1, int IN2, int ENA)
{
    
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  for(int pwm =100; pwm>=1; pwm-=0.5)
  {
     analogWrite(ENA, pwm);
     delay(100);
  }

  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
}

void motor_stop(int IN1, int IN2)
{
  
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  
}

#include <Servo.h>
Servo servo;
Servo servo2;

int IN1 = 3;
int IN2 = 4;

int IN3 = 5;
int IN4 = 6;


void setup() {
  Serial.begin(9600);
  servo.attach(13);
  servo2.attach(12);

  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  
}

void loop() {
  if(Serial.available())
  {

  char Data = (char)Serial.read();

  if(Data == 'A')
  {
  
    servo.write(180);
    delay(1000);
    
  }
  else if (Data == 'B')
  {
    
    servo.write(0);
    delay(1000);
  }

  else if (Data == 'a')
  {
    servo2.write(180);
    delay(1000);
  }

  else if (Data == 'b')
  {
    servo2.write(90);
    
  }

else if (Data == 'c')
  {
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);

    delay(5000);
    
  }

  else if (Data == 'd')
  {
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);

    delay(5000);
    
  }

  servo.write(90);
  servo2.write(90);
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  
}

}

 

  • 봤어요 (0명)

댓글

댓글 본문
graphittie 자세히 보기