0
Offline
Full Member
Karma: 4
Posts: 102
Arduino rocks
|
 |
« on: January 27, 2011, 01:23:33 pm » |
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  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
Edison Member
Karma: 22
Posts: 1373
|
 |
« Reply #1 on: January 27, 2011, 01:46:50 pm » |
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
|
|
|
|
|
0
Offline
Full Member
Karma: 4
Posts: 102
Arduino rocks
|
 |
« Reply #2 on: January 27, 2011, 01:58:40 pm » |
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
Edison Member
Karma: 12
Posts: 1552
|
 |
« Reply #3 on: January 27, 2011, 03:08:39 pm » |
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 
|
|
|
|
« Last Edit: January 27, 2011, 03:16:29 pm by Igor R »
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 4
Posts: 102
Arduino rocks
|
 |
« Reply #4 on: January 27, 2011, 03:58:16 pm » |
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
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Edison Member
Karma: 12
Posts: 1552
|
 |
« Reply #5 on: January 27, 2011, 04:23:14 pm » |
Lo del rs485... chupao!!  es broma...je,je,je Ahora estoy entre manos con algo mejor...  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"  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..... 
|
|
|
|
« Last Edit: January 27, 2011, 04:29:16 pm by Igor R »
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 4
Posts: 102
Arduino rocks
|
 |
« Reply #6 on: January 27, 2011, 05:24:59 pm » |
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 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
Full Member
Karma: 4
Posts: 102
Arduino rocks
|
 |
« Reply #7 on: January 28, 2011, 10:31:22 am » |
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
Edison Member
Karma: 8
Posts: 1040
Arduino rocks
|
 |
« Reply #8 on: January 28, 2011, 02:06:10 pm » |
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);
}
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 4
Posts: 102
Arduino rocks
|
 |
« Reply #9 on: January 28, 2011, 06:56:42 pm » |
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 
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 4
Posts: 102
Arduino rocks
|
 |
« Reply #10 on: January 28, 2011, 07:20:53 pm » |
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(){ }
|
|
|
|
« Last Edit: January 28, 2011, 07:25:07 pm by DRicote »
|
Logged
|
|
|
|
|
0
Offline
Edison Member
Karma: 8
Posts: 1040
Arduino rocks
|
 |
« Reply #11 on: January 29, 2011, 08:52:15 am » |
Concatenacion String test; test.concat(3); test.concat(0); test.concat(0);
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Edison Member
Karma: 12
Posts: 1552
|
 |
« Reply #12 on: January 29, 2011, 09:01:12 am » |
Dispones de unas funciones genéricas para guardar variables del tamaño que quieras en le EEPROM: http://www.arduino.cc/playground/Code/EEPROMWriteAnythingPor 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) 
|
|
|
|
« Last Edit: January 29, 2011, 09:10:03 am by Igor R »
|
Logged
|
|
|
|
|
0
Offline
Jr. Member
Karma: 1
Posts: 80
Arduino rocks
|
 |
« Reply #13 on: January 29, 2011, 06:29:09 pm » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 4
Posts: 102
Arduino rocks
|
 |
« Reply #14 on: January 30, 2011, 12:43:32 pm » |
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 
|
|
|
|
|
Logged
|
|
|
|
|
|