#include <Servo.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 7
#define dir 2
#define step 3
#define ValEntrada 12
#define ValSaida 11
#define resistencia 13
#define nivelAlto A0
#define inicio A1
int motorDelay = 5;
int pos = 0;
int etapa = 0;
int TemperaturaRampas[4] = {60,70,100,100};
int HistTemp = 2;
int TempoRampas[4] = {15,20,25,10};
int temp_conta;
unsigned long ultimoClick = 0; // última vez que o botão foi pressionado
unsigned long debounceDelay = 150; // O intervalo, igual ao delay do código anterior
unsigned long temp;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
Servo myservo;
void setup() {
pinMode(dir,OUTPUT);
pinMode(step,OUTPUT);
pinMode(ValEntrada,OUTPUT);
pinMode(ValSaida,OUTPUT);
pinMode(resistencia,OUTPUT);
pinMode(nivelAlto, INPUT);
pinMode(inicio, INPUT);
myservo.attach(5);
myservo.write(pos);
delay(200);
sensors.begin(); // Inicia a biblioteca
Serial.begin(9600);
Serial.println(">>> Automação de cozimento <<<");
Serial.println("Pressione o botão para iniciar\n");
}
void loop() {
sensors.requestTemperatures();
switch(etapa){
case 0:
if (digitalRead(inicio) == HIGH) {
if ((millis() - ultimoClick) > debounceDelay) {
etapa = 1;
Serial.println("Processo iniciado!");
Serial.println("Enchendo recipiente...");
}
ultimoClick = millis();
}
break;
case 1: //entrada de água
if(digitalRead(nivelAlto)){
digitalWrite(ValEntrada,0);
etapa = 2;
Serial.println("Aquecendo até temperatura de " + String(TemperaturaRampas[0])
+ " °C da rampa 1.");
} else digitalWrite(ValEntrada,1);
break;
case 2: //aquecimento até temp.1 e adição do ingred. 1
aquecendo_ate_rampa(0, 1, 250); //(int rampa, int ingred, int pos_ingred)
break;
case 3: //tempo na rampa 1
controleRampa(0,1); //(int rampa, bool prox)
break;
case 4: //aquecendo até a rampa 2
aquecendo_ate_rampa(1, 0, 0); //(int rampa, int ingred, int pos_ingred)
break;
case 5: //tempo na rampa 2
controleRampa(1,1); //(int rampa, bool prox)
break;
case 6: //aquecimento até rampa 3 e adição do ingred. 2
aquecendo_ate_rampa(2, 2, 500); //(int rampa, int ingred, int pos_ingred)
break;
case 7: //tempo na rampa 3
controleRampa(2,0); //(int rampa, bool prox)
break;
case 8: //ingrediente 3 e última rampa
Serial.println("Adicionando ingrediente 3 -> posição 750");
inserirIngredientes(750);
temp = millis();
temp_conta = TempoRampas[3];
Serial.println("Rampa 4: restam " + String(temp_conta) + "segundos");
etapa = 9;
break;
case 9: //tempo na rampa 4
controleRampa(3,0);
break;
case 10: //fim
digitalWrite(resistencia,0);
digitalWrite(ValSaida,1);
if(temp_conta > 0){
if((millis() - temp) > 1000){
temp = millis();
temp_conta--;
Serial.println("Cozimento concluído! Transferindo líquido: restam "
+ String(temp_conta) + "segundos");
}
}
else{
digitalWrite(ValSaida,0);
Serial.println("Processo concluído!\n");
Serial.println(">>> Automação de cozimento <<<");
Serial.println("Pressione o botão para iniciar\n");
etapa = 0;
}
break;
}
}
void inserirIngredientes (int passo){
gira_motor (0,passo,1); //(int inicio, int fim, int dire)
garra(0, 180,1); //(int ini, int termino, int direc)
gira_motor (passo,1000,1);
garra(180, 0,-1);
gira_motor (0,1000,0);
}
void controleRampa (int rampa, bool prox){
if(temp_conta > 0){
if(sensors.getTempCByIndex(0) < (TemperaturaRampas[rampa] - HistTemp))
digitalWrite(resistencia,1);
else if(sensors.getTempCByIndex(0) >= TemperaturaRampas[rampa])
digitalWrite(resistencia,0);
if((millis() - temp) > 1000){
temp = millis();
temp_conta--;
Serial.println("Rampa " + String(rampa + 1) + ": restam " + String(temp_conta)
+ "segundos");
}
} else {
etapa++;
//Serial.println("Início do controle de temperatura e tempo da rampa " + String(rampa + 1));
if(prox){
digitalWrite(resistencia,1);
Serial.println("Aquecendo até temperatura de " + String(TemperaturaRampas[rampa + 1])
+ " °C da rampa " + String(rampa + 2));
}
else{
temp = millis();
temp_conta = 5;
}
}
}
void aquecendo_ate_rampa(int rampa, int ingred, int pos_ingred){
if(sensors.getTempCByIndex(0) < TemperaturaRampas[rampa])
digitalWrite(resistencia,1);
else {
digitalWrite(resistencia,0);
etapa++;
if(ingred > 0){
Serial.println("Adicionando ingrediente " + String(ingred) + " -> posição: " + String(pos_ingred));
inserirIngredientes(pos_ingred);
}
Serial.println("Início do controle de temperatura e tempo da rampa " + String(rampa + 1));
temp = millis();
temp_conta = TempoRampas[rampa];
Serial.println("Rampa " + String(rampa + 1) + ": restam " + String(temp_conta)
+ "segundos");
}
}
void gira_motor (int inicio, int fim, int dire) {
digitalWrite(dir,dire);
for(int i=inicio;i<fim;i++){
digitalWrite(step,1);
delay(motorDelay);
digitalWrite(step,0);
}
}
void garra(int ini, int termino, int direc){
for (pos = ini; pos >= termino; pos =+ direc) { // goes from 180 degrees to 0 degrees
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(5); // waits 15ms for the servo to reach the position
}
delay(200);
}