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
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.
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
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.
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.
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
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.
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.
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 ...
⠓⠑⠇⠑⠝ ⠅⠑⠇⠇⠑⠗ 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
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.
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
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