template<class T> inline Print &operator <<(Print &obj, T arg) { //comunicacion con telegram
obj.print(arg);
return obj;
}
//#include "CTBot.h"
//CTBot miBot;
//#include "token.h"
#include <Ticker.h>
Ticker ticLLenado1;
Ticker ticLLenado2;
Ticker ticLavadoCW;
Ticker ticLavadoCCW;
Ticker ticVaciadoON;
Ticker ticVaciadoOFF;
//in
int swStart = 12;
int ifm1 = 14;
int ifm2 = 27;
int modoLavado = 26;
int mecanismoLavado = 25;
int mecanismoSpin = 33;
//out
int valvula1 = 21; //valvula de agua
int CW = 22; // giro del motor en sentido horario
int CCW = 23; // giro del motor en sentido anti horario
int pump = 19; //bomba de salida de agua
int mecanismo = 18;
int buzzer = 5; //buzzer para avisos
//variables
int start = 0; //variable para el boton start, enclavamiento
int llenando = 0; //variable para hacer girar el otor mientras se llena la tina
int llenadoFull = 0; //variable para saber si el ifm marco llena la tina
int lavando = 0; //variable para el lavado
int lavadoTerminado = 0;
int spinMode = 0;
//contadores variable
int contaLavadas = 0;
int contaSpin = 0;
//constantes
int numLavadas = 3; //constante para veces que lava en CW y CCW
int esperaEntreGiros = 200; //espera en milisegundos *es un delay
int tiempoLavado = 3; //tiempo en segundos que dura encendida la salida para el giro del motor
int tiempoVaciado = 5; //tiempo para ternminar de vaciar la tina cuando el sensor dejo de funcionar
void setup() {
Serial.begin(115200);
//in
pinMode(swStart, INPUT);
pinMode(ifm1, INPUT);
pinMode(ifm2, INPUT);
pinMode(modoLavado, INPUT);
pinMode(mecanismoLavado, INPUT);
pinMode(mecanismoSpin, INPUT);
//out
pinMode(valvula1, OUTPUT);
pinMode(CW, OUTPUT);
pinMode(CCW, OUTPUT);
pinMode(pump, OUTPUT);
pinMode(mecanismo, OUTPUT);
pinMode(buzzer, OUTPUT);
digitalWrite(CCW, HIGH); //apagando las salidas pa que no haga un desmadre
digitalWrite(CW, HIGH);
digitalWrite(valvula1, HIGH);
digitalWrite(pump, HIGH);
digitalWrite(mecanismo, HIGH);
digitalWrite(buzzer, LOW);
/*miBot.wifiConnect(ssid, password); //para comunicacion con telegram
//miBot.setTelegramToken(token);
if (miBot.testConnection()) {
Serial.println("\n Conectado");
}
else {
Serial.println("\n Problemas Auxilio");
}*/
}
//--------------------------------------------------------------------
void loop() {
/*TBMessage msg;
if (CTBotMessageText == miBot.getNewMessage(msg)) {
Serial << "Mensaje: " << msg.sender.firstName << " - " << msg.text << "\n";
miBot.sendMessage(msg.sender.id, msg.text);
}
if (CTBotMessageText == miBot.getNewMessage(msg)) {
Serial << "Mensaje: " << msg.sender.firstName << " - " << msg.text << "\n";
}
if (msg.text.equalsIgnoreCase("encender")) { //iniciar ciclo desde telegram
start = 1;
miBot.sendMessage(msg.sender.id, "start encendido");
}
*/
if(digitalRead(swStart) == HIGH && start == 0) { //lectura del boton y enclavamiento variable start
start = 1;
buzzerPress();
Serial.println("START presionado");
delay(100);
}
if(start == 1 && digitalRead(modoLavado) == LOW && digitalRead(ifm2) == HIGH && llenadoFull == 0 && llenando == 0){ //llenado de tina
digitalWrite(valvula1, LOW);
Serial.println("se empieza a llenar la tina");
llenando = 1;
ticLLenado1.attach(15, giroEnLLEnadoON); //espera * segundos para hacer funcion giroEnLLenado
delay(50);
}
if(digitalRead(ifm1) == LOW && llenando == 1 && llenadoFull == 0){ //tina llena y lista para sig. proceso
ticLLenado2.detach();
ticLLenado1.detach();
digitalWrite(CCW, HIGH);
llenadoFull = 1;
digitalWrite(valvula1, HIGH);
delay(100);
Serial.println("se termino de llenar la tina");
}
if(llenadoFull == 1 ){ //comenzamos con el lavado y prendemos los tickers
if(lavando == 0){
delay(esperaEntreGiros);
digitalWrite(CW, LOW);
ticLavadoCW.attach(tiempoLavado, lavadoCW);
delay(50);
lavando = 1;
}
}
if(contaLavadas >= numLavadas){ //detenemos los TICKERS de lavado a cierto numero de ciclos
ticLavadoCW.detach();
ticLavadoCCW.detach();
digitalWrite(CW, HIGH);
digitalWrite(CCW, HIGH);
lavadoTerminado = 1;
}
if(lavadoTerminado == 1 && digitalRead(swStart) == HIGH){ //termino del lavado. se resetea para poder empezar otra vez
contaLavadas = 0;
start = 0;
llenando = 0;
llenadoFull = 0;
lavando = 0;
lavadoTerminado = 0;
}
//-------------------------------SPIN---------------------------
if(digitalRead(modoLavado) == HIGH && start == 1 && spinMode == 0) {
spinMode = 1;
digitalWrite(pump, LOW);
delay(50);
}
if(digitalRead(mecanismoSpin) == LOW && spinMode == 1){ //si sensor es igual a 0 prendo motor
digitalWrite(mecanismo, LOW);
Serial.println("prendemos mecanismo");
}
if(digitalRead(mecanismoSpin) == HIGH && spinMode == 1){
digitalWrite(mecanismo, HIGH);
Serial.println("apagamos mecanismo");
delay(50);
spinMode = 2;
}
if(digitalRead(ifm1) == HIGH && spinMode == 2){
ticVaciadoON.once(10, vaciadoON);
spinMode = 3;
}
if(contaSpin >= 5 && spinMode == 3){
ticVaciadoON.detach();
ticVaciadoOFF.detach();
digitalWrite(CW, LOW);
ticVaciadoOFF.once(30, spinFinish);
spinMode = 4;
}
}
void spinFinish(){
digitalWrite(CW, HIGH);
digitalWrite(pump, HIGH);
buzzerFinish();
spinMode = 0;
contaSpin = 0;
start = 0;
}
void vaciadoON() { //ticker´s para agarrar vuelo y centrifugar
Serial.println("funcion TIC vaciado ON");
digitalWrite(CW, LOW);
//spinMode = 4;
delay(50);
ticVaciadoOFF.once(2, vaciadoOFF);
//llenando = 0;
}
void vaciadoOFF() { //ticker´s para agarrar vuelo y centrifugar
Serial.println("funcion TIC vaciado OFF");
digitalWrite(CW, HIGH);
ticVaciadoON.once(4, vaciadoON);
//spinMode = 1;
contaSpin ++ ;
Serial.println(contaSpin);
delay(50);
}
//--------------------------funciones-----------------------------------------------------
void giroEnLLEnadoON() { //ticker´s para mover la tina mientras se llena.
Serial.println("funcion TIC prendido del motor");
digitalWrite(CCW, LOW);
ticLLenado2.attach(3, giroEnLLEnadoOFF);
llenando = 0;
}
void giroEnLLEnadoOFF() { //ticker´s para mover la tina mientras se llena.
Serial.println("funcion TIC apagado del motor");
digitalWrite(CCW, HIGH);
}
void lavadoCW() { //ticker´s para mover la tina mientras se lava
if(lavando == 1){
Serial.println("funcion CW");
Serial.println(contaLavadas);
digitalWrite(CW, HIGH);
delay(esperaEntreGiros);
digitalWrite(CCW, LOW);
ticLavadoCW.attach(tiempoLavado, lavadoCCW);
delay(50);
lavando = 2;
}
}
void lavadoCCW() { //ticker´s para mover la tina mientras se lava
if(lavando == 2){
Serial.println("funcion CCW");
digitalWrite(CCW, HIGH);
delay(esperaEntreGiros);
digitalWrite(CW, LOW);
delay(50);
contaLavadas ++;
lavando = 0;
}
}
void buzzerFinish(){
tone(buzzer, 3000);
delay(500); // botonazo = 100. Avisos = 500
noTone(buzzer);
delay(500);
tone(buzzer, 3000);
delay(500); // botonazo = 100. Avisos = 500
noTone(buzzer);
delay(500);
tone(buzzer, 3000);
delay(500); // botonazo = 100. Avisos = 500
noTone(buzzer);
delay(500);
tone(buzzer, 3000);
delay(500); // botonazo = 100. Avisos = 500
noTone(buzzer);
delay(500);
tone(buzzer, 3000);
delay(500); // botonazo = 100. Avisos = 500
noTone(buzzer);
delay(500);
tone(buzzer, 3000);
delay(500); // botonazo = 100. Avisos = 500
noTone(buzzer);
delay(500);
}
void buzzerPress(){
tone(buzzer, 3000);
delay(100);
noTone(buzzer);
}