INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Sensorabfrage ändern
24.09.2013, 11:25 (Dieser Beitrag wurde zuletzt bearbeitet: 24.09.2013 11:38 von Wampo.)
Beitrag #1
Question Sensorabfrage ändern
Hy Leutz,

jetz brauch ich ma Hilfe! In dem unteren Code werden viele Sensoren abgefragt und ausgegeben. Allerdings ist der Code wie ich ihn geschrieben hab einfach zu umständlich denn ich kann mit keiner zeit Variieren, zb verlangsamt sich der ganze Code nur deswegen mit der Aktualisierung weil der Windsensor 3 sek Misst.
Die if else bedingung die mit drin ist springt ja auch immer nur dann an wenn er beim durchlaufen bei dieser stelle ankommt ich möchte aber das er die if else immer liest, da es mit der bedingung um eine fenstersteuerung gehen wird.IdeaExclamation

Also nun kurz und knapp, wie kann ich die Sensoren bzw berechnung und bedingung unabhängig laufen lassen? so das nicht immer erst dann was passiert wenn er genau an der stelle ist. Huh

kleine zweite frage: wie kann ich es realisieren das diese if abfrage zwei dreimal abgefragt wird bevor sie ausgeführt wird, sozusagen die sensordaten verglichen werden, denn der "percent" ist ja ein lichtsensor und das fenster soll ja nicht auf und zu gehen wenn mal wolke vorbeifliegt oder dergleichen.


Ich hoff ihr versteht was ich mein?! Huh

Code:
#define led 4

//Regen Sensor
#define rain A2

//LDR Sensor
#define analogA1 A1
double percent = 100.0;

//LCD Out
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

//Temp & Humid
#include <DHT.h>
#define DHTPIN A0    
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
float a = 17.271; // fuer Formel
float b = 237.7; // fuer Formel

//Druck und Temp
#include <Adafruit_BMP085.h>
Adafruit_BMP085 bmp = Adafruit_BMP085(10085);

//Windmesser
const int windPin = 3;          // Sensor am Pin 3
const float windFactor = 2.4;  //Faktor = 2,4 km/h pro RPM
const int measureTime = 3;      
volatile unsigned int windCounter = 0;  
float windSpeed = 0.0;
unsigned long time = 0;

void countWind() {
        windCounter ++;
        }
                
void setup()

  {
  pinMode(analogA1, INPUT);
  pinMode(led, OUTPUT);
  dht.begin();
  bmp.begin();
  lcd.begin (20,4);
    
  //Screentest
  for(int i = 0; i< 3; i++)
  {
    lcd.backlight();
    delay(50);
    lcd.noBacklight();
    delay(50);
  }
  lcd.backlight();
  lcd.print("Weather Station V2.2");
  lcd.setCursor ( 0, 1 );
  lcd.print("--------------------");
  lcd.setCursor ( 0, 2 );
  lcd.print("Prog by Daniel Agocs");
  lcd.setCursor ( 0, 3 );
  lcd.print(">>>>READ SENSORS<<<<");
  }
  

void loop()
{
  //Prozentrechnung LDR
  int valueA1 = analogRead(analogA1);
  percent = (valueA1/1023.0) * 100.0;
  
  //Werte für den Windmesser
  windCounter = 0;
  time = millis();
  //Zähl-Interrupt aktivieren
  attachInterrupt(1,countWind,RISING);
  //Abwarten Messzeitraums
  delay(1000 * measureTime);
  //Zähl-Interrupt deaktivieren
  detachInterrupt(1);
  //Zeit bestimmen
  time = (millis() - time) / 1000;
  windSpeed = (float)windCounter / (float)measureTime * windFactor;
  
  sensors_event_t event;
  bmp.getEvent(&event);
  
  float h = dht.readHumidity();  //DHT22 Feuchtigkeitswert ziehen
  float t = dht.readTemperature();  //DHT22 Temperatur ziehen
  float temperature;      
  bmp.getTemperature(&temperature);//BMP085 Temperatur ziehen
  
  const float temp = (t + temperature) / 2; //Durchschnitt aus beiden Temperatursensoren (DHT & BMP)
  
  const int runtime =(millis()/1000)/60;
  
  float tautemp = (a * temp) / (b + temp) + log(h / 100);
  double tau = (b * tautemp) / (a - tautemp);
  lcd.clear();
  
  if(temp >= 23 & windSpeed < 70 & percent > 30 & h < 90){
  
    digitalWrite(led, HIGH);
    lcd.setCursor ( 14, 1 );
    lcd.print("Open ");
  }  
   else {
    digitalWrite(led, LOW);
    lcd.setCursor ( 14, 1 );
    lcd.print("Close");
  }
  
    lcd.setCursor ( 0, 0 );
    lcd.print("T: ");
    lcd.print(temp,2);
    lcd.print("*C");
    
    lcd.setCursor ( 11, 0 );
    lcd.print("H: ");
    lcd.print(h,2);
    lcd.print("%");
    
    lcd.setCursor ( 0, 1 );
    lcd.print("P: ");
    lcd.print(event.pressure + 52, 1);
    lcd.print("hPa");
    
    lcd.setCursor ( 0, 2 );
    lcd.print("W: ");
    lcd.print(windSpeed,0);
    lcd.print("km/h");
  
    lcd.setCursor ( 0, 3 );
    lcd.print("Tau: ");
    lcd.print(tau,1);
    lcd.print("*C");
  
    lcd.setCursor(12 , 2 );
    lcd.print("L: ");
    lcd.print(percent,0);
    lcd.print("%");
    
    lcd.setCursor ( 13, 3 );
    lcd.print(runtime);
    lcd.print("min");  
    }
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.09.2013, 19:15
Beitrag #2
RE: Sensorabfrage ändern
Oja,
delay() ist immer Fluch und Segen zu gleich.
Eventuell kann dir da die Timer -Lib (nicht Time - Lib) weiterhelfen.
Damit dann man so eine Art Scheduler bauen, was auch die Möglichkeit geben sollte Programmteile "parallel" ablaufen zu lassen. Siehe: http://playground.arduino.cc/Code/Timer
Was ist das für ein Windsensor? Bietet der die Möglichkeit irgendwie den Status "ich bin noch am Messen" oder "Ich habe fertig gemessen" abzufragen?
Wenn ja, könnte man das Delay weglassen und innerhalb einer Schleife (wenn der Sensor noch am Messen ist) den Rest trotzdem weiter abarbeiten lassen.
A bisserl weinig Input zum Sensor Dodgy

Grüße Ricardo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.09.2013, 19:36 (Dieser Beitrag wurde zuletzt bearbeitet: 24.09.2013 19:45 von Wampo.)
Beitrag #3
RE: Sensorabfrage ändern
Nope der Windsensor ist im endeffekt nix weiter als n taster, REED MAGNET Windsensor (pro Umdrehung zwei Impulse), hatte schon n programablauf mit Interrupt aber absolut daneben die Messwerte.

Du meinst also das ich mit nem Timer die if else abfrage immer im hintergrund laufen lassen und mir somit über eine gewisse zeit die daten holen zb vom lichtsensor und dann die "else" funktion erst nach was weiß ich, 10 abfragen in 20 min kommt?!

Die ganze messgeschichte mit dem Windsensor hab ich nochmal überarbeitet, jetzt bekomm ich ECHTE windwerte herraus.

Du bist ja n ganz n schlauer Fuchs Ricardo Wink, könntest du mal über den code unten fliegen und mal sagen was du ander machen würdest?!
Was vielleicht die Sensorabfrage geschwindigkeit, sag ich jetz einfach, beschleunigen würde?


Code:
/*
WETTERSTATION MIT WINDGESCHWINDIGKEIT, TEMPERATUR, FEUCHTIGKEIT, LUFTDRUCK, TAUPUNKTBERECHNUNG & LICHTVERHÄLTNISS

LDR Info: Résistance à 100lx: 5kOhms, Résistance à 10lx: 33kOhms, Résistance à 0lx: 180kOhms

Version 1.2, 24.08.13: Windsensor, Temperatursensor und Feuchtesensor. Anpassungen im Setup: StartUp Display für 5 Sec mit Versionsnummer und Bootvorgang. SketchGröße: 12134Bytes
Version 1.3, 15.09.13: Hinzugefügt wurden die Voltmessung von 0-12V und Ausgabe im Display, Entfernen der Trennlinien zwischen den Werten, Aktualisierung in 5sec Takt, StartUp auf 2sec & Optimierung. SketchGröße: 12418Bytes
Version 2.1, 17.09.13: TV OUT mit LCD über I2C getauscht, Barometer(BMP085)  SketchGröße: 11804Bytes
Version 2.2, 19.09.13: Tageslichtsensor hinzugefügt mit Prozentualer ausgabe, Analogpins besser definiert, Refresh Delay entfernt, programm wird über Windmesserroutine eh refreshed, IF ELSE gleichung entfernt nur ausgabe ohne Fehler ausgabe
Display "Aufgeräumt", Laufzeittimer hinzugefügt, VoltMessung entfernt da keine brauchbaren Messungen herrauskommen...brauchbare Formel wird gesucht, SketchGröße: 12064Bytes
Version 3.0, 24.09.13: Windmessung verfeinert jetzt wir der absolut richtige wert gemessen + Beaufort Skala, einzelne Sensoren in Unterprogramme verteilt und Messinztervall hinzugefügt,
Taupunktberechnung aus Nährungsformel(siehe WIKI) hinzugefügt, Testbedingung für Fenstersteuerung, SketchGröße: 13798Bytes
designed and Compiled by Daniel Agocs
*/

// Allgemeine Variablen
int runtime = 0;
float tautemp = 0.0;
double tau = 0.00;
const int windgeschwindigkeitPin = 3; // Reed-Kontakt Windgeschwindigkeit an D8
unsigned long messIntervall = 10000; // alle (1) Minute/n eine Messung, niedriger als 10 sec nicht möglich wegen Windmessung --> sonst fehler
unsigned long startIntervall = 0;
unsigned long startIntervallAlt = 0;
#define led 4 // test led

// Variablen für Windgeschwindigkeitsmessung
float windgeschwindigkeit = 0;
unsigned long windgeschwindigkeitMessStart = 0;
unsigned long windgeschwindigkeitMessStartAlt = 0;
int beaufort = 0;
unsigned int windgeschwindigkeitPinZaehler; // = 0; // Zähler für die Pulse
unsigned int windgeschwindigkeitPinStatus = 0; // Aktueller Status EingangsPin
unsigned int windgeschwindigkeitPinStatusAlt = 0; // vorheriger und alter Status des Eingangs-Pin
unsigned long windmessDauer = messIntervall / 2; // Messen Windgeschwindigkeit während 50 % Prozent des Messintervalls

//LDR Sensor
#define analogA1 A1
double percent = 100.0;

//LCD Out
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

//Temp & Humid
#include <DHT.h>
#define DHTPIN A0    
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
float a = 17.271; // fuer Formel
float b = 237.7; // fuer Formel

//Druck und Temp
#include <Adafruit_BMP085.h>
Adafruit_BMP085 bmp = Adafruit_BMP085(10085);
float temperature;
float temp = 0.0;
double h = 0.0;
double t = 0.0;
float druck = 0.0;

                
void setup()
{
  pinMode(analogA1, INPUT);
  pinMode(led, OUTPUT);
  pinMode(windgeschwindigkeitPin, INPUT); // Pin als Eingang
  digitalWrite(windgeschwindigkeitPin, HIGH); // aktiviere internen Pullup
  dht.begin();
  bmp.begin();
  lcd.begin (20,4);
    
  //Screentest
  for(int i = 0; i< 3; i++)
  {
    lcd.backlight();
    digitalWrite(led, HIGH);
    delay(50);
    lcd.noBacklight();
    digitalWrite(led, LOW);
    delay(50);
  }
  lcd.backlight();
  lcd.print("Weather Station V3.0");
  lcd.setCursor ( 0, 1 );
  lcd.print("--------------------");
  lcd.setCursor ( 0, 2 );
  lcd.print("Prog by Daniel Agocs");
  lcd.setCursor ( 0, 3 );
  lcd.print("   STARTE MESSUNG   ");
  delay(50);
  }
  

void loop()
{
  runtime =(millis()/1000)/60;
    
   startIntervall = millis(); // Aktualisiere Startzeit
  if (startIntervall - startIntervallAlt >= messIntervall)
  {  
      Windgeschwindigkeit(); // Windgeschwindigkeit holen
      ldr(); // Helligkeit holen
      dht22(); // Feuchtigkeit und Temp holen
      bmp085(); // Druck und Temp holen
      temp = (t + temperature) / 2; //Durchschnitt aus beiden Temperatursensoren (DHT & BMP)
      taupunkt(); // Taupunktberechnung holen
      ausgabe(); // Ausgabe auf LCD
      abfrage(); // if else abfrage
      startIntervallAlt = startIntervall; // Startzeit der letzten Messung merken
      }
}
  void ausgabe()
  {
    lcd.clear();
      
    lcd.setCursor ( 0, 0 );
    lcd.print("T: ");
    lcd.print(temp,1);
    lcd.print("*C");
    
    lcd.setCursor ( 12, 0 );
    lcd.print("H: ");
    lcd.print(h,1);
    lcd.print("%");
    
    lcd.setCursor ( 0, 1 );
    lcd.print("P: ");
    lcd.print(druck + ( 449 / 8.5 ), 1); //449 = Aktuelle höhe über nN, diese ändern und anpassen auf andere Orte
    lcd.print("hPa");
    
    lcd.setCursor ( 0, 2 );
    lcd.print("W: ");  
    lcd.print(windgeschwindigkeit,0);
    lcd.print("km/h");
  
    lcd.setCursor ( 13, 2 );
    lcd.print("Bf: ");
    lcd.print(beaufort);
    
    lcd.setCursor ( 0, 3 );
    lcd.print("Tau: ");
    lcd.print(tau,1);
    lcd.print("*C");
  
    lcd.setCursor(13 , 1 );
    lcd.print("L: ");
    lcd.print(percent,0);
    lcd.print("%");
    
    lcd.setCursor ( 13, 3 );
    lcd.print(runtime);
    lcd.print("min");  
    }
  
  // Wingeschwindigkeit

void Windgeschwindigkeit()
{  
   windgeschwindigkeitMessStart = startIntervall; // aktualiere Startzeit für Messung
   windgeschwindigkeitMessStartAlt = windgeschwindigkeitMessStart; // Startzeit merken
   windgeschwindigkeitPinZaehler = 0; // Pulszähler auf 0
   windgeschwindigkeitPinStatusAlt = HIGH; // Pulsstatus auf HIGH
  
   while ((windgeschwindigkeitMessStart - windgeschwindigkeitMessStartAlt) <= windmessDauer)
   {
      windgeschwindigkeitPinStatus = digitalRead(windgeschwindigkeitPin); // lese 3
      if (windgeschwindigkeitPinStatus != windgeschwindigkeitPinStatusAlt) // wenn sich Pin-Status geändert hat
      {                
         if (windgeschwindigkeitPinStatus == LOW) // und wenn alter Status  HIGH
         {
            windgeschwindigkeitPinZaehler++; // Zähler um 1 erhöhen
         }
      }
      windgeschwindigkeitPinStatusAlt = windgeschwindigkeitPinStatus; // merken uns Pin Status für nächsten Durchlauf
      windgeschwindigkeitMessStart = millis(); // aktualisierung Zeit
   }
   windgeschwindigkeit = ((windgeschwindigkeitPinZaehler * 2.4) / (windmessDauer / 1000)); // teilen durch Messzeit in Sec
   // ermitteln der Windstärke in Beaufort
   if      (windgeschwindigkeit >= 0 && windgeschwindigkeit <= 2)    { beaufort = 0; }
   else if (windgeschwindigkeit > 2 && windgeschwindigkeit <= 5)     { beaufort = 1; }
   else if (windgeschwindigkeit > 5 && windgeschwindigkeit <= 11)    { beaufort = 2; }
   else if (windgeschwindigkeit > 11 && windgeschwindigkeit <= 19)   { beaufort = 3; }
   else if (windgeschwindigkeit > 19 && windgeschwindigkeit <= 28)   { beaufort = 4; }
   else if (windgeschwindigkeit > 28 && windgeschwindigkeit <= 38)   { beaufort = 5; }
   else if (windgeschwindigkeit > 38 && windgeschwindigkeit <= 49)   { beaufort = 6; }
   else if (windgeschwindigkeit > 49 && windgeschwindigkeit <= 61)   { beaufort = 7; }
   else if (windgeschwindigkeit > 61 && windgeschwindigkeit <= 74)   { beaufort = 8; }
   else if (windgeschwindigkeit > 74 && windgeschwindigkeit <= 88)   { beaufort = 9; }
   else if (windgeschwindigkeit > 89 && windgeschwindigkeit <= 102)  { beaufort = 10; }
   else if (windgeschwindigkeit > 102 && windgeschwindigkeit <= 117) { beaufort = 11; }
   else                                                              { beaufort = 12; }
    
}
  
  
  void bmp085()
  {
  sensors_event_t event;
  bmp.getEvent(&event);  // BMP085 Luftruck ziehen
  druck = event.pressure;
  bmp.getTemperature(&temperature);//BMP085 Temperatur ziehen
  }
  
  
  void dht22()
  {
  h = dht.readHumidity();  //DHT22 Feuchtigkeit ziehen
  t = dht.readTemperature();  //DHT22 Temperatur ziehen
  }
  
  
  void ldr()
  {
  //Prozentrechnung LDR
  int valueA1 = analogRead(analogA1);
  percent = (valueA1/1023.0) * 100.0;
  }
  
  
  void taupunkt()
  {
  tautemp = (a * temp) / (b + temp) + log(h / 100);
  tau = (b * tautemp) / (a - tautemp);
  }
  
  
  void abfrage()
  {
  if(temp >= 23 & beaufort < 7 & percent > 30 & h <= 95){
  
    digitalWrite(led, HIGH);
  }  
   else
   {
    digitalWrite(led, LOW);
  }
  }
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.09.2013, 18:16
Beitrag #4
RE: Sensorabfrage ändern
Gestern und heute hab ich mich den ganzen tag mal mit INTERRUPT´s gespielt, egal ob interne oder externe Interrupts, entweder stürzt da Ardu ab oder ich bekomm keine Programmunterbrechung rein. Habs jetz mit ganz leichten mitteln probiert zb display switch bei button betätigung oder led an bei knopfdruck für ne sec oder eben meine sensorabfrage oder MIN/MAX-Abfrage....NICHTS!!!!

Also entweder bin ich dermaßen blind mittlerweile oder mein Programmablauf lässts iwie nich zu das ich nen Interrupt setze.

habs mit nen herkömlichen attachInterrupt probiert, mit Timer, TimerOne und Timer2 -lib

NÜSCHT.....

Irgendjemand ne Ahnung warum das nich haut? hab nochmal den neusten code mit dabei ohne den Interrupts:

Code:
/*
WETTERSTATION MIT WINDGESCHWINDIGKEIT, TEMPERATUR, FEUCHTIGKEIT, LUFTDRUCK, TAUPUNKTBERECHNUNG & LICHTVERHÄLTNISS

LDR Info: Résistance à 100lx: 5kOhms, Résistance à 10lx: 33kOhms, Résistance à 0lx: 180kOhms

Version 1.2, 24.08.13: Windsensor, Temperatursensor und Feuchtesensor. Anpassungen im Setup: StartUp Display für 5 Sec mit Versionsnummer und Bootvorgang. SketchGröße: 12134Bytes
Version 1.3, 15.09.13: Hinzugefügt wurden die Voltmessung von 0-12V und Ausgabe im Display, Entfernen der Trennlinien zwischen den Werten, Aktualisierung in 5sec Takt, StartUp auf 2sec & Optimierung. SketchGröße: 12418Bytes
Version 2.1, 17.09.13: TV OUT mit LCD über I2C getauscht, Barometer(BMP085)  SketchGröße: 11804Bytes
Version 2.2, 19.09.13: Tageslichtsensor hinzugefügt mit Prozentualer ausgabe, Analogpins besser definiert, Refresh Delay entfernt, programm wird über Windmesserroutine eh refreshed, IF ELSE gleichung entfernt nur ausgabe ohne Fehler ausgabe
Display "Aufgeräumt", Laufzeittimer hinzugefügt, VoltMessung entfernt da keine brauchbaren Messungen herrauskommen...brauchbare Formel wird gesucht, SketchGröße: 12064Bytes
Version 3.0, 24.09.13: Windmessung verfeinert jetzt wir der absolut richtige wert gemessen + Beaufort Skala, einzelne Sensoren in Unterprogramme verteilt und Messinztervall hinzugefügt,
Taupunktberechnung aus Nährungsformel(siehe WIKI) hinzugefügt, Testbedingung für Fenstersteuerung, SketchGröße: 13798Bytes
designed and Compiled by Daniel Agocs
*/


// Allgemeine Variablen
int runtime = 0;
float tautemp = 0.0;
double tau = 0.00;
const int windgeschwindigkeitPin = 3; // Reed-Kontakt Windgeschwindigkeit an D8
unsigned long messIntervall = 10000; // alle (1) Minute/n eine Messung, niedriger als 10 sec nicht möglich wegen Windmessung --> sonst fehler
unsigned long startIntervall = 0;
unsigned long startIntervallAlt = 0;
#define led 4 // test led

// Variablen für Windgeschwindigkeitsmessung
float maxwind;
float windgeschwindigkeit = 0;
unsigned long windgeschwindigkeitMessStart = 0;
unsigned long windgeschwindigkeitMessStartAlt = 0;
int beaufort = 0;
unsigned int windgeschwindigkeitPinZaehler; // = 0; // Zähler für die Pulse
unsigned int windgeschwindigkeitPinStatus = 0; // Aktueller Status EingangsPin
unsigned int windgeschwindigkeitPinStatusAlt = 0; // vorheriger und alter Status des Eingangs-Pin
unsigned long windmessDauer = messIntervall / 2; // Messen Windgeschwindigkeit während 50 % Prozent des Messintervalls

//LDR Sensor
#define analogA1 A1
double percent = 100.0;

//LCD Out
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

//Temp & Humid
#include <DHT.h>
#define DHTPIN A0    
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
float a = 17.271; // für Taupunkt Formel
float b = 237.7; // für Taupunkt Formel

//Druck und Temp
#include <Adafruit_BMP085.h>
Adafruit_BMP085 bmp = Adafruit_BMP085(10085);
float temperature;
float temp = 0.0;
double h = 0.0;
double t = 0.0;
float druck = 0.0;

                
void setup()
{
  pinMode(analogA1, INPUT);
  pinMode(led, OUTPUT);
  pinMode(windgeschwindigkeitPin, INPUT); // Pin als Eingang
  digitalWrite(windgeschwindigkeitPin, HIGH); // aktiviere internen Pullup
  dht.begin();
  bmp.begin();
  lcd.begin (20,4);
    
  screentest();
  }
  

void loop()
{
  runtime =(millis()/1000)/60;
    
   startIntervall = millis(); // Aktualisiere Startzeit
  if (startIntervall - startIntervallAlt >= messIntervall)
  {  
      Windgeschwindigkeit(); // Windgeschwindigkeit holen
      ldr(); // Helligkeit holen
      dht22(); // Feuchtigkeit und Temp holen
      bmp085(); // Druck und Temp holen
      temp = (t + temperature) / 2; //Durchschnitt aus beiden Temperatursensoren (DHT & BMP)
      taupunkt(); // Taupunktberechnung holen
      if(windgeschwindigkeit > maxwind ) maxwind=windgeschwindigkeit;
      ausgabe(); // Ausgabe auf LCD
      abfrage(); // if else abfrage
      startIntervallAlt = startIntervall; // Startzeit der letzten Messung merken
      }
}
  void ausgabe()
  {
    lcd.clear();
      
    lcd.setCursor ( 0, 0 );
    lcd.print("T: ");
    lcd.print(temp,1);
    lcd.write(223);
    lcd.print("C");
    
    lcd.setCursor ( 12, 0 );
    lcd.print("H: ");
    lcd.print(h,1);
    lcd.print("%");
    
    lcd.setCursor ( 0, 1 );
    lcd.print("P: ");
    lcd.print(druck + ( 440 / 8.5 ), 1); //440 = Aktuelle höhe über nN, diese ändern und anpassen auf andere Orte
    lcd.print("hPa");
    
    lcd.setCursor ( 0, 2 );
    lcd.print("W: ");  
    lcd.print(windgeschwindigkeit,0);
    lcd.print("km/h");
  
    lcd.setCursor ( 11, 2 );
    lcd.print("Wmax: ");
    lcd.print(maxwind,0);
    
    lcd.setCursor ( 0, 3 );
    lcd.print("Tau: ");
    lcd.print(tau,1);
    lcd.write(223);
    lcd.print("C");
  
    lcd.setCursor(13 , 1 );
    lcd.print("L: ");
    lcd.print(percent,0);
    lcd.print("%");
    
    lcd.setCursor ( 13, 3 );
    lcd.print(runtime);
    lcd.print("min");  
    }
  
  // Wingeschwindigkeit

void Windgeschwindigkeit()
{  
   windgeschwindigkeitMessStart = startIntervall; // aktualiere Startzeit für Messung
   windgeschwindigkeitMessStartAlt = windgeschwindigkeitMessStart; // Startzeit merken
   windgeschwindigkeitPinZaehler = 0; // Pulszähler auf 0
   windgeschwindigkeitPinStatusAlt = HIGH; // Pulsstatus auf HIGH
  
   while ((windgeschwindigkeitMessStart - windgeschwindigkeitMessStartAlt) <= windmessDauer)
   {
      windgeschwindigkeitPinStatus = digitalRead(windgeschwindigkeitPin); // lese 3
      if (windgeschwindigkeitPinStatus != windgeschwindigkeitPinStatusAlt) // wenn sich Pin-Status geändert hat
      {                
         if (windgeschwindigkeitPinStatus == LOW) // und wenn alter Status  HIGH
         {
            windgeschwindigkeitPinZaehler++; // Zähler um 1 erhöhen
         }
      }
      windgeschwindigkeitPinStatusAlt = windgeschwindigkeitPinStatus; // merken uns Pin Status für nächsten Durchlauf
      windgeschwindigkeitMessStart = millis(); // aktualisierung Zeit
   }
   windgeschwindigkeit = ((windgeschwindigkeitPinZaehler * 2.4) / (windmessDauer / 1000)); // teilen durch Messzeit in Sec
   // ermitteln der Windstärke in Beaufort
   if      (windgeschwindigkeit >= 0 && windgeschwindigkeit <= 2)    { beaufort = 0; }
   else if (windgeschwindigkeit > 2 && windgeschwindigkeit <= 5)     { beaufort = 1; }
   else if (windgeschwindigkeit > 5 && windgeschwindigkeit <= 11)    { beaufort = 2; }
   else if (windgeschwindigkeit > 11 && windgeschwindigkeit <= 19)   { beaufort = 3; }
   else if (windgeschwindigkeit > 19 && windgeschwindigkeit <= 28)   { beaufort = 4; }
   else if (windgeschwindigkeit > 28 && windgeschwindigkeit <= 38)   { beaufort = 5; }
   else if (windgeschwindigkeit > 38 && windgeschwindigkeit <= 49)   { beaufort = 6; }
   else if (windgeschwindigkeit > 49 && windgeschwindigkeit <= 61)   { beaufort = 7; }
   else if (windgeschwindigkeit > 61 && windgeschwindigkeit <= 74)   { beaufort = 8; }
   else if (windgeschwindigkeit > 74 && windgeschwindigkeit <= 88)   { beaufort = 9; }
   else if (windgeschwindigkeit > 89 && windgeschwindigkeit <= 102)  { beaufort = 10; }
   else if (windgeschwindigkeit > 102 && windgeschwindigkeit <= 117) { beaufort = 11; }
   else                                                              { beaufort = 12; }
    
}
  
  
  void bmp085()
  {
  sensors_event_t event;
  bmp.getEvent(&event);  // BMP085 Luftruck ziehen
  druck = event.pressure;
  bmp.getTemperature(&temperature);//BMP085 Temperatur ziehen
  }
  
  
  void dht22()
  {
  h = dht.readHumidity();  //DHT22 Feuchtigkeit ziehen
  t = dht.readTemperature();  //DHT22 Temperatur ziehen
  }
  
  
  void ldr()
  {
  //Prozentrechnung LDR
  int valueA1 = analogRead(analogA1);
  percent = (valueA1/1023.0) * 100.0;
  }
  
  
  void taupunkt()
  {
  tautemp = (a * temp) / (b + temp) + log(h / 100);
  tau = (b * tautemp) / (a - tautemp);
  }
  
  
  void abfrage()
  {
  if(temp >= 23 & beaufort < 7 & percent > 30 & h <= 95){
  
    digitalWrite(led, HIGH);
  }  
   else
   {
    digitalWrite(led, LOW);
  }
  }
  
  void screentest()
  {
    //Screentest
  for(int i = 0; i< 3; i++)
  {
    lcd.backlight();
    digitalWrite(led, HIGH);
    delay(50);
    lcd.noBacklight();
    digitalWrite(led, LOW);
    delay(50);
  }
  lcd.backlight();
  lcd.print("Weather Station V3.0");
  lcd.setCursor ( 0, 1 );
  lcd.print("--------------------");
  lcd.setCursor ( 0, 2 );
  lcd.print("Prog by Daniel Agocs");
  lcd.setCursor ( 0, 3 );
  lcd.print("   STARTE MESSUNG   ");
  
  }

Greez Wampo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.09.2013, 21:24 (Dieser Beitrag wurde zuletzt bearbeitet: 25.09.2013 21:52 von rkuehle.)
Beitrag #5
RE: Sensorabfrage ändern
Moin Wampo,

so langsam begreife ich wo du hin möchtest, glaube ich zumindest.
1. Der einfache Weg ist sicher der bessere.
2. Würde ich im Loop nicht die Funktionen nacheinander aufrufen, sondern siehe unten.
3. Scheint mir hier ein Fehler:
Code:
windgeschwindigkeitPinStatusAlt = windgeschwindigkeitPinStatus; // merken uns Pin Status für nächsten Durchlauf
windgeschwindigkeitMessStart = millis(); // aktualisierung Zeit
ich glaube der Arduino bricht nicht ab, sondern geht die while Schleife ewig durch weil du die Startzeit immer neu setzt.
Mach doch einfach so was als Beispiel Messzeit 30 Sekunden:
Code:
Startzeit=millis();
do while (1)
{
if millis()-startzeit < 30000
  {
   Abfrage Pinstatus und zählen// sieht im übrigen sauber aus
  }
else
{
- Jetzt die Umrechnung Zähler Pinstatus in Beaufort // würde ich alles in ein Switch / case packen
}
- Jetzt alle anderen Sensorfunktionen aufrufen
Wenn du es allerdings wirklich safe machen willst solltest du nicht millis() verwenden. Das Ding springt bei erreichen der Long-Grenze auf 0 zurück dann gibt's Probleme, Besser wäre hier die echte Zeit zu holen. Entweder über NTP (braucht ein Shield für Netzanbindung) oder über ein RTC Shield.


Grüße Ricardo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.09.2013, 21:42 (Dieser Beitrag wurde zuletzt bearbeitet: 25.09.2013 21:47 von Wampo.)
Beitrag #6
RE: Sensorabfrage ändern
Ich probier mich da nochmal an ein paar veränderungen, allerdings veränder ich jetz ungern was an dem Windmess Void weil der jetz sauber läuft also auch von den Messwerten und alles... ich probiers trotzdem mal...ich will ja nix unversucht lassen Wink

Wenn ich also mein Code so umstell wie du es mir jetzt vorgegeben hast, meinst du das ich dann mit dem Interrupt keine probleme mehr kriegen würde?!?! Des is voll geschissen mit dem REED Windsensor....der nächste wird einer mit "dynamo" !!!

Wieso würdest du den Beaufort statt if/else anweisung in ne switch/case packen? hat das vorteile?

RTC is mitlerweile auch schon bestellt und nochn paar nette andere Spielsachen ausm Chinesischen Kanton xD dauert halt wieder 4 Wochen bis der Postbote klingelt. Sad
Ethernet Shield hab ich auch da, soll ja früher oder später eingebunden werden, allerdings muss der code dazu erst mal Astrein laufen ohne probleme zu machen.

Die Nacht is jetzt jung ich mach mich ans werk und gebe Info sobald ich was weiß Wink

Danke schon mal an dieser Stelle für die Hilfe Smile

Greez Wampo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.09.2013, 21:58
Beitrag #7
RE: Sensorabfrage ändern
Hallo Wampo,
ich habe mein Beispiel nochmal korrigiert. Also nochmal nach oben gucken.
Switch / Case ist an sich übersichtlicher und es wird immer nur der zutreffende Zweig abgearbeitet. Bei dem geschachtelten If kann es passieren, dass erst die letzte Bedingung zutrifft. Dann werden alle vorhergehenden Bedingungen geprüft und verworfen, das dauert.

Grüße Ricardo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Schwellwert mit Taster ändern malsehen 16 1.415 12.04.2016 20:11
Letzter Beitrag: malsehen
  Frequenz ändern Jim 17 3.041 15.04.2015 16:30
Letzter Beitrag: Thorsten Pferdekämper
  Standard-Start Sketch ändern? tito-t 7 1.637 21.02.2015 16:24
Letzter Beitrag: tito-t
  Arduino Yun ändern der Ethernet Portnummer Mondeo 2 1.203 06.02.2015 07:19
Letzter Beitrag: Bitklopfer
  Yun Portnummer ändern Mondeo 3 621 30.01.2015 23:32
Letzter Beitrag: Bitklopfer
Sad atoi() mehrere Zeichen/ Code durch Benutzer ändern (Safe) aepfelbirnen 3 2.103 10.01.2015 13:55
Letzter Beitrag: aepfelbirnen
  Über PHP Werte ändern robin 18 3.131 16.05.2014 18:54
Letzter Beitrag: Thorsten Pferdekämper
  GRBL Pinanorndung ändern für FabScan-Shield V1.1 StefanL38 0 1.473 19.04.2014 16:16
Letzter Beitrag: StefanL38

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste