Ich hab hier einen Funk Sensor einer Sempre Wetterstation Meteotime der auf 433MHz sendet.
Übertragen wird die Temperatur und Luftfeuchte.
Ein Datenframe sieht so aus:
Es gibt 2 Pulsbreiten zu geben:
- 1ms
- 0.5ms
Gibts da schon eine Library zu?
Ich hab hier einen Funk Sensor einer Sempre Wetterstation Meteotime der auf 433MHz sendet.
Übertragen wird die Temperatur und Luftfeuchte.
Ein Datenframe sieht so aus:
Es gibt 2 Pulsbreiten zu geben:
Gibts da schon eine Library zu?
Eine Bibliothek ist mir nicht über den Weg gelaufen, aber ein paar Infos: Außensensor der Sempre Wetterstation am Seitenende. Wäre ein Anfang
Ah danke, muss ich mir anschauen.
Das Protokoll sieht sehr nach diesem aus:
Mal schauen wie ich den Bitstrom am besten eingelesen bekomme.
dein Bild ist nicht vollständig, das kurze high am ende gefolgt von dem längeren low ist die Stasrtsequenz, danach folgt dein eigentliches Signal. Mach mal ein Bild mit Startsequenz am Anfang und Startsequenz am Ende. Dann brauchst du nur die Anzahl Bits (highs) zählen, und dem 1ms high / low die 1 oder die 0 zuordnen. Die kürzeren Signale 0,5ms sind dann 0 / 1. Das Signal wird immer mehrmals hintereinander gesendet.
Ich lese hiermit meinen Geber aus, der hat ein 36 bit Signal, die Timingbereiche für 0 und 1 stellst du unten ein (musst du ausmessen). Meist ist ein Wert Temp oder Luftfeuchte in 2 byte untergebracht.
Versuchsmal hiermit, du musst nur schauen wieviel bit dein Signal hat (ohne Startsequenz) und die Timingbereiche entsprechend anpassen.
Da solltest du schonmal binär was sehen können.
Du musst dann nur noch die Bereiche die die Werte enthalten ausfindig machen.
Meist ist ein Wert Temp oder Luftfeuchte in 2 byte untergebracht.
Den Sketch hab ich vor etlichen Jahren gefunden und für mich angepasst. Vielleicht hilft er dir.
// Funktemperatursensor auslesen Pearl NC-7159
// Anschlussbelegung
// Vin 9V / GND
// Pin2 RC, 5V, GND
// RX1 / TX1 an Mega
bool cnt = false;
byte reader = 0;
byte cnter = 0;
char reading[36];
unsigned int Atemp = 0; //Temperatur die an Mega uebergeben wird
byte vorz = 4; // 2 fuer minus Temp, 4 fuer plus Temp
byte datasend = 0; //Hilfsvariable zum uebertragen "1" alle Werte vollstaendig
byte chk = 0; //Geberkennung
byte LGoff = 2; //Schaltvariable LG aus
byte Atemp1 = 0;
byte Atemp2 = 0;
void setup() {
Serial.begin(9600);
Serial1.begin(9600);
pinMode(2, INPUT);
}
void loop() {
int LowVal = pulseIn(2, LOW);
if (LowVal > 1500 &&
LowVal < 10000) { // Kuezer als 10000 Low koennte unserer Sensor sein
if (decodeTime(LowVal) == 'S') { // Startsequenz ?
cnt = true; // Dann go fuer die Sammlung
cnter = 0; // BitCounter auf 0
}
if ((cnter <= 35) && cnt &&
((decodeTime(LowVal) == '0') ||
(decodeTime(LowVal) == '1'))) { // Stream noch nicht voll und ein Bit erkannt
reading[cnter] = decodeTime(LowVal); // Ab ins Array damit
cnter = cnter + 1; // Arraycounter fuers naechste Bit inkrementieren
}
} else { // wenn nix los ist wird gesendet
cnt = false; // Zurueck auf Anfang - nix fuer uns.
if (chk == 5 || datasend == 1 && LGoff == 4) { //hier wird bei datasend 1 und Geberkennung 5 der Tempbereich, Temp und das Vorzeichen uebertragen
senden();
}
}
if ((cnter == 36)) { // Array Voll ?
Atemp = (decodeTemp(reading));
Serial.println(Atemp);
Atemp1 = byte(Atemp >> 8); // firstByte = höherwertig
Atemp2 = byte(Atemp & 0x00FF); // secondByte = niedrigerwertig
datasend = 1; //alle Werte komplett zum Uebertragen
cnter = 0;
cnt = false;
}
}
float decodeTemp(
String bitstream) { // Hier wird aus dem Bitstrom die Geberkennung, das Vorzeichen, der Tempbereich, die Temp. und das Vorzeichen gelesen
//Serial.println(bitstream);
//Serial.println(chk);
//Serial.println(LGoff);
unsigned int x = 0;
//Geberkennung
for (int i = 1; i < 4; i++) { // Geberkennung aus Bit 1 bis 3 holen
if (bitstream[i] == '1') {
bitSet(chk, (3 - i));
}
}
if (chk == 5) { // Geberkennung 5 geht fuer Pearl NC-7159
//Vorzeichen +/- lesen
// Vorzeichen aus Bit 16 bis 18 bei - Temp 1, bei + Temp 0
for (int i = 16; i < 18; i++) { // Vorzeichen aus Bit 16 bis 18
if (bitstream[i] == '1') {
vorz = 2; // fuer -
}
if (bitstream[i] == '0') {
vorz = 4; // fuer +
}
}
// Temperatur auslesen in Abhaengigkeit vom Vorzeichen (minus invertierte Bitfolge)
if (vorz == 2 && chk == 5) { // - Bereich
for (int i = 19; i < 28;
i++) { // Extrahiert Bit 19 - 27 und packt es als integer in "x"
if (bitstream[i] == '0') {
bitSet(x, (27 - i));
}
}
}
if (vorz == 4 && chk == 5) { // + Bereich
for (int i = 19; i < 28;
i++) { // Extrahiert Bit 19 - 27 und packt es als integer in "x"
if (bitstream[i] == '1') {
bitSet(x, (27 - i));
}
}
}
return ((unsigned int)x);
} else
if (chk == 6) {
LGoff = 4;
datasend = 1;
chk = 0;
return;
}
else {
chk = 0;
return;
}
}
char decodeTime(int time) { // Wandelt die Pulse in Bits um.
if (time > 1500 && time < 10000) { // passendes Signal (zwischen 1800 und 10000)
if (time > 1700 && time < 2100) { // kleiner 2000 dann LOW
return '0';
}
if (time > 3800 && time < 4100) { // Zwischen 3800 und 4100 dann HIGH
return '1';
}
if (time > 7000 && time < 11000) { // Groesser 7500 dann Startsequenz !
return 'S';
}
} else {
return 'X';
}
}