Läsa av trådlös termometer/hygrometer 433,92 MHz

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
Användarvisningsbild
jadler
EF Sponsor
Inlägg: 407
Blev medlem: 28 maj 2009, 12:03:43
Ort: Vidja, Huddinge, Stockholm
Kontakt:

Läsa av trådlös termometer/hygrometer 433,92 MHz

Inlägg av jadler »

Jag har tidigare skrivit om avläsning/avkodning av givare för trådlös termometer som sänder på 433,92 MHz, då av märket TFA köpt på Kjell & Co.

Nu har jag skaffat lite prylar från Clas Ohlson, en mottagare med en givare (36-1794) och tre lösa givare (36-1797, finns inte i deras webbshop). Grundpaketet kostar 199:-, lösa givare 99:-. Givarna mäter temperatur, antingen direkt i givaren eller med extern prob med sladd som medföljer (frysbox, t.ex.), och relativ luftfuktighet vid givaren. Mitt intryck är att det kostar en hel del att skaffa komponenter för att läsa av luftfuktighet, så det verkade klart prisvärt med färdiga givare för 99 kronor.

Efter att ha googlat om protokollet hittade jag i princip bara en enda sida som var relevant, ett inlägg på Värmepumpsforum där norske Øyvind skriver (2006) att han i princip är klar med avkodning av protokollet för dessa produkter, men inga detaljer. Jag kontaktade honom, fick ta del av hans fynd, och har implementerat det hela för µC i form av Arduino (AVR). Som jag förstår det hade Øyvind analyserat protokollet med digitalt oscilloskop och Excel-ark, men inte gått vidare.

Mitt nuvarande programpaket innehåller:
  • Rutin som använder Input Capture interrupt för att registrera pulser från radiomottagarmodulen (Vellemans RX433 genom Kjell & Co)
  • Rutin för att avkoda TFA-protokollet
  • Rutin för att avkoda Esic-protokollet (CO-givarna)
Jag har lagt upp nuvarande version på mitt webbhotell, men det är långt ifrån slutgiltigt och jag arbetar på det fortfarande. Det är källkod för Arduino men samtidigt inte så långt ifrån vanlig AVR-C. Input Capture-delen är inspirerad av Atmels application note AVR135, men rejält modifierad för mitt ändamål.
Borre
Inlägg: 4565
Blev medlem: 14 juni 2007, 15:43:50
Ort: Hälsingland

Re: Läsa av trådlös termometer/hygrometer 433,92 MHz

Inlägg av Borre »

Intressant, uppdatera gärna om du kommer längre. :)
Användarvisningsbild
jadler
EF Sponsor
Inlägg: 407
Blev medlem: 28 maj 2009, 12:03:43
Ort: Vidja, Huddinge, Stockholm
Kontakt:

Re: Läsa av trådlös termometer/hygrometer 433,92 MHz

Inlägg av jadler »

Jag försökte idag att dokumentera protokollet. Min tekniska engelska kanske inte är den bästa, men så här har jag skrivit:

Kod: Markera allt

    Decode signal from Esic brand wireless thermometer/hygrometer.
    My sensor/transmitter units are bought at Clas Ohlson,
    product number 36-1794 (for main unit with one sensor)
    (http://www.clasohlson.se/link/m3/Product,Product.aspx?artnr=36-1794).
    Extra sensors are available as 36-1797.
    These products are manufactured by W.H. Mandolyn International Ltd.
    The sensor unit has their product ID WT450H, receiver unit WS2015H.
    All units marked as Esic brand.
    
    The signal is FM encoded with clock cycle around 2000 µs
    No level shift within the clock cycle translates to a logic 0
    One level shift within the clock cycle translates to a logic 1
    Each clock cycle begins with a level shift
    My timing constants defined below are those observed by my program
    
    +---+   +---+   +-------+       +  high
    |   |   |   |   |       |       |
    |   |   |   |   |       |       |
    +   +---+   +---+       +-------+  low
    
    ^       ^       ^       ^       ^  clock cycle
    |   1   |   1   |   0   |   0   |  translates as
    
    Each transmission is 36 bits long (i.e. 72 ms)
    
    Data is transmitted in pure binary values, NOT BCD-coded.
    
    Example transmission (House 1, Channel 1, RH 59 %, Temperature 23.5 °C)
    110000010011001110110100100110011000
    
    b00 - b03  (4 bits): Constant, 1100, probably preamble
    b04 - b07  (4 bits): House code (here: 0001 = HC 1)
    b08 - b09  (2 bits): Channel code - 1 (here 00 = CC 1)
    b10 - b12  (3 bits): Constant, 110
    b13 - b19  (7 bits): Relative humidity (here 0111011 = 59 %)
    b20 - b34 (15 bits): Temperature (see below)
    b35 - b35  (1 bit) : Parity (xor of all bits should give 0)
    
    The temperature is transmitted as (temp + 50.0) * 128,
    which equals (temp * 128) + 6400. Adding 50.0 °C makes
    all values positive, an unsigned 15 bit integer where the
    first 8 bits correspond to the whole part of the temperature
    (here 01001001, decimal 73, substract 50 = 23).
    Remaining 7 bits correspond to the fractional part.
    
    To avoid floating point calculations I store the raw temperature value
    as a signed integer in the variable esicTemp, then transform it to
    actual temperature * 10 using "esicTemp = (esicTemp - 6400) * 10 / 128",
    where 6400 is the added 50 times 128.
    When reporting the temperature I simply print "esicTemp / 10" (integer division,
    no fraction), followed by a decimal point and "esicTemp % 10" (remainder, which
    equals first fractional decimal digit).
    
    Summary of bit fields:
    1100 0001 00 110 0111011 010010011001100 0
     c1   hc  cc  c2    rh          t        p
     
    c1, c2 = constant field 1 and 2
    hc, cc = house code and channel code
    rh, t  = relative humidity, temperature
    p      = parity bit
    
    Main decoding was done by Øyvind Kaurstad (http://personal.dynator.no/),
    who reported about his work back in 2006 at
    http://www.varmepumpsforum.com/vpforum/index.php?topic=3145.msg101023#msg101023
    (Swedish forum, Øyvind writes in Norwegian).
    On my request he let me share his findings (a spreadsheet analyzing signals
    as captured by a digital oscilloscope), which made it quite easy for me to
    write the actual code that decodes the wireless signal I receive.
Min kod fungerar bra, verkar det som, och jag tar emot rimliga värden från sju olika givare (tre TFA och fyra Esic).

Ni som läst mina tidigare inlägg vet att jag är rejält okunnig vad gäller radio och antenner, men jag försöker lära mig både genom frågor här och genom nätet och böcker. Nu har jag några olika antenner (men tyvärr har jag inte byggt något vändkors än), och mitt intryck än så länge är att det verkar lite svårare att ta emot signalen från Esic-modulerna jämfört med TFA-modulerna. Jag vet inte om det beror på något i sändningen av signalerna, eller om det är min kod som inte lyckas fånga signalerna optimalt, men ser man till min erfarenhet inom de två områdena programmering och radioteknik så är det nog inte koden som är problemet. ;-)

Jag skrev i första texten att koden inte är slutgiltig. Visst finns det utrymme för optimering, men koden fungerar, helt klart.

Framtidsplaner är att lägga till avkodning av t.ex. sändare för trådlösa strömbrytare, kanske dörrklockan (om den går på samma frekvens), och att placera paket med radiomottagare och µC på strategiska platser (garaget är 4-50 m från bostadshuset, jag vill gärna kunna läsa av temperaturen där också) och använda Xbee för att överföra alla data till en central mottagare.
Användarvisningsbild
jadler
EF Sponsor
Inlägg: 407
Blev medlem: 28 maj 2009, 12:03:43
Ort: Vidja, Huddinge, Stockholm
Kontakt:

Radioaktiv doktor

Inlägg av jadler »

Kul!

Jag flyttade min "J-påle" från datorhörnan i vardagsrummet, med trådlöst nätverk, trådlösa telefoner, datorer, flera Xbee-moduler och annat som ger elektroniskt brus; till köksfönstret där det borde vara betydligt lugnare vad gäller störningar. Nu har jag klockren mottagning av alla sensorer, även från garaget 50 meter bort, från vinden och källaren. :-)

BildBild

Min "J-pole" är kopplad till mottagaren genom en 4:1-balun som gör att jag behöver en impedans på 200 ohm på den balanserade antennsidan. Varför det, när en av finesserna med en J-pole är att man kan få den impedans man önskar? Jo med min konstruktion och den frekvens jag använder behöver antennen vid 50 ohm kopplas så nära böjarna att det blir alldeles för trångt. För 200 ohm har jag mer plats och jag inbillar mig att jag kan få bättre (inbillad) precision med lite större avstånd från tvärstaget. Nu använder jag bara mottagaren, och sändaren har en maximal uteffekt på 10 mW, och jag har inga mätinstrument, så någon detaljerad mätning av antennprestanda blir det inte. Då känns det extra roligt att plötsligt få så väldigt mycket bättre mottagning.
Användarvisningsbild
jadler
EF Sponsor
Inlägg: 407
Blev medlem: 28 maj 2009, 12:03:43
Ort: Vidja, Huddinge, Stockholm
Kontakt:

Re: Läsa av trådlös termometer/hygrometer 433,92 MHz

Inlägg av jadler »

Bugg i min kod, temp över 25,5°C blir negativ temperatur, hoppar till -22,5°C men fortsätter med realistiskt utseende på kurvan (rrdtool). Beräkningen fungerar i OpenOffice.org men inte i Arduino/AVR. Har inte hunnit felsöka mer än så än, men kanske skall min 16-bitars int vara en 32-bitars dito...
Användarvisningsbild
jadler
EF Sponsor
Inlägg: 407
Blev medlem: 28 maj 2009, 12:03:43
Ort: Vidja, Huddinge, Stockholm
Kontakt:

Re: Läsa av trådlös termometer/hygrometer 433,92 MHz

Inlägg av jadler »

Min gissning var korrekt, verkar det som. Lade totalvärdet i 32-bitars int istf 16-bitars, får nu samma temperatur som på originalmottagaren.
jka
Inlägg: 1
Blev medlem: 29 augusti 2010, 21:46:42

Re: Läsa av trådlös termometer/hygrometer 433,92 MHz

Inlägg av jka »

Johan Adler, har utgått från din kod och skrivit avkodare för NEXA- och NEXA-selflearning. Har bara hunnit testa från en nexa-fjärrkontroll och Tellstick ännu, men det verker fungera bra. Kör Arduino Duemilanove (2009) och har köpt en enkel rf-mottagare från Velleman (RX433N) som jag kopplat in på D8. Koden (och en beskrivnng av protokollen) finns på: http://ekblad.org/nexaDecode.tar.gz

//mvh: Johan Ekblad
Användarvisningsbild
jadler
EF Sponsor
Inlägg: 407
Blev medlem: 28 maj 2009, 12:03:43
Ort: Vidja, Huddinge, Stockholm
Kontakt:

Re: Läsa av trådlös termometer/hygrometer 433,92 MHz

Inlägg av jadler »

Hej Johan!

Kul! Det skall bli intressant att se hur du har löst det!

Jag har fortsatt utveckla lite, försöker fylla på ny information om protokollen när det dyker upp. Nu minns jag inte vilken version jag laddade upp och länkade här, men jag använder nu ICP, input capture pin interrupt, för att med god precision fånga positiva och negativa pulsers duration, och har avkodning för TFA och Esic (som även gått under andra namn). I en annan tråd framkom ytterligare detaljer om det senare protokollet, inklusive de givare för vindriktning och -styrka samt regnmängd som finns att köpa löst som tillbehör/reservdel på CO.

Jag har bara skrivit sändare för Rising Sun fjärrströmbrytare (och en enkel dörrklocka), skulle gärna ha Nexa också, och inte minst då mottagarfunktionen. En tanke, som kan kräva en del forskning, är att känna igen generella protokoll för fjärrstyrda billås/billarm. Min egen sådan får jag in i logikanaĺysatorn, men det ser lite väl komplext ut för att analysera i detalj, och jag är inte heller intresserad av att sniffa andras koder eller fjärrstyra min bils centrallås och larm, mer att känna av om någon styr sitt centrallås på min stora grusplan/parkering (och med slumpmässig fördröjning tända lite lampor inne i huset sekventiellt för att avskräcka ev potentiella inbrottslingar).

Jag har i en annan tråd bett om tips och tankar om hur den analoga/linjära utgången kan omvandlas till en binär RSSI-signal, men har inte fått några svar än, men jag funderar en hel del på det själv hemma. Det vore trevligt att kunna aktivera mottagningen med ICP bara när det finns en lagom stark signal att ta emot, för att slippa rensa bort så mycket brus.
Zäta
Inlägg: 181
Blev medlem: 22 september 2006, 08:25:21
Ort: Borlänge

Re: Läsa av trådlös termometer/hygrometer 433,92 MHz

Inlägg av Zäta »

Intressant, jag har tidigare försökt få till Nexas självlärande på min arduino, men inte fått det att fungera!

Jag får tyvärr inte Johans kod att fungera heller. Jag är osäker på om jag har för mycket störningar eller om det är nåt annat fel.....
Jag avkommenterar följande kod:

/*
Serial.print(data);
Serial.print(" ");
if (loopc % 20 == 0)
{
Serial.println();
}
*/

....och då spottar Arduinon ur sig en massa data oavsett om jag sänder från min fjärrkontroll eller ej.


Nån mer som testat Johans kod och fått den att fungera? Får ni också lika mycket störningsdata?

Jag skulle vilja ha nåt bra sätt att testat att min mottagare och uppkoppling fungerar som den ska. Nån som har nån ide hur jag kan göra det?
DeeJayPA2
Inlägg: 371
Blev medlem: 19 mars 2008, 19:20:25
Ort: Luleå

Re: Läsa av trådlös termometer/hygrometer 433,92 MHz

Inlägg av DeeJayPA2 »

Jag har testat Jadlers kod nu till esic och den funkade perfekt, ändrade bara temp int från 32->16.
Tack för koden Jadler!
DeeJayPA2
Inlägg: 371
Blev medlem: 19 mars 2008, 19:20:25
Ort: Luleå

Re: Läsa av trådlös termometer/hygrometer 433,92 MHz

Inlägg av DeeJayPA2 »

Har byggt in ett LDR i min esic sändare så nu får jag både temp och "ljus".
Tänkte använda värdet från ljussensorn att styra några fjärrströmbrytare för fönsterbelysningen.
Men nu när det ha blivit lite kallare ute så blir visningen av temperaturen lite rolig.
Så här ser det ut;
(14 är värdet från ldr´en)

Kod: Markera allt

rf-temp-esic;1;1;14;-7.-6
rf-temp-esic;1;1;14;-7.-6
rf-temp-esic;1;1;14;-7.-6

Kod: Markera allt

    Serial.print("rf-temp-esic;");
    Serial.print(esicHouse, DEC);
    Serial.print(";");
    Serial.print(esicChannel, DEC);
    Serial.print(";");
    Serial.print(esicRH, DEC);
    Serial.print(";");
    Serial.print(esicTempTemp / 10);
    Serial.print(".");
    Serial.print(esicTempTemp % 10);
    Serial.println();
esicTempTemp är 32 bitars int. Hur gör man för att få värdet som -7.6 istf -7.-7 som det är nu?
olsi
Inlägg: 1
Blev medlem: 19 december 2010, 14:25:39

Re: Läsa av trådlös termometer/hygrometer 433,92 MHz

Inlägg av olsi »

Så här gjorde jag:

Kod: Markera allt

    output.print(";");
    output.print(esicTempTemp / 10);
    output.print(".");
    if (esicTempTemp < 0) {
       output.print(-(esicTempTemp % 10));
    } else {
      output.print((esicTempTemp % 10));
    }
    output.println();
ttallskog
Inlägg: 1
Blev medlem: 12 januari 2011, 14:39:58

Re: Läsa av trådlös termometer/hygrometer 433,92 MHz

Inlägg av ttallskog »

Detta är precis vad jag har letat efter. Vad använder ni för att ta emot signalerna från en esic temperatur och fuktläsare? Finns det någon färdig mottagare som jag kan köpa och koppla in i datorn via usb?
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Re: Läsa av trådlös termometer/hygrometer 433,92 MHz

Inlägg av PHermansson »

Zäta skrev:Intressant, jag har tidigare försökt få till Nexas självlärande på min arduino, men inte fått det att fungera!

Jag får tyvärr inte Johans kod att fungera heller. Jag är osäker på om jag har för mycket störningar eller om det är nåt annat fel.....
Jag avkommenterar följande kod:

/*
Serial.print(data);
Serial.print(" ");
if (loopc % 20 == 0)
{
Serial.println();
}
*/

....och då spottar Arduinon ur sig en massa data oavsett om jag sänder från min fjärrkontroll eller ej.


Nån mer som testat Johans kod och fått den att fungera? Får ni också lika mycket störningsdata?

Jag skulle vilja ha nåt bra sätt att testat att min mottagare och uppkoppling fungerar som den ska. Nån som har nån ide hur jag kan göra det?
Testade själv nu med jka:s kod och får inte heller några resultat med originalkoden. Tar jag bort kommentarna som ovan så får jag massa data. Aktiverar jag istället rad 208 "Serial.print(matchPos,DEC);" kommer det ettor då och då, och ibland en 2a. Det syns dock tydligt att det kommer en följd av ettor när man säder från Nexaenheten. Aktiverar jag rad 219-221 kommer det "m=2" med oregelbundna intervall oavset sändning eller inte.
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Re: Läsa av trådlös termometer/hygrometer 433,92 MHz

Inlägg av PHermansson »

Hmm...

"Note: around March 1st, 2009, the Duemilanove started to ship with the ATmega328p instead of the ATmega168. "

En snutt från en annan kod som använder interrupts med Arduino:

Kod: Markera allt

  // set the compare match to the new servo pulse duration
  OCR1AH = servopwm[servoindex] >> 8;
  OCR1AL = servopwm[servoindex] & 0xFF;
Från Jadlers kod:

Kod: Markera allt

void icp_init(void) {
  TCCR1A = 0;
  OCR1A = 0;
Vilken AVR sitter på era Arduinos?
Skriv svar