Pages: [1] 2   Go Down
Author Topic: Sensor de Luz (LDR)  (Read 5325 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Full Member
***
Karma: 4
Posts: 102
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola a todos en el nuevo foro!!, reciéntemente he estado trasteando con sensores de luz y tengo un problemilla con ello, pero me ha tocado esperar por la transición del foro  smiley-mr-green

El tema es el siguiente, lo que pretendo es hacer como un interruptor crepuscular, pero en vez de activar o desactivar algo, lo que hago es enviar una sola trama por el puerto serie cuando cambia a noche y a día, el problema es, que no para de enviarme tramas constantemente y no he conseguido que sólo me envíe una cuando cambia de estado.

Saludos
« Last Edit: April 29, 2012, 06:11:26 pm by coleoptero » Logged

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pues como no nos digas que sensor usas, cómo lo tienes conectado y con que condición envías la trama, poco vamos a poder hacer
Logged

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

0
Offline Offline
Full Member
***
Karma: 4
Posts: 102
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

El sensor es una LDR con un LM358, va conectado a positivo, negativo y la señal a una entrada analógica de arduino.
La condición sería como he mencionado anteriormente, por ejemplo, si es de día, cuando cambie a noche rebasando un umbral preestablecido envía una trama y al revés al ser de noche, cuando cambie a día envíe otra trama.

Saludos
Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola,

Pseudocódigo:

Setup()
  contadorDia=0;
  contadorNoche=0;
finSetup

Loop()
   LDR=leoADC();
  
   si (LDR<= UmbralDia Y contadorDia==0) entonces
    EnviaDatoSerie;
    contadorDia++;
    contadorNoche=0;
  fin
  si (LDR > UmbralNoche Y contadorNoche==0) entonces
     EnviaDatoSerie;
     contadorNoche++;
     contadorDia=0;
  fin
finLoop

smiley-wink
« Last Edit: January 27, 2011, 03:16:29 pm by Igor R » Logged


0
Offline Offline
Full Member
***
Karma: 4
Posts: 102
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Perfecto Igor R!!, el fallo que tenía yo es que no ponía a cero el contador contrario en cada caso y al empezar a cambiar cosas y cosas al final terminaba hasta con dolor de cabeza.
Ahí va un puntito para ti Igor R!!, a ver si te animas un día y me enseñas como enviar datos por rs485 como los de un sensor de temperatura por ejemplo  smiley-wink

Saludos
Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Lo del rs485... chupao!!  smiley-wink  es broma...je,je,je

Ahora estoy entre manos con algo mejor... smiley-eek-blue
Con bus CAN!! Estoy preparando una libreria para ser ready-to-go!!! Ya la tengo funcionando, pero me falta unos pequeños detallitos.... a 1 Mbit/s "pa por si acaso"  smiley-mr-green
Será tan fácil como usar el puerto serie!!! Tendré algunas plaquitas por si alguien quiere "jugar" con ello....buenas,bonitas y baratas smiley-wink
Espero contenerme y no empezar a buscar los cablecitos del can tracción de mi coche..... smiley-lol

« Last Edit: January 27, 2011, 04:29:16 pm by Igor R » Logged


0
Offline Offline
Full Member
***
Karma: 4
Posts: 102
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Lo del Bus Can está de lujo!! esperaré ansioso a tus publicaciones para poder probarlo, que como bien dices se pueden hacer cosillas en el coche smiley-lol
Te he comentado lo del RS485, porque me basé en él (al ser el hardware mas barato) desde hace tiempo, como sabes por algunas preguntas antiguas que te hize, y todavía no he podido enviar datos de algún sensor para por ejemplo ver los datos en un lcd a través del bus, sólo he podido enviar las tramas previamente ya programadas.

Saludos
Logged

0
Offline Offline
Full Member
***
Karma: 4
Posts: 102
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Una cosita mas, estoy intentando meter los dos valores de umbral en la eeprom con la idea de enviar un dato por serie y cambiar el valor del umbral sin tener que reprogramar el arduino, pero todavía no he sido capaz.

El umbral sería una cifra como 300 y por lo que he leído en cada sitio de la eeprom solo guarda 2 bytes, ya con esto me pierdo...

Alguna idea?

Saludos
Logged

0
Offline Offline
Edison Member
*
Karma: 8
Posts: 1040
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Escribir en eeprom
Code:
#include <EEPROM.h>

void setup()
{

//Syntax
//EEPROM.write(address, value)

EEPROM.write(0, 3);
delay(10);
EEPROM.write(1, 0);
delay(10);
EEPROM.write(2, 0);
delay(10);
}

void loop()
{
}


Leer eeprom
Code:
#include <EEPROM.h>

int value;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
value = EEPROM.read(0);
delay(10);
value = EEPROM.read(1);
delay(10);
value = EEPROM.read(2);
delay(10);

}

Logged

Trabajando en ...

    * Control Domotico (En montaje ...)
    http://casitadomotica.blogspot.com/
 

[url=https://bitbucket.org/fmalpartida

0
Offline Offline
Full Member
***
Karma: 4
Posts: 102
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

a la hora de guardarlos creo que me puedo apañar, pero a la hora de juntar la lectura de la eeprom? osease, los 3 datos en una cifra smiley-red
Logged

0
Offline Offline
Full Member
***
Karma: 4
Posts: 102
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Acabo de hacer lo siguiente para unir los 3 datos de la eeprom, pero, hay algo mas sencillo?? o es así siempre.

Code:
#include <EEPROM.h>

int value;
int value1;
int value2;
int value3;

void setup(){
  Serial.begin(115200);

  //Syntax
  //EEPROM.write(address, value)

  EEPROM.write(0,3);
  EEPROM.write(1,0);
  EEPROM.write(2,0);

  value1=EEPROM.read(0);
  value1=value1*100;
  value2=EEPROM.read(1);
  value2=value2*10;
  value2=value1+value2;
  value3=EEPROM.read(2);
  value=value2+value3;

  Serial.println(value);
}

void loop(){
}
« Last Edit: January 28, 2011, 07:25:07 pm by DRicote » Logged

0
Offline Offline
Edison Member
*
Karma: 8
Posts: 1040
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Concatenacion
Code:
String test;
test.concat(3);
test.concat(0);
test.concat(0);
Logged

Trabajando en ...

    * Control Domotico (En montaje ...)
    http://casitadomotica.blogspot.com/
 

[url=https://bitbucket.org/fmalpartida

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Dispones de unas funciones genéricas para guardar variables del tamaño que quieras en le EEPROM:
http://www.arduino.cc/playground/Code/EEPROMWriteAnything

Por otro lado, si quieres saber como "juntar" en una variable de mayor tamaño lo que tienes en variables más pequeñas, mira los operadores bitwise de la página Arduino.
Code:
word miNumero16bits= (byte1 << 8) | (byte2)

smiley-wink
« Last Edit: January 29, 2011, 09:10:03 am by Igor R » Logged


0
Offline Offline
Full Member
***
Karma: 2
Posts: 107
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

aqui te dejo las funciones para manejar la eprom con INT.
Code:
void borra_EEPROM(){
  for (int i = 0; i < 512; i++)
    EEPROM.write(i, 0);
}

void Escribe_EEPROM(int Direccion, byte Dato){
  EEPROM.write(Direccion, Dato);
  Direccion = Direccion + 1;
  if (Direccion == 512) Direccion = 0;
  delay(100);
}

byte Lee_EEPROM(int Direccion){
  byte value = EEPROM.read(Direccion);
  delay(100);
  Direccion = Direccion + 1;
  if (Direccion == 512) Direccion = 0;
  return value;
}
/////////////////////////////////////////////////////////////////////////
     
int eeprom_read_int(int eeaddress ) {
   int rdata;
   rdata = rdata | Lee_EEPROM(eeaddress);
   rdata = rdata | Lee_EEPROM(eeaddress+1)<<8;
   return rdata; } 
   
void eeprom_write_int(int eeaddress, int data ) {
  Escribe_EEPROM(eeaddress, (data & 0xFF)) ; // parte baja un INT tiene una longitud de 2 bytes
  Escribe_EEPROM(eeaddress+1,((data >> 8) & 0xFF)); // parte alta
   }
espero que te ayude.
Logged

0
Offline Offline
Full Member
***
Karma: 4
Posts: 102
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Gracias a los tres por contestar, las funciones que pacojarcia a puesto me han sevido de mucho, gracias.
Respecto a la concatencion y a los bitwise, podríais poner algun ejemplo? me temo que es bastante avanzado para mi smiley-red
Logged

Pages: [1] 2   Go Up
Jump to: