Go Down

Topic: Problema con sensor PIR (Read 123 times) previous topic - next topic

spiropuntocl

Estimados, estoy en pañales en programación de arduino, por eso recurro a ustedes, estoy haciendo un prototipo de domotica, donde mediante un sensor pir, pueda crear una especie de notificación para el usuario, hasta el momento la ejemplifico mediante un led, que al detectar movimiento se enciende, hasta ahí todo bien, pero no logro incluir otro led para ejemplificar una luz, por ejemplo el de una habitación, la cual yo pueda encender y apagar independiente de el primer led que es del sensor pir, se complica un poco mas por que quiero controlar todo esto desde una red local con la ethernet shield, logro hacer el enlace para encender y apagar un led que es típico, pero no logro unificar todo en un solo código.

resumiendo un poco:

la idea es que mediante una pagina web pueda ver si el sensor detecto movimiento y también encender y apagar un led.

espero me puedan ayudar por favor, desde ya gracias!

rodripelto

Hola,
Has probado a poner en google "encender y apagar led desde web con arduino" yo sí, y entre la multitud de resultados este es el primero.
https://www.prometec.net/ethernetled/.

Si no se sabe mezclar dos códigos es porque no entendemos el código ya que nos hemos limitado a copiar y pegar.

Hay unas sencillas reglas a tener en cuenta que funcionan casi siempre.
1ª Copiar las variables de ambos programas si coincide alguna cambiarle el nombre, no se pueden machar.
2ª Solo podemos tener 1 setup, por lo tanto copiaremos uno a continuación del otro, si tenemos instrucciones que se repiten podremos borrar una de ellas.
3ª Solo podemos tener un loop por lo tanto copiaremos uno a continuación del otro.
4ª Se copiaran todos los métodos usados en los dos programas, si hay métodos que coinciden los nombres se cambiara uno de ellos. Los métodos van fuera del loop.
No como he visto en alguna ocasión que copian los métodos del segundo programa y lo ponen dentro del loop del primero.
y con esto más o menos lo tendríamos, por supuesto esto no es un método infalible, el mejor método para mezclar dos programas es entender lo que hace cada uno por separado, para poder modificar y estructurar el programa nuevo a nuestras necesidades.
Si pones el código que quieres juntar seguro que hay alguien que te ayuda a hacerlo, ¿o pretendes que te hagamos el código desde cero?.

Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

spiropuntocl

Gracias por responder amigo, y por supuesto que no espero que hagan el código desde cero, solo necesito un poco de sus conocimientos.

hasta el momento tengo este codigo, trate de seguir los pasos que me dejaste en el post anterior, pero no logro que funcione, como les comentaba recien estoy aprendiendo.

#include <SPI.h> //Aqui incluimos la libreria SPI
#include <Ethernet.h> //Aqui incluimos la libreria Ethernet
byte mac[]={0xDE,0xAD,0xBE,0xEF,0xFE,0xED}; //Declaracion de la direccion MAC
IPAddress ip(192,168,0,10); //Declaracion de la IP
EthernetServer servidor(80); //Declaracion del puerto 80

int PIN_LED=2; // establecemos la variable PIN_LED como un valor entero
String readString=String(30); //lee los caracteres de una secuencia en una cadena.
//Los strings se representan como arrays de caracteres (tipo char)
String state=String(3);
String state1=String(3);

const int LED_Pin = 3;        // pin para el LED
const int PIR_Pin = 8;         // pin de entrada de sensor
 int pirState = LOW;           // de inicio no hay movimiento
int val = 0;                  // estado del pin


void setup() {
  Ethernet.begin(mac, ip); //Inicializamos con las direcciones asignadas
  servidor.begin(); //inicia el servidor
  pinMode(PIN_LED,OUTPUT);
  digitalWrite(PIN_LED,LOW);
  state="APAGADA";
  pinMode(LED_Pin, OUTPUT);
  pinMode(PIR_Pin, INPUT);
  Serial.begin(9600);
}
 
   

void loop() {
  //EthernetClient Crea un cliente que se puede conectar a
  //una dirección específica de Internet IP
  EthernetClient cliente= servidor.available();
  if(cliente) {
    boolean lineaenblanco=true;
    while(cliente.connected()) {
      if(cliente.available()) {
        char c=cliente.read();
        if(readString.length()<30) {
          readString.concat(c);
          //Cliente conectado
          //Leemos petición HTTP caracter a caracter
          //Almacenar los caracteres en la variable readString
        }
        if(c=='\n' && lineaenblanco) //Si la petición HTTP ha finalizado
          {
          int LED = readString.indexOf("LED=");
          if(readString.substring(LED,LED+5)=="LED=T") {
              digitalWrite(PIN_LED,HIGH);
              state="ENCENDIDA"; }
          else if (readString.substring(LED,LED+5)=="LED=F") {
              digitalWrite(PIN_LED,LOW);
              state="APAGADA";
          }

              val = digitalRead(PIR_Pin);
   if (val == HIGH)   //si está activado
   {
      digitalWrite(LED_Pin, HIGH);  //enciende led
      if (pirState == LOW)  //si previamente estaba apagado
      {
        Serial.println("movimiento detectado");
        pirState = HIGH;
        state1="MOVIMIENTO DETECTADO";
      }
   }
   else   //si esta desactivado
   {
      digitalWrite(LED_Pin, LOW); // apaga led
      if (pirState == HIGH)  //si previamente estaba encendido
      {
        Serial.println("sin movimiento");
        pirState = LOW;
        state1="SIN MOVIMIENTO";
      }
   
            }
//Cabecera HTTP estándar
cliente.println("HTTP/1.1 200 OK");
cliente.println("Content-Type: text/html");
cliente.println(); //Página Web en HTML
cliente.println("<html>");
cliente.println("<head>");
cliente.println("<title>BIENVENIDOS</title>");
cliente.println("</head>");
cliente.println("<body width=100% height=100%>");
cliente.println("<center>");
cliente.println("<h1>BIENVENIDOS</h1>");
cliente.print("<br><br>");
cliente.print("HABITACION_01: ");
cliente.print(state);
cliente.print("<br><br><br><br>");
cliente.println("<input type=submit value=ENCENDER style=width:200px;height:75px onClick=location.href='./?LED=T\'>");
cliente.println("<input type=submit value=APAGAR style=width:200px;height:75px onClick=location.href='./?LED=F\'>");
cliente.print("<br><br>");
cliente.print("DETECCION DE MOVIMIENTO: ");
cliente.print(state1);
cliente.println("</center>");
cliente.println("</body>");
cliente.println("</html>");
cliente.stop();
//Cierro conexión con el cliente
readString="";
}
}
}
}
 
  }






tengo conexion con el led 2 y lo logro encender y apagar, pero no logro que funcione el sensor y me muestre el mensaje por la pagina web de que detecto movimiento, me muestra un 3 como mensaje. espero mme puedan ayudar, saludos y gracias

rodripelto

Hola,

Yo lo que haria es poner el codigo que dectecta movimiento, enciende y apaga el led, primero fuera de cualquiei if, quiero que ese código se ejecute tengamos o no conexión con la web y luego si hay conesión con la web interactuo con ella, si no prosigo controlando el sensor.

Code: [Select]

void loop()
{
   val = digitalRead(PIR_Pin);
   if (val == HIGH)   //si está activado
   {
      digitalWrite(LED_Pin, HIGH);  //enciende led
      if (pirState == LOW)  //si previamente estaba apagado
      {
        Serial.println("movimiento detectado");
        pirState = HIGH;
        state1="MOVIMIENTO DETECTADO";
      }
   }
   else   //si esta desactivado
   {
      digitalWrite(LED_Pin, LOW); // apaga led
      if (pirState == HIGH)  //si previamente estaba encendido
      {
        Serial.println("sin movimiento");
        pirState = LOW;
        state1="SIN MOVIMIENTO";
      } 
    }
   
  //EthernetClient Crea un cliente que se puede conectar a
  //una dirección específica de Internet IP
  EthernetClient cliente= servidor.available();
  if(cliente)
  {
    boolean lineaenblanco=true;
    while(cliente.connected())
    {
      if(cliente.available())
      {
        char c=cliente.read();
        if(readString.length()<30)
        {
          readString.concat(c);
          //Cliente conectado
          //Leemos petición HTTP caracter a caracter
          //Almacenar los caracteres en la variable readString
        }
        if(c=='\n' && lineaenblanco) //Si la petición HTTP ha finalizado
          {
            int LED = readString.indexOf("LED=");
            if(readString.substring(LED,LED+5)=="LED=T")
            {
                digitalWrite(PIN_LED,HIGH);
                state="ENCENDIDA"; }
            else if (readString.substring(LED,LED+5)=="LED=F")
            {
                digitalWrite(PIN_LED,LOW);
                state="APAGADA";
            }

            //Cabecera HTTP estándar
            cliente.println("HTTP/1.1 200 OK");
            cliente.println("Content-Type: text/html");
            cliente.println(); //Página Web en HTML
            cliente.println("<html>");
            cliente.println("<head>");
            cliente.println("<title>BIENVENIDOS</title>");
            cliente.println("</head>");
            cliente.println("<body width=100% height=100%>");
            cliente.println("<center>");
            cliente.println("<h1>BIENVENIDOS</h1>");
            cliente.print("<br><br>");
            cliente.print("HABITACION_01: ");
            cliente.print(state);
            cliente.print("<br><br><br><br>");
            cliente.println("<input type=submit value=ENCENDER style=width:200px;height:75px onClick=location.href='./?LED=T\'>");
            cliente.println("<input type=submit value=APAGAR style=width:200px;height:75px onClick=location.href='./?LED=F\'>");
            cliente.print("<br><br>");
            cliente.print("DETECCION DE MOVIMIENTO: ");
            cliente.print(state1);
            cliente.println("</center>");
            cliente.println("</body>");
            cliente.println("</html>");
            cliente.stop();
            //Cierro conexión con el cliente
            readString="";
          }
      }
    }
  }
}


Pruebalo así, y nos comentas. Si funciona te comento como encasularia cada parte del programas en metodos para una mejor estructuración.
Un saludo.
Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

spiropuntocl

Hola amigo, quería agradecer tu tiempo y contarte que lo que me propusiste funciono perfecto, era lo que yo quería lograr, que funcionen de manera independiente en un solo código, el único detalle es que sigo sin interactuar con la pagina web, para que me arroje un mensaje de que se detecto movimiento o no, me imagino es por que estoy fuera de donde se realiza el enlace ethernet, espero me ayudes saludos y de nuevo muchas gracias

Go Up