Concurso de fotografía AM

Temática: «Una panorámica de tu acuario».
Ya esta abierto el plazo para presentar fotografías.

Más info
image01

¿Aún no conoces AMA?

Hazte socio de Acuariofilia Madrid Asociación.
CERRADO EL PLAZO DE INSCRIPCIÓN

Más info
image01

Atlas de peces de AM

¡Hemos alcanzado las 800 fichas! Visita nuestro atlas de peces actualizado.

Más info
image01

Cardúmenes y sociabilidad

Nueva actualización de la tabla con una extensa relación de peces, donde podrás conocer qué entorno necesita cada especie, su sociabilidad y si convive o no en cardumen. ¡Pasa a descubrirla!

Mas info
image01
Aula Arduino para principiantes.
Respuestas: 1783    Visitas: 467426
#1,426
(04-09-2015, 09:43 AM)Antonio Castro escribió: Pon la suma total de los voltajes de cada serie y te digo algo.

Las series serían las siguientes
Serie 1: 6 azules a 3.5v = 21v Tendría que utilizar una resistencia 4.286 OHMS
Serie 2: 4 rojos de 2.5 + 4 blancos cálidos de 3.5 = 24v no hay necesidad de utilizar resistencia.
Serie 3: 6 blancos de 3.5v = 21 Tendría que utilizar una resistencia 4.286 OHMS
Serie 3: 6 blancos de 3.5v = 21 Tendría que utilizar una resistencia 4.286 OHMS
Serie 3: 6 blancos de 3.5v = 21 Tendría que utilizar una resistencia 4.286 OHMS
Serie 3: 6 blancos de 3.5v = 21 Tendría que utilizar una resistencia 4.286 OHMS
Serie 3: 6 blancos de 3.5v = 21 Tendría que utilizar una resistencia 4.286 OHMS

Tengo una pregunta los led tienen capacidad de resistir a hasta 4v su rango de tolerancia es la siguiente Voltaje: 3.4 - 4.0 Max.
Led / Voltaje Mínimo /Voltaje máximo
Blanco frio / 3.4v / 4v
Blanco cálido / 3.4v / 4v
Led Azul / 3.4v / 3.6v
Led Rojo / 2.4v / 2.8v

Pregunta no sé si sería mejor trabajar con el voltaje máximo de los led o trabajar con la media.

Si trabajara a su máxima capacidad no tendría que utilizar resistencias en la series de blancos solo en las de azul
#1,427
Las resistencias de 4.286 Ohms, trabajaran a 3v y 700 mA Es decir. Disiparán 2.1w.

No encontrarás resistencias de 4.286 Ohms. Pidelas ligeramente mayores.
Te venden las resistencias con tolerancias expresadas en forma de porcentaje.
Valores típicos de tolerancia son 5%, 10% y 20%, pero también hay de 0.1%, 0.25%, 0.5%, 1%, 2%, 3% y 4%.
Una resistencia de 1000 ohmios con una tolerancia del 10% puede tener un valor entre 900 y 1100 ohmios.

Posiblemente la encuentres de 4.7 Ohms y aunque eso suponga trabajar a solo 638mA, siempre será mejor que poner una resistencia menor de lo recomendable y superar los 700mA acortando la vida del Led.

No te conformes con el valor teórico de las resistencias. Debes medir su valor, porque no tienen valor exacto y tampoco te fíes demasiado de la tolerancia que aunque en teoría deberían respetarla, puede resultar mayor que la indicada.

Los LEDs blancos y azules no deben trabajar a más de 3.4v o reducirás sensiblemente su vida útil.

Tampoco encontrarás resistencias de exactamente 2.1w. Pídelas siempre que disipen algo más. Por ejemplo de 3w.

El ahorro que interesa es el de la vida útil de tus componentes.
#1,428
Tenakawa no has dicho de que amperaje son los led, es necesario para saber que potencia tiene que disipar la resistencia de carga. Si fuera de 700mA necesitarías un mínimo de 4.3 Ohm y 2.1 W, lo siguiente normalizado sería 4.7 Ohm y 3W, permitiendo una corriente de 640 mA

Aparte potencia tiene que disipar la resistencia de carga es potencia perdida y calor generado. Porque no añades un led rojo a cada una de las lineas de 21v, sube el voltaje a 23.5v por lo que solo necesitaras 0.7 Ohm y 0.35 W. Dos resistencias en paralelo de 1.5 Ohm y cuarto de watio te dan una resultante de 0.75 Ohm y 0.5 W, de sobra y con corriente de 670mA.

Los led por debajo de su voltaje mínimo no lucen, por encima de su voltaje máximo se frien
#1,429
(05-09-2015, 09:25 PM)ArturoS escribió: Tenakawa no has dicho de que amperaje son los led, es necesario para saber que potencia tiene que disipar la resistencia de carga. Si fuera de 700mA necesitarías un mínimo de 4.3 Ohm y 2.1 W, lo siguiente normalizado sería 4.7 Ohm y 3W, permitiendo una corriente de 640 mA

Aparte potencia tiene que disipar la resistencia de carga es potencia perdida y calor generado. Porque no añades un led rojo a cada una de las lineas de 21v, sube el voltaje a 23.5v por lo que solo necesitaras 0.7 Ohm y 0.35 W. Dos resistencias en paralelo de 1.5 Ohm y cuarto de watio te dan una resultante de 0.75 Ohm y 0.5 W, de sobra y con corriente de 670mA.

Los led por debajo de su voltaje mínimo no lucen, por encima de su voltaje máximo se frien

Los Led son de 700m
#1,430
Pues sigo haciendo el montaje definitivo de CAO1, y aunque lento, voy haciando progresos.
Primero, ya me ha llegado el conversor para la sonda de PH, el de Tindie , y es realmente pequeño.

[Imagen: 9PZtuMn.jpg]

Bueno, el montaje que quiero hacer es para estar dentro del armario de debajo del acuario, van a ir todos los componentes sobre un tablero de DM de 10mm de grosor y convenientemente mecanizado, luego por supuesto ya se pintará.

Aquí la madera con el LCD, teclado y un hueco para una regleta de 6 enchufes.
[Imagen: PypZlMN.jpg]

Y en esta otra imagen se ve como irá la parte trasera.

[Imagen: Kj1uZI3.jpg]
Se puede ver arriba a la izquierda el Arduino Mega con una shield hecha sobre una paca de prototipos, y donde todas las salidas y entradas están con conector Molex, a la derecha hay otra pequeña placa que es para el Lm7809 y también hay un transistor Mosfet para el dimeo de la pantalla LED que traía mi acuario, que es a 24V y trae su propia fuente. Justo debajo está el reloj DS3231, y a la derecha de estos hay una placa comercial de potencia para el dimeo de la otra pantalla que realizaré de forma casera y que tendrá cuatro canales. En el centro están el LCD y el teclado y abajo a la derecha se ve la fuente de alimentación, una Phoenix Contact de 12V y 10A.

De momento es todo lo que tengo, cuando tenga más avances ya os lo iré mostrando.
#1,431
(06-09-2015, 09:14 PM)rubenmas escribió: Pues sigo haciendo el montaje definitivo de CAO1, y aunque lento, voy haciando progresos.
Primero, ya me ha llegado el conversor para la sonda de PH, el de Tindie , y es realmente pequeño.
[...]
Bueno, el montaje que quiero hacer es para estar dentro del armario de debajo del acuario, van a ir todos los componentes sobre un tablero de DM de 10mm de grosor y convenientemente mecanizado, luego por supuesto ya se pintará.
[...]
De momento es todo lo que tengo, cuando tenga más avances ya os lo iré mostrando.
Muy interesante. Tiene una pinta estupenda.
#1,432
(05-09-2015, 05:49 PM)Tenakawa escribió:
(04-09-2015, 09:43 AM)Antonio Castro escribió: Pon la suma total de los voltajes de cada serie y te digo algo.

Las series serían las siguientes
Serie 1: 6 azules a 3.5v = 21v Tendría que utilizar una resistencia 4.286 OHMS
Serie 2: 4 rojos de 2.5 + 4 blancos cálidos de 3.5 = 24v no hay necesidad de utilizar resistencia.
Serie 3: 6 blancos de 3.5v = 21 Tendría que utilizar una resistencia 4.286 OHMS
Serie 3: 6 blancos de 3.5v = 21 Tendría que utilizar una resistencia 4.286 OHMS
Serie 3: 6 blancos de 3.5v = 21 Tendría que utilizar una resistencia 4.286 OHMS
Serie 3: 6 blancos de 3.5v = 21 Tendría que utilizar una resistencia 4.286 OHMS
Serie 3: 6 blancos de 3.5v = 21 Tendría que utilizar una resistencia 4.286 OHMS

Tengo una pregunta los led tienen capacidad de resistir a hasta 4v su rango de tolerancia es la siguiente Voltaje: 3.4 - 4.0 Max.
Led / Voltaje Mínimo /Voltaje máximo
Blanco frio / 3.4v / 4v
Blanco cálido / 3.4v / 4v
Led Azul / 3.4v / 3.6v
Led Rojo / 2.4v / 2.8v

Pregunta no sé si sería mejor trabajar con el voltaje máximo de los led o trabajar con la media.

Si trabajara a su máxima capacidad no tendría que utilizar resistencias en la series de blancos solo en las de azul


El voltaje al que puedas poner los leds dependerá de la disipación de calor que tengan. Si tienes un buen disipador y bien ventilado puedes subirlos más cerca del rango máximo.

Me llama la atención que tus blancos necesiten más voltaje que los azules, suele ser al revés. No los has comprado en la misma tienda no?

Hazte las series de led tomando como referencia el valor medio entre los que das, es decir para el blanco yo calcularía unos 3.6 o 3.7v y así son los demás. Seguramente necesitarás resistencias de muy pocos ohmios y mucha disipación de calor. No te preocupes que por ebay venden resistencias de 1.2, 1.5 y 1.7 ohmios que seguramente te serán de ayuda para montar las series. Ten en cuenta que las resistencias se pueden sumar en serie y en paralelo, por lo que podrás construirte otras resistencias a partir de las que tengas. Las resistencias en paralelo tienen la ventaja en nuestro caso que la corriente se divide al pasar por ellas y por tanto cada una de ellas tendrá que disipar mucho menos calor que si estuviesen en serie o solo una de ellas.

Por ejemplo si necesitas una resistencia de pongamos 3 ohmios y que disipe 2,4w puedes usar 2 resistencias de 6 ohmios y 2w y las pones en paralelo. Sería el equivalente a tener una de 3 ohmios disipando 4 watios y te serviría. Yo antes de tener una fuente ajustable me tuve que montar mis series de led con resistencias de esta forma.
#1,433
(07-09-2015, 06:30 PM)Agamenon escribió:
(05-09-2015, 05:49 PM)Tenakawa escribió:
(04-09-2015, 09:43 AM)Antonio Castro escribió: Pon la suma total de los voltajes de cada serie y te digo algo.

Las series serían las siguientes
Serie 1: 6 azules a 3.5v = 21v Tendría que utilizar una resistencia 4.286 OHMS
Serie 2: 4 rojos de 2.5 + 4 blancos cálidos de 3.5 = 24v no hay necesidad de utilizar resistencia.
Serie 3: 6 blancos de 3.5v = 21 Tendría que utilizar una resistencia 4.286 OHMS
Serie 3: 6 blancos de 3.5v = 21 Tendría que utilizar una resistencia 4.286 OHMS
Serie 3: 6 blancos de 3.5v = 21 Tendría que utilizar una resistencia 4.286 OHMS
Serie 3: 6 blancos de 3.5v = 21 Tendría que utilizar una resistencia 4.286 OHMS
Serie 3: 6 blancos de 3.5v = 21 Tendría que utilizar una resistencia 4.286 OHMS

Tengo una pregunta los led tienen capacidad de resistir a hasta 4v su rango de tolerancia es la siguiente Voltaje: 3.4 - 4.0 Max.
Led / Voltaje Mínimo /Voltaje máximo
Blanco frio / 3.4v / 4v
Blanco cálido / 3.4v / 4v
Led Azul / 3.4v / 3.6v
Led Rojo / 2.4v / 2.8v

Pregunta no sé si sería mejor trabajar con el voltaje máximo de los led o trabajar con la media.

Si trabajara a su máxima capacidad no tendría que utilizar resistencias en la series de blancos solo en las de azul


El voltaje al que puedas poner los leds dependerá de la disipación de calor que tengan. Si tienes un buen disipador y bien ventilado puedes subirlos más cerca del rango máximo.

Me llama la atención que tus blancos necesiten más voltaje que los azules, suele ser al revés. No los has comprado en la misma tienda no?

Hazte las series de led tomando como referencia el valor medio entre los que das, es decir para el blanco yo calcularía unos 3.6 o 3.7v y así son los demás. Seguramente necesitarás resistencias de muy pocos ohmios y mucha disipación de calor. No te preocupes que por ebay venden resistencias de 1.2, 1.5 y 1.7 ohmios que seguramente te serán de ayuda para montar las series. Ten en cuenta que las resistencias se pueden sumar en serie y en paralelo, por lo que podrás construirte otras resistencias a partir de las que tengas. Las resistencias en paralelo tienen la ventaja en nuestro caso que la corriente se divide al pasar por ellas y por tanto cada una de ellas tendrá que disipar mucho menos calor que si estuviesen en serie o solo una de ellas.

Por ejemplo si necesitas una resistencia de pongamos 3 ohmios y que disipe 2,4w puedes usar 2 resistencias de 6 ohmios y 2w y las pones en paralelo. Sería el equivalente a tener una de 3 ohmios disipando 4 watios y te serviría. Yo antes de tener una fuente ajustable me tuve que montar mis series de led con resistencias de esta forma.

Yo me olvidaría del voltaje máximo porque en las proximidades de ese voltaje las gráficas de Intensidad / Voltaje se hacen casi verticales y un pequeño incremento del voltaje supone un aumento muy grande de la intensidad.

En realidad el factor importante es la intensidad que es el que provoca el calor. El viaje del calor es el siguiente.

1) El calor generado por la intensidad de la corriente se acumula en el punto de la unión PN del diodo pudiendo alcanzar temperaturas críticas.
2) Desde el punto de la unión PN se traslada a la base del LED.
3) Desde la base del LED se trasmite al disipador de calor
4) Del disipador de calor se libera al ambiente.

Se pueden producir deficiencias de conductividad térmica en cada uno de esos pasos y la imagen de una simulación gráfica que represente la distribución de temperaturas sería la siguiente:

[Imagen: test-termico-realizado-por-ledia-group-a...as-LED.jpg]

Nosotros hemos elegido usar un voltaje constante por simplicidad y porque la regulación PWM lo que regula son pulsos de ancho variable y altura (voltaje) constante. Hay circuitos que trabajan a intensidad constante pero no resulta sencillo dimearlos con Arduino.

El problema de esto es que el el momento del arranque con el LED frío la intensidad, será por un corto instante de tiempo, ligeramente superior a lo deseado porque los LEDs tienen un cociente de temperatura negativo. A mayor sea su temperatura menor será su resistencia. No pasa nada si usamos el LED al voltaje recomendado. Aguantan algo más y de hecho, durante el arranque es posible que en la unión PN del diodo se genere una intensidad algo mayor.

No merece la pena apurar los LEDs. Si para un pelín más de luz vas a reducir la eficiencia y a reducir a la mitad la vida útil, habría que plantearse poner más LEDs.
#1,434
Ya tengo montado casi todo el sistema CAO!, todo probado y OK, pero, siempre hay un pero. Como ya sabéis tengo el sensor de pH de tindie, después de estar pegándome con él toda la mañana, no consigo hacerlo funcionar con CAO1, si con el programa de prueba que trae.
El caso es que viendo el programa de prueba, no puede ser más sencillo, defines la dirección I2C, en mi caso 0x48, se hace la petición a la dirección especificada, se espera a que la conversión esté hecha y se leen los bytes H y L. Que no es ni más ni menos que lo que hace CAO1, entonces no entiendo porqué no funciona. EL protocolo lo tengo cambiado, comentada la línea de ANR y descomentada la línea de IDL.
Antonio a ver si me puedes echar una mano.
Por otra parte, en el LCD en lugar de salirme el símbolo del termómetro, me sale una T ¿donde se cambia esto?
Adjunto el archivo de prueba del sensor.
Código:
#include <SoftwareSerial.h>

#include "Wire.h"
#define pHtoI2C 0x48

float voltage, data;
float pH;
byte highbyte, lowbyte, configRegister;

const int numReadings = 10;

float readings[numReadings];      // the readings from the analog input
int index = 0;                  // the index of the current reading
float total = 0;                  // the running total
float average = 0;                // the average
void setup()
{
  Wire.begin();
  Serial.begin(9600);
  }
  
  void loop()
{
  // Чтение pH
  Wire.requestFrom(pHtoI2C, 3);
while(Wire.available()) // ensure all the data comes in
{
highbyte = Wire.read(); // high byte * B11111111
lowbyte = Wire.read(); // low byte
configRegister = Wire.read();
}

data = highbyte * 256;
data = data + lowbyte;

voltage = data * 2.048 ;
voltage = voltage / 327.68; // mV


total= total - readings[index];

readings[index] = ((-59.16 * voltage / (273.15 + 25)) + 7.0);
/*
pH = ((the slope of the electrode * voltage / (absolute zero + temp liquid)) + isopotential point)
for Calibration isopotential point change float 7.0 during the measurement.
for the slope of the electrode change float "-59.16" during the measurement pH 4.0 or pH 10.0
change float "25" for temperature compensation
*/
total= total + readings[index];
index = index + 1;
   // if we're at the end of the array...
  if (index >= numReadings)              
    // ...wrap around to the beginning:
    index = 0;    
    average = total / numReadings;
    pH = average;
    
    Serial.println(pH);
    delay(500);
    }
[Imagen: iWAmq2H.jpg]
#1,435
En el peor de los casos, (incompatibilidad de sensor de Tindie con el de Dormand Labs) bastaría implementar un tercer protocolo que será muy parecido al de Dormand Labs. A priori no parece complicado.

Lo miraré con calma para sugerirte algún cambio y puesto que no tengo ese sensor, puede que te haga poner alguna traza que tendrás que mirar tú.

De momento mira lo que se comentó en http://acuariofiliamadrid.org/Thread-Aul...#pid157900
#1,436
(15-09-2015, 03:44 PM)Antonio Castro escribió: En el peor de los casos, (incompatibilidad de sensor de Tindie con el de Dormand Labs) bastaría implementar un tercer protocolo que será muy parecido al de Dormand Labs. A priori no parece complicado.

Lo miraré con calma para sugerirte algún cambio y puesto que no tengo ese sensor, puede que te haga poner alguna traza que tendrás que mirar tú.

De momento mira lo que se comentó en http://acuariofiliamadrid.org/Thread-Aul...#pid157900

Si, Antonio, esta mañana miré lo comentado en esa entrada del foro y ya probé a leer tres datos despreciando el configRegister y tampoco funcionó.
Te digo lo que he probado:
1.- He modificado la dirección I2C por 0x48 en el módulo CAO1_config.h
2.- Comentado el protocolo ANR y descomentado el IDL en módulo CAO1-config.h
3.- En el módulo Linealsensor.cpp, he puesto "Wire.requestFrom((int) _ADDR, 3);", para leer tres datos
4.- Incluso he probado en el módulo Linealsensor a poner el "configRegister = Wire.read();", aunque no se utilice.

Y con esto, no funciona.
#1,437
Yo definiría un tercer protocolo, "TND", y habría que actualizar el fichero
de CAO1_config.h y en LinealSensor lo haría igual que tú.

Código:
// ****************************************************************
// Lectura unitaria. La funcion depende del protocolo usado.
// Devuelve uint16_t.
// ****************************************************************
uint16_t  Cao1_LinealSensor::_Read1RawSensor(){
    uint16_t ValAn;

    if (0==strncmp("IDL", _Protocol, 3)){ // I2c de DormandLabs
        // Solicitamos leer 2 bytes Desde el dispositivo I2C en la direccion _ADDR
        Wire.requestFrom((int) _ADDR, 2);  
        // Esperar a la recepcion de al menos 2 bytes.
        while(Wire.available() < 2);
        byte H = Wire.read();        
        byte L = Wire.read();
        // SerFmt.Fmt(0, F("*** H=%d, L=%d"), (int) H, (int) L); // TRAZA
        return (uint16_t) (H*256) + (uint16_t) L;
    }
    if (0==strncmp("TND", _Protocol, 3)){ // I2c de Tindie
        // Solicitamos leer 3 bytes Desde el dispositivo I2C en la direccion _ADDR
        Wire.requestFrom((int) _ADDR, 3);  
        // Esperar a la recepcion de al menos 3 bytes.
        while(Wire.available() < 3);
        byte H = Wire.read();        
        byte L = Wire.read();
        byte CnfR = Wire.read();
        // SerFmt.Fmt(0, F("*** H=%d, L=%d, CnfR=%d"), (int) H, (int) L, (int) CnfR ); // TRAZA
        return (uint16_t) (H*256) + (uint16_t) L;
    }    
    else if(0==strncmp("ANR", _Protocol, 3)){ //  analogRead()
        ValAn=analogRead(_ADDR);
        // SerFmt.Fmt(0, F("*** ValAn=%d"), ValAn); // TRAZA
        return  ValAn;    
    }
}

Pruebalo por si hay algo que se te pasó, pero está hecho igual que el tuyo.
Yo creo que debería funcionar. -huh.gif

En cualquier caso tienes lo más importante, un ejemplo que te funciona y a malas habría que ir tirando de ese hilo.

Descomenta la traza de la función_Read1RawSensor() para ver los datos que recibes de I2C y pon igualmente trazas de los datos dentro del ejemplo que funciona usando Serial.println()

En realidad no hacemos las mismas cosas pero es que no entiendo porque Tindie usa ese sistema de lectura.

El código de Tindie en realidad significa.

Código:
Mientras Wire tenga un byte disponible para lectura intento leer los tres siguientes{ // ???  Cómoor ???
    Leo un byte en highbyte;
    Leo un byte en lowbyte
    Leo un byte en configRegister
}

Es lo que significa

Código:
while(Wire.available()) // ensure all the data comes in
{
highbyte = Wire.read(); // high byte * B11111111
lowbyte = Wire.read(); // low byte
configRegister = Wire.read();
}
Y funciona.

Lógicamente yo intentaría hacer comparaciones con las trazas en ambos códigos para ver lo que funciona, lo que no y por qué. Todo tiene una razón y buscaría entenderla.

Tindie podría estar usando wire() de una forma algo diferente a Dormant Lab, o un protocolo con diferencias que desconozco y si no somos capaces de usarlo a mi modo habría que imitarlo lo mejor posible.
#1,438
Has probado a inicializar el sensor en vez de leyendo 3 bytes, leyendo 2? Wire.requestFrom((int) _ADDR, 2)

Así no tendrías que tocar el linealsensor añadiendo la lectura del tercer byte. La clave puede estar en lo que te comenta Antonio, que la forma de detectar que hay datos para leer es diferente. Pero vamos, no tiene mucha historia, es muy muy similar la forma de utilizar uno y otro sensor, deberías solucionar tu problema pronto.
#1,439
Algo se me está escapando, seguro que estoy haciendo algo mal.
He modificado el código para leer los tres bytes y me sigue saliendo en el LCD 0.00 pero al hacer un diagnóstico de la sonda de pH me sale lo siguiente:

[Imagen: zlU81QV.png]

Lo cual es un dato por lo menos, no se si válido, ya que la sonda está sin calibrar. Pero en el LCD sigue apareciendo 0.
#1,440
(16-09-2015, 08:09 PM)rubenmas escribió: Algo se me está escapando, seguro que estoy haciendo algo mal.
He modificado el código para leer los tres bytes y me sigue saliendo en el LCD 0.00 pero al hacer un diagnóstico de la sonda de pH me sale lo siguiente:

[Imagen: zlU81QV.png]

Lo cual es un dato por lo menos, no se si válido, ya que la sonda está sin calibrar. Pero en el LCD sigue apareciendo 0.

Pon trazas en las operaciones de lectura para cada uno de los tres bytes tanto en el programa que funciona como en el que no funciona. Para que se vea bien haz a que salgan en una misma línea el valor de esos tres bytes y así poder distinguir con absoluta seguridad que es lo que ocurre.

No des nada por sentado. Ten en cuenta que en C los errores pueden resultar muy extraños. Luego pones aquí los fragmentos de código y las trazas.

Al no tener yo ese sensor, tenemos que hacerlo así.

Usuarios navegando en este tema: 7 invitado(s)


Salto de foro: