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.
/* 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