Professional Documents
Culture Documents
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>
LiquidCrystal_I2C lcd(0x3F,20,4);
Metro checkMetro = Metro(2000);
Metro timeMetro = Metro(1000);
Metro cutterMetro = Metro(5000);
int temp[3];
void setup(){
Serial.begin(9600);
Serial.setTimeout(100);
//I2CADD();
lcd.init();
lcd.backlight();
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);
pinMode(cutter, OUTPUT);
pinMode(hallcutter, INPUT_PULLUP);
digitalWrite(cutter, HIGH);
// servo[0].attach(2);
// servo[1].attach(3);
delay(2000);
// SERVOOPEN(0);
// SERVOOPEN(1);
//
// delay(10000);
}
void INIT(){
ctr = 0, page = 0;
subpage = 0;
timerScreen = 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
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);
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
SECCONVERT();
}
void SERCOM(){
String inData = Serial.readString();
if(inData.indexOf("o") > - 1) SERVOOPEN(0);
else if(inData.indexOf("c") > - 1) SERVOCLOSE(0);
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 VALVEOPEN(){
Serial << "valve open" << endl;
digitalWrite(valve, HIGH);
}
void VALVECLOSE(){
Serial << "valve close" << endl;
digitalWrite(valve, LOW);
}
void GETTEMP(){
//CHECKPOT();
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(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);
}
}
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
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;
}
}
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;
}
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 << " ";
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 << " ";
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);
VALVEOPEN();
delay(1000);
lcd.setCursor(0,3), lcd << (i + 1)*100 << " ml ";
VALVECLOSE(); //oil dispenser
}
//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();
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();
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();
}
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);
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
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();
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();
}
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 << " ";
case 7: //frying
if(firsttime){
//SSRON(2);
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();
if(digitalRead(actlimit[1])) MOVEDOWN();
while(digitalRead(actlimit[1])){
lcd.setCursor(0,0), lcd <<
"====================";
lcd.setCursor(0,1), lcd << " Submersing
";
110
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 << " ";
while(true){
BEEP(2, 100);
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(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 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 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 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;