Avec un Atmega, Créer un capteur de température sans fil
Para continuar el proyecto de automatización con la frambuesa, el primer paso importante para mí es tener un sensor capaz de enviar datos inalámbricos. Aquí les presento un ejemplo de la sonda de medición de temperatura y humedad.
En este artículo (muy muy larga), Le advierto que tal vez no creará la sonda mejor en el mundo. Muchos sitios ofrecen amplios métodos para llegar a una solución óptima. Aquí presento los resultados de mis pruebas y ofrece para hacerte. Je compte sur les experts pour proposer des améliorations via les commentaires 🙂
Recapitulando mi sonda funciona con dos pilas AA, con un Atmega328, un LED para indicar la operación y un transmisor 433 Mhz. El LED es opcional como fuente de energía pero práctica para confirmar que todo está funcionando.
Después de 16 17 18 19 20 días de operación (la escritura del artículo llevó tiempo), Mi sonda emite siempre los datos con una distancia de 5 m entre el sensor y el Gateway (un arduino conectado a una frambuesa Pi), sin paredes pero con muebles de madera. Aquí es la evolución del nivel de las baterías en dos semanas :
La sonda tiene la siguiente operación : todos los 5 segundos (Si esto es para la prueba), la sonda DHT11 está activada, la temperatura y la humedad se leen así como el nivel de batería. Estos datos constituyen el mensaje a enviar. El mensaje se envía 4 intervalo de tiempo 160ms. Cada envío hecho encender entonces apagar LED.
Por lo tanto, te imaginas disminuyendo el número de envíos, quitando el LED y a aumentar el tiempo entre cada medición, la batería puede durar fácilmente un año (Pronto haría un artículo sobre el tema).
Requisitos previos
Antes te embarcarse en la aventura, Necesitas un poco de material y lista para usar el entorno de trabajo.
Equipo
Usted necesitará :
- De un atmega328 (Sólo el chip) con o sin gestor de arranque, No importa porque vamos a instalar nuestro. Usted puede fácilmente encontrar en ebay o sitios chinos en la 1.5 € / pieza o Amazonas. En la puesta en marcha todavía algo varios que usted puede disminuir el precio.
- Un Arduino UNO donde Puede quitar el atmega. Se utilizará para enviar el bootloader y programa de manejo de la sonda. Puede utilizar este Arduino (u otro) como receptor. Contar en los 10 € (versión oficial pero legal), un poco más en Amazonas (más rápido). El mapa puede utilizarse para la fabricación de otros sondeos.
- Un sensor de temperatura. Usé un DHT11 que tenía en casa. Esto no es lo que es mejor, el DHT22 es mucho mejor, Pero solo la hice por lado en el momento. Conde € 1.40 el DHT11 o 4.5 € el DHT22 (Pero vale la pena el costo ca)
- Resistencia 4.7KΩ necesarios para la sonda de DHT11
- Un transmisor y un receptor de 433 Mhz. Será el transmisor de la sonda, el receptor para el Arduino conectado a la frambuesa. Un poco menos de 1 € el par. Pero ten cuidado no todos tienen la misma calidad … Posteriormente pondrán a prueba otros módulos de comunicación.
- Baterías AA. Estoy usando 2 que puse en un cuerpo se recuperó de una guirnalda de Navidad LED. Las cajas cuestan alrededor de € 3,5 10 piezas (o aquí para una entrega más rápida).
- Cables
- Un protoboard. A continuación, puede utilizar placas de prototipado, menos voluminosos y reutilizar la Protoboard para otras instalaciones.
- (Opcional pero altamente recomendable !) Condensador 22μf. Les tomará 2 Si tu Atmega328 están configurados por defecto para utilizar un oscilador externo (y no creo que sabes de antemano)
- (Opcional pero altamente recomendable !) Un resonador Mhz 8 o 16 Mhz Si tu Atmega328 están configurados por defecto para utilizar un oscilador externo
Usted ya está equipados y listos para montar la sonda.
Ambiente de trabajo
Cuando hablo del ambiente de trabajo es básicamente la herramienta IDE de Arduino. Tomar la versión 1.5.8+, Aunque es una beta, para poder trabajar !
Ahora es ser capaz de configurar tu Atmega para trabajar con su oscilador interno (8MHz) para reducir su consumo total. Por esto te aconsejo que la carga el zip aquí. El archivo debe ser descomprimido en el directorio de sub hardware ubicado con sus programas de Arduino. Aquí está lo que usted necesita :
Al comienzo de la IDE de Arduino deberías ver nuevas tarjetas :
Instalar un gestor de arranque optimizado
Aquí está el cableado para cargar el cargador de arranque :
Una vez completado :
- Conecte el arduino UNO a tu ordenador mediante el cable USB
- Iniciar el IDE de Arduino y confirme la configuración
- Cargar el programa para que la ONU puede enviar el gestor de arranque. El programa está disponible en el menú “Archivo > Ejemplos > ArduinoISP”. Haga clic en “Subir”
L' Arduino UNO ahora está listo para enviar a un gestor de arranque para su montaje !
- Seleccione el tipo de tarjeta para la sonda. Por lo tanto elegimos un atmega328 en un arduino en 3,3 v y la frecuencia de 8 Mhz
- Ahora seleccione la tarjeta que programará el gestor de arranque. Es nuestro Arduino
- Resto de quemar el cargador de arranque con el comando “Quemar el cargador de arranque”
Ahora ha configurado su nodo para operar en 3.3V usando el oscilador interno que opera en 8 Mhz. Este es el primer paso para optimizar el uso de la energía !
Ahora puede añadir su sensor y transmisor. Si tienes un resonador, Se puede quitar (Además de los condensadores) :
La tarjeta Arduino UNO puede utilizarse para enviar el programa en su nuevo Atmega. Puede conectarlo como se muestra en el dibujo arriba donde muchos toman el nodo de la Atmega, ponerlo en la tarjeta UNO, cargar el programa a través del IDE y vuelva a colocar el nodo en la Protoboard Atmega. Puedes ver, personnellement je déplace l’atmega 😉
La foto de la Asamblea final :
Instalación del programa sensor
En el IDE de Arduino necesitará instalar las siguientes librerías :
- La biblioteca DHT para recuperar los datos de la sonda. Disponible aquí.
- La librería narcoléptico a dormir “profundo” el nodo y así ahorrar las baterías. Disponible aquí.
- La biblioteca de Manchester para enviar los datos a través de su transmisor 433 Mhz. Disponible aquí.
La instalación de bibliotecas es como sigue :
- Recuperar el .zip de la biblioteca
- Importación mediante la herramienta de importación en el IDE de Arduino (Bocetos > Librerías de importación)
Este es el programa para enviar a su nodo utilizando el IDE de Arduino :
#include <Narcoleptic.h> #include <dht.h> #include <Manchester.h> #define BLINK_MODE true #define NODE_ID 1 // On 8bits so 0..255 #define MESSAGE_SIZE 6 // Number of bytes to send #define SEND_MESSAGE_DELAY 5000 // Delay in ms between each value's extraction #define SEND_433_COUNT 4 // How many times the message has to be send #define SEND_433_PAUSE 160 // 16 multiple // Define connectors used for the node #define TX_PIN 7 #define LED_PIN 13 #define DHT11_PIN 2 dht DHT; // Array of bytes to will make the message // In this node : 2 bytes for voltage, 2 bytes for uint8_t msgData[MESSAGE_SIZE] = {0, 0, 0, 0, 0, 0}; //-------------------------------------------------------------------------------------------------- // Read current supply voltage //-------------------------------------------------------------------------------------------------- long readVcc() { bitClear(PRR, PRADC); ADCSRA |= bit(ADEN); // Enable the ADC long result; // Read 1.1V reference against Vcc #if defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) ADMUX = _BV(MUX5) | _BV(MUX0); // For ATtiny84 #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) ADMUX = _BV(MUX3) | _BV(MUX2); #else ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); // For ATmega328 #endif delay(2); // Wait for Vref to settle ADCSRA |= _BV(ADSC); // Convert while (bit_is_set(ADCSRA,ADSC)); result = ADCL; result |= ADCH<<8; result = 1126400L / result; // Back-calculate Vcc in mV ADCSRA &= ~ bit(ADEN); bitSet(PRR, PRADC); // Disable the ADC to save power return result; // Vcc in millivolts } void setup() { pinMode(LED_PIN, OUTPUT); if (BLINK_MODE) digitalWrite(LED_PIN, LOW); man.setupTransmit(TX_PIN, MAN_1200); msgData[0] = NODE_ID; // Wait 1s to allow DHT11 to initialize Narcoleptic.delay(1000); } void loop() { // Read Vcc value long currentVcc = readVcc(); uint16_t uint16_currentVcc = (uint16_t)currentVcc; // Save millivolts in two bytes to keep high precision. Will be decoded by the gateway uint8_t byteData[2] = {uint16_currentVcc >> 8, uint16_currentVcc & 0xFF}; msgData[2] = byteData[0]; msgData[3] = byteData[1]; // Read data from DHT11 sensor int chk = DHT.read11(DHT11_PIN); // DHT11 values can be put in a byte value due to the low precision msgData[4] = (uint8_t)DHT.humidity; msgData[5] = (uint8_t)DHT.temperature; // Send message SEND_433_COUNT times with a delay of SEND_433_PAUSE ms for each for (int i=0; i<SEND_433_COUNT; i++) { msgData[1] = i; if (BLINK_MODE) digitalWrite(LED_PIN, HIGH); man.transmitArray(MESSAGE_SIZE, msgData); if (BLINK_MODE) digitalWrite(LED_PIN, LOW); // Wait between each send Narcoleptic.delay(SEND_433_PAUSE); } // Wait before getting new sensor value Narcoleptic.delay(SEND_MESSAGE_DELAY); }
Y después ?
El siguiente artículo mostrará cómo recibir datos y enviarlos a la frambuesa POI que (en principio) Qué hacer !
Es para mejorar la visión global ! Como por ejemplo :
- Optimización de código. La idea es hacer una biblioteca general, disponible en GitHub, reunirá a las funciones de recuperación, conversión, etc.. Dependiendo de los sensores conectados : DHT11, DHT22, LM36, etc..
- Otros módulos de emisión : NRF24L01 , ESP8266, etc..
Los módulos de 433Mz son temperamentales, No siempre de buena calidad, Tengo la impresión de que esta es la mejor opción. Entonces, continuaré la investigación
La secuela del proyecto Pi casa Conecte pronto !
Pingback: Avec un Atmega, Créer un capteur de température sans fil | RoboTechno()