This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Estación meteorológica v2 - giltesa
#1
Llevaba tiempo queriéndolo publicar aquí, pero como quería currarme la entrada nunca encontraba el tiempo suficiente para hacerlo, total que mejor no me la curro tanto y si falta info ya la iré añadiendo xD

Pues eso, que después de la primera estación cuya característica principal era su conectividad bluetooth y almacenamiento en SD, me he querido montar otra, en esta ocasión todo mas profesional con una placa a medida que encaja como un guante en una caja y que estéticamente queda muy bien, en mi opinión Lengua

Sin embargo que quede mejor no quiere decir que el montaje se complique, se podría haber hecho una placa muy compleja en la que toda la electrónica fuera soldada, pero no creo que sea un proyecto en el que compense hacerlo, por ello la placa no es mas que un simple adaptador en el que conectar cualquier Arduino y los módulos que se quieran, ya sea soldandolos o mediante conectores.

Para ir abriendo boca antes unas fotos de como quedan las placas que he mencionado:

[Imagen: weather_station_v2_01-150x112.jpg] [Imagen: weather_station_v2_03-150x112.jpg] [Imagen: weather_station_v2_04-150x112.jpg] [Imagen: weather_station_v2_06-150x112.jpg] [Imagen: weather_station_v2_14-150x112.jpg] [Imagen: weather_station_v2_09-150x112.jpg] [Imagen: weather_station_v2_16-150x112.jpg] [Imagen: weather_station_v2_17-150x112.jpg]

Y ahora ya si, las características técnicas de lo que puede llevar en total montada la estación:
  • TLG10UA03 –> Conexión inalámbrica WiFi.
  • NRF24L01 –> Conexión inalámbrica RF a 2.4Ghz.
  • DS1307 o DS3231 –> Reloj o Reloj mas temperatura (no atrasa).
  • BMP180 –> Presión atmosférica, altitud y temperatura.
  • DHT22 –> Humedad y temperatura.
  • DS18B20 –> Temperatura.
  • BH1770 –> Luz.
  • LCD 16×2 + modulo I2C –> Pantalla.
  • Conectores expansión –> 1 de I2C y 3 digitales (y analógicos con Leonardo o Pro Micro)

Con todos esos módulos se puede medir la temperatura, humedad, presión atmosférica, la altitud, la luz y la hora, y se puede compartir la información a través de la pantalla, mediante RF a 2.4Ghz o mediante WiFi.
Del mismo modo se puede recibir mas información a través de RF o WiFi de otra estación montada en otra zona.

La placa esta dividida en dos zonas o subplacas, la primera de ellas y la principal es la que va conectada al Arduino y tiene el regulador de tensión de 3.3V para los módulos además de montar los dos módulos de conexión inalámbrica.
Ademas la placa esta pensada para servir como shield y conectarse en un Arduino Uno/Duemilanove/Leonardo, o para que le conectemos encima un Arduino Pro Micro.

[Imagen: estacion-arduino-uno-150x112.jpg] [Imagen: estacion-arduino-pro-micro-150x112.jpg]

  • Como el puerto ISP no coincide en todos los Arduinos se ha usado el puerto ICSP.
  • Lo mismo sucede con el I2C que según la placa y/o su revisión esta en un lado u otro. Si la placa es moderna no hay que hacer nada, si usamos una revisión antigua con el puerto en el pin analógico D4 y D5 sera necesario soldar dos jumpers SMD que hay junto a esos pines.

En cuanto a la segunda placa se encarga de la recolección de los dato de los sensores ya que es donde van soldados todos, bueno, también es donde se conecta la pantalla.

Ambas placas se unen mediante unos pines, en este vídeo resumen se puede ver como queda todo ya montado:



Y eso es todo por ahora, en próximos post añadiré ejemplos para usar los módulos de forma individual, y una vez ya estén vistos todos pasare a la programación del conjunto entero :zpalomitas:
giltesa.com Mi blog personal sobre informática, electrónica, Arduino, bricolaje, etc.
  Responder
#2
Mola Ahora mismo estaba en tu blog leyendo sobre la estación...
  Responder
#3
Muy currada. Yo valoraria ver si hay gente interesada en hacerla y ver de hacer alguna tirada :p
-> Mi CNC de escritorio CNCDesktop 500 -> https://www.spainlabs.com/foros/tema-Fresadora-Desktop-CNC-500
-> Laboratorio de Fabricación Digital Maker www.lowpower.io 
--> Twitter: https://twitter.com/Grafisoft_ES  | IG: https://www.instagram.com/lowpowerio/
  Responder
#4
WOW, muy guapa¡¡ Gran sonrisa

A mi el sensor de presion BMP180 para altitud se le va algo la pinza....no me cuadra muy bien con los datos reales.

Me gustaria preguntarte como realizas la comunicacion con el NRF, solicitas datos desde un modulo al otro o envias cada X tiempo sin mas?, yo no logre establecer una conexion en el que uno de los modulos requiriera la informacion al otro y este otro se la enviara.
  Responder
#5
Tx360 escribió:Mola Ahora mismo estaba en tu blog leyendo sobre la estación...
Intento repartir la infor a la par Sisi3


grafisoft escribió:Muy currada. Yo valoraria ver si hay gente interesada en hacerla y ver de hacer alguna tirada :p
Por el momento tengo placas de sobra, pedí 10. Yo me he quedado 4 (1 para guardarla y 3 montadas), y el viernes le envié una, mas materiales, a Ueye de fc, si alguien quiere alguna que la pida, aunque se me han terminado los condensadores xD

De todas formas aun no se si tendrá algún error grave, me faltan módulos por probar en la placa. Aparte la placa es mejorable, estoy seguro que echare de menos un lector de MicroSD y no lo puse porque no estoy muy convencido de que entre todo el código en el micro :S

Si se anima la gente siempre se podría sacar una segunda versión y mejorada. Por el momento publique en mi blog toda la documentación que recopile Mola



Triggerr escribió:WOW, muy guapa¡¡ Gran sonrisa

A mi el sensor de presion BMP180 para altitud se le va algo la pinza....no me cuadra muy bien con los datos reales.

Me gustaria preguntarte como realizas la comunicacion con el NRF, solicitas datos desde un modulo al otro o envias cada X tiempo sin mas?, yo no logre establecer una conexion en el que uno de los modulos requiriera la informacion al otro y este otro se la enviara.

Si, a mi me pasa lo mismo con ese sensor, me da valores pero no me da la sensación de que sean muy reales, un día de estos tendré que probarlo de nuevo a ver si consigo que mejore.

Y el sensor RF lo he probado con un ejemplo que encontré y luego con otro que me hice lo mas resumido posible en el que simplemente enviaba todo el rato datos y el receptor los recogía.

En mi caso todas las estaciones van a la corriente así que los esclavos envían datos todo el rato y la maestra los recoge cuando quiera para subirlos a internet.
Supongo que se podría hacer que la esclava envié datos solo cada 30 minutos y la maestra este leyendo todo el rato, quiero pensar que los módulos/librería tendrán algún buffer como los módulos bluetooth y con el Arduino vas leyendo info cuando ves que ya hay algo que leer, no es imprescindible estar en cada iteración pendiente de si hay algo o no...
...bueno, todo esto suposiciones mías, cuando me ponga en serio subiré ejemplos Mola

PD: Te paso el ejemplo que encontre porque justamente es eso, el Arduino A piede datos y el B le contesta.

Servidor:
Código:
/**
* An Mirf example which copies back the data it recives.
*
* Pins:
* Hardware SPI:
* MISO -> 12
* MOSI -> 11
* SCK -> 13
*
* Configurable:
* CE -> 8
* CSN -> 7
*
*/

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

void setup()
{
    //Configura los pines SPI, CE y CSN, estos dos ultimos son personalizables:
    Mirf.spi = &MirfHardwareSpi;
    //Mirf.cePin = 7;
    //Mirf.csnPin = 8;

    
    // Inicia el modulo:
    Mirf.init();


    // Configura la direccion, o nombre, de este modulo:
    Mirf.setRADDR((byte *)"serv1");


    // Indica cual es el tamaño de los paquetes a transmitir.
    // Ha de ser el mismo en ambos lados de la comunicacion:
    Mirf.payload = sizeof(unsigned long);


    // Establece el canal de comunicacion, algunos estan prohibidos por el pais...
    //Mirf.channel = 10;


    // Termina de configurar el modulo e indica que ya esta listo para funcionar:
    Mirf.config();

    Serial.begin(9600);
    Serial.println("Preparado...");
}


void loop()
{
    // Buffer para almacenar los datos con el mismo tamaño configurado en el setup:
    byte data[Mirf.payload];


    // Si hay datos..., y ya se han obtenido todos los datos...
    if( !Mirf.isSending()  &&  Mirf.dataReady() )
    {
        Serial.println("Paquete recibido.");

        
        // Guarda los datos en el buffer:
        Mirf.getData(data);


        // Escablece la direccion, o nombre, del modulo al que se van a enviar los datos:
        Mirf.setTADDR((byte *)"clie1");


        // Envia los datos del buffer (los mismos que se recibieron):
        Mirf.send(data);


        Serial.println("Paquete enviado.");
    }
}

Cliente:
Código:
/**
* A Mirf example to test the latency between two Ardunio.
*
* Pins:
* Hardware SPI:
* MISO -> 12
* MOSI -> 11
* SCK -> 13
*
* Configurable:
* CE -> 8
* CSN -> 7
*
* Note: To see best case latency comment out all Serial.println
* statements not displaying the result and load
* 'ping_server_interupt' on the server.
*/

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

#include <LiquidCrystal.h>
LiquidCrystal lcd(27, 26, 25, 24, 23, 22);

void setup()
{
    lcd.begin(8, 2);

    //Configura los pines SPI, CE y CSN, estos dos ultimos son personalizables:
    Mirf.spi = &MirfHardwareSpi;
    //Mirf.cePin = 7;
    //Mirf.csnPin = 8;

    
    // Inicia el modulo:
    Mirf.init();


    // Configura la direccion, o nombre, de este modulo:
    Mirf.setRADDR((byte *)"clie1");


    // Indica cual es el tamaño de los paquetes a transmitir.
    // Ha de ser el mismo en ambos lados de la comunicacion:
    Mirf.payload = sizeof(unsigned long);


    // Establece el canal de comunicacion, algunos estan prohibidos por el pais...
    //Mirf.channel = 10;


    // Termina de configurar el modulo e indica que ya esta listo para funcionar:
    Mirf.config();

    Serial.begin(9600);
    Serial.println("Preparado...");
}



void loop()
{
    // Prepara los datos a enviar:
    unsigned long time = millis();


    // Establecie la direccion, o nombre, del modulo al que se van a enviar los datos:
    Mirf.setTADDR((byte *)"serv1");


    // Envia los datos:
    Mirf.send((byte *)&time);


    // Espera a que se terminen de enviar los datos:
    while(Mirf.isSending());

    Serial.println("Finished sending");
    delay(10);


    // Espera 1 segundo a recibir la respuesta el otro modulo:
    while(!Mirf.dataReady())
    {
        if ( ( millis() - time ) > 1000 )
        {
            Serial.println("Timeout on response from server!");
            return;
        }
    }


    // Recupera los datos de respuesta del otro modulo:
    Mirf.getData((byte *) &time);


    // Imprime los datos por pantalla:
    Serial.print("Ping: ");
    Serial.println( millis()-time );
    

    // Imprime los datos por pantalla:
    lcd.clear();

    lcd.setCursor(0, 0);
    lcd.print("T ");
    lcd.print(time/1000);

    lcd.setCursor(0, 1);
    lcd.print("L ");
    lcd.print( millis()-time );

    delay(1000);
}





--------


Y estos los mios "resumidos" y mas sencillos:

Servidor:
Código:
/**
* NRF24l01 - Codigo Servidor, ejemplo 1.
* Envia el tiempo que lleva encendido el servidor.
*
* Pins:
* Hardware SPI:
*   MISO -> D12
*   MOSI -> D11
*   SCK  -> D13
*
* Configurable:
*   CE   -> D8
*   CSN  -> D10
*/

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>


void setup()
{
    // Se configura los pines SPI, CE y CSN para el modulo RF:
    Mirf.spi = &MirfHardwareSpi;
    Mirf.cePin = 8;
    Mirf.csnPin = 10;

    // Inicia el modulo RF:
    Mirf.init();

    // Establece el nombre identificativo del servidor:
    Mirf.setRADDR((byte *)"servidor1");

    // Se establece el tamaño de los paquetes que se transmitiran.
    // Ambos lados de la comunicacion deben usar el mismo tamaño de paquete.
    Mirf.payload = sizeof(unsigned long);

    // Permite establecer el canal para evitar interferencias con otras redes inalambricas.
    // Hay canales prohibidos por el pais.
    Mirf.channel = 10;

    // Termina de configurar el modulo RF:
    Mirf.config();

    Serial.begin(9600);
    Serial.println("Servidor preparado");
}


void loop()
{
    unsigned long time = millis();

    if( !Mirf.isSending()  )
    {
        // Establece el cliente al que se quiere enviar los datos:
        Mirf.setTADDR((byte *)"cliente1");

        // Envia el tiempo que lleva encendido el Arduino Servidor:
        Mirf.send((byte *)&time);
    }
}

Cliente:
Código:
/**
* NRF24l01 - Codigo Cliente, ejemplo 1.
* Recibe el tiempo que lleva encendido el servidor.
*
* Pins:
* Hardware SPI:
*   MISO -> D12
*   MOSI -> D11
*   SCK  -> D13
*
* Configurable:
*   CE   -> D8
*   CSN  -> D10
*/

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>


void setup()
{
    // Se configura los pines SPI, CE y CSN para el modulo RF:
    Mirf.spi = &MirfHardwareSpi;
    Mirf.cePin = 8;
    Mirf.csnPin = 10;

    // Inicia el modulo RF:
    Mirf.init();

    // Establece el nombre identificativo del cliente:
    Mirf.setRADDR((byte *)"cliente1");

    // Se establece el tamaño de los paquetes que se transmitiran.
    // Ambos lados de la comunicacion deben usar el mismo tamaño de paquete.
    Mirf.payload = sizeof(unsigned long);

    // Permite establecer el canal para evitar interferencias con otras redes inalambricas.
    // Hay canales prohibidos por el pais.
    Mirf.channel = 10;

    // Termina de configurar el modulo RF:
    Mirf.config();

    Serial2.begin(9600);
    Serial2.println("Cliente preparado");
}


void loop()
{
    unsigned long time = 0;

    // Si no se esta enviando nada, pero si se pueden leer datos:
    if( !Mirf.isSending()  &&  Mirf.dataReady() )
    {
        // Recibe el tiempo que lleva encendido el Arduino Servidor:
        Mirf.getData((byte *) &time);
    }    
    
    // Imprime los datos por el puerto serie:
    Serial2.print("Millis: ");
    Serial2.println( time/1000 );

    delay(1000);
}



Lo siguiente seria afinar el código y enviar estructuras de datos con toda la información!
giltesa.com Mi blog personal sobre informática, electrónica, Arduino, bricolaje, etc.
  Responder
#6
Ummm, yo uso la libreria RF24. Envio durante cierto tiempo, esperando que el receptor reciba y muestre. Todo calculado para que no pueda suceder que el receptor no reciba correctamente. Envio estructuras con un limite de 32Bytes. La comunicacion funciona perfectamente la verdad, funcionan muy bien los modulos.

Lo que no consegui, y mira que lo intente, fue hacer un protocolo de envio, como bien dices, que el receptor este a la espera de una señal del emisor para enviar los datos, no lo consegui ni empleando interrupciones ni nada, el tema es que tenia mucho codigo por medio y no pude probar en limpio la verdad...., me pasaba que era como si no funcionara el buffer del NRF nose..., tampoco le di muchas mas vueltas, puse envio cada X tiempo y listo.

Tienen muchas muchas opciones estos modulos la verdad, algunas mas complejas que otras

Lo del sensor de presion ya te digo, vivo en santander y a veces me marca que estoy a 106 metros.....

Mañana por la mañana tengo un ratin libre leere con atencion los codigos que me has mostrado, que ahora tengo que pasar unos apuntes para mañana que sino me crujen jajajajaja

Un saludo¡¡
  Responder
#7
He visto el video en twitter antes Mola
  Responder
#8
El problema de memoria se lo comentaba esta tarde a triggerr. Aunque supongo que ya estarás al tanto, se puede ampliar la memoria por spi o por i2c.

La estación.. que te voy a decir que no te haya dicho de otros proyectos. Sigues subiendo de nivel cada vez mas, si señor.
  Responder
#9
Yo me apunto a una placa si queréis hacer una tirada. Que estoy arrancando en SMD y me viene genial.

Del proyecto, suelo seguir asiduamente tu blog y la verdad que los artículos no tienen desperdicio. Muy buen trabajo, enhorabuena.
  Responder
#10
Que pasada!! Menudo curro!!
Si tenéis pensado hacer una tirada me apunto también!

Saludos!
  Responder
#11
Pues me he pedido materiales para montar otras dos estaciones completas, bueno, sin tantos sensores ya que las montare dentro de casa y solo me interesa la temperatura. Esas estaciones harán de esclavas y enviaran o recibirán los datos a la maestra.

Por ahora llevo gastadas 6 placas (3 estaciones +1 ShieldRF +1 que conservo de "muestra", +1 que le envié a un user de fc), me sobran 4 que no voy a usar, si alguien quiere una se la envió sin problemas, y si se espera unos días podre enviarle también los componentes smd que hacen falta (me he quedado sin condensadores)

Os pongo los enlaces a ebay de las cosas que pille para las estaciones esclavas. En general es todo normal salvo las pantallas que son "de efecto OLED" ya que tienen fondo negro y letras de color, así que son algo mas caras que las normales pero mucho mas baratas que las OLED Sonrisa

Caja de plástico para meterlo todo (6€) http://www.ebay.es/itm/390677361840
Pantallas (~4.5€) http://www.ebay.es/itm/250917055832 y http://www.ebay.es/itm/280947725242
Adaptador pantalla (1€) http://www.ebay.es/itm/301049165092
Módulos RF (1.6€) http://www.ebay.es/itm/140729184907


Por cierto, hace unos días hice una prueba de alcance de los RF en casa y al aire libre. En casa atraviesa casi 3 pisos haciendo la prueba en la escalera de la comunidad, y al aire libre llega a unos 80 metros con una calidad mala ya que muchas veces se pierden los datos, a unos 60 metros va perfecto, una maravilla de módulos para lo que cuestan. Esto son 80m:

[Imagen: 5882014_03_08_15_tn.01_tn.42_tn.jpg] [Imagen: 4212014_03_08_16_tn.05_tn.11_tn.jpg]


Mola
giltesa.com Mi blog personal sobre informática, electrónica, Arduino, bricolaje, etc.
  Responder
#12
Yo dentro de casa no logre mas de 8m. Aunque hay que decir que usaba un modulo de color verde y otro negro y los de color verde son peores en cobertura.
-> Mi CNC de escritorio CNCDesktop 500 -> https://www.spainlabs.com/foros/tema-Fresadora-Desktop-CNC-500
-> Laboratorio de Fabricación Digital Maker www.lowpower.io 
--> Twitter: https://twitter.com/Grafisoft_ES  | IG: https://www.instagram.com/lowpowerio/
  Responder
#13
Hola giltesa, muy currado todo enhorabuena. Quería preguntarte si las placas las diseñaste tú? en ese caso, que usaste? Interpreto que luego las mandaste fabricar? Gracias.

Saludos
  Responder
#14
Impresionante el trabajo.
Yo estuve haciendo alguna cosa con el tema de medidas meteorológicas, y al final me quedé con el DHT22 y el DS18B20. Mediante la placa Ethernet subo los datos a Xively (antes Cosm y antes Pachube) y puedo verlos a distancia, y tener una gráfica para saber si ha helado.
Cuando la amplíe pretendo añadir anemómetro, veleta y pluviómetro. ¿Has hecho alguna prueba de sensores para esta medidas?
  Responder
#15
jfelipe escribió:Impresionante el trabajo.
Yo estuve haciendo alguna cosa con el tema de medidas meteorológicas, y al final me quedé con el DHT22 y el DS18B20. Mediante la placa Ethernet subo los datos a Xively (antes Cosm y antes Pachube) y puedo verlos a distancia, y tener una gráfica para saber si ha helado.
Cuando la amplíe pretendo añadir anemómetro, veleta y pluviómetro. ¿Has hecho alguna prueba de sensores para esta medidas?

Me temo que no, que gustaría tener algo así pero pero hace falta tenerlo a cielo abierto, en la terraza no cogería bien los datos :/

https://www.sparkfun.com/products/8942

[Imagen: 08942-01.jpg]
giltesa.com Mi blog personal sobre informática, electrónica, Arduino, bricolaje, etc.
  Responder
#16
Hola giltesa, sobre tú comentario anterior, es el tipo de estación que tengo en proyecto junto con las interiores de casa, el caso que no se si hay Anemometros y veletas para arduino, ¿Tú sabes algo del tema?

Saludos.
  Responder
#17
Esa que te he puesto es para Arduino, lo único que luego hay que añadirle una shield: https://www.sparkfun.com/products/12081
No creo que sea obligatorio esa shield, mirando la documentación de los sensores y de la shield seguramente te lo puedas montar tu.

Yo desde luego es lo mas decente y barato que he encontrado. También pensé en usar un sensor de los que se ponen en los toldos eléctricos, pero si no recuerdo mal no bajan de 30€ y son para 230v así que solo es aprovechable el plástico... no se si habrá algo mejor, por ebay tampoco he encontrado nada.
giltesa.com Mi blog personal sobre informática, electrónica, Arduino, bricolaje, etc.
  Responder
#18
Giltesa, pues tendré que ir mirando de comprar esas piezas para mi proyecto, de todas maneras quería mirar otros anemometros y veletas ... de esos sensores poco he visto.
¿Por cierto las placas con que las diseñaste? es muy caro mandarlas hacer despues de diseñarlas?

Saludos.
  Responder
#19
El esquema y el circuito eléctrico lo diseñe con Eagle, después los ficheros que se le envían al fabricante se crean con una plantilla que te dan, se carga en el Eagle y así puedes comprobar si cumples los requisitos mínimos de fabricación y generar los ficheros que hay que enviarles.

Los renders están creados con EagleUp, es una extensión para Eagle y Sketchup, que te permite exportar la placa desde un programa e importarla y generarla en 3D en el otro.

Y eso es todo. 10 placas de 10x10 son 28$/21€ envió incluido, esta muy bien :zpalomitas:

PD: Pedidas aquí: http://imall.iteadstudio.com/open-pcb/pc...yping.html
giltesa.com Mi blog personal sobre informática, electrónica, Arduino, bricolaje, etc.
  Responder
#20
Glitesa vaya pedazo de curro, a mi siempre me ha llamado la atención este tipo de cacharrines. Mi hermana, ambientóloga, siempre me ha dicho que el tiempo que pierdo entre google, steam y durmiendo, podría hacerle algo similar.
  Responder


Posibles temas similares…
Tema Autor Respuestas Vistas Último mensaje
  Estacion Meteorologica Triggerr 261 55,033 21-01-2017, 10:43 PM
Último mensaje: cna