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
// 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.
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 !
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?
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);
}
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.
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)
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);
}