Go Down

Topic: Mit dem ESP8266 niedrige Frequenzen messen. (Read 450 times) previous topic - next topic

devrim

Frequenz messen mit dem ESP8266.

Ich habe hier am Wärmetauscher einen Durchflussmesser, der mir bis 100 HZ eine Frequenz ausgibt. Durch bisschen googlen habe ältere Beiträge gelesen, das die ganzen Libs für den Arduino am ESP nicht funktionieren sollen.
Die reden aber von KHz und MHz.

Habe auch schon einen Uno vorbereitet der die Frequent ausliest. Aber mehrere Versuche durch I2C und SoftwareSerial sind bei mir durch Unfähigkeit fehlgeschlagen. Gibt es jetzt in 2019 schon eine Möglichkeit mit dem ESP eine Frequenz zu messen?

Den ESP benutze ich, weil ich mit UDP Daten an das Programm Serialcominstruments sende und alles visualisiere. Momentan habe ich 4 Temperaturen und 3 Eingänge die ich anzeigen lasse.

Ich kann gerne meine 2 Sketche hier mal anbinden welches ich mit Softwareserial probiert habe.

Hier der Sketch auf dem ESP wo ich die Daten mittels UDP sende. Temperaturen und Eingänge laufen darüber.
Code: [Select]
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include<SoftwareSerial.h>
SoftwareSerial SUART(4, 5);


#define ONE_WIRE_BUS D8

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);



const char* ssid = "CinoRBD2";
const char* password = "Vicanli8383";
WiFiUDP Client;
#define ws1 D3
#define ws2 D4
#define betrieb D6
int ws1st=0;
int ws2st=0;
int betriebst=0;

void setup()
{
  Serial.begin(115200);
  SUART.begin(115200);
  Serial.println();

  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" connected");
  sensors.begin();
  pinMode(ws1, INPUT_PULLUP);
  pinMode(ws2, INPUT_PULLUP);
  pinMode(betrieb, INPUT_PULLUP);

 
  Serial.println(" 5 Sek Pause");

}
void SendString(byte InstrNr, int MWert) {
 
Client.beginPacket("192.168.0.63",6001);
Client.print("#");
Client.print(InstrNr);
Client.print("M");
Client.print(MWert);
Client.print("<");
Client.endPacket();
}


void loop()
{
byte n = SUART.available(); //n != 0 means a character has arrived
  if (n != 0)
  {
    char x = SUART.read();  //read character
    Serial.print(x);        //show character on Serial Monitor
    SendString(8,x);
Serial.println(" Send Frequencystring");
delay(500);
  }
sensors.requestTemperatures();
SendString(1,sensors.getTempCByIndex(0));
Serial.println(sensors.getTempCByIndex(0));
delay(500);
SendString(2,sensors.getTempCByIndex(1));
Serial.println(sensors.getTempCByIndex(1));
delay(500);
SendString(3,sensors.getTempCByIndex(2));
Serial.println(sensors.getTempCByIndex(2));
delay(500);
SendString(4,sensors.getTempCByIndex(3));
Serial.println(sensors.getTempCByIndex(3));
Serial.println(" Send Tempstring");

 


ws1st=digitalRead(ws1);
 if (ws1st == HIGH) {
   SendString(5,000);}
   else {
   SendString(5,201);
 }
 ws2st=digitalRead(ws2);
 if (ws2st == HIGH) {
   SendString(6,000);}
   else {
   SendString(6,201);
 }
betriebst=digitalRead(betrieb);
 if (betriebst == HIGH) {
   SendString(7,000);}
   else {
   SendString(7,201);
 }


}


Und hier der Sketch auf dem Uno wo ich die Frequenz einlese und versuche dies über SoftwareSerial zu senden.

Code: [Select]
#include<SoftwareSerial.h>
SoftwareSerial SUART( 2, 3); //SRX  = DPin-2; STX = DPin-3
#include <FreqCounter.h>
long int freq;




void setup() {
  Serial.begin(115200);               // Serielle Ausgabe
  Serial.println("Frequenz Zaehler V 1.0");
  Serial.println("Wire Bibliothek gestartet");
  SUART.begin(115200);
  delay(3000);
}

void loop() {
 FreqCounter::f_comp= 8;             // Kompensation einstellen
 FreqCounter::start(1000);           // Zähler starten für 1000ms
 while (FreqCounter::f_ready == 0)   // warten bis der Zähler fertig ist
 
 freq=FreqCounter::f_freq;           // Ergebnis lesen
 Serial.println(freq*2);               // und ausgeben
SUART.print((int)freq, DEC); 
 }

Tommy56

Bei so niedrigen Frequenzen würde ich in einer Interruptroutine z.B. auf die fallende Flanke die Periodendauer messen und daraus die Frequenz berechnen. Das ist bei solchen niedrigen Frequenzen genauer.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

noiasca

Versuch mal die Geschwindigkeiten von Softserial auf 9600 zu reduzieren, am UNO die Ausgabe natürlich auch.

how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

michael_x

Quote
Code: [Select]
while (FreqCounter::f_ready == 0)   // warten bis der Zähler fertig ist
Da fehlt evtl. ein Semikolon.
Allerdings sehe ich den Sinn einer Library zum Frequenz messen in diesem Zusammenhang nicht. Sieht mir in dieser blockierenden Anwendung wie pulseIn() aus.

devrim

Da fehlt evtl. ein Semikolon.
Allerdings sehe ich den Sinn einer Library zum Frequenz messen in diesem Zusammenhang nicht. Sieht mir in dieser blockierenden Anwendung wie pulseIn() aus.
Ich lese die Frequenz mit einem Arduino aus und will ihn zum ESP senden.

michael_x

Quote
Ich lese die Frequenz mit einem Arduino aus und will ihn zum ESP senden.
Ja, schon klar.
Ich kenne die Library nicht, aber es scheint mir, deine blockierende Schleife ist nicht richtig.

Tommy56

Ich lese die Frequenz mit einem Arduino aus und will ihn zum ESP senden.
Warum schreibst Du dann in Deiner Überschrift, dass Du die Frequenz mit dem ESP8266 messen willst bzw. warum tust Du es nicht?

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Rentner

Hallo,

Durchflussmesser mit 100Hz hört sich für mich nach Zahnradzähler an. Die werden in der Regel recht groß ausgelegt um den Druckverlust klein zu halten, das hat allerdings zur Folge das die Frequenz klein ist.

Zahnradzähler neigen bei konstanem Durchfluß , je nach Bauart, dazu eine unterschiedliche Periodendauer abzugeben.( Zahnabstand und Sensor) Also sollte eine Periodendauer-Messung anschliessend gemittelt werde. Sinvoller ist es allerdings gleich über mehrere Perioden zu messen. Periodendauer hat den Vorteil das man trotz kleiner Frequenz eine hohe Auflösung bekommt. Bei einer Frequenzmessung (Tormessung) über eine Sekunde bekommt man bei 50Hz ein Ergebniss von 50 oder 51. ist also nicht wirklich gut. Da müsste man schon 10s messen, aber wer hat soviel Zeit.

Periodendauer über z.B 10 Perioden dauert bei 50 Hz 200ms und man bekommt mit micros() eine ausreichend hohe Auflösung. Die Messung selbst kann man mittes Interrupt kontinuierlich laufen lassen und dann in einem beliebigen Zeitraster auf das Ergebniss zugreifen. Ich hatte zu dem Thema schon mal was hier vorgestellt.

Heinz


Rentner

Hallo,

@ Tommy wird nicht gehen das sind zu viele delay´s drin. :)  Kann auch sein das die Wunschlib nicht auf dem ESP läuft. Bleibt die Frage warum er eine Lib verwenden will.

Gruß Heinz

Tommy56

Ich hatte ihm schon in #1 vorgeschlagen, die Periodendauer zu messen. Narürlich braucht er dazu einen neuen Sketch und das funktioniert auf dem ESP8266 problemlos, aber den Vorschlag ignoriert er geflissentlich.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

devrim

#10
Apr 01, 2019, 03:25 pm Last Edit: Apr 01, 2019, 03:28 pm by devrim
Warum schreibst Du dann in Deiner Überschrift, dass Du die Frequenz mit dem ESP8266 messen willst bzw. warum tust Du es nicht?

Gruß Tommy
Ich bin auf die Frage eingegangen wegen des Sketch.

Es ist dieser Messumformer wo ich die Frequenz abgreifen will.
https://krohne.com/de/produkte/durchflussmesstechnik/komponenten-und-zusaetzliche-betriebsmittel-fuer-die-durchflussmessung/messumformer/ifc-100/

Pulsausgang und Frequenzausgang
• Alle Ausgänge sind untereinander sowie von allen anderen Kreisen galvanisch getrennt.
• Alle Betriebsdaten und Funktionen sind einstellbar.
• Betriebsart passiv:
Externe Hilfsenergie erforderlich: Uext ≤ 32 VDC
I ≤ 20 mA bei f ≤ 10 kHz (bei Übersteuerung fmax ≤ 12 kHz)
I ≤ 100 mA bei f ≤ 100 Hz
• Skalierung:
Frequenzausgang: in Pulse pro Zeiteinheit (z. B. 1000 Pulse/s bei Q100%);
Pulsausgang: Menge pro Puls.
• Pulsbreite:
symmetrisch (Tastverhältnis 1:1, unabhängig von der Ausgangsfrequenz)
automatisch (mit fester Pulsbreite, Tastverhältnis ca. 1:1 bei Q100%)
fest (Pulsbreite von 0,05 ms...2 s beliebig einstellbar)
• Durchflussmessung vorwärts/rückwärts (V/R-Betrieb) ist möglich.
• Der Pulsausgang und Frequenzausgang kann auch als Statusausgang/Grenzwertschalter
verwendet werden.

Tommy56

Was hat das mit meiner Frage zu tun?

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Rentner

Hallo,

Na, dann solltest Du noch die elektrischen Daten rausbekommen, was das Ding für einen Frequenzausgang hat. Open Kollektor wäre brauchbar, sieht so aus als wenn das so ist. Wenn eine Spanung >5V rauskommt must du die noch anpassen.

Heinz

Go Up