Sensor de Luz (LDR)

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 :grin:

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

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

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

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

:wink:

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 :wink:

Saludos

Lo del rs485... chupao!! :wink: es broma...je,je,je

Ahora estoy entre manos con algo mejor... :fearful:
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" :grin:
Será tan fácil como usar el puerto serie!!! Tendré algunas plaquitas por si alguien quiere "jugar" con ello....buenas,bonitas y baratas :wink:
Espero contenerme y no empezar a buscar los cablecitos del can tracción de mi coche..... XD

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

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

Escribir en eeprom

#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

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

}

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 :blush:

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

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

Concatenacion

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

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.

word miNumero16bits= (byte1 << 8) | (byte2)

:wink:

aqui te dejo las funciones para manejar la eprom con INT.

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.

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 :blush:

Me pregunto cúal será la utilidad de hacer un AND con 0xFF :relaxed:

Las operaciones bitwise y de desplazamiento vienen explicadas en la referencia de Arduino, échale un vistazo a estas páginas:
http://www.arduino.cc/es/Reference/BitwiseAnd
http://www.arduino.cc/es/Reference/Bitshift

Un saludo

Me pregunto cúal será la utilidad de hacer un AND con 0xFF

Si la variable que haces un shift, tiene 2 bytes (int), y quieres quedarte sólo con el byte bajo, tiene sentido.... no??
Si haces un shift de 8, ya sabes que lo llena de ceros, pero si lo haces de tan solo 3?? Yo también lo suelo hacer "pa por si acaso" (además en algunos lenguajes existen shifts que rotan los bits en vez de meter ceros....)

Verdad es, llevo toda la tarde trabajando con bytes y había pensado las variables como bytes :sweat_smile:

XD XD XD