Pages: [1]   Go Down
Author Topic: Delay or interrupción  (Read 787 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola a todos , e adquirido un solenoide , el cual necesito hacer que cambie de estado tras 6 horas , os adjunto foto de el , ahora tengo los dos problemas , como hacer la conexión (para los dos diferentes estados) y como hacer el delay sin un reloj , tras leer algunos libros de arduino , no consigo   averiguar como hacerlo.
En la foto e indicado el borne de la tierra , y los otros , si se conecta el derecho al positivo y el izqd al negativo  el solenoide deja pasar corriente en un sentido , y se conectan al contrario , pasará el aire por los orificios de abajo , el solenoide funciona con pulsos , no es necesario alimentarlo contínuamente , nose como hacer el esquema eléctrico para que al cabo de las 6 horas cambie de posición , y si pulsando un pulsador , (después de esas 6 horas) hacer como un reset, poniendo el solenoide en su posición anterior, listo para empezar de nuevo a contar las 6 horas.
El único código que e conseguido y que obviamente no hace nada es el siguiente .

/*
* Time sketch
*
*/
#include <Time.h>
void setup()
{
Serial.begin(9600);
setTime(12,0,0,1,1,11); // set time to noon Jan 1 2011
}
void loop()
{
digitalClockDisplay();
delay(1000);
}
void digitalClockDisplay(){
// digital clock display of the time
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.print(" ");
Serial.print(day());
Serial.print(" ");
Serial.print(month());
Serial.print(" ");
Serial.print(year());
Serial.println();
}
void printDigits(int digits){
// utility function for clock display: prints preceding colon and leading 0
Serial.print(":");
if(digits < 10)
Serial.print('0');
Serial.print(digits);
}



Lo siento por el sermón, si algún alma caritativa me puede ayudar , se lo agredezco e invito a la cerveza.


* solenoide.jpg (76.84 KB, 641x480 - viewed 15 times.)
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 40
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola te voy a intentar ayudar pero yo no soy muy bueno en esto la verdad llevo poco tiempo haber si te vale algo de lo que te comento y así avances un poco, yo creo que te valdría la función millis(), que toma el valor de la placa desde que lleva encendida este valor desborda a los 50 dias aprox.
entonces justo antes de acabar el setup yo cogería el tiempo en una variable unsigned long tiempo_anterior.
y luego miraría cuando han pasado las 6 horas restando el tiempo actual con el anterior tomado;

ejemplo:
Quote
int estado = 1;
unsigned long tiempo_anterior;
int boton=??;    // esto es un ejemplo

void setup()
{
.........
.........

{

void loop()
{
...........
...........

if (millis()- tiempo_anterior >21600000) // comprobamos si han pasado las 6 horas.
{
tiempo_anterior = millis();  // volvemos a guardar el tiempo para contar las proximas seis horas.
estado = estado +1;        // aqui le sumamos 1 al estado para que cambie de valor.
}

if (digitalRead(boton) == HIGH) // si pulsamos el botón....
{
tiempo_anterior = millis() // volvemos a coger el tiempo para que se reseteen las 6 horas.
estado = estado-1;         // le quitamos 1 al estado volvemos al anterior
}

switch (estado) {
    case 1:
      //hacer algo cuando sea igual a 1
      break;
    case 2:
      //hacer algo cuando sea igual a 2
      break;


    default:
      // si nada coincide, ejecuta el "default"
      // el "default" es opcional
  }

}

espero que te sirva para algo y que te haga avanzar en el proyecto, seguro que se puede hacer mucho mejor pero bueno este es mi granito de arena.

un saludo a todos;

Fermg
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola de nuevo , tras todo el día intentando  hacerlo funcionar , no he conseguido hacer nada no funciona absolutamente nada.(frustrante)
Si alguno pudiera ayudarme , se lo agradezco enormemente.
Una vez pasen las 6 horas , el relé conectado al pin 6 se activará por 1 segundo.

He aqui el código :


int estado = 1;
unsigned long tiempo_anterior;
int inputPin= 8;    // pulsador el cual resetea la cuenta atrás de 6 horas y cambia el estado del solenoide.
int ledPin= 6;    // relé que se activa a las 6 horas

void setup()
{

pinMode(inputPin, INPUT); // declare pushbutton as input
pinMode(ledPin, OUTPUT); // declare pushbutton as output
}

void loop()
{


if (millis()- tiempo_anterior >21600000) // comprobamos si han pasado las 6 horas.
{
tiempo_anterior = millis();  // volvemos a guardar el tiempo para contar las proximas seis horas.
estado = estado +1;        // aqui le sumamos 1 al estado para que cambie de valor.
}

if (digitalRead(inputPin) == HIGH) // si pulsamos el botón....
{
tiempo_anterior = millis(); // volvemos a coger el tiempo para que se reseteen las 6 horas.
estado = estado-1;         // le quitamos 1 al estado volvemos al anterior
}

switch (estado) {
    case 1:
       //hacer algo cuando sea igual a 1
      break;
     
    case 2:
      //hacer algo cuando sea igual a 2
      break;
      digitalWrite(ledPin, HIGH);
      delay(1000);
      digitalWrite(ledPin, LOW);

 
     
}
}


Logged

Cordoba
Offline Offline
God Member
*****
Karma: 41
Posts: 718
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset


estado = estado +1;        // aqui le sumamos 1 al estado para que cambie de valor.
}

if (digitalRead(inputPin) == HIGH) // si pulsamos el botón....
{
tiempo_anterior = millis(); // volvemos a coger el tiempo para que se reseteen las 6 horas.
estado = estado-1;         // le quitamos 1 al estado volvemos al anterior
}

switch (estado) {
    case 1:
       //hacer algo cuando sea igual a 1
      break;
     
    case 2:
      //hacer algo cuando sea igual a 2
      break;
      digitalWrite(ledPin, HIGH);
      delay(1000);
      digitalWrite(ledPin, LOW);

}
}


Algunas sugerencias.
No sumes ni reste, solo asigna valores 0,1,2. Porque? cuando pulsas el boton tu crees que lo pulsaste una vez y en realidad pueden haber sido 100, se llama rebote.
Y usaria la logica inversa, la entrada conectada a +5 atravez de una resistensia de 10k. y el pulsador entre la entrada y la resistensi a GND, (busca acerca de pullup.)

Para eso se una una tecnica antirebote. como esta
bool function BotonPresionado()
{
  if (digitalRead(inputPin) == LOW)
  {
    while (digitalRead(inputPin) == LOW); nos quedamos aca hasta que se suelte el boton
    return true;
  }
  return false:
}

te falta el estado de no hacer nada si no lo necesitas, si repasas el codigo veras que siempre esta pasando por el case del valor 1, si tienes suerte de no restar mas de una vez pasaria todo el tiempo por el case 2 prendiendo y apagando 16 millones de veces por segundo el rele.
y si resta o suma mas de la cuenta nunca entraria a nada.
Logged

El que pregunta aprende, el que responde aprende a responder.

Offline Offline
Newbie
*
Karma: 0
Posts: 40
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola Maxid tiene razón, tienes que hacer un antirebote, sigo pensando que lo mejor es que vayas sumando para hacer un contador, que este lo que trendras en el swicht.

El problema que he visto en el código que has puesto es que lo has pegado tal y como yo te lo puse y solo era un ejemplo. En el caso 2, tienes el break; antes de decirle al arduino que haga las cosas y así no vas a poder hacer nada, porque sale del caso 2 antes de que le mandes hacer algo,el "break" pon lo debajo del digitalWrite(led,LOW); para comprobar que te funcionan los dos casos el 1 y el 2 pon algo de código también  en el 1 para que veas si va bien o mal, para hacer las pruebas baja el tiempo de espera no esperes todo ese tiempo, con que esperes cada 25000 milisegundos creo que es más que suficiente para las pruebas ya lo cambiaras al tiempo que creas conveniente, con respecto a sumarle, llegara un momento que tengas que hacer X cosas por ejemplo 10 y lo tienes que limitar ahí, porque si no seguirá contándote hasta el infinito y no queremos eso tampoco,

ejemplo;

if (estado > 10)   // si estado es mayor de 10 puedes poner el que tu quieras.
{
estado =1;          // aquí volverá al primero de los estado.
}

switch (estado) {
    case 1:                       // comprobamos si entra en el estado con el 1 te hara un for 10 veces
       for (int i=1; i=10;i++)
      {
      digitalWrite(ledPin, HIGH);
      delay(100);
      digitalWrite(ledPin, LOW);
     }
      break;
     
    case 2:   
      digitalWrite(ledPin, HIGH);
      delay(1000);
      digitalWrite(ledPin, LOW);
      break;
}

espero haberte ayudado, sigo diciendo que habra mil formas de hacerlo mejor, pero bueno yo también soy principiante.

saludos
Logged

Pages: [1]   Go Up
Jump to: