Hi Leute, ich bin neu hier und weil ich das forum hier so praktisch finde dachte ich .. es interessiert evtl. jemand. Also ich hab vor ewigen Zeit mal eine FreeTec Wetterstation (http://www.yatego.com/primasound/p,4c1322679917e,43eb3e540e9cb9_5,funk-wetterstation--freetec--computerbild-preis-lei) gekauft .. bei pearl für kleines geld ... dabei war auch ein kleiner 10euro außensensor... naja ich bau mir gerade selber eine Wetterstation mit WLAN-Wetter-Prognose etc. Arduino sei dank .. aufjedenfall hatte ich keine Lust einen eigenen Außensensor zu bauen und so hab ich die FreeTec eben zerlegt und den Empfänger angeschaut und umgesetzt ... Der Empfänger besteht im prinzip aus einem BreakOut-Board das in der Seite verschraubt wird und schon mit den Pins "GND" "VCC" und "DATA" auf einen wartet .. (logischerweise mit 3.3v) nachdem ich ziemlich lange am protokoll gebrütet habe hier das erste ergebniss .. also man bekommt relativ fix 34-bit übertragen ... die übertragung funktioniert relativ schlicht .. sobald ein impuls geschickt wird beginnt oder endet ein takt .. die takt dauer entscheidet über High/Low. Es gibt ein Inital-Marker der 3 mal kurz zu beginn Pulst und nach jeder Fertigen 34-Bit Sequenz erfolgt eine kleine Pause auf welche dann die Sequenz wiederholt wird (ca. 6 mal) ... so lange rede kurzer sein .... hier der code:
1 | int aLastSigIdx = 0; |
2 | int cnt = 0; |
3 | String aStr = ""; |
4 | |
5 | int BinStrToInt(String aStr) |
6 | {
|
7 | int v = 1; |
8 | int vx = 0; |
9 | for (int i = 1; i <= aStr.length(); i++) |
10 | {
|
11 | if (aStr.charAt( aStr.length() - i) == '1') { |
12 | vx = vx + v; |
13 | } else { |
14 | }
|
15 | v = v + v; |
16 | }
|
17 | return vx; |
18 | }
|
19 | |
20 | void scan_sensor() |
21 | {
|
22 | // Breakout-Data-Port hängt auf D31
|
23 | pinMode(31, INPUT); |
24 | cnt = 0; |
25 | aStr = ""; |
26 | bool finished = false; |
27 | Serial.println("Waiting for Transmisson...."); |
28 | while (!finished) |
29 | {
|
30 | if (digitalRead(31) == LOW) { |
31 | digitalWrite(ledPin, HIGH); |
32 | int WaitTime = cnt - aLastSigIdx; |
33 | if ((WaitTime > 150) && (WaitTime < 250)) |
34 | {
|
35 | aStr = aStr + "0"; |
36 | }
|
37 | if ((WaitTime > 250)&&(WaitTime < 400)) |
38 | {
|
39 | aStr = aStr + "1"; |
40 | }
|
41 | if (WaitTime > 400) |
42 | {
|
43 | // Transmission finished
|
44 | Serial.print("Incoming Sensor Data: "); |
45 | Serial.println(aStr); |
46 | if (aStr.length() == 34) |
47 | {
|
48 | Serial.println("Transmission looks okay ..."); |
49 | // okay temp. + humidty auslesen
|
50 | String aTempStr = aStr.substring(17,26); |
51 | String aHumidtyStr = aStr.substring(26,34); |
52 | // convert str to byte
|
53 | int aTemp = BinStrToInt(aTempStr); |
54 | int aHumi = BinStrToInt(aHumidtyStr); |
55 | Serial.print("Temp: "); |
56 | Serial.print(aTemp); |
57 | Serial.print(" "); |
58 | Serial.println(aTempStr); |
59 | |
60 | Serial.print("Humidty: "); |
61 | Serial.print(aHumi); |
62 | Serial.print(" "); |
63 | Serial.println(aHumidtyStr); |
64 | }
|
65 | aStr = ""; |
66 | finished = true; |
67 | }
|
68 | aLastSigIdx = cnt; |
69 | } else { |
70 | digitalWrite(ledPin, LOW); |
71 | }
|
72 | cnt++; |
73 | }
|
74 | }
|
wie sieht den nun die ausgabe im terminal aus: Incoming Sensor Data: 0110110101110000001101100100101111 Transmission looks okay ... Temp: 217 011011001 Humidty: 47 00101111 bedeutet also: 21.7°C luftfeuchtigkeit: 47% Was ich noch nicht durchschaut habe ist minus grade und temp. über 25.5 grad... aber bei interesse einfach mal melden. Gruß Andy