Jag har byggt en trådlös sensor som sänder data precis som en ESIC-temperatursensor (http://lmgtfy.com/?q=wt450h) alternativt Viking om man använder fineoffset_clone. Skillnaden från originalen är att jag som temperatursensor använder DS18B20 för att mäta temperaturen. Minst 10 stycken har testats OK. Det finns också stöd för den prisvärda DHT22-sensorn som även mäter luftfuktighet. Förutom dessa sensorer så går det även att koppla in en PIR-sensor. Det finns ingen begränsning i viken kombination av dessa sensorer man använder.
Sensorn är kompatibel med Tellstick, Tellstick DUO/NET och RFXtrx433 från RfxCom eftersom den pratar samma protokoll ( Mandolyn / fineoffset ) som UPM/ESIC-termometern respektive Viking, vilka båda stöds av Telldus och RfxCom.
Sensorn/sändaren innehåller ett fåtal komponenter, och beställer man från rätt ställe (ebay, dx.com eller liknande) så blir det väldigt billigt. Men den var framför allt rolig att bygga
Hårdvara
Komponentlista ( version<=0.6 ),
- PIC12F675
- DS18B20 Dallas Temperature sensor(s) (±0.5C over the range of -10C to +85C)
- BC547B Transistor
- 433 MHz transmitter module (t.ex. den som Kjell.com har funkar)
- 1.5k resistor
- 4.7k resistor
- 10k resistor
- LED
- 100nF decoupling capacitor
Kopplingsschema ( version<=0.6 ):
Komponentlista ( version>=0.7 ),
- PIC12F675
- DS18B20 Dallas Temperature sensor(s) (±0.5C over the range of -10C to +85C) (Optional)
- DHT22/RHT03 Temperature/Humidity sensor (Optional)
- PIR sensor (HC-SR501) Google "DYP-ME003/Specification.pdf" (Optional)
- BC547B Transistor
- 433 MHz transmitter module (t.ex. den som Kjell.com har funkar)
- 2.7k resistor
- 2pcs 4.7k resistor
- 10k resistor
- LED
- 100nF decoupling capacitor
Kopplingsschema ( version >=0.7 ): Temperatursensorn är en 1-wire-sensor från Dallas Semiconductor, DS18B20 som man kommer över väldigt billigt på Ebay. Jag beställde 10 stycken för 61SEK inklusive frakt från Kina. Upp till 10 stycken har testats, men fler borde inte vara ett problem.
Det borde vara en smal sak att byta ut denna mot t.ex. en räknare DS2423b.
Det finns även stöd för DHT22/RHT03 som är en kombinerad temperatursensor och luftfuktighetssensor.
Notera att detta endast fungerar på esic_clone-0.7 och senare.
Från och med esic_clone-0.8 finns stöd för en PIR-sensor. När pinne 4 på PIC:en går hög så triggas ett interrupt som skickar en paketburst med sensorID 154. Pinne 4 är konfigurerad som IOC, men paketbursten skickas bara ut om pinnen går från låg till hög. Notera att denna pinne ska kopplas till GND om den inte används. Om man inte gör det så skickas sporadiska paket då pinnen flyter.
Jag har lagt till en transistor som är kopplad som en emitterföljare för att förstärka utsignalen från PIC:en som annars inte orkade driva TX433-sändaren. Här är jag lite tveksam till om jag behöver en resistor på emittern eller inte. Kopplar jag emittern direkt på Vdd på TX433-sändaren, så kan jag mäta en högre spänning. Här tar jag gärna emot tips.
Jag kan kanske koppla GND på TX433 direkt på pinne 7 och skippa transistorn helt?
Mjukvara
Detta är ett av mina första PIC-projekt, så jag tar gärna emot synpunkter på koden.
SensorID genereras av SerialID i DS18B20-fallet, och av OSCCAL i DHT22-fallet och av PIR_SENSOR_ID om en PIR används.
Luftfuktighetsfältet i Mandolynprotokollet används på följande sätt,
För 1-wire sensorerna så används fältet till att skicka batteristatus. Heltalet som skickas är en faktor som räknas fram från att spänningsfallet över LED:en är 1.776 volt i mitt fall, och att man vet att AD-omvandlaren är 8 bitar. Vdd=Vdiod/Humidity/2*256, Vdiod är spänningsfallet över dioden och Humidity är det avlästa värdet som visas i Tellstick/RFXtrx433.
Om man även har en DHT22 inkopplad, så visas luftfuktigheten i fältet för luftfuktighet och inte batteristatus som ovan i de datapaket som är taggade med OSCCAL-id.
Om man har en PIR-sensor så ignoreras humidity-fältet och temperature varierar mellan varannan detektion. Detta indikerar detekterad rörelse.
Det finns en bit avsedd för batteristatus i mandolyn protokollet, men den är inte implementerad i telldus-core-koden än. Jag använder alltså inte den biten baserat på ovan nämnda batteristatus.
Kretsen kan matas med 3 - 5.5V men detta är framförallt beroende av vilken/vilka sensorer som används. PIR-sensorn som jag testat behöver drivas med 4.5V eller mer. DHT22 kräver minst 3V. DS18B20 klarar sig på 2.8V. Jag har mest testat 3 NiMH AA-batterier vilket ger 3.6V
Variabler i koden
SAMPLE_DELAY: Det finns en variabel, SAMPLE_DELAY som anger hur många 2.6-sekunders intervall som PIC:en ska sova innan den vaknar och sänder nästa temperaturvärde. I esic_clone-0.7 eller senare, är den satt till 23=1ggr/min.
PACKET_RESENDS:
ESIC skickar alltid datapaket i en burst av tre paket varje minut. Defaultvärdet har jag satt till 3 för att likna ESIC så exakt som möjligt. Om man bor i en relativt störningsfri miljö, så borde det vara helt OK att reducera värdet till 1.
PIR_SENSOR_ID:
Hårdkodad sensorID för PIR-sensor. Den är satt till HC=15 och CC=4. Ändra vid behov.
För att kompilera koden kan man ladda her MPLab X. Det är gratis,
http://www.microchip.com/pagehandler/en ... #downloads
Det finns även en HEX-fil medskickad om man inte orkar/vill kompilera själv.
Kod: Markera allt
esic_clone =< 0.6 esic_clone >= 0.7 fineoffset_clone
_________________________________________________________
DS18B20 x x x
DHT22/AM2302 x x
PIR-sensor x x
_________________________________________________________
Tellstick DUO Yes Yes Yes
Tellstick NET ? ? ?
Rfxtrx433 ? Yes Yes
_________________________________________________________
x = supported
Yes = Verified OK
No = Do not work yet
? = I do not have the HW to verify my self. Can someone verify for me?
Stöd för 3 sensorer!
Elschemat ovan är uppdaterat. I stället för parasit-mode av 1-wire devices så använder jag aktiv(?) mode.
Koden är till största delen också uppdaterad (esic_clone-0.2). Nu kan man koppla in upp till tre stycken DS18B20.
De avlästa temperaturerna skickas med en House Code och Channel Code som är genererad av delar av den unika 6 byte device-id som varje 1-wire-device har. HC och CC är alltså kopplat till en specifik DS18B20, och ett batteribyte påverkar inte adressen.
Nya DS18B20 sensorer kan läggas till on-the-fly utan att stänga av spänningen.
Avlästa temperaturer skickas i en snabb sekvens efter varandra.
Jag har även provat med fyra sensorer, men då går den in i en cirkulär loop där den skickar temperaturen om och om igen. En bug som jag ska försöka lösa i en senare version.
Uppdatering 2:
esic_clone-0.3.zip finns nu att ladda ner.
Nu fungerar det med minst 4 temperatursensorer. Jag har tyvärr inga fler att testa med hemma, så jag vet inte hur många man kan haka på.
Den inkluderade hex-filen är kompilerad med SAMPLE_DELAY = 6. Den skickar alltså alla temperaturvärden väldigt ofta. Man bör ändra parametern om man ska använda den på riktigt.
Uppdatering 3:
eisc_clone-0.4.zip finns att ladda ner.
* Bättre generering av House Code och Channel Code. Nu använder jag mig av hela serienummret som jag xor:ar ihop till en byte som jag använder för generering av House Code och Channel Code. Detta gör att "id:" får ett annat nummer i den här versionen jämfört med vad som visats i tidigare versioner.
* Nytt delay-macro.
* 8 bitar i stället för 10 bitar för att mäta batteristatus. Matningsspänningen kan beräknas genom följande formel.
Vcc=Vdiod/(humidity*2)*256, där Vdiod är spänningsfallet över lysdioden. Den varierar beroende på vilken färg du valt. humidity är värdet i Humidity-fältet som man kan läsa från tellsticken.
* Batteristatus beräknas snabbare.
* Checksumman beräknas nu på ett korrekt sätt.
* Omskriven 1-wire-kommunikation.
* "Säkrare" initiering av watchdogen vid uppstart.
Notera att det inte finns stöd för parasitmode.
Jag har också fått veta att DS18S20 inte fungerar p.g.a. att data byten som representerar temperatur har ett annat upplägg på bitarna vilket gör att den visar fel temperatur.
Uppdatering 4:
eisc_clone-0.4.1.zip finns att ladda ner.
Version 0.4 hade fel timing i datapaketen, och är därför ersatt av version 0.4.1. Tack FredrikTillman för att du påpekade detta. Nu kanske den t.o.m. fungerar med Telldus NET
Som en bonus så finns koden för DHT22 med. Helt otestad och än så länge död kod. Den händige kan aktivera och kompilera själv.
Uppdatering 5:
esic_clone-0.5.zip finns att ladda ner.
Fixat en bug som gjorde att batteristatus påverkade temperaturen så att den visades helt fel i vissa fall.
Uppdatering 6:
esic_clone-0.6.zip finns att ladda ner.
Nu har jag löst buggen som gjorde att temperaturer över 29.9C visas korrekt.
Uppdatering 7:
esic_clone-0.7.zip finns att ladda ner.
Nu finns det stöd för DHT22/RHT03. Man kan koppla in endast den om man vill, men det går även att kombinera med DS18B20-sensorer. Det är även helt OK att bara använda DS18B20 också.
Sändningsfrekvensen är satt till 1ggr/minut i asm och hex-kod.
Notera att jag inkluderat ett nytt kopplingsschema där jag nyttjar pinnarna lite annorlunda än i det tidigare kopplingsschemat.
Notera även att jag har ändrat värden på några resistorer till värden jag tror är bättre lämpade.
Uppdatering 8:
esic_clone-0.7.1.zip finns att ladda ner.
Mer stabil avläsning av DHT22/RHT03.
OSCCAL används som sensorID i det fallet man använder en DHT22-sensor.
Uppdatering 9:
esic_clone-0.8.zip finns att ladda ner.
Stöd för PIR sensor (HC-SR501 el. liknande) Google "DYP-ME003/Specification.pdf".
PIR-sensorn kopplas till pinne 4.
Uppdatering 10:
esic_clone-0.6.1.zip finns att ladda ner.
Notera att denna tidiga version (<0.7) bara har stöd för ds18b20 och inga andra sensorer.
Fixat en bug som gjorde att den interna oscillatorkalibreringen ej användes, vilket medförde att pulslängden blev fel.
Uppdatering 11:
esic_clone-0.8.1.zip finns att ladda ner.
Uppdaterade PIR-paketen till att varje gång rörelse detekteras så skickas temperatur-datat skiljt från det innan. Detta för att göra sensorn kompatibel med Beyond Measure.
Jag har tyvärr inte haft tid att lösa problemen med DHT22-sensorn i den här versionen
Uppdatering 12:
esic_clone-0.8.3.zip finns att ladda ner.
Version 0.8.1 fungerade inte som det var tänkt.
Uppdatering 13:
esic_clone-0.9.zip finns att ladda ner.
DHT22/AM2302 Luftfuktigheten visade tidigare halva värdet. Temperaturen fungerade inte under noll grader. Temperatur och Luftfuktighet fungerar som det ska.
DHT22/AM2302 Datavalidering (Checksumma) av utläst data.
Uppdatering 14:
fineoffset_clone-0.2 finns att ladda ner.
Denna version har än så länge bara stöd för DHT22/AM2302/RHT03-sensor.
Uppdatering 15:
fineoffset_clone-0.3 finns att ladda ner.
Denna version har samma funktioner som esic_clone-0.9, men den skickar över fineoffset-protokollet istället.
DHT22 sensorn skickar Temperatur och Humidity i respektive fält.
DS18B20 skickar Temperaturen som temperatur. Humidity-fältet nyttjas till att skicka värdet på ADC:n. ADC:n är 10-bitar, men bara de 6 msb i lägsta byten används. DVS 0bXX XXXX XXXX. Detta för att telldus på mottagarsidan gömmer sensorn om det kommer in ett humidity-värde mellan 100-254.
PIR-sensor skickar alltid olika värden på temperatur så sensorn kan användas i Beyond Measure (BM). Humidity-fältet är odefinierat.
Uppdatering 16:
esic_clone-0.9.1.zip samt esic_clone-0.6.2.zip finns att ladda ner.
Initialvärdet på checksumman har nu uppdaterats till b'11'.
Tack Pixi för att du rapporterade bug:en och att du hjälpte mig att verifiera rättningen.
Thanks Bert (RfxCom) that helped me correct the checksum flaw and for the quick response.
Uppdatering 17:
esic_clone-0.9.2.zip samt fineoffset_clone-0.4 finns att ladda ner.
PIR-koden har setts över och nu borde inte tempsensorvärden skrivas över av PIR-"temp":en.
IRQ-hanteringen har också gjorts mer robust. Innan förekom det sporadiska IRQ.
La till en tabell i första posten där det är lättare att se vad som stöds av de olika versionerna.
Uppdatering 18:
esic_clone-0.9.3.zip samt fineoffset_clone-0.5 finns att ladda ner.
Nu fungerar både esic och fineoffset-versionen mycket bättre på RFXtrx433.
Jag hade tidigare testat med bara en sensor och det fungerade alltid. Däremot om man kopplade in t.ex. 1xDHT22 samt 3xds18b20 så var det sällan som RFXtrx433 detekterade ens någon av sensorerna.
Efter att ha förlängt preamble på båda versionerna så fungerar de alltså nu på RFXtrx433.
Uppdatering 19:
Det går även att ladda ner koden här, https://code.google.com/p/wireless-multi-sensor/
Uppdatering 20:
esic_clone-0.9.4.zip finns att ladda ner.
Nu stöds även DS1820, DS18S20 samt DS1822 utöver tidigare DS18B20.
Uppdatering 21:
esic_clone-0.9.5.zip finns att ladda ner.
esic_clone-0.9.4 var felaktig. Jag verifierade på fel platform. Den här ska vara korrekt. Jag ber om ursäkt.
Uppdatering 22:
fineoffset_clone-0.6.hex finns att ladda ner.
Nu stöds även DS1820, DS18S20 samt DS1822 utöver tidigare DS18B20 även för fineoffset.
Batteristatus med DS18X20/22 fungerade inte i version 0.5. Fixat.
Rättat en bug i crc-beräkningen så att den även fungerar med Tellstick NET/DUO som kör beta firmware.
Den här versionen har jag av olika anledningar valt att leverera endast som hex.
Den som tidigare har behövt göra ändringar av sensorID, antal omsändningar eller sändiningsintervaller, kan även nu göra detta. Det görs då i EEPROM:et som jag använder som en konfigurationsarea.
Kod: Markera allt
EEPROM address and usage
0x00 Reserved
0x01 VERSION
0x02 PIR_SENSOR_ID
0x03 DHT_SENSOR_ID
0x04 PACKET_RESENDS
0x05 SAMPLE_DELAY