Página principal


Arduino
Transmisor temperatura y humedad
433MHz - mx-fs-03v

xsetaseta@gmail.com

Navegando por la red,http://www.hobbycomponents.com/, encontré un kit de transmisión y recepción para el arduino en la frecuencia de 433MHz.
Es sencillo de programar y se puede obtener por menos de 2€.
Dicho y hecho, lo pedí y en menos de 15 días lo tenía en casa.
El montaje lo he separado en dos artículos, transmisor y receptor, en este primer montaje voy a explicar como he hecho el transmisor.


Kit transmisor
Esquema del transmisor


Esquema del montaje en la placa arduino.


Esquema del montaje en el ATMEGA328.

Para poder medir el consumo del circuito por partes y quitar el consumo de los componentes de la placa arduino, he sacado el Atmega en un modulo board. También he añadido un conversor USM->rs232 para poder programar el microcontrolador.


Montaje del circuito.

Para entender este circuito conviene ver mis dos anteriores artículos:
Reduciendo consumo.Parte 2. Reloj - DS1302. ardurab
Reduciendo consumo.Parte 1. Reloj - DS1302. arduraa
 
El consumo total del circuito quitado el adaptador usb-to-TTL es de 0.08 mA a 4.2V.
Cuando transmite el circuito consume 15mA ,el tiempo de transmisión dura aproximadamente 1 segundo.
Mediante un interruptor podemos indicarle al circuito que transmita cada  1 segundo o cada 60 segundos.
Una pila AA pude tener una capacidad entre 1100mAh(Zinc–carbono)
y 2900mAh (NiMH).
Si hacemos cálculos con un consumo de 15mA cada 60 segundos, con una pila de 1100mAh , tendremos para aproximadamente 4400 horas, 183 días.
Si utilizaríamos pilas alcalinas con poca autodescarga y cambiaríamos el programa para que transmitiera cada mas tiempo, duraría años el circuito transmitiendo.


Todo esto es bastante teórico, las baterías se autodescargan con el tiempo.

Programa

//-------------
// SETA43
// 06/05/2014
//-------------

#include <avr/io.h>
#include <avr/interrupt.h>

#include <avr/sleep.h>

#include <Wire.h>
#include <VirtualWire.h>
#include "DHT.h"

#define DHTPIN 3     // what pin we're connected to

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

unsigned int ih,it;
int sensorValue1, sensorValue2;

DHT dht(DHTPIN, DHTTYPE);

const int TX_DIO_Pin = 2;

int z,contador;

void setup() {
  
  pinMode(13, OUTPUT);
  pinMode(12, INPUT);

  vw_set_tx_pin(TX_DIO_Pin);
  vw_set_ptt_inverted(true);
  vw_setup(2000);

  Serial.begin(9600);
  Serial.println("DHTxx test!");
 
  dht.begin();
  
  watchdogOn(); // Turn on the watch dog timer.
  //Desactiva conversor A/D
  ADCSRA = ADCSRA & B01111111;
  ACSR = B10000000;
 
  contador=0;
}

void loop() {
 unsigned int Data;
 byte TxBuffer[2];
 
  float h = dht.readHumidity();
  float t = dht.readTemperature();


  if (isnan(t) || isnan(h))
    {
    Serial.println("Failed to read from DHT");
    }
  else
    {
    
    ih=h*100;
    it=t*100;
 
    sensorValue1=222;
    sensorValue2=contador;
    
    digitalWrite(13, HIGH);
    
    TxBuffer[0] = 33333 >> 8;
    TxBuffer[1] = 33333;
    vw_send((byte *)TxBuffer, 2);
    vw_wait_tx();
    
    TxBuffer[0] = ih >> 8;
    TxBuffer[1] = ih;
    vw_send((byte *)TxBuffer, 2);
    vw_wait_tx();
    
    TxBuffer[0] = it >> 8;
    TxBuffer[1] = it;
    vw_send((byte *)TxBuffer, 2);
    vw_wait_tx();
    
    TxBuffer[0] = sensorValue1 >> 8;
    TxBuffer[1] = sensorValue1;
    vw_send((byte *)TxBuffer, 2);
    vw_wait_tx();
    
    TxBuffer[0] = sensorValue2 >> 8;
    TxBuffer[1] = sensorValue2;
    vw_send((byte *)TxBuffer, 2);
    vw_wait_tx();
        
    Serial.print(ih); Serial.print(" %  ");
    Serial.print(it); Serial.print(" C  ");
    Serial.println(contador);  
    
    delay(500);
    digitalWrite(13, LOW);
    
    for(z=0;z<60 && HIGH==digitalRead(12) ;z++)goToSleep();
    contador++;
    if(contador>100) contador=0;
    delay(100);

    digitalWrite(13, HIGH);

    }
  
}

void goToSleep()   
{    
  set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Set sleep mode.
  sleep_enable(); // Enable sleep mode.
  sleep_mode(); // Enter sleep mode.
  sleep_disable(); // Disable sleep mode after waking.                     
}

void watchdogOn()
{
  //Fuente http://www.fiz-ix.com/2012/11/low-power-arduino-using-the-watchdog-timer/
  // Clear the reset flag, the WDRF bit (bit 3) of MCUSR.
  MCUSR = MCUSR & B11110111;
  WDTCSR = WDTCSR | B00011000;
  //WDTCSR = B00000101; //0.5S
  WDTCSR = B00000110; //1S
  //WDTCSR = B00100001; //8S

  // Enable the watchdog timer interupt.
  WDTCSR = WDTCSR | B01000000;
  MCUSR = MCUSR & B11110111;
}


ISR(WDT_vect)
{
  //No hace nada
  
}



Hasta pronto.
JUAN GALAZ

Bibliografía:
http://forum.hobbycomponents.com/viewtopic.php?f=39&t=1324
http://www.seta43.netau.net/ardurab.html
http://playground.arduino.cc/Main/DHTLib
http://www.pjrc.com/teensy/td_libs_VirtualWire.html