Forum: Mikrocontroller und Digitale Elektronik AVR und RFM12 als Funk Temperatursensor


von Ralf (Gast)


Lesenswert?

Hallo,

ich plane eine kleine Messtation im Wohnzimmer einzurichten, auf der ich 
alle Temperaturen des Hauses (der jeweiligen Zimmer) ablesen kann. Dazu 
ist als Basis ein Atmega 32 mit 240 x 128 GLCD vorgesehen.
Damit ich keine Kabel verlegen muss, habe ich das Ganze mit RFM12 
Modulen Funkfähig gemacht.
Die Sensoren sind mit Atmega 8, RFM12 und DS18S20 1 Wire Sensoren 
ausgestattet.

Erste Tests mit einem Sensor liefen positiv. Nur sitze ich jetzt in 
vielen Fragen fest:

Da die Sensoren später mal per Batterie betrieben werden, sollen diese 
möglichst Stromsparend ausgelegt werden. AVR schlafen legen und alle 
paar Minuten aufwecken, Messen und dann Senden. Nur das geht nicht so 
einfach siehe nachfolgend...

Es soll ja nicht nur ein Sensor, sondern später mal ca. 12 Sensoren 
werden. Wenn die alle gleichzeitig Senden kommt am Empfänger nichts mehr 
an. Hier brauche ich Ideen wie ich das Handhaben könnte. Eins hätte ich 
schon. Der Sender sendet nur, wenn der Master es befiehlt. Nur dazu 
müssten die Sensoren ja immer auf Empfang sein und das beisst sich mit 
dem Batteriebetrieb.

Als Batterie hätte ich an 3 AAA Batterien gedacht. Wären im vollen 
Zusatand bei 4,5V im leeren Zustand und 2,4V im komplett leeren Zustand 
(Ich will die Batterien ja richtig leersaugen)
Der DS18S20 benötigt mindestens 3V um zu funktionieren. AVR und RFM12 
Arbeiten auch noch bei 2,2V. Da bräuchte ich dann einen anderen 
Temperatursensor. Nur welcher?

Hoffe ihr könnt mir da bei meinen kleinen Fragen helfen

von Manuel S. (steinerhippo)


Lesenswert?

Zum Übertragen:

Also da ist CSMA/CA wohl ein guter Ansatz (siehe 
http://en.wikipedia.org/wiki/Carrier_sense_multiple_access_with_collision_avoidance).

Man muss das ja nicht alles exakt implementieren. Aber die Grundidee 
wäre vielleicht:

Eine Station will senden:
1. Sie stellt zuerst auf Empfang und erkennt ob möglicherweise gerade 
eine andere Messstation sendet.
2. Nachdem kein Empfang mehr festgestellt wird, sendet die Messstation. 
Hierbei die zu übertragenden Daten mit einer Checksumme versehen.
3. Auf eine Bestätigung von der Zentraleinheit warten (falls diese auch 
Senden kann und nicht nur ein Empfangsmodul besitzt).
4a. Bei falscher Checksummenprüfung wird eine negative Bestätigung 
gesendet und die Messstation sendet nach Zufallszeit erneut.
4b. Wird keine Bestätigung empfangen, muss von einer Kollision 
ausgegangen werden, auch nach Zufallszeit erneut senden.

Das Bild on der Wiki Seite entspricht auch etwa dem hier Beschriebenen.

von ⠓⠑⠇⠑⠝ ⠅⠑⠇⠇⠑⠗ (Gast)


Lesenswert?

Zu kompliziert!
Lass dein Atmega32 eine Bake senden (z.B. 1x pro Minute); alles andere 
ergibt sich daraus..

von Reiner O. (elux)


Lesenswert?

Forensuche:
Beitrag "RFM12 Empfang von Sensordaten im IRQ"
und
Beitrag "Sensoren mit RFM02/12, FOST02, HP03S (ASM)"

hat ein Bekannter mal gebaut und funktioniert bis heute 1A...

Gruss aus Beijing

Elux

von Cyblord -. (cyblord)


Lesenswert?

ALOHA geht hier auch. Die Sensoren müssen halt irgendwie zufällig 
senden. Und nicht immer alle exakt zum gleichen Zeitpunkt. Das ganze 
mittels ACK vom Empfänger quittieren lassen und gut ist. Wenn kein Ack 
dann nochmal senden.

gruß cyblord

von kopfkratzer (Gast)


Lesenswert?

kopfkratz
Warum nicht einfach Master/Slave ?
Dein Mega32 funkt alle Sensoren an und geht die jeweilige ID durch, alle 
Sensoren werden durch den Funkimpuls geweckt und warten auf die Abfrage 
nach der sie das Datum senden und wieder schlafen gehen.

von Cyblord -. (cyblord)


Lesenswert?

kopfkratzer schrieb:
> *kopfkratz*
> Warum nicht einfach Master/Slave ?
> Dein Mega32 funkt alle Sensoren an und geht die jeweilige ID durch, alle
> Sensoren werden durch den Funkimpuls geweckt und warten auf die Abfrage
> nach der sie das Datum senden und wieder schlafen gehen.

Das will der TE ja nicht.

Allerdings müsste man in der Tat emitteln, wie weit runter man den 
Verbrauch bekommen kann. Die RFMs haben ja ne IRQ Leitung. Das sollte 
Stromsparend hinzubekommen sein.

von Ralf (Gast)


Lesenswert?

Danke erstmal für die Antworten.

@Manuel Steiner: Wie sollen die Module erkennen können, ob ein anderes 
Modul gerade sendet? Soweit ich weiß werden erst Daten ins FIFO 
geschrieben, nachdem eine Präambel empfangen wurde. Wenn da gerade 
Mittendrinn Sensor 1 sendet, nachdem Sensor 2 aufgewacht ist, kriege ich 
das nicht mit.

⠓⠑⠇⠑⠝ ⠅⠑⠇⠇⠑⠗ schrieb:
> Zu kompliziert!
> Lass dein Atmega32 eine Bake senden (z.B. 1x pro Minute); alles andere
> ergibt sich daraus..

Was meinst du mit Bake senden?

kopfkratzer schrieb:
> kopfkratz
> Warum nicht einfach Master/Slave ?
> Dein Mega32 funkt alle Sensoren an und geht die jeweilige ID durch, alle
> Sensoren werden durch den Funkimpuls geweckt und warten auf die Abfrage
> nach der sie das Datum senden und wieder schlafen gehen.

Aber die Funkmodule schlafen doch. Da kann nichts Empfangen werden um 
auf einen Funkimpuls zu reagieren. Die müsste ich erst aufwecken, damit 
der Empfangsteil eingeschaltet wird. Habe ich zudem im Anfangspost 
erwähnt, dass die klassische Master/Slave Mehtode genau deswegen nicht 
funktioniert

von Manuel S. (steinerhippo)


Lesenswert?

Ralf schrieb:
> Wenn da gerade
> Mittendrinn Sensor 1 sendet, nachdem Sensor 2 aufgewacht ist, kriege ich
> das nicht mit.

Dann lass einfach beide senden, wenn das nicht erkennbar ist. Die 
Checksumme stimmt dann eben nirgens und die beiden Stationen warten 
zufällig.

Bzw. eben Master/Slave, und wenn die Zentrale nach einer gewissen Zeit 
keine Antwort erhält, dann nimmt sie an, dass die Station gerade schläft 
und auch nix senden will. Dauert dann halt ein wenig länger vielleicht.

: Bearbeitet durch User
von AxelAC (Gast)


Lesenswert?

Ich habe in meinem Haus 5 Funkmodule (RFM12 und ATTiny mit digitalem 
Temperatursensor) die mit ca 2 Min Zeitabstand ihre Daten zur 
Basisstation senden. Dazwischen schlafen die Funkmodule. Damit halten 
die 3AAA Batterien fast ein Jahr. Es kann natürlich vorkommen, das mal 2 
Module ihre Datenaussendung gegenseitig stören. Defekte Packete werden 
verworfen, da jeweils eine Packetnr. mitgesendet wird, kann eine solche 
Störung festgestellt werden. Da sich Temperaturen nur sehr langsam 
ändern lohnt sich ein kollisionserkennnendes Protokoll nicht.

von kopfkratzer (Gast)


Lesenswert?

Ralf schrieb:
> Aber die Funkmodule schlafen doch. Da kann nichts Empfangen werden um
> auf einen Funkimpuls zu reagieren. Die müsste ich erst aufwecken, damit
> der Empfangsteil eingeschaltet wird. Habe ich zudem im Anfangspost
> erwähnt, dass die klassische Master/Slave Mehtode genau deswegen nicht
> funktioniert

Stimmt ja, habe ich nicht bedacht o_O
Der RFM12 hat aber einen eingebauten Wecktimer, der dann regelmäßig 
(alle 10min oder so) das Modul und µC wecken kann ...

von AxelAC (Gast)


Lesenswert?

Auf

http://blog.as0.de/#post8

gibts mehr Info zu meinen Modulen

von Rainer B. (katastrophenheinz)


Lesenswert?

⠓⠑⠇⠑⠝ ⠅⠑⠇⠇⠑⠗ schrieb:
> Zu kompliziert!
> Lass dein Atmega32 eine Bake senden (z.B. 1x pro Minute); alles andere
> ergibt sich daraus..

Den Weg würde ich auch empfehlen: Der Master sendet z.B. 1x pro Minute 
die genaue Zeitbasis, z.B. immer zur Sekunde 00. Alle anderen Teilnehmer 
synchronisieren ihre Zeitbasis hierdrauf. Jeder Teilnehmer bekommt 
seinen Zeitslot, zu dem er senden darf. D.h. jeder Slave muss bei 
Sekunde 00 lauschen und seine Zeitbasis aktualisieren und zu seinem 
zugewiesenen Zeitslot seine Daten senden, ansonsten RFM12 ausgeschaltet

Der Master sendet zu Sekunde 00 seine Zeit und lauscht zu den jeweiligen 
Zeitslots auf Daten vom Slave. Die Breite des Zeitslots, den die Slaves 
auf das Zeitsync vom Master lauschen, hängt von der Genauigkeit der 
Zeitbasis aller Teilnehmer und von der Häufigkeit der Synchronisierung 
ab, genauso die Breite des Zeitslots, in der der Master auf die Daten 
der Slaves lauscht.

In den jeweiligen Zeitslots kannst du dann den Datenaustausch auch 
bidirektional gestalten, falls der Master seinen Slaves sonst noch was 
sagen will und dann z.B. auch gleich wieder die Zeit synchronisiseren.

Und das ganze dann zyklisch jede Minute oder kürzer/länger, je nachdem 
wie du es brauchst und deine Zeitbasis es hergibt.

Funktioniert in der Praxis prima und batterieschonend.

Gruss, Rainer

: Bearbeitet durch User
von Ralf (Gast)


Lesenswert?

Hm das ist eine wirklich gute Idee. Ich versuche die über die Tage mal 
umzusetzen.

Dazu noch eine Frage: Der RFM12 hat ja einen integrierten Wakeuptimer. 
So muss der µC im Tiefschlaf nur auf einen Interrupt warten und braucht 
keinen Watchdog oder ähnliches Treiben. Das spart ziemlich viel Energie 
- habe ich mal gelesen

So diesen Wakeup Timer kann man ja einstellen auf eine gewisse Zeit. So 
alle 1 Minute etc. Nur drivtet das Ganze irgendwann ab. Daher muss der 
Timer in gewissen abständen neu Synchronisiert werden. Nur wie mache ich 
das? Der Timer vom RFM12 wird ja nur beim Start einmalig initialisiert 
oder versetehe ich da was falsch. Wäre gut wenn mir das mal einer 
Erklären könnte, der sich mit den RFM Dingern auskennt.

von Pit S. (pitschu)


Angehängte Dateien:

Lesenswert?

So einen Monitor habe ich auch gebaut. Insgesamt mit 16 Sensoren, u.a. 
auch Energie, Druck und Feuchte. Allerdings verwende ich fertige 
Sensoren von Oregon Scientific, wie sie z.B. bei amazon etc. erhältlich 
sind. Das Funkformat ist dokumentiert und einfach (433Mhz) und lässt 
sich mit RFM12 Modulen oder anderen AM Empfängern demodulieren (ich 
benutze RFM23 und AUREL 433Mhz recv). Das Bild ist ein Screenshot von 
dem 7" LCD (800x600) mit Touchbedienung. Läuft seit ca. einem halben 
Jahr problemlos.

Die Sensoren senden wann immer sie wollen. Die Oregons typischerweise im 
Abstand von 45 Sekunden, der Energiemonitor 2 mal pro Sekunde 
(allerdings auf 868Mhz mit eigenem Empfänger). Alle anderen sind 
entweder lokal (Druck) oder wie die Oregons über 433.92Mhz angebunden. 
Es gibt kein Protokoll. Wenn man 15 Minuten nichts von einem Sensor 
hört, wird er als abwesend markiert, wenn er nach 12 Stunden immer noch 
nichts sagt wird er aus der Sensorliste ausgetragen. Funktioniert 
problemlos, da die Wahrscheinlichkeit einer Überlappung minimal ist 
(Sendedauer ca. 100ms). Da die Abstände unterschiedlich sind, bleiben 
Überlappungen nur temporär.

pitschu

von Rainer B. (katastrophenheinz)


Lesenswert?

Ralf schrieb:
> Hm das ist eine wirklich gute Idee. Ich versuche die über die Tage mal
> umzusetzen.
>
> Dazu noch eine Frage: Der RFM12 hat ja einen integrierten Wakeuptimer.
> So muss der µC im Tiefschlaf nur auf einen Interrupt warten und braucht
> keinen Watchdog oder ähnliches Treiben. Das spart ziemlich viel Energie
> - habe ich mal gelesen
>
> So diesen Wakeup Timer kann man ja einstellen auf eine gewisse Zeit. So
> alle 1 Minute etc. Nur drivtet das Ganze irgendwann ab. Daher muss der
> Timer in gewissen abständen neu Synchronisiert werden. Nur wie mache ich
> das? Der Timer vom RFM12 wird ja nur beim Start einmalig initialisiert
> oder versetehe ich da was falsch. Wäre gut wenn mir das mal einer
> Erklären könnte, der sich mit den RFM Dingern auskennt.

Der RFM12-WakeUp-Timer hat lt. Datenblatt eine Genauigkeit von +/- 5%, 
d.h. +/- 3s auf eine Minute -> F wie Forget.

Ich würde als WakeUp-Source den Timer2 mit Uhrenquarz im Asynchronmodus 
hernehmen oder gleich einen neueren ATmega ( z.B. 88P ) mit 
WatchdogTimer und weniger Leistungsverbrauch ggü Mega8 einsetzen.

Gruss, Rainer

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.