#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
//Encorder Switch pin mode
int CLK = 2;
int DT = 3;
int SW = 4;
//closer sensor
int IR = 5;
// Buzzer
int BUZZ = 6;
// Motor
int ENABLE = 7;
int STEP = 8;
int DIRECTION = 9;
// LED
int R = 10;
int G = 11;
int B = 12;
//Functions
void encoder();
void menu();
void begin_menu();
void motor();
void motor_test();
void emergency();
void heatbed_display();
void heatbed_play();
//Var
int old_clk = 0;
int old_dt = 0;
int old_sw = 0;
int dt_in = 0;
int clk_in = 0;
int sw_in = 0;
int encoder_result = 0;
int sw_result = 0;
int menu_page = 0;
float angle = 0;
int heatbed = 0;
int heatbed_10 = 0;
int heatbed_1 = 0;
int heatbed_change = 0;
int heatbed_2 = 0;
int heatbed_20 = 0;
int heatbed_sw = 0;
int ir_sensor = 0;
int ir_count = 0;
int buzz_count = 0;
unsigned int heatbed_timer = 0;
unsigned int buzz_timer = 0;
unsigned int emergency_timer = 0;
int timer_count = 0;
int timer = 0;
void setup ()
{
pinMode (IR, INPUT_PULLUP);
pinMode (DIRECTION, OUTPUT);
pinMode (ENABLE, OUTPUT);
pinMode (STEP, OUTPUT);
pinMode (R, OUTPUT);
pinMode (G, OUTPUT);
pinMode (B, OUTPUT);
pinMode (CLK, INPUT);
pinMode (DT, INPUT);
pinMode (SW, INPUT);
pinMode (BUZZ, INPUT);
begin_menu();
}
void loop()
{
ir_sensor=digitalRead(IR); //
timer++;
encoder();
if(menu_page==211)
{
angle=angle+(encoder_result*1.8);
if(sw_result==1)motor_test();
}
if(menu_page==200)
{
angle=0;
digitalWrite(STEP, LOW);
}
if(menu_page==311)
{
heatbed==heatbed+encoder_result;
if(heatbed>30)heatbed=30;
if(heatbed<0)heatbed=0;
}
if(menu_page==300)
{
heatbed=0;
heatbed_timer=0;
heatbed_sw=0;
buzz_timer = 0;
digitalWrite(R,LOW);
}
if(heatbed_sw==1)heatbed_play();
if(menu_page==410|menu_page==420)emergency();
{
heatbed_display();
delay(1);
menu();
}
}
void motor()
{
digitalWrite(STEP,HIGH);
delayMicroseconds(1000);
digitalWrite(STEP, LOW);
delayMicroseconds(1000);
}
void emergency()
{
emergency_timer++;
if(ir_sensor==1)ir_count++;
else if(ir_sensor==0)ir_count=0;
if(ir_count==0)
{
lcd.print("DANGER");
if(buzz_count<5)
{
if((emergency_timer%20)<11)
{
timer_count=1;
digitalWrite(BUZZ, HIGH);
}
else if((emergency_timer%20)>10)
{
digitalWrite(BUZZ,LOW);
timer_count =0;
}
}
else
{
digitalWrite(BUZZ,LOW);
}
digitalWrite(STEP,LOW);
}
else if(ir_count>5)
{
timer_count=0;
digitalWrite(BUZZ,LOW);
lcd.print("STABLE");
motor();
buzz_count=0;
}
}
void heatbed_display()
{
heatbed_10=heatbed/10;
heatbed_1=heatbed%10;
heatbed_20=heatbed_change/10;
heatbed_2=heatbed_change%10;
}
void heatbed_play()
{
if(heatbed_sw == 1)
{
heatbed_timer++;
}
if(heatbed_change < heatbed)
{
if((heatbed_timer%30)>28)heatbed_change++;
}
if(heatbed_change==heatbed)
{
timer ++;
digitalWrite(DIRECTION, LOW);
motor();
if((buzz_timer%30)<10)
{
digitalWrite(R,HIGH);
digitalWrite(G,LOW);
digitalWrite(B,LOW);
}
if((buzz_timer%30)>10&&(buzz_timer%30)<20)
{
digitalWrite(R,LOW);
digitalWrite(G,HIGH);
digitalWrite(B,LOW);
}
if((buzz_timer%30)>20)
{
digitalWrite(R,LOW);
digitalWrite(G,LOW);
digitalWrite(B,HIGH);
}
}
}
void begin_menu()
{
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("3D PRINTER A001");
lcd.setCursor(0,1);
lcd.print("READY TO DRIVE");
delay(5000);
}
void encoder()
{
clk_in=digitalRead(CLK);
dt_in=digitalRead(DT);
sw_in=digitalRead(SW);
if(old_clk==1 && clk_in == 0)
{
if(dt_in == 1)
{
encoder_result = 1;
}
}
else if(old_dt == 1 && dt_in == 0)
{
if(clk_in == 1)
{
encoder_result = -1;
}
}
else encoder_result=0;
if(old_clk == 1 && sw_in == 0)
{
sw_result = 1;
}
else sw_result = 0;
old_clk=clk_in;
old_dt=dt_in;
old_sw=sw_in;
}
void motor_test ()
{
if(angle>0)
{
digitalWrite(DIRECTION, LOW);
for(int i=0;i<(angle/1.8);i++)
{
motor();
}
}
if(angle<0)
{
digitalWrite(DIRECTION, HIGH);
for(int i=(angle/1.8); i>0;i++)
{
motor();
}
}
}
void menu()
{
switch(menu_page)
{
case 0:
lcd.setCursor(0,0);
lcd.print("X: Y: A001"); //16칸 까지만 제한
lcd.setCursor(0,1);
lcd.print("3D PRINTER READY");
if(sw_result==1)
{
lcd.clear();
menu_page=100;
}
break;
case 100:
lcd.setCursor(0,0);
lcd.print(">EXIT"); //16칸 까지만 제한
lcd.setCursor(0,1);
lcd.print(" MOTOR TEST");
if(sw_result==1)
{
lcd.clear();
menu_page=200;
}
if(encoder_result==1)
{
lcd.clear();
menu_page=400;
}
if(encoder_result==-1)
{
lcd.clear();
menu_page=400;
}
break;
case 200:
lcd.setCursor(0,0);
lcd.print(" EXIT");
lcd.setCursor(0,1);
lcd.print(">MOTOR TEST");
if(sw_result==1)
{
lcd.clear();
menu_page=210;
}
if(encoder_result==1)
{
lcd.clear();
menu_page=300;
}
if(encoder_result==-1)
{
lcd.clear();
menu_page=100;
}
break;
case 210:
lcd.setCursor(0,0);
lcd.print(">ANGLE:");
lcd.setCursor(9,0);
lcd.print(angle);
lcd.setCursor(0,1);
lcd.print(" RETURN");
if(sw_result==1)
{
lcd.clear();
menu_page=211;
}
break;
case 220:
lcd.setCursor(0,0);
lcd.print("ANGLE:");
lcd.setCursor(9,0);
lcd.print(angle);
lcd.setCursor(0,1);
lcd.print(">RETURN");
if(sw_result==1)
{
lcd.clear();
menu_page=211;
}
if(encoder_result==1)
{
lcd.clear();
menu_page=220;
}
if(encoder_result==-1)
{
lcd.clear();
menu_page=220;
}
break;
case 300:
lcd.setCursor(0,0);
lcd.print(" MOTOR TEST");
lcd.setCursor(0,1);
lcd.print(">HEATING BED");
if(sw_result==1)
{
lcd.clear();
menu_page=200;
}
if(encoder_result==1)
{
lcd.clear();
menu_page=400;
}
if(encoder_result==-1)
{
lcd.clear();
menu_page=200;
}
break;
case 310:
lcd.setCursor(0,0);
lcd.print(">HEATING: ");
lcd.setCursor(11,0);
lcd.print("heatbed_20");
lcd.setCursor(12,0);
lcd.print("heatbed_2");
lcd.setCursor(13,0);
lcd.print("/");
lcd.setCursor(14,0);
lcd.print("heatbed_10");
lcd.setCursor(15,0);
lcd.print("heatbed_1");
lcd.setCursor(0,1);
lcd.print(" HEATING BED");
if(sw_result==1)
{
lcd.clear();
menu_page=311;
heatbed_sw=1;
}
break;
case 311:
lcd.setCursor(0,0);
lcd.print(" HEATING: ");
lcd.setCursor(11,0);
lcd.print("heatbed_20");
lcd.setCursor(12,0);
lcd.print("heatbed_2");
lcd.setCursor(13,0);
lcd.print("/");
lcd.setCursor(14,0);
lcd.print("heatbed_10");
lcd.setCursor(15,0);
lcd.print("heatbed_1");
lcd.setCursor(0,1);
lcd.print(">RETURN");
if(sw_result==1)
{
lcd.clear();
menu_page=300;
heatbed_sw=1;
}
if(encoder_result==1)
{
lcd.clear();
menu_page=310;
}
if(encoder_result==1)
{
lcd.clear();
menu_page=310;
}
break;
case 400:
lcd.setCursor(0,0);
lcd.print(" HEATING BED");
lcd.setCursor(0,1);
lcd.print(">EMERGENCY SET");
if(sw_result==1)
{
lcd.clear();
menu_page=410;
}
if(encoder_result==1)
{
lcd.clear();
menu_page=500;
}
if(encoder_result==-1)
{
lcd.clear();
menu_page=300;
}
break;
case 410:
digitalWrite(DIRECTION,LOW);
lcd.setCursor(0,0);
lcd.print(" RETURN");
lcd.setCursor(0,1);
lcd.print(">STATE");
lcd.setCursor(8,0);
if(encoder_result==1)
{
lcd.clear();
menu_page=420;
}
if(encoder_result==-1)
{
lcd.clear();
menu_page=420;
}
break;
case 420:
digitalWrite(DIRECTION,LOW);
lcd.setCursor(0,0);
lcd.print(" RETURN");
lcd.setCursor(0,1);
lcd.print(">STATE");
lcd.setCursor(8,0);
if(sw_result==1)
{
lcd.clear();
menu_page=400;
}
if(encoder_result==1)
{
lcd.clear();
menu_page=410;
}
if(encoder_result==-1)
{
lcd.clear();
menu_page=410;
}
break;
case 500:
lcd.setCursor(0,0);
lcd.print(" EMERGENCY SET");
lcd.setCursor(0,1);
lcd.print(">EXIT");
if(sw_result==1)
{
lcd.clear();
menu_page=0;
}
if(encoder_result==1)
{
lcd.clear();
menu_page=200;
}
if(encoder_result==1)
{
lcd.clear();
menu_page=400;
}
break;
}
}