Control de giro lavadora

Buenas, estoy haciendo una placa para mi lavadora y el problema que tengo es que el programa que le he hecho, hace el giro hacía un lado y para el otro lado no y luego cuando le toca otra vez al otro, sí lo hace.
Sin embargo, si repito el programa, si funciona para los dos lados y es una cosa que no le veo el fallo y llevo ya unos días que no se que hacer.

#include <LiquidCrystal.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 16, 2);


#define val1 12
#define val2 11
#define rele2 7
#define rele1 6
#define bomba 9
#define bloqueo 12
#define taco 1




 int pul = 0;
long int pul2 = 0;
int sen = 0;
int tiem = 0;
unsigned long start = 0;
unsigned long resta = 0;
int regulacion = 200;
unsigned tiempo2 = 0;
unsigned int inicio, inicio2 = 0;
unsigned int tiempo, tiempo3 = 0;
long int rpm1 = 0;
long int rpm2 = 0;
int valor;
byte a, c = 0;
byte b = 0;
byte d = 0;
int EstadoActual = 0;
int EstadoAnterior = 0;
int x=0;
void setup() {
  lcd.init();
  lcd.backlight();
  lcd.clear();
  pinMode(rele1, OUTPUT);
  digitalWrite(rele1, 0);

  pinMode(rele2, OUTPUT);
  digitalWrite(rele2, 0);

  pinMode(5, OUTPUT);
  pinMode(4, INPUT_PULLUP);

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

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

  pinMode(bomba, OUTPUT);
  digitalWrite(bomba, 0);

  pinMode(bloqueo, OUTPUT);
  digitalWrite(bloqueo, 1);
  attachInterrupt(taco, senal, FALLING);
  //pinMode(3, INPUT);
  // Serial.begin(250000);
  lcd.setCursor(4, 0);
  lcd.print("INICIO");
  a = 1;
  
}

void loop() {  
  int n = (45 * regulacion);
  
  if (b == 2) {
    b = 0;
  }
  if (a == 1 && b == 0) {
    lcd.setCursor(0, 0);
    lcd.print(a);
    lcd.print(b);
    digitalWrite(rele1, LOW);
    digitalWrite(rele2, HIGH);
    delay(4000);
    start = millis();
    tiem = millis();
    inicio = millis();
    inicio2 = millis();
    a = 2;
  }
  while (a == 1 && b == 1) {
    lcd.setCursor(0, 0);
    lcd.print(a);
    lcd.print(b);
    digitalWrite(rele2, LOW);
    digitalWrite(rele1, HIGH);
    delay(4000);
    start = millis();
    tiem = millis();
    inicio = millis();
    inicio2 = millis();
    a = 2;
  }
  while (a == 2) {
    tiempo = millis() - inicio;
    tiempo2 = millis() - tiem;
    tiempo3 = millis() - inicio2;
    EstadoActual = digitalRead(4);
    
    if (EstadoActual == 0 & EstadoAnterior == 1) {

      c = 1;
    }
    EstadoAnterior = EstadoActual;

    if (c == 1) {
      delayMicroseconds(n);
      digitalWrite(5, HIGH);
      delayMicroseconds(10);
      digitalWrite(5, LOW);
      c = 0;
    }
    if (tiempo >= 1000) {
      rpm1 = (pul * 60) / 600;
      pul = 0;
      pul2 = 0;
      inicio = millis();
    }
    if (tiempo2 >= 1000) {
      lcd.clear();
      lcd.setCursor(0, 1);
      lcd.print(rpm1);
      tiem = millis();
      }

    resta = millis() - start;

    if (resta >= 20 && regulacion >= 113 && b == 0) {
      regulacion--;
      n = (45 * regulacion);
      start = millis();
    }

    if (tiempo3 >= 13000) {
      regulacion = 200;
      delay(100);
      lcd.setCursor(0, 0);
      lcd.print("FIN");
      digitalWrite(rele2, LOW);
      digitalWrite(rele1, LOW);
      b++;
      delay(5500);
      a=1;
    }



  }}

La cosa es que la inversión de giro lo hace pero no me manda los impulsos al triac para que el motor marche.

Saludos y gracias de antemano.

No hay esquema, no hay documentación ni comentarios.

Como esperas que te ayudemos?

  1. Cual es el objetivo de
attachInterrupt(taco, senal, FALLING);

no existe la función senal!! Entonces?

  1. Que son a y b?
  2. para que sirve el pulsador
pinMode(4, INPUT_PULLUP);
  1. para que usas un delay(4000);y luego todo lo demas con millis()? y mas tarde en otra parte del código para que usas delay(100) y delay(5000) dentro de un loop millis()

Perdón, en un rato lo subo, que fallo el mío.

1.- El objetivo de esa interrupción es para el cálculo de las revoluciones por minuto del motor pero me ha faltado copiarlo en el mensaje de antes.

2.- a es para salir del while y b es para cambiar de estado de un relé o del otro para poder cambiar de sentido del motor.

3.- Cómo tengo usado todas las interrupciones, pues pensé que la mejor manera de detectar el flanco de bajada para el paso por 0.

4.- Los delays grandes son usados para que pare el motor totalmente y repose unos segundos la ropa para el nuevo giro y el delay(100) es usado para darle un tiempo de seguridad a los relés para evitar arcos eléctricos en ellos a la hora de dejar de mandar impulsos al triac.

El resultado de resta sirve para la rampa de aceleración del motor de la lavadora, ya que no pueden arrancar de golpe sino que tienen que hacerlo progresivamente.

Tiempo y tiempo2 sirven para el cálculo de RPM y que lo muestre por el LCD, pero no afecta para el funcionamiento de la lavadora por el momento.

Tiempo3 es la duración de cada ciclo de giro.

La detección de paso por cero se hace a través de un optoacoplador 4n25 por el D4 y la señal de para el triac desde el D5.

#include <LiquidCrystal.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 16, 2);

#define val1 12
#define val2 11
#define rele2 7
#define rele1 6
#define bomba 9
#define bloqueo 12
#define taco 1

int pul = 0;
long int pul2 = 0;
int sen = 0;
int tiem = 0;
unsigned long start = 0;
unsigned long resta = 0;
int regulacion = 200;
unsigned tiempo2 = 0;
unsigned int inicio, inicio2 = 0;
unsigned int tiempo, tiempo3 = 0;
long int rpm1 = 0;
long int rpm2 = 0;
int valor;
byte a, c = 0;
byte b = 0;
byte d = 0;
int EstadoActual = 0; 
int EstadoAnterior = 0;
int x = 0;
void setup() {
  lcd.init();
  lcd.backlight();
  lcd.clear();
  pinMode(rele1, OUTPUT);
  digitalWrite(rele1, 0);

  pinMode(rele2, OUTPUT);
  digitalWrite(rele2, 0);

  pinMode(5, OUTPUT);
  pinMode(4, INPUT_PULLUP);

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

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

  pinMode(bomba, OUTPUT);
  digitalWrite(bomba, 0);

  pinMode(bloqueo, OUTPUT);
  digitalWrite(bloqueo, 1);
  attachInterrupt(taco, senal, FALLING);
  //pinMode(3, INPUT);
  // Serial.begin(250000);
  lcd.setCursor(4, 0);
  lcd.print("INICIO");
  a = 1;

}

void loop() {
  int n = (45 * regulacion);////Entero para el cálculo de disparo del triac/////////////////////////////

  if (b == 2) { /////Si b es igual a 2, puesta a 0 de nuevo//////////
    b = 0;
  }
  if (a == 1 && b == 0) { ///////Condición para giro a izquierdas/////////
    lcd.setCursor(0, 0);
    lcd.print(a);
    lcd.print(b);
    digitalWrite(rele1, LOW);
    digitalWrite(rele2, HIGH);
    delay(4000);
    start = millis();
    tiem = millis();
    inicio = millis();
    inicio2 = millis();
    a = 2;
  }
  if (a == 1 && b == 1) { ////////Condición para giro a derechas/////////////////
    lcd.setCursor(0, 0);
    lcd.print(a);
    lcd.print(b);
    digitalWrite(rele2, LOW);
    digitalWrite(rele1, HIGH);
    delay(4000);
    start = millis();
    tiem = millis();
    inicio = millis();
    inicio2 = millis();
    a = 2;
  }
  while (a == 2) {////////
    tiempo = millis() - inicio;
    tiempo2 = millis() - tiem;
    tiempo3 = millis() - inicio2;
    
    EstadoActual = digitalRead(4); /////////////////////////Detección de paso por 0/////////////////////////////////////
    if (EstadoActual == 0 & EstadoAnterior == 1) {
      c = 1;
    }
    EstadoAnterior = EstadoActual;

    if (c == 1) { ////////////////////////Si paso por 0 es 1, disparo triac///////////////////////////////////
      delayMicroseconds(n);
      digitalWrite(5, HIGH);
      delayMicroseconds(10);
      digitalWrite(5, LOW);
      c = 0;
    }
    if (tiempo >= 1000) {//////////////////Cálculo RPM//////////////////////////////////////
      rpm1 = (pul * 60) / 600;
      pul = 0;
      inicio = millis();
    }
    if (tiempo2 >= 1000) { ///////////Mostrar RPM en LCD
      lcd.clear();
      lcd.setCursor(0, 1);
      lcd.print(rpm1);
      tiem = millis();
    }

    resta = millis() - start;

    if (resta >= 20 && regulacion >= 113 && b == 0) {////////////////Arranque del motor////////////////////////////////
      regulacion--;
      n = (45 * regulacion);
      start = millis();
    }

    if (tiempo3 >= 13000) { /////////Si tiempo3 llega a 13 segundos, para motor, desconecta los relés y aumenta b en uno más para el cambio de giro y sale del while///////
      regulacion = 200;
      delay(100);
      lcd.setCursor(0, 0);
      lcd.print("FIN");
      digitalWrite(rele2, LOW);
      digitalWrite(rele1, LOW);
      b++;
      delay(5500);
      a = 1;
    }
  }
}

void senal(){
  pul++
}

Esquema de funcionamiento.

La cosa es que cuando a==1 y b==0, lo hace todo bien pero luego cuando es a==1 y b==1 hace todo el ciclo pero no manda impulsos al triac, luego cuando vuelve a ser a==1 y b==0 si lo hace bien y en el siguiente nada.

Espero haberme explicado bien, gracias de antemano y saludos.

Bueno ahora toma mas color el contexto de lo que quieres hacer. Asi debiste comenzar.
Ahora me comprendes no?

Bueno ahora tengo mas comprensión de lo que quieres hacer.
Esto

EstadoActual = digitalRead(4); /////////////////////////Detección de paso por 0/////////////////////////////////////
        if (EstadoActual == 0 & EstadoAnterior == 1) {
            c = 1;
        }
        EstadoAnterior = EstadoActual;

        if (c == 1) {          ////////////////////////Si paso por 0 es 1, disparo triac///////////////////////////////////
            delayMicroseconds(n);
            digitalWrite(5, HIGH);
            delayMicroseconds(10);
            digitalWrite(5, LOW);
            c = 0;
        }

Debería estar en una interrupción. Detectar cruce por cero ocurre cada 10 mseg... no es algo para seguirlo en un loop aunque tal vez te funcione. no lo se.

Yo lo pondria todo en la 2da interrupción disponible. Si usas la INT0 te queda la INT1 para un UNO. El Mega tiene mas INTs.
Por lo visto taco usa la interrupción 1. Asi que te queda la otra.
Bien considéralo!!

Solo respondo a tu problema de cambio de giro.

Prueba a ver si esto funciona mejor. He hecho leves modificaciones.

#include <LiquidCrystal.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 16, 2);

#define val1 12
#define val2 11
#define rele2 7
#define rele1 6
#define bomba 9
#define bloqueo 12
#define taco 1

int pul       = 0;
long int pul2 = 0;
int sen       = 0;
int tiem      = 0;
unsigned long start = 0;
unsigned long resta = 0;
int regulacion = 200;
unsigned tiempo2 = 0;
unsigned int inicio, inicio2 = 0;
unsigned int tiempo, tiempo3 = 0;
long int rpm1 = 0;
long int rpm2 = 0;
int valor;
byte a, c     = 0;
bool b        = false;
byte d        = 0;
int EstadoActual    = 0;
int EstadoAnterior  = 0;
int x         = 0;

void setup() {
  lcd.init();
  lcd.backlight();
  lcd.clear();
  pinMode(rele1, OUTPUT);
  digitalWrite(rele1, 0);

  pinMode(rele2, OUTPUT);
  digitalWrite(rele2, 0);

  pinMode(5, OUTPUT);
  pinMode(4, INPUT_PULLUP);

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

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

  pinMode(bomba, OUTPUT);
  digitalWrite(bomba, 0);

  pinMode(bloqueo, OUTPUT);
  digitalWrite(bloqueo, 1);
  attachInterrupt(taco, senal, FALLING);
  //pinMode(3, INPUT);
  // Serial.begin(250000);
  lcd.setCursor(4, 0);
  lcd.print("INICIO");
  a = 1;
  
}

void loop() {  
  int n = (45 * regulacion);  ////Entero para el cálculo de disparo del triac/////////////////////////////
  
  if (b == 2) {         /////Si b es igual a 2, puesta a 0 de nuevo//////////
      b = 0;
  }

  if (a == 1) {
      lcd.setCursor(0, 0);
      lcd.print(a);
      lcd.print(b);
      if (!b) {          ///////Condición para giro a izquierdas/////////)
          digitalWrite(rele1, LOW);
          digitalWrite(rele2, HIGH);
      }
      else {              ////////Condición para giro a derechas/////////////////
          digitalWrite(rele1, HIGH);
          digitalWrite(rele2, LOW);
      }
      delay(4000);
      start   = millis();
      tiem    = millis();
      inicio  = millis();
      inicio2 = millis();
      a = 2;
  }

  while (a == 2) {
        tiempo  = millis() - inicio;
        tiempo2 = millis() - tiem;
        tiempo3 = millis() - inicio2;
        
        EstadoActual = digitalRead(4); /////////////////////////Detección de paso por 0/////////////////////////////////////
        if (EstadoActual == 0 & EstadoAnterior == 1) {
            c = 1;
        }
        EstadoAnterior = EstadoActual;

        if (c == 1) {          ////////////////////////Si paso por 0 es 1, disparo triac///////////////////////////////////
            delayMicroseconds(n);
            digitalWrite(5, HIGH);
            delayMicroseconds(10);
            digitalWrite(5, LOW);
            c = 0;
        }
        if (tiempo >= 1000) {  //////////////////Cálculo RPM//////////////////////////////////////
            // rpm1 = (pul * 60) / 600;   // no hagas tantas cuentas 60/600 = 1/10
            rpm1    = pul/10;
            pul     = 0;
            pul2    = 0;
            inicio  = millis();
        }

        if (tiempo2 >= 1000) {   ///////////Mostrar RPM en LCD
            lcd.clear();
            lcd.setCursor(0, 1);
            lcd.print(rpm1);
            tiem = millis();
        }
        resta = millis() - start;

        if (resta >= 20 && regulacion >= 113 && b == 0) {  ////////////////Arranque del motor////////////////////////////////
            regulacion--;
            n = (45 * regulacion);
            start = millis();
        }

        if (tiempo3 >= 13000) {   /////////Si tiempo3 llega a 13 segundos, para motor, desconecta los relés y aumenta b en uno más para el cambio de giro y sale del while///////
            regulacion = 200;
            delay(100);
            lcd.setCursor(0, 0);
            lcd.print("FIN");
            digitalWrite(rele2, LOW);
            digitalWrite(rele1, LOW);
            b = !b;
            delay(5500);
            a = 1;
        }
  }
}

void senal(){
  pul++
}

Se que tenía que haberme explicado más y mejor pero a saber en que estaba pensando yo, lo siento.

Referente a la interrupción para el paso por 0 no es posible porque se usa para el presostato, cosa que se me olvidó mencionar, y cómo uso un arduino nano, no me quedó otra que usar esta forma de detectar el paso por 0 y funciona realmente bien.
Cómo el paso por 0 tiene muchísimos menos ciclos por segundo (100Hz) que el presostato o el tacogenerador, pues lo usé así.

Y en un rato probaré tu modificación a ver que tal funciona y te comento.

Muchas gracias por tu ayuda y saludos.

Edito: Hace lo mismo que con el mío, no me dispara el triac.
Me resulta muy raro todo esto porque si a b le quito o le pongo !, gira tanto para un lado como para el otro.

Edito: Hace lo mismo que con el mío, no me dispara el triac.
Me resulta muy raro todo esto porque si a b le quito o le pongo !, gira tanto para un lado como para el otro.

if (!b) {          ///////Condición para giro a izquierdas/////////)
          digitalWrite(rele1, LOW);
          digitalWrite(rele2, HIGH);
      }
      else {              ////////Condición para giro a derechas/////////////////
          digitalWrite(rele1, HIGH);
          digitalWrite(rele2, LOW);
      }

Simplifique tus dos if en 1 porque lo unico que los diferencia es el estado de b

Entonces si b = 0 es lo mismo que !b
Si b == 1 es el otro caso.

b solo cambia dentro de tu while(a==2) en determinado momento.

SI sigue haciendo lo mismo entonces mi suposición de que b++ pasaba del valor 0..1.. y seguia no es correcta.

Una observación que aunque por ahora no las usas estas duplicando las definiciones

#define val1    12
#define bloqueo 12

Llendo al problema de que no cambia de giro mira esto

        if (tiempo3 >= 13000) {   // Si tiempo3 llega a 13 segundos, para motor, desconecta los relés y aumenta giro en uno más para el camgiroio de giro y sale del while
            regulacion = 200;
            delay(100);
            lcd.setCursor(0, 0);
            lcd.print("FIN");
            digitalWrite(rele2, LOW);
            digitalWrite(rele1, LOW);
            giro = !giro;         // invierto GIRO del tambor.
            delay(5500);
            a = 1;
        }

En tu esquema de programación o estamos en a ==1 o estamos en a == 2
Si estamos en a=2 no salimos hasta superos los 12 segundos.
Cuando superas los 13 segundos a =1 tu lo defines asi, por lo tanto sale.
Al salir ya no cambia de sentido de giro hasta que vuelva a entrar.

Por eso entras al while y permaneces sol 13 segundos y sales
Es algo que debiste haberte dado cuenta mas porque tu mismo lo has programado.
Cuando tengas estos problemas lo mejor es poner salidas por monitor serie que te digan que esta pasando... con leyendas que te ubiquen en partes del programa.

A ver que opinas?

Si lo de cambiar la forma de b lo he entendido, a lo que me refería es que cambiando la condición como lo habías puesto, hace lo mismo que de la forma que lo hice yo. Y si funcionaba bien lo de b++ porque cuando llegaba a ser 2, con el if que tenía lo pasaba a 0 otra vez.

Si me di cuenta de que tenía mal puestas esas dos definiciones y ya lo tengo corregido.

Y a lo último, uso el LCD como monitor para ver lo que hace, ya que no quiero jugarme a romper el ordenador aunque lo he conectado ya veces y no pasa nada, pero poca preocupación es poca.

Si a==1 lo uso para para que se lea los valores de la variable de b y con esa variable es la que usa para que tanto un relé u otro se conecte y vaya a a==2 para los disparos del triac.
Pero lo que no entiendo si siendo lo mismo, o eso creo yo, que no me haga los disparos en uno de los sentidos porque los relés funcionan correctamente y si repito el código en otro void y lo enlazo en el final del ciclo de una con el comienzo de la otra y cambio los valores de b, funciona todo bien, que es lo que me gustaría es eso, ahorrar copiar código para ahorrar espacio pero que si no es posible, pues se repite y soluciono el problema así.

Todavía me cuesta trabajar sobre microcontroladores ya que apenas llevo un año con ellos, de ahí que me cueste ver muchas cosas y puedo tirarme horas y días pero con esto se ha llevado la palma y no le saco punta.

Gracias y saludos.

Mira hagamos esto:

Porque no explicas con tus palabras lo que debería hacer.

13 segundos gira para un lado y cambia para otro.
Mientras muestra las RPM
mientras con cada cruce por cero dispara el triac y no se que hace.

Que mas?

Hola:

Hace tiempo dejé un poco parado hacer la placa de mi lavadora, que puedes ver noticias aquí.

Mi lavadora gira en su programa normal 20 segundos en un giro.
Se detiene 1.5 segundos y cuando el tacómetro detecte 0 RPM. Varía entre 1.5 a 2 segundos.
Empieza a girar en el otro sentido otros 20 segundos.
Así surante 20 veces, si no recuerdo mal y luego saca el agua.
Te lo puedo explicar paso por paso pero es largo.

Tienes que tener claro también las electroválvulas, ebomba de agua y demás.

Luego empiezas poco a poco entender muchas cosas.

Velocidad del motor. Como en mi lavadora usa unas 4 velocidades, con este esquema usando optoacopladores puedes añadirle hasta 8, que en realdiad n hace falta.

Ver zoom.

Puedes controlar el cambio de giro como indica abajo, junto con la velocidad del motor.

Ver zoom.

En cuanto al tacómetro, es la parte que tengo menos estudiado si es analógico. ¿Puedes subir ejemplos?

Aquí hay algunos ejemplos donde saqué la idea, si sabes algo mejor, avisa por aquí.

Datasheet.

Cruce por cero.

Tengo en mente controlar la lavadora lo que me de la gana desde el PC.

Aún es como un simulador que está en desarrollo, cuando todo esté bien, se controlará por puerto serie, la velicidad del motor, cambio de giro y demás de toda la lavadora. Más adelante, desde Android. :wink:

Lavadora_05.zip (5.75 KB)

surbyte:
Mira hagamos esto:

Porque no explicas con tus palabras lo que debería hacer.

13 segundos gira para un lado y cambia para otro.
Mientras muestra las RPM
mientras con cada cruce por cero dispara el triac y no se que hace.

Que mas?

Lo que quiero que haga es que en a==1 vea la condición de b para ver que relé se activa, luego pasa a==2 que cuando el cruce por 0 haga disparar el triac en el momento que se calcula con esta operación, n = (45 * regulacion) donde regulación en 200 es que no conduce electricidad y 0 es toda la tensión, y luego de todo eso cuando el tiempo es 13 segundos, regulación se pone en 200 para que el triac corte el voltaje, se desconecte el relé que haya sido activado y se cambie la condición de b para que se active el siguiente relé en el siguiente ciclo.

Básicamente es lo que tu has dicho.

El ciclo para cada sentido de giro es de unos 22 segundos más o menos, 13 segundos girando y unos 9 en reposo.

De hecho los de las RPM puedes dejarlo aparcado porque es una cosa que ahora mismo en el programa no tiene una utilidad de momento.

No se si ahora comprendes lo que quiero conseguir.

Gracias y saludos.

Y viste lo sugerido por Metaconta? Es muy bueno el programa que el hizo.

Metaconta:
Hola:

Hace tiempo dejé un poco parado hacer la placa de mi lavadora, que puedes ver noticias.

Mi lavadora gira en su programa normal 20 segundos en un giro.
Se detiene 1.5 segundos y cuando el tacómetro detecte 0 RPM. Varía entre 1.5 a 2 segundos.
Empieza a girar en el otro sentido otros 20 segundos.
Así surante 20 veces, si no recuerdo mal y luego saca el agua.
Te lo puedo explicar paso por paso pero es largo.

De hecho antes de empezar con mi lavadora, dando vueltas por internet, di con tu blog y dije, creo que puedo hacerlo yo también y aquí estoy, atascado pero voy.

Y sí, tengo claro lo de las electrovávulas, bomba de agua y demás.

Una pregunta que me gustaría saber es si la resistencia calefactora la tienes en un triac o en un relé.

Otra es, ¿por qué tienes 4 optos para regular la velocidad si con uno y el tacómetro podrías regularla para que vaya a una velocidad determinada?

Y respecto a lo del sensor del tacómetro, el mío es un tacogenerador, el circuito que tengo hecho falla o es el tacómetro que está malo y da unas lecturas malas incluso en el osciloscopio, que a unas determinadas RPM me sale una doble senoidal como si de una hélice de ADN se tratara.

Creo que voy a coger la idea que has puesto para el tacómetro para usarla en el mío, no se como no había caído yo en eso.

Y otra forma de detectar las RPM, pues creo que un sensor Hall sería una muy buena idea, desde mi punto de vista. Eliminas el bobinado original del tacómetro y con una PCB muy sencilla puedes acoplarlo en el alojamiento del bobinado. Yo haré eso si veo que mi taco está mal.

¿A ti te falla a bajas revoluciones tu sistema de sensado?.

Gracias por tu ayuda y saludos.

surbyte:
Y viste lo sugerido por Metaconta? Es muy bueno el programa que el hizo.

Llámame ciego, ignorante o que no se leer, pero no he conseguido encontrar el programa completo, pero si unos detalles de las pruebas con las que empezó hacer el con las bombillas como motor.
:slightly_frowning_face:

En la respuesta de MEtaconta debajo de la imagen del simulador hay un archivo adjunto. * Lavadora_05.zip
Es el el programa supongo

Un error detectado

volatile int pul       = 0;

pul ser volatile sino no se comparte su valor de la interrupcioin con el loop.

Ah sí, me lo he descargado pero es un exe para ordenador.

Edito: Mañana lo cambio y hago una prueba con el a ver si me da unos datos correctos.

Hola:

Es de experimentación el programa que hice para escapar, es un simulador. Cuando lo tenga todo a mano con Visual Studio y funcione, lo adaptaré a Arduino. También se controlará desde Arduino y VS .net.

Lo que viste será esto.


Ver zoom.

Vídeos:
Velocidad motor Arcelik con triac.

Control velocidad motor lavadora Beko.

Esto de las lavadoras es más complicado de lo que uno piensa. Seguiré ahí.

Mi placa tiene 4 relés. 2 para cambio de giro del motor. 1 relé para el calentador y 1 relé que va conectado en serie el conmutador directamente del triac principal de 16A con el objetivo que si detecta que hay algo, se abre el relé y se detiene el tambor principal.

Los demás triac pequeños de 5.5 A. funciona como interruptor a las electroválvulas, bomboa de agua y demás. Esta placa se ve mucho por España pero son hechos en Argentina, con caseras y funciona. Por ahroa no he visto compatoble con LCD. Por supuesto, quiero mi propia placa.

Aquí placa hecha que vende la gente una vez finalizada. Poco se de él.

Ver zoom.

Ver Zoom.
Saludos.

POR FAVOR, como se ha corregido el codigo?
Y si ya fuera con los comentarios en el C++ seria la hostia.

Es que sin los comentarios // es muy dificil entender la intencion del programa.

Mil gracias, haremos una lavadora PORQUE YA NO VUELVO A COMPRAR/TIRAR/COMPRAR una nueva!

Moderador:
Siento lo que haré pero hilo que tiene mas de 120 días de movimiento a menos que sea para solucionarlo no puede revivirse, de modo que lo voy a cerrar y te invito a que abras un nuevo hilo para poder desarrollarlo con la gente que quiera/pueda ayudarte.
Lee las normas del foro