Datalogger + WifiWebServer - Problem bei Client anfragen!

Hallo alle zusammen,

ich habe eine Frage bezüglich des WifiWebServer kombiniert mit einem Datalogger...

Problem:
Mein Problem ist, dass ich einen Windgeschwindigkeitsensor habe den ich 1 Minute beobachte und bei jeder Umdrehung einen Zähler hinauf zählen lass und somit die Geschwindigkeit ermittle.
Dadurch ist mein Arduino für 1 Minute blockiert und kann auf keine Client anfragen antworten...

mögliche Abhilfe:
Ich hätte mir gedacht, dass ich einfach durchgehend jede Minute eine neue Messung starte und dann die Werte auf einer SD-Karte speichere. Erhalte ich jetzt eine Anfrage von einem Client wird einfach die Messung unterbrochen und die zuletzt aufgenommenen Werte von der SD-Karte ausgegeben.

Hätte jemand eine Idee wie so ein Problem codetechnisch zu lösen wäre? :slight_smile:

Vielen Dank schon im Voraus!

mfg Benjamin

benjaminmueller:
Dadurch ist mein Arduino für 1 Minute blockiert und kann auf keine Client anfragen antworten...

Dann ist das schlecht programmiert.

Siehe millis() und das BlinkWithoutDelay Beispiel wie man Zeitabfragen macht ohne den Rest des Codes zu blockieren.

benjaminmueller:
Hätte jemand eine Idee wie so ein Problem codetechnisch zu lösen wäre? :slight_smile:

Was für ein Signal gibt der Windsensor?

Ist das ein Reedkontakt, der wie bei einem Fahrradtacho einmal pro Umdrehung einen kurzen Schließ-Impuls liefert?

Eigentlich habe ich die Messung mit millis() realisiert:

//Windgeschwindigkeit
int geschwPin = 2;                  
int count = -1;
int actualState = 0;                   
int lastState = 0;
float Geschwindigkeit;                    

//---------------------------------------------------------------------
void setup()
{
  Serial.begin(9600);
  pinMode(geschwPin, INPUT);             
}

//---------------------------------------------------------------------
void loop()
{
  Serial.println("Start!");
  unsigned long previousMillis = millis();
  
  while (millis() - previousMillis < 60000L) 
  {
    delay(1);
    actualState = digitalRead(geschwPin);
    if (actualState == 1 && lastState == 0)
    {
      count++;
      lastState=actualState;
    }
    if (actualState == 0)
    {
      lastState=0;
    }
  }
  
  Serial.print("Counter: ");
  Serial.println(count);
  
  if(count == 0)
  {
     Geschwindigkeit = 0;
  }
  else
  {
    Geschwindigkeit = (0.01250 * (count*6)) + 0.2;
  }
  
  Serial.print("Geschwindigkeit: ");
  Serial.print(Geschwindigkeit);
  Serial.println(" m/s");
  Serial.println("");
  
  count = 0; 
}

das eigentliche Problem ist: “Alles liegen und stehen zu lassen”, wenn ein Client eine Anfrage schickt!
Für den WebServer verwende ich das Standardbeispiel von Arduino…

Was für ein Signal gibt der Windsensor?

Ja genau! Einfach ein Reed-Kontakt in einer Pull-Up-Schaltung.

Aber mit while() und damit blockierend!

Du musst mit if abfragen ob eine bestimmte Zeit vergangen ist.

Serenifly:
Aber mit while() und damit blockierend!

Du musst mit if abfragen ob eine bestimmte Zeit vergangen ist.

ok, danke :slight_smile:
Insgesamt lese ich mehrere Sensoren aus. Habe ich durch eine if-Agfrage keine Probleme mit Impulsverluste?

Im Prinzip wäre es total hilfreich, wenn ich eine Art Interrupt auf das Client-Event hätte! Gibt es sowas?

Hallo,

wie festgestellt wurde, blockierst Du mit while den Rest vom Code während Du Impulse zählst. Nimmst Du if statt while und kannst damit auf Clientanfragen reagieren, gehen Dir jedoch Impulse verloren, während Du den Client bedienst. Jetzt merkst Du schon, Du kannst eigentlich machen was Du willst, es wird nicht zu 100% perfekt.

Die Frage wäre, wie oft kommt eine Clientanfrage rein? Kann man das abschätzen?

Teurere Lösung:
2. µC nehmen der Imulse zählt und der vom 1. µC abgefragt wird wenn er Zeit hat und damit immer nur den aktuellsten Wert geliefert bekommt.

günstigste Lösung:
bei einem µC bleiben und je nachdem was wichtiger ist, könnte man:
der Impulszählung Vorrang geben, eine Clientanfrage in einer Variable speichern und wenn die Impulszählung fertig ist, fragt man die Variable ab ob eine Anfrage kam, wenn ja bedient man den Client verspätet. Kann natürlich sein der Client bekommt dadurch manchmal einen Timeoutfehler.

oder der Clientanfrage Vorrang geben, man läßt Impulse zählen, sobald eine Clientanfrage reinkommt, bedient man den Client, verwirft damit die Impulsmessung und fängt von vorn an mit der Impulsmessung. Nachteil hier, wenn viele Clientanfragen reinkommen, hat man möglicherweise nie die Möglichkeit eine Messung durchführen zu lassen.

  1. Idee wäre, man läßt die Impulse mittels Interrupt zählen.
    Also permanent läuft der Code der die Clientanfragen bedienen kann und im "Hintergrund" löst jeder Impuls einen Interrupt aus, dieser zählt in einer kleinen/kurzen Funktion die Impulse. Der Rest der Rechung muß im Hauptsketch erfolgen. Der Code für den Interrupt sollte so kurz wie möglich sein, sonst blockiert er wiederum den loop zu lange. Bzw. im dümmsten Fall dauert die Interruptfunktion länger wie die Zeit zwischen den Impulsen, dann gehen Dir auch Impulse verloren. Ich weis ja nicht wieviel U/min du bekommst. Ein µC Takt dauert 62,5ns.

Das wäre mein Theorieansatz.

Doc_Arduino:
oder der Clientanfrage Vorrang geben, man läßt Impulse zählen, sobald eine Clientanfrage reinkommt, bedient man den Client, verwirft damit die Impulsmessung und fängt von vorn an mit der Impulsmessung. Nachteil hier, wenn viele Clientanfragen reinkommen, hat man möglicherweise nie die Möglichkeit eine Messung durchführen zu lassen.

ja ich würde gerne der Clientanfrage den Vorrang geben, aber wie könnte ich das codetechnisch lösen?
Danke für deine Bemühungen! :slight_smile: