RF Transmitter and Receiver WRL-10535 and WRL-10533

I just have 30 guage wirewrap wire, sits loose on my enclosure.

perhof:

CrossRoads:
17cm is for 434 MHz.

Right, it should be 17. My bad.
I've also read 13 in some guides but it should be 17 for 434MHz and that's what I'm using.

315 MHz ~1.5ft,
1/4 of that, ~11cm, should work well

What is 11cm? 1/8 wavelength?
Guess it should work too.

Experiment a bit. Try 11-12 cm and route it around inside your enclosure and try 24 cm and make more loops. It doesn't necessarily have to stick out.
Maybe it has to if you use a metal enclosure.

Any piece of wire should do. I've used thick single core copper without plastic insulation, thin single core jumper wire with insulation, a multi core wire with insulation from an ethernet cable (there are eight of these in each cable) and that worked fine too. I don't know what's best in theory.

The alarm devices you're mentioning are probably using coil antennas or pcb loop antennas which are a bit harder to get right.
Maybe someone here can tell what dimensions you would need for that.

What kind of range are you aiming for?

Worse case scenario about 15 meters, but mostly within 10 meters.

I'm still playing with stuff just testing and prototyping right now. Got some transceivers to try out next if I can figure out how to wire them. They just use a bit more power which I'm not crazy about since I'm trying to keep these things low enough to run off batteries for a good amount of time.

Worse case scenario about 15 meters, but mostly within 10 meters.

I'd say you should reach 15 meters no matter what kind of wire and which of the antenna lengths you select as long as it's a length that matches the frequency.
Selecting any other length might not help.

I'm still playing with stuff just testing and prototyping right now. Got some transceivers to try out next if I can figure out how to wire them. They just use a bit more power which I'm not crazy about since I'm trying to keep these things low enough to run off batteries for a good amount of time.

What's the application if i may ask?

perhof:
What's the application if i may ask?

Wireless sensors for an alarm system.

I just found these on sparkfun:

How the heck do you solder something like that? It's really cheap and a 2.4ghz transceiver should have a lot less interference problems, and the power usage is between the rf transmitters and the transceivers I currently have (RFM12B-S2 Wireless Transceiver - 434MHz - WRL-09582 - SparkFun Electronics)

Does it require anything else to work? The description mentions something about works great with a 16mhz crystal, does it require that though?

Do you know for sure that the device is getting 5V? Those little devices usually just work. They worked well for me when I actually made the things before I retired. Clean 5V and Ground, the antenna wires should be about 7" or about 18CM and either vertical or horizontal doesn't matter as long as both are the same way. You might get lucky there as it is possible to decrease the interfering signal by changing antenna polarization, theoretically by a factor of 10, Practically about 1/3.

Doc

You buy it on a board instead:

http://iteadstudio.com/store/index.php?main_page=product_info&cPath=7&products_id=53

CrossRoads:
You buy it on a board instead:

SparkFun Transceiver Breakout - nRF24L01+ - WRL-00691 - SparkFun Electronics

http://iteadstudio.com/store/index.php?main_page=product_info&cPath=7&products_id=53

Lol thanks, I actually found the board version on sparkfun after I posted that, but wasn't going to pay 20 dollars for it on a board, however $5.50, that I can probably swing :slight_smile:

9V's batteries are horrible... High Cost/Low Current.

You would do well to buy a $15-$20 radio control 9.6V rechargeable (usually comes with a charger too).

And the same module here for $2.75 US (this price is typical of many vendors on Ebay) 5.50 Ea should be for a pair... Check it out.
[price-up] NRF24L01 2.4G Wireless Module, Genuine Chip – ElectroDragon.
I recently bought 6 of those devices and a USB Receiver "Dongle" for $9.95... "Free Shipping"... Too ? $22.00 Ea... Yeah I'll Bet... that they would love to sell a bunch at that price, oh yeah and the Features on the $22.50 board are built into the Chip. All of the nRF24XX series Ic's have those features... They're part of what drove the original design and that was an inexpensive Chipset that could co-exist with all the other ISM stuff as well as Microwave Ovens @ 2450 Mhz and most capable of 1000 watts or more @ ~ 2450 mhz as the ovens use a "Power Oscillator" (A Klystron of Magnetron tube) neither of which has any external frequency control (Oscillating Frequency is set by internal cavity dimensions primarily).

Doc

Docedison:
And the same module here for $2.75 US (this price is typical of many vendors on Ebay) 5.50 Ea should be for a pair... Check it out.
[price-up] NRF24L01 2.4G Wireless Module, Genuine Chip – ElectroDragon.
I recently bought 6 of those devices and a USB Receiver "Dongle" for $9.95... "Free Shipping"... Too ? $22.00 Ea... Yeah I'll Bet... that they would love to sell a bunch at that price, oh yeah and the Features on the $22.50 board are built into the Chip. All of the nRF24XX series Ic's have those features... They're part of what drove the original design and that was an inexpensive Chipset that could co-exist with all the other ISM stuff as well as Microwave Ovens @ 2450 Mhz and most capable of 1000 watts or more @ ~ 2450 mhz as the ovens use a "Power Oscillator" (A Klystron of Magnetron tube) neither of which has any external frequency control (Oscillating Frequency is set by internal cavity dimensions primarily).

Doc

That $2.75 one doesn't look like the + model that sales for $5.50 at the other place. The + model adds a few features including a slower transmit speed for increased range and less power usage.

However you are correct they are cheaper on ebay http://www.ebay.com/itm/2PCS-Arduino-NRF24L01-Wireless-Transceiver-Module-/270977894613?pt=LH_DefaultDomain_0&hash=item3f178a88d5 is a + and 4.10 for 2 of them, so only $2.05 each free shipping.

Although I'd probably buy this one instead: nrf24l01 for sale | eBay a little bit more expensive but it's located in the US, so would get here 3 times quicker lol.

So, I'm testing the RF434, with VirtualWire. And is there a way to make it translate what it recieved into a text? Instead of hex codes for each letter.

Sure, just translate the hexcodes into letters. Translation is available at asciitable.com

Say you get 1 character at a time:

    // mapping from incoming character to font_array or other commands: \ + = < >
    // invalid characters are not defined and are ignored
    switch(incomingByte){
    case 0x20:
Serial.print(" ");
      break;
    case 0x21:
Serial.print("!");
break;
    case 0x2d:
      Serial.print("-");
      break;
    case 0x2e:
      Serial.print(".");
      break;
    case 0x2f:
      Serial.print("/");
      break;
    case 0x30:
      Serial.print("0");
      break;
    case 0x31:
      Serial.print("1");
      break;
 // etc.   
}

Thanks!

But I've ran into another problem, the VirtualWire library is hard to understand.

I'm using a DHT11 to measure the temperature, now getting the readings from the DHT11 is easy, getting em shown in the serial monitor is easy.

Problem comes when I want to send the readings using VirtualWire, thats hard :stuck_out_tongue: Or I'm sure I'm missing something...

This is my code:

Problems starts in "char *msg = char(DHT11.temperature);" it seems.

// transmitter.pde
//
// Simple example of how to use VirtualWire to transmit messages
// Implements a simplex (one-way) transmitter with an TX-C1 module
//
// See VirtualWire.h for detailed API docs
// Author: Mike McCauley (mikem@open.com.au)
// Copyright (C) 2008 Mike McCauley
// $Id: transmitter.pde,v 1.3 2009/03/30 00:07:24 mikem Exp $

// dewPoint function NOAA
// reference: http://wahiduddin.net/calc/density_algorithms.htm 
double dewPoint(double celsius, double humidity)
{
	double A0= 373.15/(273.15 + celsius);
	double SUM = -7.90298 * (A0-1);
	SUM += 5.02808 * log10(A0);
	SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
	SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
	SUM += log10(1013.246);
	double VP = pow(10, SUM-3) * humidity;
	double T = log(VP/0.61078);   // temp var
	return (241.88 * T) / (17.558-T);
}

// delta max = 0.6544 wrt dewPoint()
// 5x faster than dewPoint()
// reference: http://en.wikipedia.org/wiki/Dew_point
double dewPointFast(double celsius, double humidity)
{
	double a = 17.271;
	double b = 237.7;
	double temp = (a * celsius) / (b + celsius) + log(humidity/100);
	double Td = (b * temp) / (a - temp);
	return Td;
}


#include <dht11.h>

dht11 DHT11;

#define DHT11PIN 2

#include <VirtualWire.h>

int tempsend;
char tempconv;
char fuck;

void setup()
{
    Serial.begin(9600);	  // Debugging only
    Serial.println("setup");
    Serial.println("DHT11 TEST PROGRAM ");
    Serial.print("LIBRARY VERSION: ");
    Serial.println(DHT11LIB_VERSION);
    Serial.println();

    // Initialise the IO and ISR
    vw_set_ptt_inverted(true); // Required for DR3100
    vw_setup(2000);	 // Bits per sec
}

void loop()
{
     Serial.println("\n");

  int chk = DHT11.read(DHT11PIN);

  Serial.print("Read sensor: ");
  switch (chk)
  {
    case 0: Serial.println("OK"); break;
    case -1: Serial.println("Checksum error"); break;
    case -2: Serial.println("Time out error"); break;
    default: Serial.println("Unknown error"); break;
  }

  //Serial.print("Humidity (%): ");
  //Serial.println((float)DHT11.humidity, 2);

  Serial.print("Temperature (oC): ");
  Serial.println(DHT11.temperature);


   char *msg = char(DHT11.temperature);

    digitalWrite(13, true); // Flash a light to show transmitting
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx(); // Wait until the whole message is gone
    digitalWrite(13, false);
    delay(2000);
 

}

Since it complains I can't do "'int' to 'char*'", I tried to set a char() conversion first. But then it complains about this "'char' to 'char*'". So I try to remove the * infront of MSG, but then I get the warning about a constant char...

I'm really confused here, anyone want to help me think this one out?

Sigh, I wish VirtualWire would have more examples showing how to send other values than 'const char'.

Change a couple of things:

Move these to the top of the sketch

#include <dht11.h>
#include <VirtualWire.h>

Delete this unless your transmitter needs a Push to Talk switch (most don't)

    vw_set_ptt_inverted(true); // Required for DR3100

put the data you want to send in an array
msg[ ]
then virtualwire will send the msg[] array out.

I can't tell what data type you want to send - DHT11.temperature is a float? thus 4 butes?
So put 4 byte in msg[0] thru msg[3] and let 'er rip.

Hm, sorry for not understanding. But the value I'm sending could just be a normal int.

   Serial.print("Temperature (oC): ");
  int convert = DHT11.temperature;
  Serial.println(convert);


   char *msg[3] = convert;

    digitalWrite(13, true); // Flash a light to show transmitting
    vw_send((uint8_t *)msg, strlen(3));
    vw_wait_tx(); // Wait until the whole message is gone
    digitalWrite(13, false);
    delay(2000);

So after converting my float value to a int, it's basically the value of 23-25 around there. What do you mean by put 4 byte in msg[0] thru msg[3]?

Thanks for all the help so far! :slight_smile:

I didn't know how many bytes of data you were dealing with, so figured you had a float that was 4 bytes long.

I don't know what this does

char *msg[3] = convert;

I would personally do this:

msg[0] = highByte(convert);
msg[1] = lowByte(convert);

and then let virtualwire send the [msg] array out. Or just grab the low byte if its always <=255

I'd have to look at my remote control code at home to see if

vw_send((uint8_t *)msg, strlen(3));

had to change to support that.

Hm, got no compiling errors, but it won't send. Led 13 won't even light up, so it can't have gotten that far into the program :stuck_out_tongue:

#include <dht11.h>
dht11 DHT11;
#define DHT11PIN 2
#include <VirtualWire.h>

double dewPoint(double celsius, double humidity)
{
	double A0= 373.15/(273.15 + celsius);
	double SUM = -7.90298 * (A0-1);
	SUM += 5.02808 * log10(A0);
	SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
	SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
	SUM += log10(1013.246);
	double VP = pow(10, SUM-3) * humidity;
	double T = log(VP/0.61078);   // temp var
	return (241.88 * T) / (17.558-T);
}

// delta max = 0.6544 wrt dewPoint()
// 5x faster than dewPoint()
// reference: http://en.wikipedia.org/wiki/Dew_point
double dewPointFast(double celsius, double humidity)
{
	double a = 17.271;
	double b = 237.7;
	double temp = (a * celsius) / (b + celsius) + log(humidity/100);
	double Td = (b * temp) / (a - temp);
	return Td;
}

int tempsend;
char tempconv;
char fuck;

void setup()
{
    Serial.begin(9600);	  // Debugging only
    Serial.println("setup");
    Serial.println("DHT11 TEST PROGRAM ");
    Serial.print("LIBRARY VERSION: ");
    Serial.println(DHT11LIB_VERSION);
    Serial.println();

    // Initialise the IO and ISR
    vw_setup(2000);	 // Bits per sec
}

void loop()
{
     Serial.println("\n");

  int chk = DHT11.read(DHT11PIN);

  Serial.print("Read sensor: ");
  switch (chk)
  {
    case 0: Serial.println("OK"); break;
    case -1: Serial.println("Checksum error"); break;
    case -2: Serial.println("Time out error"); break;
    default: Serial.println("Unknown error"); break;
  }

  int convert = DHT11.temperature;

   char *msg;
   msg[0] = highByte(convert);
   msg[1] = lowByte(convert);

    digitalWrite(13, true); // Flash a light to show transmitting
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx(); // Wait until the whole message is gone
    digitalWrite(13, false);
    delay(2000);
}

Are you getting any of these?

  switch (chk)
  {
    case 0: Serial.println("OK"); break;
    case -1: Serial.println("Checksum error"); break;
    case -2: Serial.println("Time out error"); break;
    default: Serial.println("Unknown error"); break;
  }

is this doing anything now?
char *msg;

I'm getting the Ok. But I found an example on a blog:

So I took it, and merged it with the DHT11.

Transmitter:

// 
//   FILE:  dht11_test1.pde
// PURPOSE: DHT11 library test sketch for Arduino
//

//Celsius to Fahrenheit conversion

#include <dht11.h>

dht11 DHT11;

#define DHT11PIN 2

#include <VirtualWire.h>

// LED's
const int ledPin = 13;

// Sensors

int Sensor1Data;
//int Sensor2Data;
char Sensor1CharMsg[4]; 

double Fahrenheit(double celsius)
{
	return 1.8 * celsius + 32;
}

//Celsius to Kelvin conversion
double Kelvin(double celsius)
{
	return celsius + 273.15;
}

// dewPoint function NOAA
// reference: http://wahiduddin.net/calc/density_algorithms.htm 
double dewPoint(double celsius, double humidity)
{
	double A0= 373.15/(273.15 + celsius);
	double SUM = -7.90298 * (A0-1);
	SUM += 5.02808 * log10(A0);
	SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
	SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
	SUM += log10(1013.246);
	double VP = pow(10, SUM-3) * humidity;
	double T = log(VP/0.61078);   // temp var
	return (241.88 * T) / (17.558-T);
}

// delta max = 0.6544 wrt dewPoint()
// 5x faster than dewPoint()
// reference: http://en.wikipedia.org/wiki/Dew_point
double dewPointFast(double celsius, double humidity)
{
	double a = 17.271;
	double b = 237.7;
	double temp = (a * celsius) / (b + celsius) + log(humidity/100);
	double Td = (b * temp) / (a - temp);
	return Td;
}


void setup()
{
  Serial.begin(9600);
   // LED 
 pinMode(ledPin,OUTPUT);
  // VirtualWire setup
 vw_setup(2000);     // Bits per sec
 
}

void loop()
{

  
  
   // Read and store Sensor 1 data
  int chk = DHT11.read(DHT11PIN);
  Sensor1Data = DHT11.temperature;
  delay(2000);
  // Convert integer data to Char array directly 
  itoa(Sensor1Data,Sensor1CharMsg,10);
  
  // DEBUG
  Serial.print("Sensor1 Integer: ");
  Serial.print(Sensor1Data);
  Serial.print(" Sensor1 CharMsg: ");
  Serial.print(Sensor1CharMsg);
  Serial.print("RawSensor: ");
  Serial.print(DHT11.temperature);
  Serial.println(" ");
  delay(1000);

  // END DEBUG
 
 digitalWrite(13, true); // Turn on a light to show transmitting
 vw_send((uint8_t *)Sensor1CharMsg, strlen(Sensor1CharMsg));
 vw_wait_tx(); // Wait until the whole message is gone
 digitalWrite(13, false); // Turn off a light after transmission
 delay(200); 
}
//
// END OF FILE
//

Reciever:

/* 

Sensor Receiver 
By Markus Ulfberg 2012-07-06

Gets a sensor reading 0-1023 in a char array
from RF Transmitter unit via VirtualWire 
converts char array back to integer

*/

#include <VirtualWire.h>

// LED's
int ledPin = 13;

// Sensors 
int Sensor1Data;

// RF Transmission container
char Sensor1CharMsg[4]; 

void setup() {
  Serial.begin(9600);
  
  // sets the digital pin as output
  pinMode(ledPin, OUTPUT);      
    
    // VirtualWire 
    // Initialise the IO and ISR
    // Required for DR3100
    vw_set_ptt_inverted(true); 
    // Bits per sec
    vw_setup(2000);     
    
    // Start the receiver PLL running
    vw_rx_start();       

} // END void setup

void loop(){
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;
    
    // Non-blocking
    if (vw_get_message(buf, &buflen)) 
    {
    int i;
        // Turn on a light to show received good message 
        digitalWrite(13, true); 
    
        // Message with a good checksum received, dump it. 
        for (i = 0; i < buflen; i++)
    {            
          // Fill Sensor1CharMsg Char array with corresponding 
          // chars from buffer.   
          Sensor1CharMsg[i] = char(buf[i]);
    }
        
        // Null terminate the char array
        // This needs to be done otherwise problems will occur
        // when the incoming messages has less digits than the
        // one before. 
        Sensor1CharMsg[buflen] = '\0';
        
        // Convert Sensor1CharMsg Char array to integer
        Sensor1Data = atoi(Sensor1CharMsg);
        
        
        // DEBUG 
        Serial.print("Temp Outside: ");
        Serial.println(Sensor1Data);
        
       
        
        
        // END DEBUG
                
        // Turn off light to and await next message 
        digitalWrite(13, false);
    }
}

Now it's working. :stuck_out_tongue: Not sure I understand exactly how it parses the int over. I sure need to study arrays more. And just experiment with em.