You are on page 1of 31

87

Microcontroller Unit program

Arduino Program

#include <Streaming.h>
#include <Metro.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Streaming.h>
#include <EEPROM.h>
#include <OneWire.h>
#include "max6675.h"
#include <Servo.h>
#include <EEPROM.h>

int thermoDO[3] = {51, 48, 45};


int thermoCS[3] = {52, 49, 46};
int thermoCLK[3] = {53, 50, 47};

MAX6675 thermocouple0(thermoCLK[0], thermoCS[0],


thermoDO[0]);
MAX6675 thermocouple1(thermoCLK[1], thermoCS[1],
thermoDO[1]);
MAX6675 thermocouple2(thermoCLK[2], thermoCS[2],
thermoDO[2]);

Servo servo[2]; //flour, secret ingredient

LiquidCrystal_I2C lcd(0x3F,20,4);
Metro checkMetro = Metro(2000);
Metro timeMetro = Metro(1000);
Metro cutterMetro = Metro(5000);

Metro heaterMetro[3] = {Metro(2000) ,Metro(2000),


Metro(2000)};

int fasttime = A3;


int countdown = 60;
int vibmotor = 16;
int potoffset = 2;

int dir = 34;


int actuator = 35;
int conveyor[2] = {36, 37};
int door[2] = {38, 39};
int pm[2] = {6, 7}; //0-on, 1 -f/r
int buzzer = 13;
88

int valve = A7;


int bdiff, odiff, fdiff;

int actlimit[2] = {22, 23}; //0-up, 1-down


int doorlimit[4] = {11, 12, 4, 5}; //0-1down, 1-2down, 2-
1up, 3-2up
int conlimit[4] ={24, 25, 26, 27}; //0-left, 1-right, 2-
middle1, 3-middle2

int button[2] = {A0, A2}; //start, stop


//int toggle[5] = {44, 30, 31, 32, 33}; //molding, forming,
boiling, oven, frying
int toggle[6] = {43, 44, 30, 31, 32, 33}; //dispenser,
molding, forming, boiling, oven, frying

int cutter = 14;


int hallcutter = 15;

int pot[5] = {A11, A12, A13, A14, A15, };


int temppot[3] = {A8, A9, A10};
int dispenserpot[3] = {A4, A5, A6};

int millingTime, moldingTime, boilingTime, ovenTime,


fryingTime, boilingTemp, ovenTemp, fryingTemp , oilTime,
flourTime, secTime;
int millingTime_, moldingTime_, boilingTime_, ovenTime_,
fryingTime_, boilingTemp_, ovenTemp_, fryingTemp_, oilTime_,
flourTime_, secTime_;
int heater[3] = {8, 9, 10}; // boiling, oven, frying

int SmillingTime, SmoldingTime, SboilingTime, SovenTime,


SfryingTime;
int SboilingTemp, SovenTemp, SfryingTemp;
int SoilTime, SflourTime;

int temp[3];

int ctr = 0, page = 0;


int subpage = 0;
int timerScreen = 0;

unsigned long TimeH, TimeM, TimeS, TimeSet = 3661;

boolean movmiddle = false;


boolean noselect = false;
boolean firsttime = true;
boolean heatstat[3] = {false, false, false};
89

boolean limitlock = false;

void setup(){
Serial.begin(9600);
Serial.setTimeout(100);
//I2CADD();
lcd.init();
lcd.backlight();

// for(int i = 0; i < 5; i++) EEPROM.write(i, 5); //time in


minutes, molding, forming, boiling, oven, frying
// for(int i = 10; i < 13; i++) EEPROM.write(i, 60);
//temperature - boiling, oven, frying
// EEPROM.write(20, 1); //oil seconds
// EEPROM.write(21, 2); //grams*100 currently 200grams

SmillingTime = EEPROM.read(0);
SmoldingTime = EEPROM.read(1);
SboilingTime = EEPROM.read(2);
SovenTime = EEPROM.read(3);
SfryingTime = EEPROM.read(4);

SboilingTemp = EEPROM.read(10);
SovenTemp = EEPROM.read(11);
SfryingTemp = EEPROM.read(12);

SoilTime = EEPROM.read(20);
SflourTime = EEPROM.read(21);

for(int i = 0; i < 2; i++) pinMode(conveyor[i], OUTPUT),


digitalWrite(conveyor[i], HIGH), pinMode(door[i], OUTPUT),
digitalWrite(door[i], HIGH), pinMode(pm[i], OUTPUT),
digitalWrite(pm[i], HIGH);
for(int i = 0; i < 3; i++) pinMode(heater[i], OUTPUT),
digitalWrite(heater[i], LOW);

pinMode(cutter, OUTPUT);
pinMode(hallcutter, INPUT_PULLUP);

digitalWrite(cutter, HIGH);

for(int i = 0; i < 2; i++) pinMode(actlimit[i],


INPUT_PULLUP), pinMode(button[i], INPUT_PULLUP);
for(int i = 0; i < 4; i++) pinMode(conlimit[i],
INPUT_PULLUP), pinMode(doorlimit[i], INPUT_PULLUP);
for(int i = 0; i < 5; i++) pinMode(toggle[i],
INPUT_PULLUP);
90

pinMode(buzzer, OUTPUT), digitalWrite(buzzer, LOW);


pinMode(valve, OUTPUT), digitalWrite(valve, LOW);
pinMode(dir, OUTPUT), digitalWrite(dir, HIGH);
pinMode(actuator, OUTPUT), digitalWrite(actuator, HIGH);
pinMode(fasttime, INPUT_PULLUP);
pinMode(vibmotor, OUTPUT), digitalWrite(vibmotor, HIGH);;

// servo[0].attach(2);
// servo[1].attach(3);

Serial << "device started" << endl;


lcd.setCursor(0,0), lcd << "====================";
lcd.setCursor(0,1), lcd << " Fried Miki Maker ";
lcd.setCursor(0,2), lcd << " BS CPE Batch 2018 ";
lcd.setCursor(0,3), lcd << "====================";
BEEP(2, 500);

delay(2000);
// SERVOOPEN(0);
// SERVOOPEN(1);
//
// delay(10000);
}

void INIT(){
ctr = 0, page = 0;
subpage = 0;
timerScreen = 0;

TimeH = 0, TimeM = 0, TimeS = 0, TimeSet = 0;

movmiddle = false;
noselect = false;
firsttime = true;
for(int i = 0; i < 3; i++) heatstat[i] = false;
limitlock = false;
}

void CHECKPOT(){
millingTime = constrain(map(analogRead(pot[0]),0, 1023,
-2, 65), 1, 60);
moldingTime = constrain(map(analogRead(pot[1]),0, 1023,
-2, 65), 1, 60);
boilingTime = constrain(map(analogRead(pot[2]),0, 1023,
-2, 65), 1, 60);
ovenTime = constrain(map(analogRead(pot[3]),0, 1023, -2,
65), 1, 60);
91

fryingTime = constrain(map(analogRead(pot[4]),0, 1023, -1,


12), 1, 10);
boilingTemp = constrain(map(analogRead(temppot[0]),0,
1023, 35, 95), 35, 90);
ovenTemp = constrain(map(analogRead(temppot[1]),0, 1023,
35, 95), 35, 90);
fryingTemp = constrain(map(analogRead(temppot[2]),0, 1023,
35, 255), 35, 250);

oilTime = constrain(map(analogRead(dispenserpot[0]),0,
1023, -4, 25), 1, 20);
flourTime = constrain(map(analogRead(dispenserpot[1]),0,
1023, -4, 25), 1, 20);
secTime = constrain(map(analogRead(dispenserpot[2]),0,
1023, -4, 25), 1, 20);

// Serial << "***************************************Time"


<< endl;
// Serial << "Milling: " << millingTime;
// Serial << ", Molding: " << moldingTime;
// Serial << ", Drying: " << boilingTime;
// Serial << ", Oven: " << ovenTime;
// Serial << ", Frying: " << fryingTime;
// Serial << ", boilingTemp: " << boilingTemp;
// Serial << ", ovenTemp: " << ovenTemp;
// Serial << ", fryingTemp: " << fryingTemp;
//
// Serial << endl;
// Serial << "***************************************" <<
endl;

void CHECKALL(){
// Serial << "tmolding: " << digitalRead(toggle[0]) << ",
tforming: " << digitalRead(toggle[1]) << ", tboiling: " <<
digitalRead(toggle[2]) << ", toven: " <<
digitalRead(toggle[3]) << ", tfrying: " <<
digitalRead(toggle[4]);
// Serial << "**********************" << endl;
// Serial << "btnstart: " << digitalRead(button[0]) << ",
btnstop: " << digitalRead(button[1]) << endl;
// Serial << "**********************" << endl;
// Serial << "lmtup: " << digitalRead(limit[0]) << ",
lmtdown: " << digitalRead(limit[1]) << ", lmtleft: " <<
digitalRead(limit[2]);
92

//// Serial << ", lmtmiddle: " << digitalRead(limit[3]) <<


", lmtright: " << digitalRead(limit[4]) << endl;
// Serial << "**********************" << endl;
// Serial << "pot: " << analogRead(0) << ", boilheat: " <<
digitalRead(heater[0]) << ", ovenheat: " <<
digitalRead(heater[1])<< ", fryheat: " <<
digitalRead(heater[2]) << endl;
// Serial << "**********************" << endl;
// Serial << "dir: " << digitalRead(dir) << ", conveyor: "
<< digitalRead(conveyor) << ", actuator: " <<
digitalRead(actuator) << endl;
// Serial << "doorlimit0: " << digitalRead(doorlimit[0]) <<
", doorlimit1: " << digitalRead(doorlimit[1]) << ",
doorlimit2: " << digitalRead(doorlimit[2]) << ", doorlimit3:
" << digitalRead(doorlimit[3]) << endl;
Serial << "conlimit1: " << digitalRead(conlimit[0]) << ",
conlimit2: " << digitalRead(conlimit[1]) << endl;

SECCONVERT();
}

void SERCOM(){
String inData = Serial.readString();
if(inData.indexOf("o") > - 1) SERVOOPEN(0);
else if(inData.indexOf("c") > - 1) SERVOCLOSE(0);

void SERVOOPEN(int x){


Serial << "Servo open-" << x << endl;
if(!x){

servo[x].attach(2+x);
delay(100);
servo[x].write(100);
delay(500);
servo[x].detach();
delay(500);
}
else{
servo[x].attach(2+x);
delay(100);
servo[x].write(107);
delay(500);
servo[x].detach();
delay(500);
}
93

void SERVOCLOSE(int x){


Serial << "Servo close-" << x << endl;
if(!x){
servo[x].attach(2+x);
delay(100);
servo[x].write(0);
delay(500);
servo[x].detach();
delay(500);
}
else{
servo[x].attach(2+x);
delay(100);
servo[x].write(10);
delay(500);
servo[x].detach();
delay(500);
}
}

void VALVEOPEN(){
Serial << "valve open" << endl;
digitalWrite(valve, HIGH);
}

void VALVECLOSE(){
Serial << "valve close" << endl;
digitalWrite(valve, LOW);
}

void GETTEMP(){
//CHECKPOT();

temp[0] = thermocouple2.readCelsius(); //bpiler


temp[1] = thermocouple0.readCelsius(); //dryer
temp[2] = thermocouple1.readCelsius(); //fryer

bdiff = SboilingTemp - temp[0];


odiff = SovenTemp - temp[1];
fdiff = SfryingTemp - temp[2];

Serial << "boiler temp: " << temp[0] << ", sp: " <<
boilingTemp << ", bdiff: " << bdiff << endl;
Serial << "oven temp: " << temp[1] << ", sp: " << ovenTemp
<< ", odiff: " << odiff << endl;
94

Serial << "fryer temp: " << temp[2] << ", sp: " <<
fryingTemp << ", fdiff: " << fdiff << endl;
Serial <<
"***********************************************************
*" << endl;
}

void loop(){
if(cutterMetro.check() && page == 4){
digitalWrite(cutter, LOW);
delay(200);
cutterMetro.reset();
}

if(!digitalRead(cutter) && !digitalRead(hallcutter))


digitalWrite(cutter, HIGH);

if(checkMetro.check()){
if(page == 8) BEEP(1, 500);
CHECKALL();
GETTEMP();
checkMetro.reset();
// if(page == 1){
// if(!digitalRead(toggle[2]) && !
digitalRead(toggle[4])){
// digitalWrite(heater[0], !
digitalRead(heater[2]));
// digitalWrite(heater[2], !
digitalRead(heater[0]));
// }
// else{
// if(!digitalRead(toggle[2])){
// digitalWrite(heater[0], !
digitalRead(heater[0]));
// }
// if(!digitalRead(toggle[4])){
// digitalWrite(heater[2], !
digitalRead(heater[2]));
// }
// }
// }
}

if(!digitalRead(fasttime)){
timeMetro.interval(50);
}
else{
95

timeMetro.interval(1000);
}

for(int i = 0; i < 3; i++){


if(heaterMetro[i].check()){
if(heatstat[i]){
Serial << "heatstat: " << i << endl;
GETTEMP();
if(i == 0){
if(bdiff > 10) SSRON(i);
else if(bdiff > 3) digitalWrite(heater[i], !
digitalRead(heater[i])), heaterMetro[i].interval(1000);
else SSROFF(i);
}
else if(i == 1){
if(odiff > 10) SSRON(i);
else if(odiff > 3) digitalWrite(heater[i], !
digitalRead(heater[i])), heaterMetro[i].interval(1000);
else SSROFF(i);
}
else if(i == 2){
if(fdiff > 10) SSRON(i);
else if(fdiff > 3) digitalWrite(heater[i], !
digitalRead(heater[i])), heaterMetro[i].interval(1000);
else SSROFF(i);
}

}
heaterMetro[i].reset();
}
}

if(timeMetro.check()){
if(page > 1){
TimeSet--;
SECCONVERT();
}
timeMetro.reset();
}
if(Serial.available()) SERCOM();

switch(page){
case 0:
//lcd.clear();
lcd.setCursor(0,0), lcd << "====================";
lcd.setCursor(0,1), lcd << " Initializing ";
lcd.setCursor(0,2), lcd << " Please Wait... ";
lcd.setCursor(0,3), lcd << "====================";
96

for(int i = 0; i < 2; i++) SERVOCLOSE(i);

Serial << "moveup..." << millis() << endl;


while(digitalRead(actlimit[0])) MOVEUP();
STOPALL(), BEEP(2, 50);

Serial << "doors open..." << millis() << endl;


digitalWrite(dir, LOW);
limitlock = false;

lcd.setCursor(0,0), lcd << "====================";


lcd.setCursor(0,1), lcd << " Opening Oven Doors ";
lcd.setCursor(0,2), lcd << " Please Wait... ";
lcd.setCursor(0,3), lcd << "====================";

while(!limitlock){
if(digitalRead(doorlimit[0])) digitalWrite(door[0],
LOW);
else digitalWrite(door[0], HIGH);

if(digitalRead(doorlimit[1])) digitalWrite(door[1],
LOW);
else digitalWrite(door[1], HIGH);

ctr = 0;
for(int i = 0; i < 50; i++){
if(!digitalRead(doorlimit[0]) && !
digitalRead(doorlimit[1])) ctr++;
if(ctr > 40) limitlock = true;
}
}

STOPALL(), BEEP(2, 50);

lcd.setCursor(0,0), lcd << "====================";


lcd.setCursor(0,1), lcd << " Moving Conveyor ";
lcd.setCursor(0,2), lcd << " Please Wait.. ";
lcd.setCursor(0,3), lcd << "====================";

Serial << "moveleft..." << millis() << endl;


MOVEL();

while(digitalRead(conlimit[0])) ;
STOPALL(), BEEP(2, 50);
page = 1;
timerScreen = 50;
BEEP(2, 500);
97

lcd.clear();
firsttime = true;
break;

case 1:
CHECKPOT();
for(int i = 0; i < 3; i++) heatstat[i] = false;

if(oilTime > oilTime_ + 2 || oilTime < oilTime_ - 2){


timerScreen = 20;
}
else if(flourTime > flourTime_ + 2 || flourTime <
flourTime_ - potoffset){
timerScreen = 21;
}
// else if(secTime > secTime_ + potoffset || secTime <
secTime_ - potoffset){
// timerScreen = 10;
// }

else if(millingTime > millingTime_ + potoffset ||


millingTime < millingTime_ - potoffset){
timerScreen = 0;
}
else if(moldingTime > moldingTime_ + potoffset ||
moldingTime < moldingTime_ - potoffset){
timerScreen = 1;
}
else if(boilingTime_ > boilingTime_ + potoffset ||
boilingTime < boilingTime_ - potoffset){
timerScreen = 2;
}
else if(ovenTime > ovenTime_ + potoffset || ovenTime <
ovenTime_ - potoffset){
timerScreen = 3;
}
else if(fryingTime > fryingTime_ + potoffset ||
fryingTime < fryingTime_ - potoffset){
timerScreen = 4;
}
else if(boilingTemp > boilingTemp_ + potoffset ||
boilingTemp < boilingTemp_ - potoffset){
timerScreen = 10;
}
else if(ovenTemp > ovenTemp_ + potoffset || ovenTemp <
ovenTemp_ - potoffset){
timerScreen = 11;
98

}
else if(fryingTemp > fryingTemp_ + potoffset ||
fryingTemp < fryingTemp_ - potoffset){
timerScreen = 12;
}

if(firsttime){
firsttime = false;
timerScreen = 50;
}

switch(timerScreen){
case 0:
lcd.setCursor(0,0), lcd << " Settings ";
lcd.setCursor(0,1), lcd << "Process: Milling ";
lcd.setCursor(0,2), lcd << "Time(min): " <<
SmillingTime << " ";
lcd.setCursor(0,3), lcd << "Time Set(min): " <<
millingTime << " ";

if(!digitalRead(button[1])){ //set button


BEEP(1, 10);
while(!digitalRead(button[1])) ;
EEPROM.write(timerScreen, millingTime);
SmillingTime = EEPROM.read(timerScreen);
BEEP(2, 100);
}
break;
case 1:
lcd.setCursor(0,0), lcd << " Settings ";
lcd.setCursor(0,1), lcd << "Process: Forming ";
lcd.setCursor(0,2), lcd << "Time(min): " <<
SmoldingTime << " ";
lcd.setCursor(0,3), lcd << "Time Set(min): " <<
moldingTime << " ";

if(!digitalRead(button[1])){ //set button


BEEP(1, 10);
while(!digitalRead(button[1])) ;
EEPROM.write(timerScreen, moldingTime);
SmoldingTime = EEPROM.read(timerScreen);
BEEP(2, 100);
}
break;
case 2:
lcd.setCursor(0,0), lcd << " Settings ";
99

lcd.setCursor(0,1), lcd << "Process: Boiling ";


lcd.setCursor(0,2), lcd << "Time(min): " <<
SboilingTime << " ";
lcd.setCursor(0,3), lcd << "Time Set(min): " <<
boilingTime << " ";

if(!digitalRead(button[1])){ //set button


BEEP(1, 10);
while(!digitalRead(button[1])) ;
EEPROM.write(timerScreen, boilingTime);
SboilingTime = EEPROM.read(timerScreen);
BEEP(2, 100);
}
break;
case 3:
lcd.setCursor(0,0), lcd << " Settings ";
lcd.setCursor(0,1), lcd << "Process: Drying ";
lcd.setCursor(0,2), lcd << "Time(min): " <<
SovenTime << " ";
lcd.setCursor(0,3), lcd << "Time Set(min): " <<
ovenTime << " ";

if(!digitalRead(button[1])){ //set button


BEEP(1, 10);
while(!digitalRead(button[1])) ;
EEPROM.write(timerScreen, ovenTime);
SovenTime = EEPROM.read(timerScreen);
BEEP(2, 100);
}
break;
case 4:
lcd.setCursor(0,0), lcd << " Settings ";
lcd.setCursor(0,1), lcd << "Process: Frying ";
lcd.setCursor(0,2), lcd << "Time(min): " <<
SfryingTime << " ";
lcd.setCursor(0,3), lcd << "Time Set(min): " <<
fryingTime << " ";

if(!digitalRead(button[1])){ //set button


BEEP(1, 10);
while(!digitalRead(button[1])) ;
EEPROM.write(timerScreen, fryingTime);
SfryingTime = EEPROM.read(timerScreen);
BEEP(2, 100);
}
break;
case 10:
100

lcd.setCursor(0,0), lcd << " Settings ";


lcd.setCursor(0,1), lcd << "Process: Boiling ";
lcd.setCursor(0,2), lcd << "Temp("<< char(223) <<
"C): " << SboilingTemp << " ";
lcd.setCursor(0,3), lcd << "Temp Set("<< char(223)
<< "C): " << boilingTemp << " ";

if(!digitalRead(button[1])){ //set button


BEEP(1, 10);
while(!digitalRead(button[1])) ;
EEPROM.write(timerScreen, boilingTemp);
SboilingTemp = EEPROM.read(timerScreen);
BEEP(2, 100);
}
break;
case 11:
lcd.setCursor(0,0), lcd << " Settings ";
lcd.setCursor(0,1), lcd << "Process: Oven ";
lcd.setCursor(0,2), lcd << "Temp("<< char(223) <<
"C): " << SovenTemp << " ";
lcd.setCursor(0,3), lcd << "Temp Set("<< char(223)
<< "C): " << ovenTemp << " ";

if(!digitalRead(button[1])){ //set button


BEEP(1, 10);
while(!digitalRead(button[1])) ;
EEPROM.write(timerScreen, ovenTemp);
SovenTemp = EEPROM.read(timerScreen);
BEEP(2, 100);
}
break;
case 12:
lcd.setCursor(0,0), lcd << " Settings ";
lcd.setCursor(0,1), lcd << "Process: Frying ";
lcd.setCursor(0,2), lcd << "Temp("<< char(223) <<
"C): " << SfryingTemp << " ";
lcd.setCursor(0,3), lcd << "Temp Set("<< char(223)
<< "C): " << fryingTemp << " ";

if(!digitalRead(button[1])){ //set button


BEEP(1, 10);
while(!digitalRead(button[1])) ;
EEPROM.write(timerScreen, fryingTemp);
SfryingTemp = EEPROM.read(timerScreen);
BEEP(2, 100);
}
break;
101

case 20:
lcd.setCursor(0,0), lcd << " Settings ";
lcd.setCursor(0,1), lcd << "Ingredient: Water ";
lcd.setCursor(0,2), lcd << "Unit("<< "" << "): "
<< SoilTime << " ";
lcd.setCursor(0,3), lcd << "Unit Set(ml): " <<
oilTime*100 << " ";

if(!digitalRead(button[1])){ //set button


BEEP(1, 10);
while(!digitalRead(button[1])) ;
EEPROM.write(timerScreen, oilTime);
SoilTime = EEPROM.read(timerScreen);
BEEP(2, 100);
}
break;
case 21:
lcd.setCursor(0,0), lcd << " Settings ";
lcd.setCursor(0,1), lcd << "Ingredient: Flour ";
lcd.setCursor(0,2), lcd << "Weight("<< "g" << "):
" << SflourTime*100 << " ";
lcd.setCursor(0,3), lcd << "Weight Set(g): " <<
flourTime*100 << " ";

if(!digitalRead(button[1])){ //set button


BEEP(1, 10);
while(!digitalRead(button[1])) ;
EEPROM.write(timerScreen, flourTime);
SflourTime = EEPROM.read(timerScreen);
BEEP(2, 100);
}
break;
case 50:
lcd.setCursor(0,0), lcd << "====================";
lcd.setCursor(0,1), lcd << " Press ";
lcd.setCursor(0,2), lcd << " Start... ";
lcd.setCursor(0,3), lcd << "====================";
break;
}

millingTime_ = millingTime;
moldingTime_ = moldingTime;
boilingTime_ = boilingTime;
ovenTime_ = ovenTime;
fryingTime_ = fryingTime;
boilingTemp_ = boilingTemp;
ovenTemp_ = ovenTemp;
102

fryingTemp_ = fryingTemp;
oilTime_ = oilTime;
flourTime_ = flourTime;
//secTime_ = secTime;
if(!digitalRead(button[0])){
noselect = false;
ctr = 0;
for(int i = 0; i < 50; i++){
if(!digitalRead(button[0])) ctr++;
}
if(ctr > 30){
//startprocess
noselect = true;
Serial << "button start pressed..." << endl;
for(int i = 0; i < 6; i++){
if(!digitalRead(toggle[i])){
page = i + 2;
noselect = false;
SSROFF(0);
SSROFF(2);
firsttime = true;
break;
}

}
if(noselect){
lcd.setCursor(0,0), lcd <<
"====================";
lcd.setCursor(0,1), lcd << " No Process
";
lcd.setCursor(0,2), lcd << " Selected...
";
lcd.setCursor(0,3), lcd <<
"====================";
BEEP(30, 10);
delay(3000);
}
else{
TimeH = 0, TimeM = 0, TimeS = 0;
GETETA();
BEEP(2, 500);
}
}
}

break;
103

case 2: //ingredient
lcd.setCursor(0,0), lcd << " System Status ";
lcd.setCursor(0,1), lcd << "====================";
lcd.setCursor(0,2), lcd << " Dispense Flour ";
digitalWrite(vibmotor, LOW);
Serial << "flourtime: " << SflourTime << endl;
for(int i = 0; i < SflourTime; i++){
SERVOOPEN(0), delay(2500), SERVOCLOSE(0); //flour
dispenser
SERVOOPEN(1), delay(1000), SERVOCLOSE(1);
delay(2500); //flour dispenser
lcd.setCursor(0,3), lcd << (i + 1)*100 << " g ";
Serial << "dispense 100g" << endl;
}
digitalWrite(vibmotor, HIGH);
delay(500);

lcd.setCursor(0,2), lcd << " Dispense Water ";


if(!digitalRead(toggle[1])) MOLDON();
for(int i = 0; i < oilTime; i++){

VALVEOPEN();
delay(1000);
lcd.setCursor(0,3), lcd << (i + 1)*100 << " ml ";
VALVECLOSE(); //oil dispenser
}

//SERVOOPEN(1), delay(secTime*1000), SERVOCLOSE(1);

//while(true);
TimeSet = 0;
SECCONVERT();
ENDPROCESS();
break;

case 3: //milling
lcd.setCursor(0,0), lcd << " System Status ";
lcd.setCursor(0,1), lcd << "====================";
lcd.setCursor(0,2), lcd << "Milling Please Wait ";
lcd.setCursor(0,3), lcd << "Time: " << TimeH << ":" <<
TimeM << ":" << TimeS << " ";

MOLDON();
ENDPROCESS();

if(!digitalRead(toggle[2])) heatstat[0] = true;


else if(digitalRead(toggle[2])) heatstat[0] = false;
104

break;

case 4: //forming
lcd.setCursor(0,0), lcd << " System Status ";
lcd.setCursor(0,1), lcd << "====================";
lcd.setCursor(0,2), lcd << "Forming Please Wait ";
lcd.setCursor(0,3), lcd << "Time: " << TimeH << ":" <<
TimeM << ":" << TimeS << " ";

FORMON();
ENDPROCESS();

// if(TimeM < 10 && !digitalRead(toggle[2]))


heatstat[0] = true;
// else if(digitalRead(toggle[2])) heatstat[0] = false;
//
// if(TimeM < 5 && !digitalRead(toggle[3])) heatstat[1]
= true;
// else if(digitalRead(toggle[3])) heatstat[1] = false;

break;

case 5: //boiling
if(firsttime){
SSRON(0);
if(!digitalRead(toggle[3])){ // preparation for oven
if(digitalRead(doorlimit[2])) CLOSEDOOR(1);
while(digitalRead(doorlimit[2])){
// Serial << digitalRead(doorlimit[2]) << endl;
lcd.setCursor(0,0), lcd <<
"====================";
lcd.setCursor(0,1), lcd << " Closing Oven Door
2";
lcd.setCursor(0,2), lcd << " Please Wait
";
lcd.setCursor(0,3), lcd <<
"====================";
}
}

STOPALL();
GETTEMP();
BEEP(1, 200);
lcd.clear();
while(temp[0] < SboilingTemp - 1){
SSRON(0);
105

GETTEMP();
lcd.setCursor(0,0), lcd << " System Status ";
lcd.setCursor(0,1), lcd << " Preheating Boiler ";
lcd.setCursor(0,2), lcd << "Temp Sp: " <<
SboilingTemp << " " << char(223) << "C ";
lcd.setCursor(0,3), lcd << "Temp: " << temp[0] <<
" " << char(223) << "C ";
delay(100);
}

if(digitalRead(actlimit[1])) MOVEDOWN();
while(digitalRead(actlimit[1])){
lcd.setCursor(0,0), lcd << "====================";
lcd.setCursor(0,1), lcd << " Submersing ";
lcd.setCursor(0,2), lcd << " Please Wait ";
lcd.setCursor(0,3), lcd << "====================";

}
STOPALL();
BEEP(1, 200);
firsttime = false;
GETETA();
timeMetro.reset();
lcd.clear();
}

lcd.setCursor(0,0), lcd << " System Status ";


lcd.setCursor(0,1), lcd << "Boiling Please Wait ";
lcd.setCursor(0,2), lcd << "Temp: " << temp[0] << " "
<< char(223) << "C ";
lcd.setCursor(0,3), lcd << "Time: " << TimeH << ":" <<
TimeM << ":" << TimeS << " ";
if(!TimeM && TimeS <= 10) heatstat[0] = false;
else heatstat[0] = true;

if(TimeM < 10 && !digitalRead(toggle[3])) heatstat[1]


= true;
else if(digitalRead(toggle[3])) heatstat[1] = false;

if(!TimeM && TimeS < 3){


MOVEUP();
while(digitalRead(actlimit[0])){
lcd.setCursor(0,0), lcd << "====================";
lcd.setCursor(0,1), lcd << " Hinahango ";
106

lcd.setCursor(0,2), lcd << " Please Wait ";


lcd.setCursor(0,3), lcd << "====================";
}
STOPALL();

while(true){
SSRON(1);
lcd.setCursor(0,0), lcd << "====================";
lcd.setCursor(0,1), lcd << " Draining... ";
lcd.setCursor(0,2), lcd << " Please Wait ";
lcd.setCursor(0,3), lcd << "====================";
delay(60000);

TimeM = 0, TimeH = 0, TimeS = 0;


ENDPROCESS();

break;
}

// if(TimeM < 5 && !digitalRead(toggle[4])) heatstat[2]


= true;
// else if(digitalRead(toggle[4])) heatstat[2] = false;
//ENDPROCESS();
break;

case 6: //oven
if(firsttime){
SSRON(1);
SSRON(2);
// MOVEUP();
// while(digitalRead(actlimit[0])){
// lcd.setCursor(0,0), lcd <<
"====================";
// lcd.setCursor(0,1), lcd << " Hinahango
";
// lcd.setCursor(0,2), lcd << " Please Wait
";
// lcd.setCursor(0,3), lcd <<
"====================";
// }
// STOPALL();

OPENDOOR(0);
while(digitalRead(doorlimit[0])){
lcd.setCursor(0,0), lcd <<
"====================";
107

lcd.setCursor(0,1), lcd << " Opening Oven Door


1";
lcd.setCursor(0,2), lcd << " Please Wait
";
lcd.setCursor(0,3), lcd <<
"====================";
}
STOPALL();

CLOSEDOOR(1);
while(digitalRead(doorlimit[2])){
lcd.setCursor(0,0), lcd <<
"====================";
lcd.setCursor(0,1), lcd << " Closing Oven Door
2";
lcd.setCursor(0,2), lcd << " Please Wait
";
lcd.setCursor(0,3), lcd <<
"====================";
}
STOPALL();

MOVER();

lcd.setCursor(0,0), lcd << "====================";


lcd.setCursor(0,1), lcd << " Moving to Oven ";
lcd.setCursor(0,2), lcd << " Please Wait ";
lcd.setCursor(0,3), lcd << "====================";

while(digitalRead(conlimit[2]));

// if(digitalRead(conlimit[3]))
digitalWrite(conveyor[1], LOW);
// else digitalWrite(conveyor[1], HIGH);

STOPALL();

if(digitalRead(doorlimit[3])) CLOSEDOOR(0);
while(digitalRead(doorlimit[3])){
lcd.setCursor(0,0), lcd <<
"====================";
lcd.setCursor(0,1), lcd << " Closing Oven Door
1";
lcd.setCursor(0,2), lcd << " Please Wait
";
lcd.setCursor(0,3), lcd <<
"====================";
}
108

STOPALL();

BEEP(1, 200);
firsttime = false;
GETETA();
timeMetro.reset();
lcd.clear();

while(temp[1] < SovenTemp - 1){


SSRON(1);
GETTEMP();
lcd.setCursor(0,0), lcd << " System Status
";
lcd.setCursor(0,1), lcd << " Preheating Oven
";
lcd.setCursor(0,2), lcd << "Temp Sp: " <<
SovenTemp << " " << char(223) << "C ";
lcd.setCursor(0,3), lcd << "Temp: " << temp[1]
<< " " << char(223) << "C ";
delay(100);

}
lcd.setCursor(0,0), lcd << " System Status ";
lcd.setCursor(0,1), lcd << " Drying Please Wait ";
lcd.setCursor(0,2), lcd << "Temp: " << temp[1] << " "
<< char(223) << "C ";
lcd.setCursor(0,3), lcd << "Time: " << TimeH << ":" <<
TimeM << ":" << TimeS << " ";

if(!TimeM && TimeS <= 5) heatstat[1] = false;


else heatstat[1] = true;

if(!digitalRead(toggle[4])) heatstat[2] = true;


else if(digitalRead(toggle[4])) heatstat[2] = false;
//SSRON(1);
ENDPROCESS();
break;

case 7: //frying
if(firsttime){

//SSRON(2);

Serial << digitalRead(conlimit[1]) << endl;

if(digitalRead(doorlimit[1])) OPENDOOR(1);
109

while(digitalRead(doorlimit[1])){
lcd.setCursor(0,0), lcd <<
"====================";
lcd.setCursor(0,1), lcd << " Opening Oven Door
2";
lcd.setCursor(0,2), lcd << " Please Wait
";
lcd.setCursor(0,3), lcd <<
"====================";

}
STOPALL();
if(digitalRead(conlimit[1])) MOVER();
while(digitalRead(conlimit[1])){
lcd.setCursor(0,0), lcd <<
"====================";
lcd.setCursor(0,1), lcd << " Moving to Fryer
";
lcd.setCursor(0,2), lcd << " Please Wait
";
lcd.setCursor(0,3), lcd <<
"====================";
}
STOPALL();

while(temp[2] < SfryingTemp - 1){


SSRON(2);
GETTEMP();
delay(100);
lcd.setCursor(0,0), lcd << " System Status
";
lcd.setCursor(0,1), lcd << " Heating Oil ...
";
lcd.setCursor(0,2), lcd << "Temp Sp: " <<
SfryingTemp << " " << char(223) << "C ";
lcd.setCursor(0,3), lcd << "Temp: " << temp[2]
<< " " << char(223) << "C ";
delay(100);
}

if(digitalRead(actlimit[1])) MOVEDOWN();
while(digitalRead(actlimit[1])){
lcd.setCursor(0,0), lcd <<
"====================";
lcd.setCursor(0,1), lcd << " Submersing
";
110

lcd.setCursor(0,2), lcd << " Please Wait


";
lcd.setCursor(0,3), lcd <<
"====================";
}
STOPALL();

BEEP(1, 200);
firsttime = false;
GETETA();
timeMetro.reset();
lcd.clear();
}
lcd.setCursor(0,0), lcd << " System Status ";
lcd.setCursor(0,1), lcd << " Frying Please Wait ";
lcd.setCursor(0,2), lcd << "Temp: " << temp[2] << " "
<< char(223) << "C ";
lcd.setCursor(0,3), lcd << "Time: " << TimeH << ":" <<
TimeM << ":" << TimeS << " ";

if(!TimeM && TimeS <= 5) heatstat[2] = false;


else heatstat[2] = true;
//SSRON(2);

if(!TimeM && TimeS < 3){


MOVEUP();
while(digitalRead(actlimit[0])){
lcd.setCursor(0,0), lcd << "====================";
lcd.setCursor(0,1), lcd << " Hinahango ";
lcd.setCursor(0,2), lcd << " Please Wait ";
lcd.setCursor(0,3), lcd << "====================";
}
STOPALL();

while(true){

lcd.setCursor(0,0), lcd << "====================";


lcd.setCursor(0,1), lcd << " Draining... ";
lcd.setCursor(0,2), lcd << " Please Wait ";
lcd.setCursor(0,3), lcd << "====================";
delay(60000);

BEEP(2, 100);

lcd.setCursor(0,0), lcd << "====================";


lcd.setCursor(0,1), lcd << " Picking... ";
lcd.setCursor(0,2), lcd << " Please Wait ";
111

lcd.setCursor(0,3), lcd << "====================";


delay(30000);

TimeM = 0, TimeH = 0, TimeS = 0;


ENDPROCESS();
break;
}

break;

case 8: //finish
lcd.setCursor(0,0), lcd << "====================";
lcd.setCursor(0,1), lcd << " Process ";
lcd.setCursor(0,2), lcd << " Finished... ";
lcd.setCursor(0,3), lcd << "====================";

while(true){
if(!digitalRead(button[1])){
page = 0;
BEEP(3, 500);
INIT();
break;

}
}
break;
}

void ENDPROCESS(){

if(!TimeH && !TimeM && TimeS <= 0){


STOPALL();
BEEP(2, 800);
if(page == 7){

if(digitalRead(actlimit[0])) MOVEUP();
while(digitalRead(actlimit[0])){
lcd.setCursor(0,0), lcd << "====================";
lcd.setCursor(0,1), lcd << " Hinahango ";
lcd.setCursor(0,2), lcd << " Please Wait ";
lcd.setCursor(0,3), lcd << "====================";
}
STOPALL();
112

page = 8;
lcd.clear();
}
else{
for(int i = (page-1); i < 6; i++){
if(!digitalRead(toggle[i])){
firsttime = true;
page = i + 2;
lcd.clear();
break;
}
else{
noselect = true;
STOPALL();
page = 8;
lcd.clear();
}
}

GETETA();
firsttime = true;
}

BEEP(2, 500);
}
}

void BEEP(int x, int y){


for(int i = 0; i < x; i++){
digitalWrite(buzzer, HIGH);
delay(y);
digitalWrite(buzzer, LOW);
delay(y/5);
}
}

void MOVEL(){
Serial << "moving left" << endl;
digitalWrite(dir, LOW);
delay(200);
for(int i = 0; i < 2; i++) digitalWrite(conveyor[i], LOW);
movmiddle = false;
}

void MOVER(){
Serial << "moving right" << endl;
113

digitalWrite(dir, HIGH);
delay(200);
for(int i = 0; i < 2; i++) digitalWrite(conveyor[i], LOW);

movmiddle = false;
}

void MOVEM(){
Serial << "moving middle" << endl;
if(!digitalRead(conlimit[2]) || !digitalRead(conlimit[3]))
{
//do nothing, already in middle
}
else if(!digitalRead(conlimit[0])){
//move to right

MOVER();
movmiddle = true;
}
else if(!digitalRead(conlimit[1])){
//move to left

MOVEL();
movmiddle = true;
}
}

void CHECKMOTOR(){
if(!digitalRead(dir) && !digitalRead(actuator) && !
digitalRead(actlimit[0])) STOPALL(); //actuator up
if(digitalRead(dir) && !digitalRead(actuator) && !
digitalRead(actlimit[1])) STOPALL(); //actuator down
if(digitalRead(dir) && !digitalRead(conveyor[0]) && !
digitalRead(conveyor[1]) && !digitalRead(conlimit[1]))
STOPALL(); //conveyor right
if(!digitalRead(dir) && !digitalRead(conveyor[0]) && !
digitalRead(conveyor[1]) && !digitalRead(conlimit[0]))
STOPALL(); //conveyor left
if(movmiddle && !digitalRead(conveyor[0]) && !
digitalRead(conlimit[2])) STOPMOTOR(0);
if(movmiddle && !digitalRead(conveyor[1]) && !
digitalRead(conlimit[3])) STOPMOTOR(1);
}

void MOLDON(){
//Serial << "molder on" << endl;
digitalWrite(pm[0], LOW);
114

digitalWrite(pm[1], HIGH);
}

void FORMON(){
//Serial << "former on" << endl;
digitalWrite(pm[0], LOW);
digitalWrite(pm[1], LOW);
}

void MOVEUP(){
//Serial << "actuator up" << endl;
digitalWrite(dir, LOW);
delay(200);
digitalWrite(actuator, LOW);
}

void MOVEDOWN(){
//Serial << "actuator down" << endl;
digitalWrite(dir, HIGH);
delay(200);
digitalWrite(actuator, LOW);
}

void SSRON(int x){


digitalWrite(heater[x], HIGH);
}

void SSROFF(int x){


digitalWrite(heater[x], LOW);
}

void OPENDOOR(int x){


Serial << "open door - " << x << endl;
digitalWrite(dir, LOW);
delay(100);
digitalWrite(door[x], LOW);
}

void CLOSEDOOR(int x){


Serial << "close door - " << x << endl;
digitalWrite(dir, HIGH);
delay(100);
digitalWrite(door[x], LOW);
}

void STOPALL(){
Serial << "stop all" << endl;
115

digitalWrite(dir, HIGH);
digitalWrite(actuator, HIGH);
digitalWrite(conveyor[0], HIGH);
digitalWrite(conveyor[1], HIGH);
digitalWrite(door[0], HIGH);
digitalWrite(door[1], HIGH);
digitalWrite(pm[0], HIGH);
digitalWrite(pm[1], HIGH);
for(int i = 0; i < 3; i++) SSROFF(i);
}

void STOPMOTOR(int x){


Serial << "stop motor - " << x << endl;
digitalWrite(conveyor[x], HIGH);
}

void I2CADD(){
Wire.begin();
byte error, address;
int nDevices;

Serial.println("Scanning...");

nDevices = 0;
for(address = 1; address < 127; address++ )
{
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();

if (error == 0)
{
Serial.print("I2C device found at address 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");

nDevices++;
}
else if (error==4)
{
Serial.print("Unknown error at address 0x");
if (address<16)
Serial.print("0");
116

Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");

while(true) ;
}

void GETETA(){
CHECKPOT();
switch(page){
case 2:
TimeSet = 0;
break;
case 3:
TimeSet = SmillingTime*60;
break;

case 4:
TimeSet = SmoldingTime*60;
break;

case 5:
TimeSet = SboilingTime*60;
break;

case 6:
TimeSet = SovenTime*60;
break;

case 7:
TimeSet = SfryingTime*60;
break;

}
}

void SECCONVERT(){
unsigned long x, y = 0;

TimeH = TimeSet/3600L;
x = TimeSet - (TimeH*3600L);
//Serial << "x: " << x << endl;
x /= 60;
117

TimeM = x;
TimeS = TimeSet - (TimeH*3600L) - (TimeM*60L);
//Serial << ">> " << TimeH << ":" << TimeM << ":" << TimeS
<< " <<" << endl;

You might also like