• Willkommen im Forum „Wetterstationsforum.info - Archiv“.
 

Neuigkeiten:

Dieses Forum dient ausschließlich zu Archivzwecken.
Für Fragen nutze bitte unser aktuelles Forum, welches du unter https://wetterstationsforum.info findest.

Hauptmenü

Funk-Innensensor WS-7000-22 nachgebaut mit einen Arduino Pro mini 8MHz / 3.3V

Begonnen von epoc, 25.05.2020, 19:17:15

⏪ vorheriges - nächstes ⏩

epoc

Hardware:
Arduino Pro mini 8MHz / 3.3V (Spannungsregler+LED entfernt)
HTU21D Temp-Feuchte-Sensor
2x AAA Batterien
1x Sender 433 MHz HFS-300
1x DC Converter 0.9V/3.3V Spark Fun NCP1402.

Strommessung:
Programmbetrieb 5,9 mAh (7,3s) delay(7300)
Sleepbetrieb 0,036 mAh (167s)
Sendebetrieb 20mA (s)

Anleitung Nachbau Sensor S 300 TH hat mit geholfen einen eigenen WS-7000-22 Funk-Innensensor nachzubauen.  LINK https://www.kompf.de/tech/rftemp.html
Sensor S 300 TH Protokoll (V1.2) ident mit W2000+WS2500.

Die Basis Wetter Stationen ELV WS2200+WS2500 und das PC-Interface WS2500 erkennen den neuen Sensor im Sender Suchmodus um 8h00 und 18h00.
Das Empfangszeitfenster wird bei den zwei Uhrzeit kurzfristig zwecks Sender Synchronisation länger geöffnet.

AUSZUG ELVjournal 6/98:
ELV-Funk-Wetterstation
WS 2000 Teil 3
------------------------------------------------------------
Ein Beispiel für die implementierte
Intelligenz des Systems ist das Zeitmanage- ment beim Empfang. Immerhin kann das System die Daten von bis zu 12 Sensoren empfangen, die ungefähr alle 3 Min senden.
Wie das mit nur einem Funk-Empfänger?
Das Geheimnis liegt darin, daß jeder
Sensor ein wenig zeitversetzt sendet, der Prozessor  dank  Adressenzuordnung  und jeweils anderem Datentelegramm diese An- gaben speichert und so für jeden Sensor ein an  diesen  Zyklus  angepaßtes  Zeitfenster für den nächsten Empfang öffnet. So ver- schieben sich mit der Zeit die einzelnen Zeitfenster immer mehr und halten so stets ausreichenden  Abstand  voneinander,  da das Datentelegramm sowieso nur 200 ms lang ist.
Sollte  doch  einmal  der  Fall  eintreten, daß  mehrere  Sender  exakt  zur  gleichen Zeit senden, ist die Ordnung nach späte- stens 3 Min wieder hergestellt, denn hier tritt wieder die Zeitfensterverschiebung in Kraft. Zur Vermeidung von Störungen ist der Empfänger auch nur für dieses Zeitfen- ster aktiviert.
------------------------------------------------------------
ASZUG ENDE

Das Problem mit der exakten Sendezeit wurde wie folgt gelöst:

Quellcode NEU:
#include <TempHygroTX868.h>
#include <Wire.h>
#include <SparkFunHTU21D.h>

#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>

HTU21D htu;
TempHygroTX868 tx;

volatile int nextTxTimer;

#define LED 13
#define SWITCH 7

void setup()
{
#ifdef DEBUG
  Serial.begin(9600);
  Serial.println();
  Serial.println("Address\tHumidity (%)\tTemperature (C)");
#endif

  htu.begin();
  tx.setup(5, TempHygroTX868::PROT_V12);
  pinMode(LED, OUTPUT);

  nextTxTimer = 0;

  MCUSR &= ~(1<<WDRF);
  WDTCSR |= (1<<WDCE) | (1<<WDE);
  WDTCSR = 1<<WDP0 | 1<<WDP3;
  WDTCSR |= _BV(WDIE);
}

void loop()
{
  if (nextTxTimer <= 1) {

    nextTxTimer =20; // nextTxTimer =20=167,0sek=(real 19x) a 8,8s WDT
    byte addr = 4; // Sensoradresse

     wdt_disable(); // Watchdog timer abschalten
   delay(7300); // 7,3s warten (7300= 174,3sek) 10% Ausfälle 10x5min=9
Empfang OK

   tx.setAddress(addr);
   sendData();
   wdt_enable(); // Watchdog timer einschalten
  }

  pwrDownSleep();
}

void sendData()
{
  digitalWrite(LED, HIGH);
  float humidity = htu.readHumidity();
  float temperature = htu.readTemperature();

#ifdef DEBUG
  Serial.print(humidity);
  Serial.print("\t");
  Serial.println(temperature);
#endif


  if (humidity < 900 && temperature < 900) {
  tx.send(temperature, humidity);
  }
  digitalWrite(LED, LOW);
}

ISR(WDT_vect)
{
  nextTxTimer -= 1;   //WDT 1x 8.8sek Stoppuhr bei 3.3V ~ 25°C
}

void pwrDownSleep()
{
  byte adcsra = ADCSRA;
  ADCSRA = 0;
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  cli();
  sleep_bod_disable();
  sei();
  sleep_cpu();

  sleep_disable();
  power_all_enable();
  ADCSRA = adcsra; /
}

void wdt_enable() // Watchdog timer einschalten
{

  MCUSR &= ~(1<<WDRF);
  WDTCSR |= (1<<WDCE) | (1<<WDE);
  WDTCSR = 1<<WDP0 | 1<<WDP3;
  WDTCSR |= _BV(WDIE);
}

Es ist zwar nicht professionell, jedoch es funktioniert.
Der Watchdog Timer hat ca. 8,8s laut Stoppuhr bei 22-25°C Raumtemperatur
und einer Konstant Spannung von 3,3V. (deswegen auch der DC Converter)

Bezogen auf die Sensoradresse Nr. 5 auf der Basisstation

19x nextTxTimer WTD durchlaufen ergibt 167,2s, den Watchdog timer
abschalten, ein nicht so schönes delay(7300) 7,3s ergibt in Summe 174,5s
ohne der Sende-Zeit. Telegramm senden Watchdog Timer einschalten
wdt_enable() und zurück im Powersleepmodus pwrDownSleep()
und if (nextTxTimer <= 1) 19x nextTxTimer durchlaufen usw.

Von 76 Empfangsabfragen (a 5min) wurden 74 empfangen passt.

LG
epoc




AFA

Hey cool, das kann ich eventuell gebrauchen. Ich hab noch eine alte WS300-Anzeige rumhängen, der könnt ich damit wieder ein wenig Leben einhauchen.
Danke!
LG Franz