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.
Zu kompliziert! Lass dein Atmega32 eine Bake senden (z.B. 1x pro Minute); alles andere ergibt sich daraus..
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
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.
:
Bearbeitet durch User
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
:
Bearbeitet durch User
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
:
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.