November 29, 2013

Wireless Multi-sensor

A.k.a. esic-clone and fineoffset-clone.

How hard can it be to build a wireless temperature sensor? I had to find out.

I figured I needed a microcontroller that could read a sensor and bitbang the data to a 433MHz OOK radio module. My choice fell on the PIC12F675. Not too many pins and not too many registers/parameters/options to keep in the head. And one more thing. I wanted to write in assembler.

The temperature sensor that I set up as a project to copy was one that had the brand ESIC that was sold by Clas Ohlson in Sweden. The protocol seemed not too complex and it was easy to implement since the receiver that I have (Tellstick DUO) is written mainly in open source. I could easily have a look at what the Tellstick DUO expected to receive from an ESIC temperature/humidity sensor.
The the rest of this blog post is a description of how you can build your own temperature sensor that is compatible with Tellstick DUO/NET from Telldus and RFXtrx433 from RFXCom. I call it a Wireless Multi-sensor. It will be more clear why "Multi-" in a moment. Note: esic_clone/fineoffset_clone was the first name and it will be seen trough out the text.

The Wireless Multi-sensor mimic an ESIC/Viking temperature sensor but with better range, and best of all, it can mimic up to at least 11 ESIC-sensors with only one Wireless Multi-sensor device.

ESIC temperature/humidity sensor
Viking temperature/humidity sensor

It supports the following sensors,
  • DS18B20, DS18S20, DS18B22, DS1820 from Dallas Semiconductor. A network of 10 has been tested OK, and more will probably work as well. Parasite mode is not supported. The sensor variant MAX31820 is likely to work as well since they should be compatible to DS18B20, but they have not been verified yet. Please let me know if they work so I can update this blog post.
  • DHT22 Temperature and Humidity sensor (a.k.a. RHT03 and AM2302)
  • HC-SR501 PIR-sensor to detect movement. It will send data whenever pin 4 goes from L to H. Actually this can be any sensor that have a 0V-5V TTL logic output.
The data is sent over the air with a 433.92MHz OOK/ASK transmitter using the Mandolyn (or Fineoffset) protocol. The transmission is done once every minute but can be adjusted by changing the SAMPLE_DELAY parameter in the source code.

The Wireless Multi-sensor will appear as if it was one or several single ESIC/Viking temperature sensors. All depending on how many sensors that has been added to the Wireless Multi-sensor device.

Here are some examples of the different configurations (esic_clone = Wireless Multi-sensor):


The details

More about the electrical schema and the program.

Hardware

Bill of materials

- PIC12F675
- DS18X20 Dallas Temperature sensor(s) (Optional)
- DHT22 (a.k.a. RHT03 and AM2302) Temperature/Humidity sensor (Optional)
- HC-SR501 PIR sensor Google "DYP-ME003/Specification.pdf" (Optional)
- TX433 OOK/ASK transmitter module (i.e. FS1000A)
- R1  1k
- R2,R3  4k7
- LED
- 100nF decoupling capacitor


Power supply

Maximum voltage is limited by the PIC to 5.5V and minimum voltage is 3V.
However, if a HC-SR501 PIR sensor is used the minimum voltage is 4.5V.
I recommend 3 AA(A) batteries, unregulated or 4 NiMH AA(A).

Software

This has been my first PIC microprocessor project, so I am not very familiar with PIC-assembler. The code could probably be optimised and for sure much better structured.

Mandolyn protocol

There are several interpretations of the Mandolyn protocol on the internet. This is my interpretation of the protocol which I believe is the correct one ;)
  • 4-bit Preamble
  • 4-bit House Code (Either 6 byte 1-wire id XOR:ed or OSCCAL or PIR_SENSOR_ID)
  • 2-bit Channel Code (Either 6 byte 1-wire id XOR:ed or OSCCAL or PIR_SENSOR_ID)
  • 2-bit Unknown (Always b'11')
  • 1-bit Battery status (Here always b'0')
  • 7-bit Humidity (Represents battery status and/or Humidity depending on sensor)
  • 12-bit Temperature from 1-wire sensors and/or DHT22
  • 2-bit Packet sequence number (0-2)
  • 2-bit Checksum (1st bit XOR all ODD bits, 2nd bit XOR all EVEN bits)

House Code (HC) and Channel Code (CC)

In the Mandolyn protocol the House code and Channel code is used to tell one sensor from another.
I generate the HC and CC differently depending on the sensor.
  • 1-wire sensor: HC and CC for each individual 1-wire sensor is generated from every individual sensors unique serial ID.
  • DHC22: HC and CC for the DHC22 is generated from the OSCCAL register value, but could be hardcoded to another value if needed.
  • Event sensor: HC and CC for the event sensor will be set by the PIR_SENSOR_ID parameter. Default value is HC=15 CC=4.

Note that the way the HC and CC for all sensors above is generated, implies that the HC and CC survive a battery change.

Humidity bits

The ESIC-sensor is sending the Humidity value as a 7-bit integer.
In my Multi-sensor I have used the 7-bit humidity field to send the current battery status level when sending data from the 1-wire sensors. The value you get is dependent on Vdd. Anything from 3V to 5.5V should be OK to feed the circuit with. Lower numbers mean higher voltage. The voltage drop over the LED is used as a reference. In my case the voltage drop over the LED is 1.77V. This gives the following equation,

Vdd=Vdiod/Humidity/2*256

where Vdiod is the voltage drop over the diode and Humidity is the read value from the Tellstick.

Data packets sent from the DHT22 readings will contain the actual humidity.

In the case when activity is detected by the event sensor (i.e. PIR-sensor) the humidity field is
filled with data that should be different from the previously triggered event. The purpose with this is to make the sensor compatible with Beyond Measure, a very flexible, module based automation application.

Battery status bit

I have not used the battery status indicator flag in any way since it is ignored by Telldus.

System defines

The system define SAMPLE_DELAY tell how many 2.6 second periods that should pass
until next sample-transmit round. This is 23 in the asm-code which corresponds to a transmission
approximately once every minute.

The system define PACKET_RESENDS specifies how many packets in every burst that should
be sent. Default is 3, just like the original ESIC-sensor.



There are also three forums where I have presented this project where you might find more information.
Svenska Elektronikforumet (Swedish)
Telldus Forum (English)
Temperatur.nu Forum (Swedish)

There are two variants of the implementation. Both have the same features but uses different protocols.
  • esic_clone mimic ESIC sensors.
  • fineoffset_clone mimic Viking sensors.
The source code and already compiled hex-file can be found here.

If you need to re-compile the code you will need MPLab X IDE that is free to download from here,
http://www.microchip.com/pagehandler/en-us/family/mplabx/#downloads


You can also buy a kit or the complete product from here.

There you will also find a Wireless Energy Meter compatible with Tellstick DUO/NET and RFXtrx433 that I will post as soon as it is verified.


/Niclas

Fail: badly designed PCB for the Wireless Multi-sensor

I sell the boards that was badly designed.

The LED is connected to Vdd through R1 which makes it light up as soon as you power the wireless sensor. It is supposed to only blink when sending data.

This can be corrected by cutting and bridging  as in the picture below.


After this has been done the board is 100% OK.