Go Down

Topic: Sensor de Luz (LDR) (Read 6278 times) previous topic - next topic

DRicote

Jan 27, 2011, 07:23 pm Last Edit: Apr 30, 2012, 01:11 am by coleoptero Reason: 1
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

chiva

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
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

DRicote

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

Igor R

#3
Jan 27, 2011, 09:08 pm Last Edit: Jan 27, 2011, 09:16 pm by Igor R Reason: 1
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

;)

DRicote

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  ;)

Saludos

Igor R

#5
Jan 27, 2011, 10:23 pm Last Edit: Jan 27, 2011, 10:29 pm by Igor R Reason: 1
Lo del rs485... chupao!!  ;)  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 ;)
Espero contenerme y no empezar a buscar los cablecitos del can tracción de mi coche..... XD


DRicote

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 XD
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

DRicote

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

flico


Escribir en eeprom
Code: [Select]

#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: [Select]

#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);

}

Trabajando en ...

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

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

DRicote

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:

DRicote

#10
Jan 29, 2011, 01:20 am Last Edit: Jan 29, 2011, 01:25 am by DRicote Reason: 1
Acabo de hacer lo siguiente para unir los 3 datos de la eeprom, pero, hay algo mas sencillo?? o es así siempre.

Code: [Select]

#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(){
}

flico

Concatenacion
Code: [Select]

String test;
test.concat(3);
test.concat(0);
test.concat(0);

Trabajando en ...

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

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

Igor R

#12
Jan 29, 2011, 03:01 pm Last Edit: Jan 29, 2011, 03:10 pm by Igor R Reason: 1
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: [Select]
word miNumero16bits= (byte1 << 8) | (byte2)

;)

pacojarcia

aqui te dejo las funciones para manejar la eprom con INT.
Code: [Select]
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.

DRicote

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:

Go Up