Moin,
ich messe 3 Lüfterdrehzahlen im Bereich von etwa 1200 - 1700 rpm. Das sind 20 - 28,3Hz.
Diese Frequenz wird auch jeweils auf einer hardwaregesteuerten LED ausgegeben.
In dem Frequenzbereich kann das menschliche Auge nicht mehr eindeutig unterscheiden, ob die LEDs flackern (=Lüfter dreht) oder dauerhaft leuchten (=Stillstand auf HIGH Pegel).
Deswegen möchte ich drei softwaregesteuerte LEDs mit niedrigerer Frequenz blinken lassen.
Der Teiler soll einstellbar sein, d.h. z.B. nur bei jedem 2., 4. oder 10. Impuls einmal die LED blinken lassen (ich will ausprobieren was davon am besten aussieht, dann wird das nicht mehr geändert).
Da ich die LED aber nicht mit einem delay(xxx) eine Weile an lassen kann, kann ich sie erst wieder nach einigen Impulsen ausschalten.
Und da geht mir jetzt langsam die Luft aus.
Die drei Ausgabe LED Pins und Pinmodes habe ich schon im Sketch drin.
Allerdings fehlt noch in der Loop wie ich diese ansteuere.
Der Rest des Sketches läuft seit Monaten einwandfrei.
//#define AUSGABE // Serielle Ausgabe aktiv (kann man auskommentieren wenn die serielle Ausgabe der Daten nicht gewünscht ist)
//#define AUSGABEschleifen // Serielle Ausgabe Anzahl Schleifen aktiv (kann man auskommentieren wenn die serielle Ausgabe der durchlaufenden Schleifen nicht gewünscht ist)
#define LEDsenden // Die blaue ESP12 LED blinkt beim senden (kann man auskommentieren wenn die LED Anzeige nicht gewünscht ist)
#define DATENsenden // Die Daten werden an den Server gesendet (kann man auskommentieren zum offline testen)
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
ESP8266WiFiMulti WiFiMulti;
#ifdef LEDsenden
byte LEDsend = 2; // Arduino Pin vom der ESP12 onboard LED
#endif
const long BaudRate = 74880; // Serielle Verbindungsgeschwindigkeit für die serielle Ausgabe
const int Messzeit = 60000; // 60000 Millisekunden = 60 Sekunden = Umdrehungen pro Minute
unsigned long Startzeit; // Merker für die Zeit in Millisekunden seit letzten Aufruf der Funktion. Millis zählt immer weiter hoch seit dem Einschalten des Controllers
const int sensorPin[3] = {14,12,13}; // the number of the sensorPin[0...2] (original: 14,12,13 bzw. D5, D6, D7)
const int LED[3] = {5,4,15}; // the number of the LED[0...2] (original: 5,4,15 bzw. D1, D2, D8)
unsigned long Schleifen; // wie viele Schleifen wurden in der Messzeit durchlaufen? (Müssen mehr sein als die gemessene Frequenz)
int i; // Zählvariable
int Sensor[3]={1,1,1}; // Array Variable für den ausgelesenen Wert, muss am Anfang 1 sein
int OldSensor[3]={1,1,1}; // Array Variable für den vorigen ausgelesenen Wert, muss am Anfang 1 sein
int rpm[3]={0,0,0}; // Array Variable für den ausgelesenen Wert, muss am Anfang 0 sein
const char WiFiSSID[] = "xxxxx"; // Router SSID
const char WiFiPSK[] = "xxxxxxxxxxxxxxxxxxx"; // Router Password
const String host = "xxxxxxxxxxxxx"; // Server IP Adresse
const unsigned int port = xx;
const String url_start = "/middleware.php/data/"; // Unterordner für die Werteablage
const String url_stop = ".json?operation=add&value="; // Dateierweiterung für die Werteablage und Parameter
byte maxwait = 120;
char *UUID[3] = { // Die UUID's der abzulegenden Kanäle werden in ein char array hinterlegt
"xxxxxxxxxxxxxxxxxxxx", // UUID des 0. Kanals "Drehzahl Zuluft"
"xxxxxxxxxxxxxxxxxxxx", // UUID des 1. Kanals "Drehzahl Abluft"
"xxxxxxxxxxxxxxxxxxxx"}; // UUID des 2. Kanals "Drehzahl Fortluft"
//****************************************
bool waitWifi() {
while((WiFiMulti.run() != WL_CONNECTED) && maxwait > 0) {
#ifdef AUSGABE
Serial.println("Wait Wifi");
#endif
delay(1000);
maxwait--;
}
if(WiFiMulti.run() == WL_CONNECTED) return true;
return false;
}
//****************************************
void sendHttpData(String url) {
HTTPClient http;
if(waitWifi()) {
#ifdef AUSGABE
Serial.print("GET: "); Serial.println(url);
#endif
http.begin(host, port, url); //HTTP
int httpCode = http.GET();
#ifdef AUSGABE
if(httpCode) {
if(httpCode == 200) {
String payload = http.getString();
Serial.println(payload);
}else{
Serial.print("HTTP "); Serial.println(httpCode);
}
} else {
Serial.print("[HTTP] GET... failed, no connection or no HTTP server\n");
}
#endif
}else{
#ifdef AUSGABE
Serial.print("No WiFi available\n");
#endif
}
}
//****************************************
void WertSenden(int i) {
String url_temp = "";
url_temp = url_start;
url_temp += UUID[i];
url_temp += url_stop;
url_temp += rpm[i];
#ifdef AUSGABE
Serial.println(url_temp);
#endif
#ifdef DATENsenden
sendHttpData(url_temp); // ------------------Daten senden-----------------
#endif
}
//****************************************
void setup() {
#ifdef AUSGABEschleifen // wird nur kompiliert, wenn serielle Ausgabe aktiv ist
Serial.begin(BaudRate); // Starten der seriellen Ausgabe die mit einem seriellen Monitor angesehen werden kann
#endif
#ifdef AUSGABE // wird nur kompiliert, wenn serielle Ausgabe aktiv ist
Serial.begin(BaudRate); // Starten der seriellen Ausgabe die mit einem seriellen Monitor angesehen werden kann
Serial.println("BOOT");
Serial.print("Wifi...");
#endif
WiFiMulti.addAP(WiFiSSID, WiFiPSK);
#ifdef AUSGABE
Serial.println("OK");
#endif
pinMode(sensorPin[0], INPUT); // Initialisiert Pin sensorPin[0] als einen Input
pinMode(sensorPin[1], INPUT); // Initialisiert Pin sensorPin[1] als einen Input
pinMode(sensorPin[2], INPUT); // Initialisiert Pin sensorPin[2] als einen Input
pinMode(LED[0], OUTPUT); // Initialisiert Pin LED[0] als einen Output
pinMode(LED[1], OUTPUT); // Initialisiert Pin LED[1] als einen Output
pinMode(LED[2], OUTPUT); // Initialisiert Pin LED[2] als einen Output
for (int i=0; i<3; i++){ // Schleife 0-2
digitalWrite(LED[i], LOW); // LED[i] ausschalten
}
#ifdef LEDsenden
pinMode(LEDsend, OUTPUT); // Initialisiert Pin LEDsend als einen Output
digitalWrite(LEDsend, HIGH); // LEDsend ausschalten // LEDsend ausschalten
#endif
Startzeit=millis(); // Startzeit merken
}
//****************************************
void loop() {
for (int i=0; i<3; i++){ // Schleife 0-2
yield(); // Dem Prozessor Zeit für seine internen Prozesse geben und somit einen automatischen RESET verhindern
Sensor[i]=digitalRead(sensorPin[i]);
if (Sensor[i]==HIGH && OldSensor[i]==LOW){
rpm[i]++;}
OldSensor[i]=Sensor[i];
}
#ifdef AUSGABEschleifen
Schleifen++;
#endif
if (millis()-Startzeit>=Messzeit){ // Wenn der Messinterval abgelaufen ist Werte ausgeben und senden
rpm[0]=rpm[0]/2; // Die Sensoren machen zwei Impulse pro Umdrehung, daher geteilt durch 2
rpm[1]=rpm[1]/2; // Die Sensoren machen zwei Impulse pro Umdrehung, daher geteilt durch 2
rpm[2]=rpm[2]/2; // Die Sensoren machen zwei Impulse pro Umdrehung, daher geteilt durch 2
#ifdef AUSGABE
Serial.print("rpm1: ");
Serial.print(rpm[0]);
Serial.print(" rpm2: ");
Serial.print(rpm[1]);
Serial.print(" rpm3: ");
Serial.println(rpm[2]);
#endif
#ifdef AUSGABEschleifen
Serial.print("Schleifen durchlaufen: ");
Serial.println(Schleifen);
#endif
for (int i=0; i<3; i++){ // Schleife 0-2 um die Werte zu senden
WertSenden(i); // Wert(i) senden
digitalWrite(LED[i], LOW); // LED[i] ausschalten
#ifdef LEDsenden
digitalWrite(LEDsend, LOW); // LEDsend einschalten für einen gesendeten Wert
delay(30); // 30 Millisekunden warten
digitalWrite(LEDsend, HIGH); // LEDsend ausschalten
delay(30); // 30 Millisekunden warten
#endif
}
rpm[0]=0;
rpm[1]=0;
rpm[2]=0;
Schleifen=0;
Startzeit=millis();
}
}
Lieben Gruß,
Chris