¿Código mal establecido?

he intentado hacer funcionar un puente h que controla una válvula para entrada y salida de gases, el código es simple quiero que abra y cierre la válvula en diferentes tiempos, hice el código con un contador, es decir, si el contador llega a una cantidad mínima (que vendría ser el tiempo de abierto o cerrado) cambie el estado, pero no logro que suceda, alguno de uds podrían decirme si algo va mal en mi código o tengo que armarlo de otra forma, para terminar el contador es algo necesario. el delay lo hago para hacer los conteos.

les dejo mi código :slight_smile:

// Conexoes modulo - Arduino
int ENB = 3;
int IN3 = 30;
int IN4 = 31;
int contador=0;
int valvula=0;
void setup()
{
  // Define os pinos como saida
  pinMode(ENB,OUTPUT);
  pinMode(IN3,OUTPUT);
  pinMode(IN4,OUTPUT);
}

//int tempo = 1000;

void loop()
{
  if(valvula=0)
  // Passo 1
  analogWrite(ENB, 255);
  digitalWrite(IN3, 1);
  digitalWrite(IN4, 0);
  //delay(tempo);  
  contador=contador+1;
  if(contador>=10)
  contador=0;

  // Passo 2
  analogWrite(ENB, 0);
  digitalWrite(IN3, 1);
  digitalWrite(IN4, 0);
  //delay(tempo);  
  contador=contador+1;
  if(contador>=50)
  valvula=0;
  contador=0;
  delay(100);

}

Buenas llOzll, este código no hay por donde cogerlo, debes mirarte el condicional if y creo que lo mejor luego apliques la instrucción millis() para controlar el tiempo. Mira si no pones {} despues del if solo se ejecutará la instrucción que le sigue, pero solo esa.

Tampoco entiendo para que te sirve la variable valvula si nunca la modificas...en fin, son muchas cosas. Yo te recomendaría te mirases el uso de if y millis.

Saludos,

buenas ... lo de la variable vavlvula me olvide quitarla ... pero entonces crees que se deba al comando if? por que vi que se podia usar de esa forma o con las llaves ( { } ), lo de la funcion millis no lo quiero usar por que no entiendo muy bien su funcionamiento y me parece mas dificil... quedaria asi mi codigo

// Conexoes modulo - Arduino
int ENB = 3;
int IN3 = 30;
int IN4 = 31;
int contador=0;

void setup()
{
  // Define os pinos como saida
  pinMode(ENB,OUTPUT);
  pinMode(IN3,OUTPUT);
  pinMode(IN4,OUTPUT);
}



void loop()
{

  // Passo 1
  analogWrite(ENB, 255);
  digitalWrite(IN3, 1);
  digitalWrite(IN4, 0);
  //delay(tempo);  
  contador=contador+1;
  if (contador>=10)
  contador=0;

  // Passo 2
  analogWrite(ENB, 0);
  digitalWrite(IN3, 1);
  digitalWrite(IN4, 0);
  //delay(tempo);  
  contador=contador+1;
  if(contador>=50)
  contador=0;
  delay(1000);

}

lo que quiero saber es si hacer este codigo no es posible con un contador... o el contador esta mal empleado? o si lo hago con millis como lo haria?... gracias por la respuesta !

Bueno, esperaba que alfredomrh se equivocara pero tiene razón... el código no tiene ni pies ni cabeza.

Como digo siempre y para que Nosotros podamos entenderte.
Puente H, dime como esta conectado.

const byte ENB       = 3;
const byte IN3       = 30;
const byte IN4       = 31;

Esto dice que tienes 3 conexiones.

Vamos a suponer este caso pero con un MEGA ya que usas 30, 31

Esto mismo pero en lugar de 4,5 usas 30,31

Este código pone en funcionamiento tu válvula cada 5 segundos y la apaga a los sig 5. y asi indefinidamente.

int IN3 = 30;    // Input3 conectada al pin 30
int IN4 = 31;    // Input4 conectada al pin 31 
int ENB = 3;    // ENB conectada al pin 3 de Arduino

unsigned long start;
bool estado, estadoAnt = false;

void setup()
{
 pinMode (ENB, OUTPUT); 
 pinMode (IN3, OUTPUT);
 pinMode (IN4, OUTPUT);
}

void loop() {

  if (millis() - start > 5000) {  // cambia de estado cada 5 seg o sea prende apaga la bomba
      estado = !estado;
    
  }
  if (estado != estadoAnt)
     if (estado)
        valvulaON();
     else  
        valvulaOFF();

  estadoAnt = estado;
}

void valvulaON(){
  digitalWrite (IN3, HIGH);
  digitalWrite (IN4, LOW);
  // Aplicamos PWM al pin ENB, haciendo que la válvula esta a full 
  analogWrite(ENB,255);
}

void valvulaOFF(){
  digitalWrite (IN3, HIGH);
  digitalWrite (IN4, LOW);
  analogWrite(ENB, 0);
}

claro tengo arduino megay los pines funcionan como lo dijiste 30, 31 es el 4, 5 con el codigo que dejaste se enciende y apaga el mismo intervalo de tiempo ?, es decir si abro la valvula 5s también tengo que cerrarlo despues de 5s?

No se… solo te di un esquema y códigos que funcionan.
Lo que quieres hacer es tu problema.
Tu pusiste

quiero que abra y cierre la válvula en diferentes tiempos

yo te di algo que lo hace cada 5seg, modifica esos 5 seg y hará lo que necesitas supongo!!

bueno, gracias por el codigo pero no abrio ni cerro la valvula, solo se quedo abierto luego le puse un delay a tu codigo y trabajo con ese delay es decir si le daba 1s abria y cerraba la valvula en 1s (cosa que no deseo) yo quiero que sean tiempos diferentes de abierto y cerrado,es muy extraño que no funcione y si funcione solo con delay … este cofigo es simple para abrir y cerrar pero llego al mismo problema abrir y cerrar la valvula en diferentes tiempos

int ENB = 3;
int IN3 = 30;
int IN4 = 31;
void setup()
{
  // Define os pinos como saida
  pinMode(ENB,OUTPUT);
  pinMode(IN3,OUTPUT);
  pinMode(IN4,OUTPUT);
}

int tempo = 1000;

void loop()
{
  
  // Passo 1
  analogWrite(ENB, 255);
  digitalWrite(IN3, 1);
  digitalWrite(IN4, 0);
  delay(tempo);  
 
  // Passo 2
  analogWrite(ENB, 0);
  digitalWrite(IN3, 1);
  digitalWrite(IN4, 0);
  
  delay(tempo);

}

espero alguien pueda ayudarme

Explicame algo... la válvula esta conectada como en el esquema el motor?

Si, esta hecho en arduino mega lo conecte todo como dice el codigo, justo ahora estoy que muevo el codigo y nada, solo con delay consigo encender y apagar la valvula pero lo malo del delay es que lo abre y cierra a tiempos iguales.

Prueba esto y haz lo necesario para que funcione

void loop() {
      valvulaON();
      delay(5000);
      valvulaOFF()
      delay(5000);
}

void valvulaON(){
  digitalWrite (IN3, HIGH);
  digitalWrite (IN4, LOW);
  // Aplicamos PWM al pin ENB, haciendo que la válvula esta a full 
  analogWrite(ENB,255);
}

void valvulaOFF(){
  digitalWrite (IN3, HIGH);
  digitalWrite (IN4, LOW);
  analogWrite(ENB, 0);
}

Es lo mismo con delay()

GRACIAS, ahora funciona dándole diferentes tiempos en los delay's !!

una gran ayuda la que brindaste amigo, te pasaste!!
:slight_smile: tengo más preguntas pero seguro que creare mas hilos para poder hacerlas!!

GRACIAS otra vez!!

Acabo de ver mi error en el código anterior. este tmb tiene que funcionar

void loop() {

  if (millis() - start > 5000) {  // cambia de estado cada 5 seg o sea prende apaga la bomba
      estado = !estado;
      start  = millis();
  }
  if (estado != estadoAnt)
     if (estado)
        valvulaON();
     else  
        valvulaOFF();

  estadoAnt = estado;
}

void valvulaON(){
  digitalWrite (IN3, HIGH);
  digitalWrite (IN4, LOW);
  // Aplicamos PWM al pin ENB, haciendo que la válvula esta a full 
  analogWrite(ENB,255);
}

void valvulaOFF(){
  digitalWrite (IN3, HIGH);
  digitalWrite (IN4, LOW);
  analogWrite(ENB, 0);
}

tambien funciona, lo malo es que abre y cierra la valvula a tiempos iguales (lo cual no deseo), podria hacerse para diferentes tiempos de abierto y cerrado?

una cosa mas si deseo por ejemplo controlar una cierta temperatura aparte de abrir y cerrar la valvula... ¿como lo haría? (aqui el problema se complica intente hacerlo pero no lo consegui) :slight_smile:

Claro que puede...
Aca va con tiempos diferentes
TIEMPO_ON sera tu constante de tiempo para accionarse
TIEMPO_OFF sera tu constante para permanecer desactivado.
Estan en millisegundos asi que tu juega con los números... ejemplo : 2 hs

2 h *3600 *1000 mseg

#define TIEMPO_ON     10*60*1000 // 10 minutos
#define TIMEPO_OFF      5*60*1000  // 5 minutos
int IN3 = 30;    // Input3 conectada al pin 30
int IN4 = 31;    // Input4 conectada al pin 31 
int ENB = 3;    // ENB conectada al pin 3 de Arduino

unsigned long starton, startoff;
bool estado, estadoAnt = false;

void setup()
{
 pinMode (ENB, OUTPUT); 
 pinMode (IN3, OUTPUT);
 pinMode (IN4, OUTPUT);

 starton = millis(); // esto es para que arranque con el ciclo de encendida, sino cambia
}

void loop() {

  if (millis() - starton > TIEMPO_ON) {  // cambia de estado cada 5 seg o sea prende apaga la bomba
      startoff = millis();
      valvulaOFF();
  }
  if (millis() - startoff > TIEMPO_OFF) {  // cambia de estado cada 5 seg o sea prende apaga la bomba
      starton = millis();
      valvulaON();
  }
}

void valvulaON(){
  digitalWrite (IN3, HIGH);
  digitalWrite (IN4, LOW);
  // Aplicamos PWM al pin ENB, haciendo que la válvula esta a full 
  analogWrite(ENB,255);
}

void valvulaOFF(){
  digitalWrite (IN3, HIGH);
  digitalWrite (IN4, LOW);
  analogWrite(ENB, 0);
}

solo queda encendido, modifique los tiempos y no cambio nunca.