Wetterstation HB-UNI-SEN-WEA

Entwicklung und Bau von Hardware aller Art, die im HM-Umfeld eingesetzt werden kann

Moderator: Co-Administratoren

jp112sdl
Beiträge: 12115
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 848 Mal
Danksagung erhalten: 2150 Mal
Kontaktdaten:

Re: Wetterstation HB-UNI-SEN-WEA

Beitrag von jp112sdl » 03.07.2018, 13:13

BeWi hat geschrieben:Hallo,

vielen Dank für die Infos.

Gibt es den atmega328p auch mit etwas mehr Speicher, denn diese Funktion fände ich schon sinnvoll.
Nein, leider nicht. Du müsstest dann auf den 644 oder 1284 ausweichen, wie deimos erklärt hat.

Oder - wenn du auf Sensoren verzichten kannst (z.B. UV oder Blitz), könntest du den Kram aus dem Code rausschmeißen.
Dann ist auch genug Platz für "sofortige Telegrammaussendung bei überschreiten einer Geschwindigkeit".

BeWi hat geschrieben: Ebenso würde ich gern eine Direktverknüpfung zu einem Rolloaktor bzgl. Wind wie der der HM-Wetterstation einbasteln.
Ja cool, mach das mal! Würde gern sehen, wie das funktioniert.
Ich glaub, die Direktverknüpfung beim Original läuft über einen separaten Channel!?
In der XML vom originalen Gerät sieht man zwar die Link-Parameter, aber was der Sender dann konkret an den Aktor schicken muss... Hmm...
Habe zu wenig Zeit, mich damit im Detail zu beschäftigen, da ich es selbst nicht benötige.
Aber rein vom HowTo wäre ich sehr interessiert!
Also wenn du das "einbastelst", dann wäre es klasse, wenn du den Code irgendwo veröffentlichen könntest.

VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

papa
Beiträge: 705
Registriert: 22.05.2018, 10:23
Hat sich bedankt: 24 Mal
Danksagung erhalten: 120 Mal

Re: Wetterstation HB-UNI-SEN-WEA

Beitrag von papa » 03.07.2018, 14:31

Na ein paar Byte könnte man bestimmt noch sparen. Wie schon mal gesagt, der AVR hat keine FPU und kann somit nur Integer-Arithmetik. Fließkomma wird aufwendig mit Mathelibraries gemacht.

Code: Alles auswählen

int   kmph =  3.141593 * 2 * (anemometerRadius / 100.0) * (_wind_isr_counter / (WINDSPEED_MEASUREINTERVAL_SECONDS * SYSCLOCK_FACTOR)) * 3.6 * (anemometerCalibrationFactor / 10.0)
könnte man doch so komplett mit Integer annähern (hoffentlich habe ich richtig umgestellt)

Code: Alles auswählen

((22618L * anemometerRadius * anemometerCalibrationFactor * _wind_isr_counter) / WINDSPEED_MEASUREINTERVAL_SECONDS) / 1000
Für

Code: Alles auswählen

x*7.5
besser

Code: Alles auswählen

(x*75)/10
Und das hier

Code: Alles auswählen

      _uvindex = 0;
      if (_uvvalue >= 187)
        _uvindex = 1;
      if (_uvvalue >= 374)
        _uvindex = 2;
      if (_uvvalue >= 560)
        _uvindex = 3;
      if (_uvvalue >= 747)
        _uvindex = 4;
      if (_uvvalue >= 934)
        _uvindex = 5;
      if (_uvvalue >= 1120)
        _uvindex = 6;
      if (_uvvalue >= 1307)
        _uvindex = 7;
      if (_uvvalue >= 1494)
        _uvindex = 8;
      if (_uvvalue >= 1681)
        _uvindex = 9;
      if (_uvvalue >= 1868)
        _uvindex = 10;
      if (_uvvalue >= 2054)
        _uvindex = 11;  
ist doch eigentlich

Code: Alles auswählen

_uvvalue % 187
Anfragen zur AskSin++ werden nur im Forum beantwortet

Benutzeravatar
DiJe
Beiträge: 566
Registriert: 04.03.2015, 05:51
Hat sich bedankt: 2 Mal
Danksagung erhalten: 5 Mal

Re: Wetterstation HB-UNI-SEN-WEA

Beitrag von DiJe » 03.07.2018, 15:07

Ich kenne die Wissensstand desjenigen gegenüber immer nicht, daher ist immer schwer für mich, abzuwägen, wie umfangreich die Antwort sein muss
Ich bin für jede ausführliche Erklärung und Hilfe dankbar.
Da ich von der Materie null Ahnung habe, muß ich mir alles zusammen suchen.
Gruß Dieter
Gruß Dieter
----------------------------------------------------------------------------------------
RaspiMatic auf Raspi4 - 4Gb -nach Kernel Upgrade Temp.~50° - m.Addons: ioBroker, RedMatic, CCU-Historian, CUxD, Email, XMl Api
Geräte 120, davon DIY Geräte 35 -Variablen 213 - Programme 160 / Visualisierung mit Mediola auf 24" Acer DA241HL / läuft alles stabil

jp112sdl
Beiträge: 12115
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 848 Mal
Danksagung erhalten: 2150 Mal
Kontaktdaten:

Re: Wetterstation HB-UNI-SEN-WEA

Beitrag von jp112sdl » 03.07.2018, 15:35

papa hat geschrieben:

Code: Alles auswählen

int   kmph =  3.141593 * 2 * (anemometerRadius / 100.0) * (_wind_isr_counter / (WINDSPEED_MEASUREINTERVAL_SECONDS * SYSCLOCK_FACTOR)) * 3.6 * (anemometerCalibrationFactor / 10.0)
könnte man doch so komplett mit Integer annähern (hoffentlich habe ich richtig umgestellt)

Code: Alles auswählen

((22618L * anemometerRadius * anemometerCalibrationFactor * _wind_isr_counter) / WINDSPEED_MEASUREINTERVAL_SECONDS) / 1000
Hmm... da kommen ganz andere Werte raus. Habe mal schnell einen Test-Sketch mit Fix-Werten gefüttert und mit meiner ursprünglichen Formel sowie deiner vorgeschlagenen gerechnet:

Code: Alles auswählen

  int anemometerRadius = 65;
  int _wind_isr_counter = 25;
  int WINDSPEED_MEASUREINTERVAL_SECONDS = 5;
  int anemometerCalibrationFactor = 40;
  int SYSCLOCK_FACTOR = 1.0;

  int kmph =  3.141593 * 2 * (anemometerRadius / 100.0) * (_wind_isr_counter / (WINDSPEED_MEASUREINTERVAL_SECONDS * SYSCLOCK_FACTOR)) * 3.6 * (anemometerCalibrationFactor / 10.0);
  int kmph2 = ((22618L * anemometerRadius * anemometerCalibrationFactor * _wind_isr_counter) / WINDSPEED_MEASUREINTERVAL_SECONDS) / 1000;

  Serial.println("kmh alt = " + String(kmph));
  Serial.println("kmh neu = " + String(kmph2));
Ergebnis:
kmph = 294
kmph2 = 31890
papa hat geschrieben: Und das hier

Code: Alles auswählen

      _uvindex = 0;
      if (_uvvalue >= 187)
        _uvindex = 1;
      if (_uvvalue >= 374)
        _uvindex = 2;
      if (_uvvalue >= 560)
        _uvindex = 3;
      if (_uvvalue >= 747)
        _uvindex = 4;
      if (_uvvalue >= 934)
        _uvindex = 5;
      if (_uvvalue >= 1120)
        _uvindex = 6;
      if (_uvvalue >= 1307)
        _uvindex = 7;
      if (_uvvalue >= 1494)
        _uvindex = 8;
      if (_uvvalue >= 1681)
        _uvindex = 9;
      if (_uvvalue >= 1868)
        _uvindex = 10;
      if (_uvvalue >= 2054)
        _uvindex = 11;  
ist doch eigentlich

Code: Alles auswählen

_uvvalue % 187

Code: Alles auswählen

  int uv = 400;
  uv = uv % 187;
ergibt 26, obwohl eigentlich 400 einem UVIndex von 2 entspricht.

Da ist irgendwo noch der Fehlerteufel drin. :evil:

VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

papa
Beiträge: 705
Registriert: 22.05.2018, 10:23
Hat sich bedankt: 24 Mal
Danksagung erhalten: 120 Mal

Re: Wetterstation HB-UNI-SEN-WEA

Beitrag von papa » 03.07.2018, 16:02

Arg - Modulo ist Quatsch - Du willst ja nicht den Rest, sondern den ganzen Teiler. Die andere Formel passt aber - halbwegs :D . Allerdings musste man noch mal durch 1000 teilen. Ich habe die Faktoren mal etwas angepasst. Testprogramm ist mit nem g++ unter cygwin gebaut.

Code: Alles auswählen

#include <stdint.h>
#include <iostream>

int main () {
uint8_t anemometerRadius = 65;
uint8_t _wind_isr_counter = 25;
uint8_t WINDSPEED_MEASUREINTERVAL_SECONDS = 5;
uint8_t anemometerCalibrationFactor = 40;
uint8_t SYSCLOCK_FACTOR = 1;

int kmph =  3.141593 * 2 * (anemometerRadius / 100.0) * (_wind_isr_counter / (WINDSPEED_MEASUREINTERVAL_SECONDS * SYSCLOCK_FACTOR)) * 3.6 * (anemometerCalibrationFactor / 10.0);
int kmph2 = ((226L * anemometerRadius * anemometerCalibrationFactor * _wind_isr_counter) / WINDSPEED_MEASUREINTERVAL_SECONDS) / 10000;

std::cout << kmph << std::endl;
std::cout << kmph2 << std::endl;
std::cout << 400 / 187 << std::endl;
return 0;
}
Ausgabe

Code: Alles auswählen

294
293
2
Da ist aber mächtig Sturm - 294 km/h.


Bei der originalen Formel kommt übrigens für _wind_isr_counter < WINDSPEED_MEASUREINTERVAL_SECONDS immer 0 raus. :shock:
Anfragen zur AskSin++ werden nur im Forum beantwortet

jp112sdl
Beiträge: 12115
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 848 Mal
Danksagung erhalten: 2150 Mal
Kontaktdaten:

Re: Wetterstation HB-UNI-SEN-WEA

Beitrag von jp112sdl » 03.07.2018, 16:03

papa hat geschrieben:Da ist aber mächtig Sturm - 294 km/h.
Das sind 29,4 km/h (der Faktor 10 wird in der XML berücksichtigt). :wink:

VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

jp112sdl
Beiträge: 12115
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 848 Mal
Danksagung erhalten: 2150 Mal
Kontaktdaten:

Re: Wetterstation HB-UNI-SEN-WEA

Beitrag von jp112sdl » 03.07.2018, 16:05

papa hat geschrieben: Bei der originalen Formel kommt übrigens für _wind_isr_counter < WINDSPEED_MEASUREINTERVAL_SECONDS immer 0 raus. :shock:
Hmm... Warum nur? Ich multipliziere eigentlich extra mit dem SYSCLOCK_FACTOR 1.0, damit auch mit float weitergerechnet wird.

VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

papa
Beiträge: 705
Registriert: 22.05.2018, 10:23
Hat sich bedankt: 24 Mal
Danksagung erhalten: 120 Mal

Re: Wetterstation HB-UNI-SEN-WEA

Beitrag von papa » 03.07.2018, 16:09

jp112sdl hat geschrieben: Hmm... Warum nur? Ich multipliziere eigentlich extra mit dem SYSCLOCK_FACTOR 1.0, damit auch mit float weitergerechnet wird.
Ah - habe ich natürlich sportlich in nen Integer umgewandelt 8)
Anfragen zur AskSin++ werden nur im Forum beantwortet

papa
Beiträge: 705
Registriert: 22.05.2018, 10:23
Hat sich bedankt: 24 Mal
Danksagung erhalten: 120 Mal

Re: Wetterstation HB-UNI-SEN-WEA

Beitrag von papa » 03.07.2018, 16:20

Hier mal der Größenvergleich auf dem Arduino

Code: Alles auswählen

#include "Arduino.h"
#define WINDSPEED_MEASUREINTERVAL_SECONDS 5
#define SYSCLOCK_FACTOR  1.0

int kmh(uint8_t anemometerRadius,uint8_t anemometerCalibrationFactor, uint8_t _wind_isr_counter) {
    return  3.141593 * 2 * (anemometerRadius / 100.0) * (_wind_isr_counter / (WINDSPEED_MEASUREINTERVAL_SECONDS * SYSCLOCK_FACTOR)) * 3.6 * (anemometerCalibrationFactor / 10.0);
//    return ((226L * anemometerRadius * anemometerCalibrationFactor * _wind_isr_counter) / WINDSPEED_MEASUREINTERVAL_SECONDS) / 10000;
}

void setup() {}

void loop() {
  for( int i=0; i<30; ++i ) {
    int kmph = kmh(65,40,i);
    Serial.println(kmph);
  }
}
Mit Float

Code: Alles auswählen

Program:    2554 bytes (7.8% Full)
(.text + .data + .bootloader)
Data:        188 bytes (9.2% Full)
(.data + .bss + .noinit)
Mit Int

Code: Alles auswählen

Program:    1708 bytes (5.2% Full)
(.text + .data + .bootloader)
Data:        188 bytes (9.2% Full)
(.data + .bss + .noinit)
Anfragen zur AskSin++ werden nur im Forum beantwortet

jp112sdl
Beiträge: 12115
Registriert: 20.11.2016, 20:01
Hat sich bedankt: 848 Mal
Danksagung erhalten: 2150 Mal
Kontaktdaten:

Re: Wetterstation HB-UNI-SEN-WEA

Beitrag von jp112sdl » 03.07.2018, 16:29

Danke!
Jetzt stimmen auch die Ergebnisse zwischen alter und neuer Rechenmethode.
Wieder was gelernt - echt irre, was das ausmacht!

VG,
Jérôme ☕️

---
Support for my Homebrew-Devices: Download JP-HB-Devices Addon

Antworten

Zurück zu „Hardwareentwicklung und Selbstbau von Aktoren und Sensoren“