코드를 많이 손보고, 부족한 부분을 더 채웠습니다.
대체로 잘 돌아가는 모습이네요.
저 시리얼 튀어나가는 부분(?)이랑, 우유 공급하는 장치 호스 연결해서 확인해보면
정말 정말 완성되지 않을까 싶습니다.
소스 코드
#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);
}
}

