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.

Pi Home Connect - temperature humidity sensor atmega 328

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 :

Pi Home Connect - temperature humidity sensor atmega 328 - interface

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.
    Pi Home Connect - Atmega328P
  • 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.
    Pi Home Connect - Arduino Uno with Atmega328p
  • 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)
    Pi Home Connect - DHT11
  • Resistencia 4.7KΩ necesarios para la sonda de DHT11
    Pi Home Connect - resitor 4k7
  • 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.
    Pi Home Connect - 433Mhz rf kit
  • 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).Pi Home Connect - 2x AA battery holder
  • CablesPi Home Connect - wires
  • Un protoboard. A continuación, puede utilizar placas de prototipado, menos voluminosos y reutilizar la Protoboard para otras instalaciones.Pi Home Connect - Breadboard
  • (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)
    Pi Home Connect - 22uF capacitor
  • (Opcional pero altamente recomendable !) Un resonador Mhz 8 o 16 Mhz Si tu Atmega328 están configurados por defecto para utilizar un oscilador externo
    Pi Home Connect - 16mhz resonator

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 :

Arduino IDE boards.txt folder mac os

Al comienzo de la IDE de Arduino deberías ver nuevas tarjetas :

Pi Home Connect - boards atmega328 8Mhz low power

Instalar un gestor de arranque optimizado

Aquí está el cableado para cargar el cargador de arranque :

PiHomeConnect-Node bootloader atmega328

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”
    LPi Home Connect - IDE arduino ISP' 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
    Pi Home Connect - IDE bootloader 8Mhz 3.3V
  • Ahora seleccione la tarjeta que programará el gestor de arranque. Es nuestro Arduino
    Pi Home Connect - IDE bootloader Arduino as ISP
  • 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) :

PiHomeConnect - Arduino node temperature humidity sensor

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 :

PiHomeConnect - Arduino node temperature humidity sensor

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 !

Posiblemente le gustan también....

  • Zescientist

    Hola,
    Estas parejas Em/Rec no son de excelente calidad.
    Un truco para minimizar el costo : Mantener estas Em/Rec en sus módulos remotos (sensores y actuadores) Pero invertir en un solo “buena” esfuerzo de torsión para su estación principal vinculada a la RPi. Esto mejorará grandemente a tu alcance.

    Si no ve el ESP8266 “la solución” para la automatización del hogar de bajo coste, más necesitan de atmega para gestionar sensores, No más necesitan arduino para transmitir la información para el IPC y un ámbito relacionado con la calidad del Wifi.

    • En realidad creo que el Wifi es elegido por todas partes la casa hasta el momento de disfrutarlo y el precio es muy razonable. Je suis pressé de tester en remplaçant mes modules 433Mz 😉

      • mrclem.NW

        Sí, pero el consumo de ESP8266 es muy pobre. Se necesita un máx..
        Gracias por tu tutorial, Quería rehacer mi sensor RF con sólo un ATMega en lugar de la actual microview. Pero sobre todo sueño de repente cambiar el gestor de arranque. todo para el diálogo con un módulo de RFXCOM y domoticz

        • A ver qué da saber, porque el objetivo es hacer dormir que el nodo transmisor no debe recibir instrucción. Pero la conexión con el SSID no llevará mucho tiempo … Podrá probar

          • MrClem

            Así que en realidad no es muy grave si cortamos el transmisor cada vez. He visto las pruebas son muy lentas cuando es un servidor LUA en ello, pero está evolucionando a una velocidad…
            Gracias otra vez la parte de personalización del gestor de arranque me interesa bcp. Voy a probar todo.

          • MrClem

            arf du coup j’ai des questions 😉 :

            ¿Cuáles son tus optimizaciones del gestor de arranque ?

            como - tonelada necesita este gestor de arranque optimizado para utilizar amiga ? (Parecería que no)

            Sin embargo sólo me di cuenta que no será para mi uso. Hago esperar muy poco en mi lazo(), todo se gestiona por intervalo de tiempo : venta por mayor, viendo si el intervalo se pasa al ejecutar una adquisición y enviar en RF. Me tomará una función de dormir y despertar más bien pero con el milli() sigue activo.. Lo entiendo, Debe existir.

          • El bootloader es optiboot 5 .0a para atmega328 en 3,3 v y 8 mhz.

            Amiga permite el uso de la vigilancia para que ca no está relacionado con el gestor de arranque

            Por su preocupación, creo que puedes despertar tu atmega basado en interrupción (Hay 2, el 0 y el 1). También tienes JeeLib que permite para medir el tiempo transcurrido : http://jeelabs.net/pub/docs/jeelib/

  • Sandu

    Finalmente un tutorial para exactamente lo que estoy buscando. Es similar a la LoFi (HackADay) proyecto. ¿por qué no la considera como una energía más baja MCU como el ATiny84, etc. 85.? de todos modos, el enfoque de arduino es mucho mejor y luego ESP8266 en términos de sensores inalámbricos real sin necesidad de reemplazar las baterías.

    • No sé cuál es la diferencia entre atiny85 y un atmega328P (-Versión de PU del curso). ¿Crees que la vida de la batería será mucho más larga ?

      • Sandu

        Bueno, puede ejecutar un sensor inalámbrico basado en attiny durante un año utilizando una célula de la moneda (CR2032) o incluso por año (10 años en 3 AA) dependiendo de cuánto usted transmitir,etc..
        ¿Has considerado cualquier cifrado en la carga que se está transmitiendo? sería un buen futuro si considera extender este proyecto en el futuro para tener transmisión bidireccional: recibir y enviar comandos a otros sensores remotos.

        También estoy esperando algunas emisoras RFM12B y RFM69HW a prueba con un proyecto similar en attiny. tienen mejor penetración del rango y la pared de la NRF24L01.

        Buena suerte! waiting for your next part of the tutorial 🙂

  • Galen

    Bravo pour ce tuto 🙂 encore un qui va rejoindre ma collection sur le sujet jusqu’a ce que je me lance
    También tengo un ci http://labalec.fr/erwan/?p=1534 debajo del codo puede ayudar en la búsqueda para el transmisor y el receptor confiable

  • Guillaume

    Hola,
    También hay otra manera de establecer un atmega sin quitar el chip es continuar con el spi e incorporar el isp en el programa de arduino. Pero es otra manera más agradable tomar un arduino mini pro que es casi más barato que un atmega, así como componentes para poner a continuación.

    • El arduino mini y mucho más es muy compacta ideal para sondas (Este es el paso siguiente después de los diferentes transmisores ;-))

  • David

    Hola,

    Gracias por el artículo ! Muy interesante ! Especialmente desde que tengo el mismo enfoque actualmente así te seguiré la serie con gran atención.

    Acabo de pasar algún tiempo tratando de coco cómo instalar un gestor de arranque, pero sufrí un poco …

    Viendo los archivos que usted propuso que veo que a diferencia de otros enlaces que encontré que no usas un gestor de arranque proporciona directamente con el IDE. Y' tiene allí una razón ?

    http://hardware-libre.fr/2014/02/fr-arduino-atmega-programmation-isp/
    http://arduino.cc/en/Tutorial/ArduinoToBreadboard

    Aún no intentó suyos en realidad, Primero traté de los demás, pero aunque me las arreglé para instalar el gestor de arranque (Después de una pequeña corrección en board.txt) Entonces no puedo subir el bosquejo.

    Vi que había utilizado “Subir con un programador” En lugar de “Subir”, ¿es lo mismo con el gestor de arranque ? (pas encore essayé car j’avais dépassé mon quota de bricolage pour la journée 😉

    David.

    • El mío es un poco una mezcla. El bootloader es de optiboot que es ahora en el ide de arduino si no me equivoco. Uno del archivo es el atmega 168 para 328 en el gestor de arranque del directorio IDE
      El gestor de arranque para ir a través de un programador. Mon article essaye de resumer tout ca car j’ai aussi galeré 😉

      • David

        Hola,

        Bien lo he probado con el gestor de arranque hoy y funciona muy bien. Vi que también había modificado el archivo platform.txt ? Esto debe explicar por qué sólo por modificar el Board.txt del archivo de origen para agregar tu configuración y usando el gestor de arranque no funciona …

        Si hago lo que dices en tu artículo funciona níquel por lo que veo más por el momento. Iré cuando he avanzado más en el proyecto.
        Sin embargo, estaré muy interesado en entender lo que hiciste como un cambio. Una idea para otro artículo ?? 😉 Mais pour le moment j’attends avec impatience l’article sur la liaison entre l’arduino de réception et le RPI. Mediante una serie de enlace ? SPI ?

        Buena continuación !

        • L’article est en ligne 😉 il manque le code pour la réception mais il suffit d’ajouter un récepteur 433 en el arduino y envíe los datos a la frambuesa

          Para el arranque está bien si funciona el cargador. Pero los cambios son principalmente para un paquete independiente que se instala fácilmente.

          • David

            Hola,

            Me alegro que he logrado poner el gestor de arranque y pasarse a 8 MHz interna y 3, 3V.

            De repente es posible utilizar el puerto serie mediante el arduino UNO después ? Ya me di cuenta de la necesidad de desconectar el reinicio de la tarjeta, de lo contrario que el atmega reinicia todo el tiempo (Probablemente la diferencia de potencial) Pero incluso con eso ya no veo nada por la serie de enlace de la IED ….

            Eres insuperable ?
            Gracias.

          • No te garantizo a 100% Pero me parece que ha funcionado.

  • Pascal

    Es cierto que el transmisor/receptor 433 Mhz bajo costo no son terribles !! Pero existe el proyecto de Mysensors que utiliza el NRF24L01 (2.4GHz transmisor/receptor) buen funcionamiento y administrado por domótica de proyecto Jeedom, Es muy bueno!

    • Termino mi biblioteca de Arduino para los módulos Wifi ESP8266 y después he probado el NRF24L01. Entonces podría hacer una comparación para ayudar a elegir según sus necesidades.

  • David

    Hola,

    Yo he avanzado gracias a tu artículo !
    He probado 3 reducción de las bibliotecas actuales de consumo … Narcoléptico, Jeelib y baja potencia.

    Yo no podía salirme al principio y tenía un modo de conso incluso 1mA POWER_DOWN …
    Estaba vinculado a los modificadores que utilizo para establecer el número de sensor (No han seguido el mismo principio que lo pones directamente en el código …). Problema usando el arduino para accionar los interruptores a init sólo de salida.

    Breve ! Quería compartir el consumo con tres bibliotecas.
    8MHz 3v. 4Mi sobre continua (leer la temperatura, luz y batería).

    En reposo :
    - Baja potencia : 0.030Mi (tampoco 3648 días por mayor, pero sin la autodescarga)
    - Narcoléptico : 0.190Mi (tampoco 623 días de siempre sin la autodescarga)
    - JeeLib : 0.014Mi (tampoco 6689 estos días sin la autodescarga)

    Sigue siendo una diferencia sagrada … No sé si se trataba de mirar el consumo …

    David.

    • Gracias por la información. Había visto JeeLib pero no de baja potencia. Je vais faire la bascule 😉
      Terminé mis pruebas con un ESP8266, j’attaque bientôt les NRF24L01 😉

    • Atención también con figuras. Dormir con el perro guardián es máximo 8s 8s todos despertará el Arduino haga un bucle con una prueba y volver a dormir.

      • David

        Jeelib acepta un valor de hasta 65535 MS … Puse 10 segundos para el momento y no tengo la impresión de que despierta … No sé cómo se. Planeo hacer una medida de todas las 5 minutos así que voy a poner el comando en un bucle. El arduino despertará un poco pero no habrá ninguna medida para que no deben consumir …
        Ya veremos con el tiempo.

        Si usted tiene un retorno puede comparar.

        David.

  • Arduina

    Hola Chris!! Muchas gracias por este tutorial. Hemos probado el código del transmisor y funciona perfectamente pero no logramos generar un codigo para el receptor, lo hemos intendado pero no nos funciona.
    Nuestra idea es tener dos transmisores haciendo uso de los nodos en el código que tu has hecho.
    Esperamos impacientes el siguiente tutorial!

    • Hola,

      Aquí hay un ejemplo de cómo recibir datos sobre un arduino y enviarlos al puerto serie (¿Dónde lo conecté una frambuesa pi) :

      #include

      #define RX_PIN 4
      #define LED_PIN 13

      uint8_t moo = 1;
      #define BUFFER_SIZE 6
      uint8_t buffer[BUFFER_SIZE];

      void setup() {
      Serial.begin(115200);
      pinMode(LED_PIN, OUTPUT);
      digitalWrite(LED_PIN, moo);
      man.setupReceive(RX_PIN, MAN_1200);
      man.beginReceiveArray(BUFFER_SIZE, buffer);
      }

      void loop() {
      if (man.receiveComplete()) {
      uint8_t receivedSize = 0;
      Serial.print(buffer[0]);Serial.print(";");
      Serial.print(buffer[1]);Serial.print(";");
      float voltage = (buffer[2] < < 8 ) | (buffer[3] & 0xff); Serial.print(voltage/1000);Serial.print(";"); Serial.print(buffer[4]);Serial.print(";"); Serial.print(buffer[5]); Serial.println(";");man.beginReceiveArray(BUFFER_SIZE, buffer); moo = ++moo % 2; digitalWrite(LED_PIN, moo); } }

      • Arduina

        Muchísimas gracias! Vamos a pasar el día trabajando con esto. Nuestros obejtivo es tener dos Transmisores Nodo1, Nodo2 enviando datos a un mismo Receptor que pueda identificar el mensaje de cada nodo Transmisor (1 & 2). Con el ejemplo que me has proporcionado, creo que podremos ver como nos llegan los datos desde un nodo y así decidir como gestionar las trasnmisiones desde el receptor. Creo que nos serámuy útil. Empezaré probando con Arduino UNO para poder acceder al puerto serial; pero despues lo tendremos que probar con Attiny85, que es lo que queremos usar para nuestro proyecto.
        Si logramos implantar los dos nodos transmisores a un receptor compartiré el código.
        Gracias de nuevo!

        • Con el protocolo básico ultra que he intentado implementar puede administrar múltiples nodos (es el primer o segundo campo que no lo recuerdo bien) Así que usted debe ser capaz de hacer eso.
          Sobre el Attiny85, el programa es que el mismo entonces también debería ser fácil
          Buena suerte !

          • Arduina

            Sorry about the mess!! The TX code I provided is not the correct one. My response should have been:

            Hi again,

            Sadly, I haven´t been as successful as I hoped 🙁

            We created the TX Code and loaded into Attiny85 and the RX code loaded on UNO. The Manchester Library used is the indicated in this tutorial https://github.com/mchr3k/arduino-libs-manchester.

            The TX code doesn´t seem to be working as there is no blinking on the LED in Pin 1. Also, I can see that the RX code is not receiving anything as the ony Serial.print I get on the serial port is the first one “Inicio Loop”.

            I will paste both pieces of code just in case someone is interested to have a look and maybe suggest ideas while we research from our side.

            We have succesfully using the Manchester library to have 1 transmitter sending data to 2 receivers all runing on Attiny. That was also a challenge for us, and we are proud to have it working at home with inside and outside lights that come on when movement is detected. I will share all final codes once we get this next step completed!

            This is the TX Transmitter Code loaded on Attiny85:

            /*Este sketch usa la librería Manchester del siguiente enlace 
             https://github.com/mchr3k/arduino-libs-manchester
             Gestionar distintos nodos del transmisor que envían datos a un solo receptor
            */
            #include <Manchester.h>
            #include <Narcoleptic.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 0
            #define LED_PIN 1
            #define SENSOR_T A2
            float dato;
            float datoTotal;
            int   bucle;
            float y;            //señal de planta sensor dinamo
            float Temp;        //variable de temperatura desde "sensor"
            // 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 sensor
                    dato = 0;
               datoTotal = 0;
                   bucle = 0;
               while (bucle <=3000){
              dato = analogRead (SENSOR_T);
              datoTotal = dato + datoTotal;
              delayMicroseconds (10);
              bucle++;
            }
                y = (datoTotal / 3000); //sumamos caida de tension en el cable
             Temp = (5.12 * y * 100.0)/1024.0;
              // Sensor values can be put in a byte value due to the low precision
              msgData[4] = (uint8_t)Temp;
              msgData[5] = (uint8_t)Temp; 
              // 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);
            }
            

            And this is the RX Receiver code running on UNO (to be able to access serial port):

            /*Este sketch usa la librería Manchester del siguiente enlace 
             https://github.com/mchr3k/arduino-libs-manchester
             Gestionar distintos nodos del transmisor que envían datos a un solo receptor
            */
            #include <Manchester.h>
            #define RX_PIN 4
            #define LED_PIN 13
            uint8_t moo = 1;
            #define BUFFER_SIZE 6
            uint8_t buffer[BUFFER_SIZE];
            void setup() {
            Serial.begin(115200);
            pinMode(LED_PIN, OUTPUT);
            digitalWrite(LED_PIN, moo);
            man.setupReceive(RX_PIN, MAN_1200);
            man.beginReceiveArray(BUFFER_SIZE, buffer);
            }
            void loop() {
            Serial.println ("Inicio loop");
            if (man.receiveComplete()) {
            uint8_t receivedSize = 0;
            Serial.print(buffer[0]);Serial.print(";");
            Serial.print(buffer[1]);Serial.print(";");
            float voltage = (buffer[2] << 8 ) | (buffer[3] & 0xff);
            Serial.print(voltage/1000);Serial.print(";");
            Serial.print(buffer[4]);Serial.print(";");
            Serial.print(buffer[5]);
            Serial.println(";");
            man.beginReceiveArray(BUFFER_SIZE, buffer);
            moo = ++moo % 2;
            digitalWrite(LED_PIN, moo);
            }
            }
            

            Thanks!

          • Has cambiado el valor de los valores por defecto y creo que se haya perdido la conexión. Considero un valor que no es un buen valor A2. Se esperan sólo números enteros.
            Por favor, mira esta foto : http://fc04.deviantart.net/fs70/f/2013/038/3/7/attiny_web_by_pighixxx-d5u4aur.png
            Supongo que los valores de Arduino Pin son el uno para usar (10, 11, 12, 13). No estoy seguro de, No tienen un attiny85 …
            Intenta cargar un bosquejo básico que parpadea un led a adivinar cuáles son los valores correctos

  • Marco

    Buenas noches,

    je voudrais savoir si un article a été fait pour la partir réception sur un autre arduino? j’ai cherché mais je n’ai rien trouvé.

    J’espere que l’auteur de l’article pourra m’aider

    J’ai repris excatement sont croquis pour l’emission avec un dht22 et atmega 8Mhz interne

      • Marco

        J avais vu cet article. Por contra mí busco el código de recepción que va con la emisión de esta sección del código para Arduino.

        • No lo siento. El principio se explica que echa de menos el código de descomposición / recepción tengo que tener en mi equipo y yo pueda enviar si lo encuentro

          • Marco

            Hola, CA Si no te importa Estoy interesado en el código si se puede poner el desssus Ain. ¿Quieres mi correo electrónico?

            Gracias de nuevo

          • Se puede adaptar pero debería funcionar :

            #incluyen

            #definir RX_PIN 4

            #definir LED_PIN 13

            uint8_t moo = 1;

            #definir BUFFER_SIZE 6

            tampón uint8_t[TAMAÑO DEL BÚFER];

            instalación de vacío() {

            Serial.Begin(115200);

            pinMode(LED_PIN, SALIDA);

            digitalWrite(LED_PIN, mugir);

            man.setupReceive(RX_PIN, MAN_1200);

            man.beginReceiveArray(TAMAÑO DEL BÚFER, almacenador intermediario);

            }

            bucle vacío() {

            If (man.receiveComplete()) {

            uint8_t receivedSize = 0;

            Serial.Print(almacenador intermediario[0]);Serial.Print(“;”);

            Serial.Print(almacenador intermediario[1]);Serial.Print(“;”);

            voltaje de flotación = (almacenador intermediario[2] << 8 ) | (almacenador intermediario[3] & 0xff);

            Serial.Print(tensión / 1000);Serial.Print(";");

            Serial.Print(almacenador intermediario[4]);Serial.Print(";");

            Serial.Print(almacenador intermediario[5]);

            Serial.println(";");

            man.beginReceiveArray(TAMAÑO DEL BÚFER, almacenador intermediario);

            moo = ++ moo % 2;

            digitalWrite(LED_PIN, mugir);

            }

            }

          • Marco

            Doy gracias a lo prueba.

          • Marco

            Buenas noches,

            Acabo de probar el código de recepción (No antes de que pudiera lol)

            voila ce que je recois:

            1;1;4.77;2;1;

            1;2;4.77;2;1;

            1;3;4.77;2;1;

            1;0;4.77;2;1;

            1;1;4.77;2;1;

            1;2;4.77;2;1;

            1;3;4.77;2;1;

            1;0;4.79;2;1;

            1;2;4.79;2;1;

            Avez vous une idée d’ou ça peut venir

            Gracias

          • C’est dans les commentaires de l’émetteur 🙂
            - ID du node
            - No. de la trama 0 a SEND_433_COUNT (4 de forma predeterminada). He tanto, no establecer el marco de la gestión de ACK es transmitido varias veces a pasar que ca. A cargo de la frambuesa para ordenar
            - Me transmisor de tensión de alimentación
            - La humedad DHT11 (conectado a la clavija 2 de forma predeterminada)
            - temperatura DHT11 (conectado a la clavija 2 de forma predeterminada)

            Teniendo en cuenta sus valores recientes tendremos que ver la conexión o los ajustes

          • Marco

            es bueno que no había cambiado en el DHT22 DHT11

            Recibo el:

            1.10v - 58% - 26*C

            es que es normal que no veo más que 1.10V mientras está enchufado USB.

            Otra pregunta después de que me dejó sola.
            cuando conecto el Arduino con sólo el alimenttion externa de 9V No tengo datos sobre el receptor monitor serie. Mais si je le branche en usb ça fonctionne.

            Un parametre a modifier?

            Buenas noches

          • Non c’est pas normal surtout que dans les teames précédantes tu avais bien 4.7v. Un autre paramètre a du etre changé

          • Marco

            normalement le voltage que je dois trouver c’est combien?
            là je l’alimente avec alim externe de 9v alors
            au moment de la premiere mesure j’etais avec mon usb (donc bonne valeur mesurer)
            ensuite j’ai modifier le dht11 en dht22 et du coup j’etais a 1.10v

            le reste des parametre est identique a ton code

          • Utilise la meme alimentation via ton hub. Si tu mets du 9v direct sur l’arduino alors qu’il attend du 3.3v max normal que ca ne fonctinne pas 😉

          • Marco

            Buenas noches,

            ca y est, todo funciona, par contre j’ai toujours les 1.10v.

            Háblame de esta parte del prog tono, sabiendo que sólo tiene que utilizar los chips ATmega, es lo que tengo que cambiar algunas cosas? sin embargo, gira con esta parte de la totalidad.

            Veo que hay una línea u observación hace por escrito; // Leer 1.1V referencia contra Vcc
            este es el ca es que tengo a mi 1.10V en mi acuse de recibo?

            En cualquier caso, muchas gracias, Realmente DEBUTE con Arduino, Trato de entender el prog C, pero no es fácil, pero una vez dicho esto es super interesante

            //————————————————————————————————-

            // Leer la tensión de alimentación actual

            //————————————————————————————————-

            largo readVcc() {

            bitClear(PRR, PRADC); ADCSRA |= poco(ADEN); // Habilitar el ADC

            resultado largo;

            // Leer 1.1V referencia contra Vcc

            #Si se ha definido (__AVR_ATtiny24__) || define(__AVR_ATtiny44__) || define(__AVR_ATtiny84__)

            ADMUX = _BV(MUX5) | _BV(MUX0); // Por ATtiny84

            #Elif definido (__AVR_ATtiny25__) || define(__AVR_ATtiny45__) || define(__AVR_ATtiny85__)

            ADMUX = _BV(MUX3) | _BV(MUX2);

            #más

            ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); // Por ATmega328

            #endif

            retardo(2); // Esperar a Vref resolver

            ADCSRA |= _BV(ADSC); // Convertir

            Tiempo (bit_is_set(ADCSRA,ADSC));

            resultado = ADCL;

            resultado |= ADCH<<8;

            resultado = 1126400L / resultado; // Espalda-calcular Vcc en mV

            ADCSRA &= ~ bit(ADEN); bitSet(PRR, PRADC); // Deshabilitar el ADC para ahorrar energía

            devolver resultados; // VCC en milivoltios

            }

          • El 1.1 es un valor de referencia a continuación, calcular el valor real de los alimentos. ¿Cómo alimentas ?

          • Marco

            Hola,

            J alimenta mi Arduino USB y estoy conectado a la tierra y 5v como en su última parte superior shema (excepto que no lo hice alambre en el TX y RX) y en el programa que acabo de cambiar eso’ m que muestra los valores que el anterior c es decir:
            voltaje - humedad - temperatura

          • Marco

            es bueno que no había cambiado en el DHT22 DHT11

            Recibo el:

            1.10v - 58% - 26*C

            es que es normal que no veo más que 1.10V mientras está enchufado USB

  • Alexandre SEROT

    Hola,

    Probé con Arduino UNO, Me vi obligado a comentar las líneas 28 y 44

    bitClear(PRR, PRADC); ADCSRA |= poco(ADEN); // Habilitar el ADC
    ADCSRA &= ~ bit(ADEN); bitSet(PRR, PRADC); // Deshabilitar el ADC para ahorrar energía

    Para PRR no fue reconocido.

    Con estas modificaciones funciona nikel.

    Soy dueño de micro pro (chino copia comprar con Aliexpress con un ATmega32u4), Quería poner a prueba y es el drama ... después de subir, Arduino ya no es reconocido por Windows y me dice que el dispositivo se ha detenido debido a que tiene problemas (Código 43).

    Encontrar la solución (en el caso de CA suceda a otra):

    - Para restablecer el Arduino (primero + GND)
    - De nuevo, será detectar por las ventanas de un tribunal, mientras, esto permite ver el puerto COM en el que es detectar.
    - Se volverá a ir por mal camino
    - Empezar a subir un esquema básico (ejemplo abrir y cerrar)
    - Repita el reinicio
    - Carga resultó, está ganando es de nuevo operativo.

    El truco (No sé explicar), es que durante el reset, se detecta correctamente por Windows por un tiempo corto (10apenas segundos), es por eso que tenemos que empezar un poco antes de la segunda carga de reposición, subir comenzando con el código de verificación.

    Mi pregunta es por qué mi pro micro pasando en este estado?

    Estoy releyendo el código, No entiendo lo que pone en este estado, No encuentro nada específico tiene Atmega328

    Gracias de antemano,

    Alex

    • Hola
      Es que no viene a la biblioteca Narcoleptic ? Al ser desactivado y el uso de la “sueño” clásico no funciona mejor ? Veo que el AC podría hacer que la manipulación y para registrarse “planta” la UC

  • Jean-Michel SORET

    Hola,
    Bravo por la exactitud de su tutorial, que me dieron ganas de tirarme.
    Se trata de mis primeros pasos con Arduino.

    Todavía no he recibido los condensadores de modo que probé sin oscilador externo.
    En el IDE de Arduino, Me uní a los mensajes de error.
    Está relacionado con la falta de oscilador externo???

    Gracias a querer responder bien.

    • Hola
      No hay archivos adjuntos
      Pero sí es posible que el dibujo no se carga debido a la falta de oscilador para activar el reloj correctamente. Sin embargo, es posible prescindir de él, pero en este caso hay que adaptar la velocidad de subida

  • Jean-Michel SORET

    Hola,

    He añadido el oscilador y condensadores (20 nF y no 20 ΜF) pero me sale el error abajo cuando se quema el gestor de arranque:

    Arduino : 1.6.7 (Windows 10), Mapa : “(PiHomeConnect) ATmega328 - 3.3V - 8 reloj interno MHz”

    java.io.IOException: No se puede ejecutar el programa “{camino}/bin / avrdude”: CreateProcess de error = 2, El archivo especificado no se encuentra

    en java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)

    en processing.app.helpers.ProcessUtils.exec(ProcessUtils.java:26)

    en cc.arduino.packages.Uploader.executeUploadCommand(Uploader.java:123)

    en cc.arduino.packages.uploaders.SerialUploader.burnBootloader(SerialUploader.java:359)

    en processing.app.Editor.lambda $ handleBurnBootloader $ 42(Editor.java:2754)

    en java.lang.Thread.run(Thread.java:745)

    Causado por: java.io.IOException: CreateProcess de error = 2, El archivo especificado no se encuentra

    en java.lang.ProcessImpl.create(Método nativo)

    en java.lang.ProcessImpl.(ProcessImpl.java:386)

    en java.lang.ProcessImpl.start(ProcessImpl.java:137)

    en java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)

    … 5 más

    Si usted tiene una pista…

    Gracias de antemano

    • Como se indica en el registro de avrdude el programa no está en el camino. Si ha instalado debe establecer la variable de ruta

      • Danston Sac

        Hola, Me Mac OSX y yo no nos gestor de arranque grave que no se puede ejecutar el programa “{camino}/bin / avrdude”: error = 2, Nº tal archivo o directorio.

        así que tengo el mismo problema, pero no entiende cómo ajustar la variable de ruta gracias

        • Se gobernará en la memoria de la interfaz IDE

          • Danston Sac

            así que hice las modificaciones de la ruta, pero ahora tengo otro error,
            avrdude: stk500_recv(): programador no está respondiendo
            avrdude: stk500_getsync() intento 1 de 10: no sincronizados: resp = 0x00

            Es este un error de mi cableado ? Presté atención todavía. Tengo una duda sobre el sentido de la polaridad 2 hay condensadores en la misma dirección !!.

          • Creo que si un error en la conexión. También recuerdo haber tenido que mantener los activos para los que se detecta el reinicio ATmega. Dependía fichas

  • Jean-Michel SORET

    Hola,

    Estoy corriendo en Windows 10. Me cambió la trayectoria y reiniciar mi PC pero tengo siempre el mismo error de ruta.
    No entiendo lo que está pasando.
    Tengo la última versión del IDE de Arduino (1.7).

    Si usted tiene una idea…

    Gracias

  • Julien Geneste

    Yop,

    Vi en la imagen una vez que el proyecto terminado que no tiene de cuarzo en su ATmega. El reloj es interna o ella depende de la versión del microcontrolador ?

    Gracias !

    • Hola,
      Como explico que estoy usando el oscilador interno a 8 MHz. menos “rápido” pero sobre todo consume menos

  • sidwin9

    Hola,

    Me faltan detalles de su edición, especialmente en lo que respecta a las fuentes de alimentación. Al parecer, nutres con todo 2 1.5volts baterías para el funcionamiento del ATmega a 3,3Volts pero ¿qué hacer para poder TX 433 Mhz trabaja en 5Volts.

    Gracias a aclararme un poco de todo esto.

    • Buenas noches. He conectado directamente. El módulo funciona en un rango de 3.3V-12V. Por contra en la.portée 3.3v se limita

      • sidwin9

        Gracias por su respuesta rápida.
        El 2 batería 1.5 voltios son por lo tanto suficiente para todo el conjunto. ¿Quieres cuánto tiempo sin cambiar las baterías ?

        • Yo digo esto a partir del artículo con un gráfico que muestra la evolución de la carga de 2 baterías. En este tutorial abusado un poco en la frecuencia para ilustrar el funcionamiento. Por contra no he medido de descarga “natural” batería

    • Gael Dirig

      hola sidwin9 j trata en vano de ponerse en contacto con usted en el mini estación meteo con pantalla forumarduino foro en el sitio para obtener más información de su estación meteorológica con Arduino y la pantalla 480×320 .usted puede compartir su código de manzana bruta para ver si puedo entender y adaptarse a la aldea de código y mi función. Yo también estaba en contacto con t en otro foro. Gracias

  • Ken Addams

    Hola,
    Es muy bueno todos estos montajes, pero en una instalación en casa de verdad, instalar sus placas universales con captuers temperaturas y resistencia en su sala de estar ? De hecho estoy totalmente de acuerdo con el principio, pero todavía no he encontrado Implementación “no geeks” es decir, que lleva una caja discreta para su integración en un interior armónico. complacer las ideas ?

    • Hola. Para los no friki en este sitio hay un proyecto explicó con carcasas que ocultan todo lo que
      Si no fuera por este artículo que explica cómo hacer uno mismo. El siguiente paso es la caja impresa 3d. Cada uno de vista de la estética

  • Valerie Stephane Vdb Cresp
    • magnífico ! Buen trabajo !
      ¿Qué componentes se utilizan y qué vida estimada de la batería ?

  • Pingback: Avec un Atmega, Créer un capteur de température sans fil | RoboTechno()

  • Esto

    Hola,

    Je suis sur un montage analogue avec virtualwire ou radiohead pour le 433Mhz. j’envoie du JSON et ca passe bien (j’ai bien le message de recu sur le moniteur arduino du recpteur), seul probleme, quand je connecte mon arduino au raspberry je recois plus les println sur le serial dans ma boucle de lecteur de message radio.

    Plus etrange encore, en dehors de ma boucle ce code

    bucle vacío(){
    //reception msg 433
    {…}
    Serial.println(“prueba”);
    If (msg.length()>0){
    Serial.println(msg);
    }
    }

    me genere bien “prueba” en boucle mais jamais le msg. Les capteurs / emmeteur sont alimenté par un circuit a part, j ai juste ma data sur l arduno.
    Dans l’ide arduino niveau du moniteur jtout est ok, juste ce serial.println dans ma boucle de lecture qui remonte pas sur raspberry -_-. Ni dans un script python, ni sur nodered.

    Je pense avoir tres clair :/

    Une idée 😀