//https://forum.arduino.cc/t/arduino-so-funciona-bem-a-primeira-vez-apos-compilacao/1244054
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <TimerOne.h>
#define I2C_ADDRESS 0x27 // Endereço I2C padrão do display 16x2
#define BUTTON_PIN 10 // Pino do botão
#define BUTTON_ANALOG 1 // Pino do botão
#define Nivel_PIN 2 // Pino do nivel
// Pinos dos módulos de relé
#define pinRele1 8 // Porta do Arduino que irá acionar o relé 1 - motor 1 horario
#define pinRele2 9 // Porta do Arduino que irá acionar o relé 2 - motor 2 anti horario
#define pinRele3 7 // Porta do Arduino que irá acionar o relé 3 - valvula 1 - Pré lavagem
#define pinRele4 2 // Porta do Arduino que irá acionar o relé 4 - valvula 2 - Lavagem
#define pinRele5 3 // Porta do Arduino que irá acionar o relé 5 - valvula 3 - enxague amaciante
#define pinRele6 5 // Porta do Arduino que irá acionar o relé 6 - embreagem
#define pinRele7 6 // Porta do Arduino que irá acionar o relé 7 - bomba despejo
#define pinRele8 4 // Porta do Arduino que irá acionar o relé 8 - aquecimento-temporariamente valvula 2
#define tempoContador 900 //define o tempo do contador (em segundos)
int encher1 = 100;//360000; // Variaveis
int tela = 1;
int c1 = 1;
int tempo = tempoContador;
int tempo2 = 225;
int contador = 0;
int contadorbate = 0;
byte contadorStatus = 0; //0=Pause, 1=Run
int controle = 0;
int valoragua;
int valorbotao;
int contadormolho = 0;
int vezesmolho = 3;
LiquidCrystal_I2C lcd(I2C_ADDRESS, 16, 2); // Inicializa o objeto LiquidCrystal_I2C
int cicloT1 = 0;
bool flag1 = false;
//---------------------------------------------------------------------
void contaTempo() {
if (contadorStatus == 1) {
contador--;
if (contador <= 0) {
contador = 0;
contadorStatus = 0;
}
}
}
//---------------------------------------------------------------------
void tela1(int tela) {
lcd.clear();
digitalWrite(pinRele1, LOW); // ESCREVE NO PINO DIGITAL O ESTADO ATUAL (LIGADO OU DESLIGADO)
digitalWrite(pinRele2, LOW); // ESCREVE NO PINO DIGITAL O ESTADO ATUAL (LIGADO OU DESLIGADO)
digitalWrite(pinRele3, LOW); // ESCREVE NO PINO DIGITAL O ESTADO ATUAL (LIGADO OU DESLIGADO)
digitalWrite(pinRele4, LOW); // ESCREVE NO PINO DIGITAL O ESTADO ATUAL (LIGADO OU DESLIGADO)
digitalWrite(pinRele5, LOW); // ESCREVE NO PINO DIGITAL O ESTADO ATUAL (LIGADO OU DESLIGADO)
digitalWrite(pinRele6, LOW); // ESCREVE NO PINO DIGITAL O ESTADO ATUAL (LIGADO OU DESLIGADO)
digitalWrite(pinRele7, LOW); // ESCREVE NO PINO DIGITAL O ESTADO ATUAL (LIGADO OU DESLIGADO)
digitalWrite(pinRele8, LOW); // ESCREVE NO PINO DIGITAL O ESTADO ATUAL (LIGADO OU DESLIGADO)
lcd.setCursor(0, 0);
lcd.print("Fun.: ");
lcd.print("Normal");
lcd.setCursor(0, 1);
lcd.print("Nivel: ");
lcd.print("Alto");
lcd.setCursor(14, 1);
lcd.print("T1");
//delay(500);
//Serial.print("tela: ");
//Serial.println(tela);
}
//---------------------------------------------------------------------
void encher() {
lcd.setCursor(0, 0);
lcd.print("Em funcionamento");
lcd.setCursor(0, 1);
lcd.print(" Enchendo ");
digitalWrite(pinRele4, LOW);
delay(550000);
digitalWrite(pinRele4, HIGH);
Serial.print("tela - enche ");
}
//---------------------------------------------------------------------
void despeja() {
lcd.setCursor(0, 0);
lcd.print("Em funcionamento");
lcd.setCursor(0, 1);
lcd.print(" Esvaziando ");
digitalWrite(pinRele7, LOW);
delay(480000);
digitalWrite(pinRele7, HIGH);
Serial.print("tela - enche ");
}
//---------------------------------------------------------------------
void Centrifulga() {
lcd.setCursor(0, 0);
lcd.print("Em funcionamento");
lcd.setCursor(0, 1);
lcd.print(" centrifulga ");
digitalWrite(pinRele5, LOW);
delay(300000);
digitalWrite(pinRele5, HIGH);
bater();
delay(300000);
digitalWrite(pinRele6, LOW);
digitalWrite(pinRele7, LOW);
delay(480000);
while (c1 < 3) {
delay(80000);
digitalWrite(pinRele1, HIGH);
delay(100000);
digitalWrite(pinRele1, LOW);
delay(80000);
c1++;
}
digitalWrite(pinRele7, HIGH);
digitalWrite(pinRele6, HIGH);
}
//---------------------------------------------------------------------
void enxague() { //enche enxague
lcd.setCursor(0, 0);
lcd.print("Em funcionamento");
lcd.setCursor(0, 1);
lcd.print(" Enchendo ");
digitalWrite(pinRele4, LOW);
Serial.print("tela - enche ");
delay(550000);
digitalWrite(pinRele4, HIGH);
//agita enxague
if (tempo > 0) {
if (contadorStatus == 0) {
if (contador == 0) {
contador = tempo2;
}
Timer1.start(); //INICIA O CONTADOR NOVAMENTE
Timer1.attachInterrupt(contaTempo);
contadorStatus = 1;
} else {
Timer1.stop(); //PARA O CONTADOR
contadorStatus = 0;
}
}
if (contadorStatus == 1) {
while (contadorStatus == 1) {
lcd.setCursor(0, 1);
lcd.print(" Agitacao ");
digitalWrite(pinRele1, HIGH);
delay(700);
digitalWrite(pinRele1, LOW);
delay(250);
digitalWrite(pinRele2, HIGH);
delay(700);
digitalWrite(pinRele2, LOW);
delay(250);
}
}
else {
digitalWrite(pinRele1, LOW);
digitalWrite(pinRele2, LOW);
}
if (tempo > 0) { //agita amaciate
if (contadorStatus == 0) {
if (contador == 0) {
contador = tempo2;
}
Timer1.start(); //INICIA O CONTADOR NOVAMENTE
Timer1.attachInterrupt(contaTempo);
contadorStatus = 1;
} else {
Timer1.stop(); //PARA O CONTADOR
contadorStatus = 0;
}
}
if (contadorStatus == 1) {
while (contadorStatus == 1) {
lcd.setCursor(0, 1);
lcd.print(" Agitacao ");
digitalWrite(pinRele1, HIGH);
delay(700);
digitalWrite(pinRele1, LOW);
delay(250);
digitalWrite(pinRele2, HIGH);
delay(700);
digitalWrite(pinRele2, LOW);
delay(250);
}
}
else {
digitalWrite(pinRele1, LOW);
digitalWrite(pinRele2, LOW);
}
lcd.setCursor(0, 1);
lcd.print(" Molho ");
delay(900000);
}
//---------------------------------------------------------------------
void PreLavagem() { //enche pre-lavagem
lcd.setCursor(0, 0);
lcd.print("Em funcionamento");
lcd.setCursor(0, 1);
lcd.print(" Enchendo ");
lcd.setCursor(14, 1);
lcd.print("PL");
digitalWrite(pinRele3, HIGH);
//Serial.print("tela - enche ");
delay(450000);
digitalWrite(pinRele3, HIGH);
//agita pre-lavagem
while (contadormolho < vezesmolho) {
if (tempo > 0) {
if (contadorStatus == 0) {
if (contador == 0) {
contador = tempo2;
}
Timer1.start(); //INICIA O CONTADOR NOVAMENTE
Timer1.attachInterrupt(contaTempo);
contadorStatus = 1;
}
else {
Timer1.stop(); //PARA O CONTADOR
contadorStatus = 0;
}
}
if (contadorStatus == 1) {
while (contadorStatus == 1) {
lcd.setCursor(0, 1);
lcd.print(" Agitacao ");
digitalWrite(pinRele1, HIGH);
delay(700);
digitalWrite(pinRele1, LOW);
delay(250);
digitalWrite(pinRele2, HIGH);
delay(700);
digitalWrite(pinRele2, LOW);
delay(250);
}
}
else {
digitalWrite(pinRele1, LOW);
digitalWrite(pinRele2, LOW);
}
lcd.setCursor(0, 1);
lcd.print(" Molho ");
delay(900000);
contadormolho ++;
}
}
//---------------------------------------------------------------------
void bater()
{
lcd.setCursor(0, 0);
lcd.print("Em funcionamento");
lcd.setCursor(0, 1);
lcd.print(" Lavando ");
Serial.print("tela - enche ");
if (tempo > 0) {
if (contadorStatus == 0) {
if (contador == 0) {
contador = tempo;
}
Timer1.start(); //INICIA O CONTADOR NOVAMENTE
Timer1.attachInterrupt(contaTempo);
contadorStatus = 1;
}
else {
Timer1.stop(); //PARA O CONTADOR
contadorStatus = 0;
}
}
if (contadorStatus == 1) {
while (contadorStatus == 1) {
lcd.setCursor(0, 1);
lcd.print(" Lavando ");
digitalWrite(pinRele1, HIGH);
delay(700);
digitalWrite(pinRele1, LOW);
delay(250);
digitalWrite(pinRele2, HIGH);
delay(700);
digitalWrite(pinRele2, LOW);
delay(250);
}
} else {
digitalWrite(pinRele1, LOW);
digitalWrite(pinRele2, LOW);
}
}
//---------------------------------------------------------------------
void setup() {
lcd.init(); // inicia o display 16x2
lcd.backlight();
lcd.clear(); // limpa todos os caracteres do lcd
lcd.setCursor(0, 0); // posiciona o cursor no display (caracter, linha)
lcd.print(F("Lavadora")); // imprime o texto entre aspas
lcd.setCursor(0, 1); // posiciona o cursor no display (caracter, linha)
lcd.print(F("inicializando...")); // imprime o texto entre aspas
// delay(5000); // pausa o programa por 5 segundos
delay(1000);
lcd.clear();
lcd.noBacklight();
delay(1000);
lcd.backlight();
Serial.begin(9600); // INICIALIZA A SERIAL COM TAXA DE 9600 BAUDS
pinMode(BUTTON_PIN, INPUT_PULLUP); // Inicializa o botão
Timer1.initialize(1000000); //INICIO DO TIMER IRA EXECUTAR A CADA 1 SEGUNDO (PARAMETRO EM MICROSEGUNDOS)
Timer1.attachInterrupt(contaTempo);
for (int i = 2; i < 10; i++) {
pinMode(i, OUTPUT); // Inicializa os pinos dos relés como saída
digitalWrite(i, LOW);
}
}
//---------------------------------------------------------------------
void loop() {
valoragua = analogRead(Nivel_PIN);
valorbotao = analogRead(BUTTON_ANALOG);
// === Ações no display LCD === //
switch (controle)
{
case 0: // se a variável tela for igual a 1w, faça...
tela1(tela);
controle ++;
// Serial.print("Sensor Agua: ");
// Serial.print(valoragua);
// Serial.print(" botão:");
// Serial.print(valorbotao);
// Serial.print(" Tempo:");
// Serial.println(cicloT1);
break;
case 1:
break;
case 2:
cicloT1 = 0;
PreLavagem();
despeja();
controle ++;
break;
case 3:
encher();
delay(500);
bater();
delay(500);
controle ++;
break;
case 4:
despeja();
delay(500);
controle ++;
break;
case 5:
enxague();
delay(500);
controle ++;
break;
case 6:
Centrifulga();
despeja();
delay(5000);
controle = 0;
break;
default:
break;
}
/////////////////////////////////////////////////
// Verifica o estado do botão //
/////////////////////////////////////////////////
int buttonState = digitalRead(BUTTON_PIN);
if (buttonState == LOW) {
delay(30);
if (buttonState == LOW) {
controle++;
if (controle >= 7) {
controle = 0;
}
}
}
}