Go Down

Topic: Arduino als Aussensensor für Tchibo Wetterstation (Read 1 time) previous topic - next topic

erni-berni

Dec 13, 2012, 11:01 pm Last Edit: Dec 14, 2012, 08:19 am by erni-berni Reason: 1
Hallo,
nachdem ich die Kodierung der Außensensoren der Tchibo Wetterstation geknackt hatte, (http://arduino.cc/forum/index.php/topic,136836.0.html)  lag es nahe mal einen Sensor selbst zu bauen. Ein billiges 433 MHz Sendemodul hatte ich noch. Aber warum Temperaturen und Fechte übertragen? Man kann ja auch Spannungen an den Analogeingängen darstellen. Die Basisstation kann immerhin 3 Außensensoren darstellen.
Die Beschaltung ist relativ simpel. Über zwei Potentiometer vom 10k variiere ich die Spannung an A0 und A1. An D1 liegt ein Taster nach GND der den TX Taster am Außensensor nachbildet (wirklich notwendig war das nicht).
Ziel war auch mit diesem Aufbau die Grenzen der Anzeige der Basisstation herauszufinden. Die Bedeutung der einzelnen Bits im Datenstrom hatte ich ja in meinem o.g. Beitrag schon beschrieben. Im Code kann man leicht die Pulslängen von Sync, One und Zero erkennen. Die Abfolge ist immer gleich: 28x Sync, SensorAdresse, SyncByte, Feuchte, Temperatur. Alle Daten als 8 Bit bis auf die Temperatur, die als vorzeichenbehaftete 12 Bit Zahl übertragen wird.  
Code: [Select]

/* Programm simuliert einen Aussensensor für eine Wetterstation TCM 218943
TX Button schaltet D1 auf GND
433 MHz Sender an D12
Die am A0 und A1 anliegenden Spannungen (0-5V) werden als Temperatur (-50 bis +70°) und Feuchte (0-100%) an die Basisstation übertragen
De Grenzen der Anzeige an der Basisstation ist -50 bis +70 für Temperatur und 0-99% für Feuchte  */

#include <Bounce.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 7, 5, 4, 3, 2);
#define PUSHB 1
#define TXP 12
byte sensor, TxSign;
byte Feuchte;
long Temp;

Bounce bouncer = Bounce(PUSHB,10);

void setup() {
 pinMode(PUSHB, INPUT);
 digitalWrite (PUSHB, HIGH);
 // set up the LCD's number of columns and rows:
 lcd.begin(16, 2);
 // Print a message to the LCD.
 lcd.print("433 MHz Sensor");
 lcd.print(" V1");
 delay(1000);
 randomSeed(analogRead(2));
 sensor=random(256);        // legt eine zufällige Sensorkennung fest
}

void loop() {
 bouncer.update();
 int value = bouncer.read();
 if ( value == LOW) {     // entspricht dem TX Button an der Basisstation
   TxSign=0x10;
 }
 else {
   TxSign=0x00;
 }
 lcd.clear();  
 lcd.print("Sensor #");
 lcd.print(" ");
 lcd.print(sensor,HEX);
 lcd.setCursor(0, 1);
 lcd.print(TxSign,BIN);
 Feuchte=byte(map(analogRead(A0),0,1023,0,100));
 Temp=map(analogRead(A1),0,1023,-500,700);
 for (int k=0;k<28;k++) {   // Datastream wird 28x wiederholt
   sync();
   sendserial(sensor, 7);
   sendserial(TxSign, 7);
   sendserial(Feuchte, 7);
   sendserial(Temp, 11);
 }
 delay(4000);      // alle 4s ein Datenpaket
}

void one() {
 digitalWrite(TXP,HIGH);
 delayMicroseconds(190);
 digitalWrite(TXP,LOW);
 delayMicroseconds(2020);
}

void zero() {
 digitalWrite(TXP,HIGH);
 delayMicroseconds(190);
 digitalWrite(TXP,LOW);
 delayMicroseconds(1000);
}

void sync() {
 digitalWrite(TXP,HIGH);
 delayMicroseconds(190);
 digitalWrite(TXP,LOW);
 delayMicroseconds(8000);
}

void sendserial(long data, int bytecount) {
 for (int j=bytecount;j>=0;j--) {
   if (data & (1<<j)) {
     one();
   }
   else {
     zero();
   }
 }
}

Die Basisstation zeigt die Feuchte von 0-99% und Temperaturen von -50 bis +70° an.
Da fängt man schon mal an zu frieren, wenn die Basisstation mal arktische -38,4° anzeigt ;-)
Aber warum nur Temperaturen anzeigen, man kann den Wert ja auch als Spannung interpretieren, z.B. die Ladespannung eines Akkus oder über einen LDR die Helligkeit messen. Der Fantasie sind keine Grenzen gesetzt.
Gruß
Reinhard

 

Go Up
 

Quick Reply

With Quick-Reply you can write a post when viewing a topic without loading a new page. You can still use bulletin board code and smileys as you would in a normal post.

Warning: this topic has not been posted in for at least 120 days.
Unless you're sure you want to reply, please consider starting a new topic.

Note: this post will not display until it's been approved by a moderator.
Name:
Email:

shortcuts: alt+s submit/post or alt+p preview