Hacer prueba rápida para el 01-01-2016 de este proyecto

Hola:

Estoy intentado hacer una prueba rápida con Arduino, motor de escobillas para hacer el cambio de giro. En esta ocasión, quiero controlar el cambio de giro con relés y una pantalla LCD. El ejemplo que quiero hacer es sencillo.

Quiero lograr este funcionamiento para Arduino:

  • Enciende Arduino.
  • Muestra mensaje en el LCD.
  • Aparece un contador cuenta atrás que dura 10 segundos antes de iniciar el proceso.
  • Se activan los relés en el cual actúa el cambio de giro.
  • Se detiene 15 segundos.
  • Cambio de giro con los relés durante 15 segundos.
  • Se vuelve a detener durante 15 segundos.
  • Así son 11 procesos repetitivos el cambio de giro.

Se usa dos salidas digitales para cada relés.

Por ahora he hecho un código base no funcional, hay que mejorarlo. Antes de conectar nada, quiero programar el código para que no de problemas y queme el motor, eso si, prbaré con una bombilla primero por si acaso.

// include el código de la librería.
#include <LiquidCrystal.h>

// Inicializa la librería con sus pines indicados.
// RS, RW, Enable, D4, D5, D6, D7.
LiquidCrystal lcd(8, NULL, 9, 4, 5, 6, 7);

unsigned long inicio, fin, transcurrido;
long Veces = 0;

int LuzFondo = 10; // Pin 10 para saber que es luz de fondo.

void setup()
{
   // Formato de pantalla.
  lcd.begin(16, 2);
  lcd.print("Foro ELECTRONICA");


  pinMode(3,OUTPUT);
  pinMode(2,OUTPUT);
  pinMode(LuzFondo,OUTPUT);

  digitalWrite(LuzFondo, HIGH);
  //digitalWrite(2, !LOW); // !LOW es HIGH.
  //digitalWrite(3, !LOW);
  Serial.begin(115200);
}

void loop()
{
  lcd.setCursor(0,1);
  lcd.print(inicio=millis()/15000); // 15 seg. antes de empezar.

     for (int i=0; i <= 10; i++)
   {
   
  digitalWrite(2, !LOW);
  lcd.setCursor(3,1); // RL 1.
  lcd.print("1 OFF");
  digitalWrite(3, !LOW);
  lcd.setCursor(9,1); // RL 2.
  lcd.print("2 OFF");
  delay(2000);

  digitalWrite(2, !HIGH);
  lcd.setCursor(3,1); // RL 1.
  lcd.print("1 ON ");
  delay(2000);

  digitalWrite(2, !LOW);
  lcd.setCursor(3,1); // RL 1.
  lcd.print("1 OFF");
  delay(2000);

  digitalWrite(3, !HIGH);
  lcd.setCursor(9,1); // RL 2.
  lcd.print("2 ON ");
  delay(2000);

  digitalWrite(3, !LOW);
  lcd.setCursor(9,1); // RL 2.
  lcd.print("2 OFF");
  delay(2000);

Veces++;
 lcd.setCursor(0,1);
 lcd.print(Veces);
  
  }

  delay(1000000);

     // Cuando llegue aquí, tiene que pararse el motor siempre.
     // No se que instrucciones darle para que lo haga.
}

¿Alguna ayuda sobre la programación?

Que muestre el tiempo cuentra atrás cada 15 segundos en el LCD.
Los pasos escrito arriba tienen que cumplir.

Feliz año nuevo. :wink:

Feliz año. Si he entendido bien tu problema, lo único que deberías hacer es traspasar todo el código dentro de las llaves del loop al final del setup (dejando loop vacío).
También puedes colocar un bucle infinito:
en lugar del
delay(1000000);
Pon
while(true);

Hola:

Entendido lo de los relés, eso si, estaba probando. Aquí hay consejos por el cual no hay que usar los delay como dices, exceptuando los microrebotes de los pulsadores a uno 100 ms, o lo que es lo mismo 0.1 seg.

http://www.educachip.com/razones-no-usar-funcion-delay-en-arduino/

Estoy indignado de una cosa con este proyecto de pruebas, se me bajaron las palancas de la casa y no me fucniona el relé K2, pesnaba que era el transistor, pero no, porque me enciende el Led rojo pero no activa el relé, rompí el diodo D2 para sustituirlo, no es el diodo, probé el relé directamente y funciona, solo el relé, claro. Así que tiene que ser el optoacoplador.

Por mucho que encienda el Led D2, opté por el relé K3 del INT 3, al rato de apagarse y encender la bombilla, se vuelve a bajar las palancas de mi casa, el magnetotérmico, no el digerencial, sin chispas o estampido de algo.

El optoacoplador le pasó lo mismo del INT 3 que al INT 2, se acabó máspruebas. Dentro de un rato pongo mis experiencias en mi blog sobre este proyecto. Deja ver si venden estos optoacopladores a parte en mi local habitual. En este mismo momento me quedan unos minutos para subir un vídeo qu esubiré aquí para que vean la idea del proyecto.

Dejo claro que aún no he puesto el motor, primero uan bombilla de 100 W a 230 VAC 50 Hz en España. A lo mejor de apagar y encender la bolbilla cada dos segundos, se bajaron las palancas, aunque no entiendo, porqué se fastidian los optoacopladores.

Estoy un poco desmotivado por tonterías como estas. Dejo una imagen como curiosidad.

Esquema.

Ver zoom.

Vídeo.

A seguir adelante con el código, felices fiesas.

Si no lo terminas hoy tendras que cambiar el título, jajaja

Hola:

El ejemplo o experiencia ya lo he publicado.

Lo más que me mosquea, es no saber porqué el módulo de 8 relés me ahce bajar el magnetotérmico de mi casa y se quema el optoacoplador. Esa es mi intriga y nadie lo sabe en foros que he preguntado.

Ahora me toca ver la programación, luego pongo la lista de los procesos que debe seguir.

Feliz año nuevo 2016.

Porque cada vez que lo accionas generas un corto. Lo sorprendente esque no se quemara.

[quote author=noter date=1451646443 link=msg=2544505]
Feliz año. Si he entendido bien tu problema, lo único que deberías hacer es traspasar todo el código dentro de las llaves del loop al final del setup (dejando loop vacío).
También puedes colocar un bucle infinito: 
en lugar del 
delay(1000000);
Pon
while(true);
[/quote]// include el código de la librería.
#include <LiquidCrystal.h>

// Inicializa la librería con sus pines indicados.
// RS, RW, Enable, D4, D5, D6, D7.
LiquidCrystal lcd(8, NULL, 9, 4, 5, 6, 7);

unsigned long inicio, fin, transcurrido;
long Veces = 0;

int LuzFondo = 10; // Pin 10 para saber que es luz de fondo.

void setup()
{
   // Formato de pantalla.
  lcd.begin(16, 2);
  lcd.print("Foro ELECTRONICA");
 
  /*
  delay(2000);
  lcd.setCursor(0,0);
  lcd.print("Cambio de giro  ");
  lcd.setCursor(0,1);
  lcd.print("motor lavadora. ");
  delay(2000);
  lcd.clear(); // Limpia la pantalla.
  lcd.setCursor(0,0); // En el primer carácter y primera fila.
*/

  pinMode(3,OUTPUT);
  pinMode(2,OUTPUT);
  pinMode(LuzFondo,OUTPUT);

  digitalWrite(LuzFondo, HIGH);
  //digitalWrite(2, !LOW); // !LOW es HIGH.
  //digitalWrite(3, !LOW);
  Serial.begin(115200);
}

void loop()
{
  lcd.setCursor(0,1);
  lcd.print(inicio=millis()/15000); // 15 seg. antes de empezar.

  digitalWrite(2, !LOW);
  lcd.setCursor(3,1); // RL 1.
  lcd.print("1 OFF");
  digitalWrite(3, !LOW);
  lcd.setCursor(9,1); // RL 2.
  lcd.print("2 OFF");
  delay(2000);

     for (int i=0; i <= 10; i++)
   {

  digitalWrite(2, !HIGH);
  lcd.setCursor(3,1); // RL 1.
  lcd.print("1 ON ");
  delay(2000);

  digitalWrite(2, !LOW);
  lcd.setCursor(3,1); // RL 1.
  lcd.print("1 OFF");
  delay(2000);

  digitalWrite(3, !HIGH);
  lcd.setCursor(9,1); // RL 2.
  lcd.print("2 ON ");
  delay(2000);

  digitalWrite(3, !LOW);
  lcd.setCursor(9,1); // RL 2.
  lcd.print("2 OFF");
  delay(2000);

Veces++;
 lcd.setCursor(0,1);
 lcd.print(Veces);
  
  }

  while (true);

     // Cuando llegue aquí, tiene que pararse el motor siempre.
     // No se que instrucciones darle para que lo haga.
}

Me imagino que te refieres así.

surbyte:
Porque cada vez que lo accionas generas un corto. Lo sorprendente esque no se quemara.

Por fin alguien sabe algo. Me iamgino lo del corto porque se me bajan el magnetotérmico de la casa dejándome sin luz. A pesar de ese corto, para eso están los optoacopladores, para que se fundan en vez del Arduino y demás componentes.

¿Qué corto vez o lo cuentas por lo que crees?

¿Por qué al principio no hay corto y funciona bien?

Saludos.

PD: Dentro de unos minutos subo esquema fotos para que sepan lo que hice realmente a la hora de conectarlo.

Edito:

Ver zoom.

Seguí la normativa del cambio de sentido.

Animado:

Ver zoom.

Ya creo saber que ocurre. Es un problema de estados. Seguramente conmutas e instantáneamente provocas el corto porque deberías llevar los LENTOS relés a un estado previo que asegure que no genere el corto circuito. Luego analizo tu código y te sugiero, pero te guío en la tarea. Solo lleva previo a un cambio de giro a los reles a un estado neutro como cuando pones el rotor en corto usando los dos reles. Estado detenido.
Dime que te parece?
Tu código es muy lento, demasiados pasos para indicar cosas via LCD que nada tienen que ver con la operación a realizar. La secuencia debe ser, dar las órdenes a los relés SEGURAS e INSTANTANEAS y luego si muestra por Serial o LCD la situación pero no mientras tanto porque son varios mseg en los que Qué hace el circuito? Generalmente para por estados indeseados y con las bobinas o inductores no se juega porque siempre se oponen a los cambios.

Hola:

No te había leído. Presento el segundo intento con éxito y explicado por aquí.

No hay cortos en ningún lado, solo problemas de fluctuaciones al cambio brusco y corto de tiempo con una bombilla de 100 W y sin poner condensador y resistencia en la salida del relé.

He estado investigando.

Puse otro código de ejemplo usando delay, siiiiiiiiiii, se que no hay que usarlo, pero lo he usado porque aún no he aprendido usar otra cosa, sobre todo para el tema de las interrupciones cuando pongo PAUSE o se apague la luz, con la idea de continuar donde estaba.

Como estamos de pruebas, pues...

// include el código de la librería.
#include

// Inicializa la librería con sus pines indicados.
// RS, RW, Enable, D4, D5, D6, D7.
LiquidCrystal lcd(8, NULL, 9, 4, 5, 6, 7);

unsigned long inicio, fin, transcurrido;
long Veces = 0;

int LuzFondo = 10; // Pin 10 para saber que es luz de fondo.

void setup()
{
   // Formato de pantalla.
  lcd.begin(16, 2);
  lcd.print("Foro ELECTRONICA");

  /*
  delay(2000);
  lcd.setCursor(0,0);
  lcd.print("Cambio de giro  ");
  lcd.setCursor(0,1);
  lcd.print("motor lavadora. ");
  delay(2000);
  lcd.clear(); // Limpia la pantalla.
  lcd.setCursor(0,0); // En el primer carácter y primera fila.
*/

  pinMode(3,OUTPUT);
  pinMode(2,OUTPUT);
  pinMode(LuzFondo,OUTPUT);

  digitalWrite(LuzFondo, HIGH);
  digitalWrite(2, !LOW);
  lcd.setCursor(3,1); // RL 1.
  lcd.print("1 OFF");
  digitalWrite(3, !LOW);
  lcd.setCursor(9,1); // RL 2.
  lcd.print("2 OFF");
  Serial.begin(115200);
}

void loop()
{
  lcd.setCursor(0,1);
  lcd.print(inicio=millis()/15000); // 15 seg. antes de empezar.

     for (int i=0; i <= 10; i++)
   {

  digitalWrite(2, !HIGH);
  lcd.setCursor(3,1); // RL 1.
  lcd.print("1 ON ");
  delay(10000);

  digitalWrite(2, !LOW);
  lcd.setCursor(3,1); // RL 1.
  lcd.print("1 OFF");
  delay(10000);

  digitalWrite(3, !HIGH);
  lcd.setCursor(9,1); // RL 2.
  lcd.print("2 ON ");
  delay(10000);

  digitalWrite(3, !LOW);
  lcd.setCursor(9,1); // RL 2.
  lcd.print("2 OFF");
  delay(10000);

Veces++;
 lcd.setCursor(0,1);
 lcd.print(Veces);
 
  }

  while (true);

     // Cuando llegue aquí, tiene que pararse el motor siempre.
     // No se que instrucciones darle para que lo haga.
}

En cuanto lo que ha dicho que después se pone todo en el serial o LCD. Pues no se que tengo mal en ese aspecto. Por lo que veo, necesito apoyo en la programación de PIC, por suerte, la electrónica no me quejo tanto, aún me alegro los apoyos por si acaso.

Ver zoom.

Feliz día de Reyes 6 de enero. :wink: