Como cambiar delay() por millis o time? arduino

Todo cuanto tiene que ver con la obtención, almacenamiento y proceso de la información digital, sus aplicaciones y el software y hardware utilizado.
Mensaje
Autor
Avatar de Usuario
mister_electronico
Mensajes: 122
Registrado: Mié Ene 15, 2014 8:44 pm
País: España
Ciudad: Asturias

Re: Como cambiar delay() por millis o time? arduino

#11 Mensaje por mister_electronico »

Intenta con este codigo a ver que tal te va.... manteniedolo como tu lo escribes, ordenandolo de otra forma y no no permitiendo ambiguedad entre control bluetooth y control por sensores para no dejar nada al azar.

Es dificil depurar el codigo si no se tiene el circuito montado.

http://www.mediafire.com/file/4uokyk43u ... motica.ino

Saludos

brunomars09
Mensajes: 9
Registrado: Sab Abr 29, 2017 3:21 am
País: España
Ciudad: Barcelona

Re: Como cambiar delay() por millis o time? arduino

#12 Mensaje por brunomars09 »

Muchas gracias compañero, ya probé el código, mejora el error de las luces del jardin al encenderlas lo malo que ahora parece que la función de la alarma no la ejecuta, no la puedo desactivar.

Avatar de Usuario
mister_electronico
Mensajes: 122
Registrado: Mié Ene 15, 2014 8:44 pm
País: España
Ciudad: Asturias

Re: Como cambiar delay() por millis o time? arduino

#13 Mensaje por mister_electronico »

La alarma segun programa se activa enviandole el caracter "s" atraves de bluetooth
y se desactiva enviando el caracter "t".


Tambien para la luz del jardin "q" activa las luces y "r" las desactiva pero si aprietas esta teclas ya no se pueden activar o desactivar por LDR, para poderlo hacer y aqui acabo encontrar un error que puse dupiclada la funcion de la tecla "s" en el siguiente codigo cambia la "s" por la "y"

**********************************
void funcion_luzjardin()
{

if (estado=='q'){ bandera2=1 ; } // activo bandera2 y ya no permito que actue el LDR.
if (estado=='r'){ bandera2=1 ; } // activo bandera2 y ya no permito que actue la LDR.
if (estado=='s'){ bandera2=0 ; } // La "s" cambiala por la "y" en esta linea.
**********************************

Lo mismo para el ventilador "u" y "v" activan y desactivan el ventilador por bluetooth pero si lo haces asi desactivas el sensor de temperatura.

La letra "x" vuelve a permitir el funcionamiento por sensor de temperatura.

Saludos

brunomars09
Mensajes: 9
Registrado: Sab Abr 29, 2017 3:21 am
País: España
Ciudad: Barcelona

Re: Como cambiar delay() por millis o time? arduino

#14 Mensaje por brunomars09 »

Si es parte la entiendo, lo que trato de decir es que al ejecutar el código ya de por si la alarma esta activa, no inicia desactivada, y cuando suena y la quiero desactivar enviando desde la app el carácter ' t' , no se desactiva solo alcanza a hacer una pequeñas interrupciones cada vez que envio la letra 't' pero no la llega a apagar, a eso me refería. Pense que hacer este proyecto de la casa domotica iba ser mas facil por los videos que hay en youtube y eso pero nada :cry:. Gracias por la ayuda compañero, Intentare seguir a avanzando de todas formas.

Avatar de Usuario
mister_electronico
Mensajes: 122
Registrado: Mié Ene 15, 2014 8:44 pm
País: España
Ciudad: Asturias

Re: Como cambiar delay() por millis o time? arduino

#15 Mensaje por mister_electronico »

Pense que hacer este proyecto de la casa domotica iba ser mas facil por los videos que hay en youtube y eso pero nada :cry:.
Jejeje... paciencia compañero los proyectos por tontos que sean son para tirarse de los pelos.... hay que tener mucha tranquilidad.

Con respecto a la alarma.

Código: Seleccionar todo

Si es parte la entiendo, lo que trato de decir es que al ejecutar el código ya de por si la alarma esta activa, no inicia desactivada
Al final del void setup() pon:

digitalWrite(alarma, LOW);

Luego compañero me estoy dando cuenta de otra cosa y es que no tienes en el codigo original nada que detecte si la alarma esta activa o no .

osea que en el void funcion_alarma()

Al final mete las tres siguientes lineas:


if (estado==0){ piralarmaState = digitalRead(piralarma); } //desactiva alarma
if ((piralarmaState==HIGH) && ( bandera==0 )) { //si hay intrusos
digitalWrite(alarma, HIGH); } //activa alarma

if ((piralarmaState==LOW) && (bandera==0)) { //si hay intrusos
digitalWrite(alarma, LOW); } //activa alarma


Hazlo y cuentame a ver que pasa, voy muy deprisa y no me da tiempo a analizar nada mas.

Saludos.

Avatar de Usuario
mister_electronico
Mensajes: 122
Registrado: Mié Ene 15, 2014 8:44 pm
País: España
Ciudad: Asturias

Re: Como cambiar delay() por millis o time? arduino

#16 Mensaje por mister_electronico »

Perdon antes fui muy rapido y no me dio tiempo a contestarte bien.

Haz como te dije en la ultima linea de void setup()

digitalWrite(alarma, LOW);

Y la funcion void funcion_alarma()

Sustituyela completamente por esta:


void funcion_alarma()
{

if (estado=='s'){ bandera=1 ; digitalWrite(alarma, LOW); } // Desactiva la alarma.
if (estado=='t'){ bandera=0; } //si estado es igual a "t" vuelve activar la alarma.

if (bandera=0) { piralarmaState = digitalRead(piralarma); } // si la alarma esta activa lee el sensor.

if ((piralarmaState==HIGH) && ( bandera==0 )) { // Si la alarma esta activa y el sensor esta activado
digitalWrite(alarma, HIGH); } // activa alarma

if ((piralarmaState==LOW) && (bandera==0)) { //Si la alarma esta activa y el sensor esta desactivado
digitalWrite(alarma, LOW); } // desactiva alarma

}

Tienes que tener en cuenta que tal como esta el programa ahora la alarma empieza desactivada por que al inicio del programa bandera=0, pero esta vez espero que sin sonar por que en el void setup pusimos digitalWrite(alarma, LOW);

Pruebalo y cuentame.

Saludos.

Avatar de Usuario
mister_electronico
Mensajes: 122
Registrado: Mié Ene 15, 2014 8:44 pm
País: España
Ciudad: Asturias

Re: Como cambiar delay() por millis o time? arduino

#17 Mensaje por mister_electronico »

No se por que no me deja editar el foro los mensajes que he escrito yo.....

El post anterior es correcto pero el codigo de funcion funcio_alarma() en las dos ultimas lineas dentro de las dos condiciones if se me colo el comentario dentro de los corchetes { } lo cual no es muy correcto, pero no lo puedo editar para cambiarlo..... demasiadas prisas.

Un saludo.

brunomars09
Mensajes: 9
Registrado: Sab Abr 29, 2017 3:21 am
País: España
Ciudad: Barcelona

Re: Como cambiar delay() por millis o time? arduino

#18 Mensaje por brunomars09 »

Ahora esta asi :

Código: Seleccionar todo

#include <DHT.h>

int sensor = 22;
int temp, humedad;

DHT dht (sensor, DHT11);

int led1 = 40;      //Luz 1 Comedor
int led2 = 41;      //Luz_2_Comedor
int led3 = 42;      //Luz_Cocina
int led4 = 43;      //Luz_1_Pasillo
int led5 = 44;      //Luz_1_Pasillo
int led6 = 45;      //Luz_Hab 1
int led7 = 46;      //Luz_Hab 1
int led8 = 47;      //Luz_Baño
int led9 = 48;      //Luz_Garaje
int led10 = 49;     //Luz_1_Jardin
int led11 = 50;     //Luz_2_Jardin
int led12 = 51;     //Luz_3_Jardin
int led13 = 52;     //Luz_4_Jardin

int ventilador= 8;
int bandera= 0;
int bandera1=0;
int bandera2= 0;
int bandera3= 0;

//bluetooth
int estado = 0;

int LDRpin=A1;            // define el pin conectado al LDR
int LDRabc=0;
float LDRvoltaje=0;         // variable tipo flotante

int alarma=33;            //alarma contra intrusos y a la vez de incendios
int piralarma=7;         //sensor pir que detecta movimiento
int piralarmaState;       //variable para almacenar el valor del sensor pir


void setup(){
 
   
  Serial.begin(9600);
  dht.begin();
  pinMode(LDRpin, INPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  pinMode(led6, OUTPUT);
  pinMode(led7, OUTPUT);
  pinMode(led8, OUTPUT);
  pinMode(led9, OUTPUT);
  pinMode(led10, OUTPUT);
  pinMode(led11, OUTPUT);
  pinMode(led12, OUTPUT);
  pinMode(led13, OUTPUT);

  pinMode(alarma, OUTPUT);
  pinMode(piralarma, INPUT);


  pinMode(ventilador,OUTPUT);     //configuracion del ventilador

  digitalWrite(alarma, LOW);

}

void loop(){

 if( Serial.available()>0)   {
    estado = Serial.read();
    funcion_luces();
  }
 
  funcion_alarma();
  funcion_luces();
  funcion_luzjardin();
  funcion_ventilador();  

  estado = 0;
  

  }


void funcion_alarma()

{

if (estado=='s'){ bandera=1 ; digitalWrite(alarma, LOW); } // Desactiva la alarma. 
if (estado=='t'){ bandera=0; } //si estado es igual a "t" vuelve activar la alarma.

if (bandera=0) { piralarmaState = digitalRead(piralarma); } // si la alarma esta activa lee el sensor.

if ((piralarmaState==HIGH) && ( bandera==0 )) 
{ digitalWrite(alarma, HIGH); } // activa alarma

if ((piralarmaState==LOW) && (bandera==0)) 
{ digitalWrite(alarma, LOW); } // desactiva alarma

} 



void  funcion_luces()   // para manejar luces de casa.
{
  switch( estado)
  {
    case 'a':
    digitalWrite(led1, HIGH);    // primera luz del interior la casa
    break;
    case 'b':
    digitalWrite(led1, LOW);
    break;
   
    case 'c':
    digitalWrite(led2, HIGH);
    break;
    case 'd':
    digitalWrite(led2, LOW);
    break;
   
    case 'e':
    digitalWrite(led3, HIGH);
    break; 
    case 'f':
    digitalWrite(led3, LOW);
    break;

    case 'g':
    digitalWrite(led4, HIGH);
    digitalWrite(led5, HIGH);        // luz pasillo ambas encienden a la vez
   
    break; 
    case 'h':
    digitalWrite(led4, LOW);
    digitalWrite(led5, LOW);    // luz pasillo ambas se apagan a la vez
    break;

    case 'i':
    digitalWrite(led6, HIGH);
    break; 
    case 'j':
    digitalWrite(led6, LOW);
    break;

    case 'k':
    digitalWrite(led7, HIGH);
    break; 
    case 'l':
    digitalWrite(led7, LOW);
    break;

    case 'm':
    digitalWrite(led8, HIGH);
    break; 
    case 'n':
    digitalWrite(led8, LOW);
    break;

    case 'o':
    digitalWrite(led9, HIGH);
    break; 
    case 'p':
    digitalWrite(led9, LOW);    // ultima luz del interior de la casa
    break;

  }
}

void funcion_luzjardin()   // Para manejar luces jardin.
{

   if (estado=='q'){ bandera2=1 ; }     // activo bandera2 y ya no permito que actue el LDR.  
   if (estado=='r'){ bandera2=1 ; }     // activo bandera2 y ya no permito que actue la LDR.   
   if (estado=='y'){ bandera2=0 ; }     // desactivo bandera2 y permito que actue la LDR.   

   if ((estado=='q') && (bandera2==1)) {           //si hay intrusos
    digitalWrite(led10, HIGH);
    digitalWrite(led11, HIGH);      // lucess del jardin 
    digitalWrite(led12, HIGH);
    digitalWrite(led13, HIGH);
  } 
   
   if ((estado=='r') && (bandera2==1)) {           //
    digitalWrite(led10, LOW);
    digitalWrite(led11, LOW);     //apagamos luces del jardin
    digitalWrite(led12, LOW);
    digitalWrite(led13, LOW);
  }

   if ( bandera2==0 ) { 
      
  LDRabc=analogRead(LDRpin);
    LDRvoltaje=LDRabc*(5.0/1023.0);
    Serial.print("voltaje LDR: ");
    Serial.println(LDRvoltaje);
  }
   
    if ((LDRvoltaje<=1.20) && (bandera2==0)){
      digitalWrite(led10, HIGH);   
      delay(500);
      digitalWrite(led11, HIGH);      // luces del jardin encienden de noche
      delay(600);
      digitalWrite(led12, HIGH);
      delay(700);
      digitalWrite(led13, HIGH);
      delay(800);
 
      }

    if ((LDRvoltaje>1.20) && (bandera2==0)){
          digitalWrite(led10, LOW);
          digitalWrite(led11, LOW);   // luces del jardin se apagan de dia
          digitalWrite(led12, LOW);
          digitalWrite(led13, LOW);
          }
}


void funcion_ventilador()  // Para manejar ventilador y lectura humedad y envio de datos puerto.
{

   if (estado=='u'){ bandera3=1 ; }     // activo bandera3 y ya no permito que actue el sensor temperatura.  
   if (estado=='v'){ bandera3=1 ; }     // activo bandera3 y ya no permito que actue el sensor temperatura.   
   if (estado=='x'){ bandera3=0 ; }     // desactivo bandera3 y permito que actue el sensor temperatura.   


   if ((estado=='u') && (bandera3==1)) {           // 
    digitalWrite(ventilador, HIGH);
  }  

   if ((estado=='v') && (bandera3==1)) {           // 
    digitalWrite(ventilador, LOW);
  }  
  
    humedad = dht.readHumidity();
    temp = dht.readTemperature();


  // ¿¿ es necesario que por el puerto serie envies constantemente el valor de la temperatura y la humedad ??
  Serial.print("Temperatura:");
  Serial.print(temp);
  Serial.print("ºC Humedad: ");
  Serial.print(humedad);
  Serial.println("%");


  if ((temp < 22)  && (bandera3==0)) {//cambiar numero en funcion de lo que se desee
    digitalWrite(ventilador, LOW);
    }

  if ((temp > 22)  && (bandera3==0)){//cambiar numero en funcion de lo que se desee
    digitalWrite(ventilador, HIGH);
    }   
  
}
Sucede que ahora la alarma esta desactivada totalmente, no me deja activarla via bluetooth, esto es un dolor de cabeza jaja

Avatar de Usuario
mister_electronico
Mensajes: 122
Registrado: Mié Ene 15, 2014 8:44 pm
País: España
Ciudad: Asturias

Re: Como cambiar delay() por millis o time? arduino

#19 Mensaje por mister_electronico »

Pues deberia funcionar, asegurate que el pin de entrada de activacion de alarma se poner realmente a nivel alto y bajo de verdad.

O que el bluetooth manda las ordenes correctamente, y realmente.

Yo lo que hago normalmente en la depuraccion de codigo es dedicar una patita de salida de micrococontrolador para encender un led y asi me aseguro que entro y se ejecuta la parte del codigo correspondiente.

Asi por ejemplo diseño una nueva salida la de led y se lo coloco.

int led14 = 53; // led para chequeo. Ojo no se si esta patilla es correcta compruebalo.

Y asi por ejemplo en lla linea de codigo por ejemplo que quiero chequear

if (estado=='t'){ bandera=0; } //si estado es igual a "t" vuelve activar la alarma.

para ver si funciona pongo.

if (estado=='t'){ bandera=0; digitalWrite(led14, HIGH); } //si estado es igual a "t" vuelve activar la alarma.

Y asi chequeo que que realmente el bluetooth activa realmente la alarma.

Y asi para otras lineas.

Algo te esta fallando por que este codigo si deberia de funcionar.

Comprueba a ver y me cuentas..... saludos

Avatar de Usuario
mister_electronico
Mensajes: 122
Registrado: Mié Ene 15, 2014 8:44 pm
País: España
Ciudad: Asturias

Re: Como cambiar delay() por millis o time? arduino

#20 Mensaje por mister_electronico »

Otra cosa que puede ocurrir es que te este fallando la alimentacion, si la alimentacion no es estable el microcontrolador se te resetea y vuelve a empezar de nuevo.

Los contactos de las board muchas veces no son muy estables.

Se me ocurre que a lo mejor estas haciendo sonar una alarma de un altavoz o algo solo con la tension del usb que alimenta al arduino y a todo lo demas y en un momento determinado se te viene abajo la tension del USB y se resetea el arduino.

Salduos.

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 0 invitados