da brauchst du nichts entprellen, versuch mal das Signal mit einem Interrupt einzulesen, vllt. bringt das was.
....da komm ich ja her. Mit Interrupt geht's gar nicht. Die Interrupts ballern den ESP8266 so voll, dass er nicht genug Zeit für seine Kernprozesse hat und so mehrmals pro Stunde rebootet.
Was soll da prellen ?
prellen, peaken, zucken, is doch alles das gleiche.
Es kommt vermutlich kein Signal AAAAAANNNNNNN, AAAUUUUUUUSSSSSS, AAAAAANNNNNNN, AAAUUUUUUUSSSSSS
Sondern AAAAAANNNNNNN, AAAUUUUUUUSSSSSS, AN, AUS, AAAAAANNNNNNN, AAAUUUUUUUSSSSSS
Das ist ein Prellen. Muss ja nicht mechanisch bedingt sein. In diesem Fall ist es eben optisch bedingt.
Ein Oszi zur Hand?
Öhm, ja, ich kram das alte Teil mal raus.....
Interrupt - wenn Du bis jetzt pollst, könnten Dir Flanken verloren gehen
Wie sollen Flanken verloren gehen, wenn ich mit 32.000Hz abfrage und die Signale nur mit 66Hz kommen können?
Ich glaube ja eher nicht, dass diese Schleife macht was du machen willst.
Aber das ist schwer zu sagen, weil es nur ein Codeschnipsel ist und nicht klar ist, was der restliche (nicht gezeigte) Code macht.
Okay, warum aufs wesentliche, den mundgerecht vorbereiteten Code beschränken, wenn man auch den Heuhaufen kriegen kann. Aber ich glaube nicht, dass wir jetzt schlauer werden. Ich glaube das verwirrt jetzt nur mehr:
#define AUSGABE // Serielle Ausgabe aktiv
#define AUSGABEschleifen // Serielle Ausgabe Anzahl Schleifen aktiv
#define LEDsenden // Die blaue ESP12 LED blinkt beim senden
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
ESP8266WiFiMulti WiFiMulti;
#ifdef LEDsenden
byte LED1 = 2; // Arduino Pin vom der ESP12 onboard LED
#endif
const long BaudRate = 74880; // Serielle Verbindungsgeschwindigkeit für die serielle Ausgabe
const int Messzeit = 5000; // 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)
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[] = "xxxxxxxxxxx"; // Router Password
const String host = "xxxxxxxxx"; // Server IP Adresse
const unsigned int port = 80;
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
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", // UUID des 0. Kanals "Drehzahl Zuluft"
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", // UUID des 1. Kanals "Drehzahl Abluft"
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}; // 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
sendHttpData(url_temp); // ------------------Daten senden-----------------
}
//********************************************************************************************************************************
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
// initialize the sensorPins as an input:
pinMode(sensorPin[0], INPUT);
pinMode(sensorPin[1], INPUT);
pinMode(sensorPin[2], INPUT);
#ifdef LEDsenden
pinMode(LED1, OUTPUT);
digitalWrite(LED1, HIGH); // LED1 ausschalten // LED1 ausschalten
#endif
Startzeit=millis();
}
//********************************************************************************************************************************
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 // wird nur kompiliert, wenn serielle Ausgabe aktiv ist
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 // wird nur kompiliert, wenn serielle Ausgabe aktiv ist
Serial.print("rpm1: ");
Serial.print(rpm[0]);
Serial.print(" rpm2: ");
Serial.print(rpm[1]);
Serial.print(" rpm3: ");
Serial.println(rpm[2]);
#endif
#ifdef AUSGABEschleifen // wird nur kompiliert, wenn serielle Ausgabe aktiv ist
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
#ifdef LEDsenden
digitalWrite(LED1, LOW); // LED1 einschalten für einen gesendeten Wert
delay(30); // 30 Millisekunden warten
digitalWrite(LED1, HIGH); // LED1 ausschalten
delay(30); // 30 Millisekunden warten
#endif
}
rpm[0]=0;
rpm[1]=0;
rpm[2]=0;
Schleifen=0;
Startzeit=millis();
}
}