#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
int CLK=2;
int DT=3;
int SW=4;
int IR=5;
int BUZZ=6;
int ENABLE=7;
int STEP=8;
int DIRECTION=9;
int R=10;
int G=11;
int B=12;
void encoder();
void menu();
void begin_menu();
void motor();
void motor_test();
void emergency();
void heatbed_display();
void heatbed_play();
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()
{
lcd.init();
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);
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);
digitalWrite(G,LOW);
digitalWrite(B,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)
{
if(timer_count==1)buzz_count++;
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)
{
buzz_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_sw==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=0;i<(-1*angle/1.8);i++)
{
motor();
}
}
}
void menu()
{
switch(menu_page)
{
case 0:
lcd.setCursor(0,0);
lcd.print("X: Y: A001");
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");
lcd.setCursor(0,1);
lcd.print(" MOTOR TEST");
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;
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;
}
if(encoder_result==1)
{
lcd.clear();
menu_page=220;
}
if(encoder_result==-1)
{
lcd.clear();
menu_page=220;
}
break;
case 211:
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=210;
}
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=200;
}
if(encoder_result==1)
{
lcd.clear();
menu_page=210;
}
if(encoder_result==-1)
{
lcd.clear();
menu_page=210;
}
break;
case 300:
lcd.setCursor(0,0);
lcd.print(" MOTORTEST");
lcd.setCursor(0,1);
lcd.print(">HEATING BED");
if(sw_result==1)
{
lcd.clear();
menu_page=310;
}
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(" RETURN");
if(sw_result==1)
{
lcd.clear();
menu_page=311;
}
if(encoder_result==1)
{
lcd.clear();
menu_page=320;
}
if(encoder_result==-1)
{
lcd.clear();
menu_page=320;
}
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=310;
heatbed_sw=1;
}
break;
case 320:
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=0;
heatbed_change=0;
}
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(">STATE:");
lcd.setCursor(0,1);
lcd.print(" RETURN");
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(" STATE:");
lcd.setCursor(0,1);
lcd.print(">RETURN");
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;
}
}