Hallo zusammen!
Bin neu hier und wende mich an Euch da ich seit 3 Wochen nicht weiterkomme...
Ich versuche den Giesomat über einen ESP12e auszulesen. Über Arduino Uno hat es mir gelungen, der Sensor liefert die sinnvolle Werte.
Beim ESP nutze ich die Interrupts. Hier der Code:
#define sensorPin_1 6
volatile byte pulseCount;
void IRAM_ATTR pulseCounter_1();
void setup() {
Serial.begin(115200);
Serial.print ("Frequency = ");
attachInterrupt(sensorPin_1, pulseCounter_1, FALLING);
}
void IRAM_ATTR pulseCounter_1()
{
pulseCount++;
}
void loop() {
Serial.print (pulseCount);
}
Serial Ausgabe: "Frequency = 0000000000...." Nur Nuller.
Was mache ich falsch?
Danke im Voraus!
Meinst Du nicht, dass pulseCount mit byte etwas klein ist?
Das Auslesen und Nullsetzen sollte atomar erfolgen.
Welche Werte hast Du denn am Uno bekommen?
Gruß Tommy
Hallo Tommy,
dieselbe Ausgabe bekomme ich mit int16_t und uint32_t. Die callback Metode wird nie aufgerufen...
Am Arduino kamen die Werte ca. 1500 bis 3700.
Grüße
Alex
Um auf Serial was zu sehen, würde ich nur bei Änderung etwas ausgeben.
Du kannst gar nicht so schnell scrollen, um eine der neuen "0" Werte zu sehen.
Die callback Metode wird nie aufgerufen...
Da könntest du recht haben.
Schon überprüft, ob dein fehlendes
digitalPinToInterrupt(GPIO)
ok ist?
Also passt es erst mal schon in kein Byte rein. Den Rest hast Du ignoriert.
Den ESP12e gibt es nicht, ich vermute, Du meinst den ESP8266-12E. Dann wäre das Ram-Attribut falsch.
Probier mal (ungetestet):
#define sensorPin_1 6
volatile uint16_t pulseCount;
void IRAM_ATTR pulseCounter_1();
void ICACHE_RAM_ATTR pulseCounter_1()
{
pulseCount++;
}
void setup() {
Serial.begin(115200);
Serial.print ("Frequency = ");
attachInterrupt(digitalPinToInterrupt(sensorPin_1), pulseCounter_1, FALLING);
}
void loop() {
uint16_t tempCnt;
cli(); // Interrupt sperren
tempCnt = pulseCount;
pulseCount = 0;
sei(); // Interrupt freigeben
Serial.print (tempCnt);
}
Gruß Tommy
Lesbare Ausgabe eher so:
void loop() {
uint16_t tempCnt=0;
cli(); // Interrupt sperren
if (pulseCount) {
tempCnt = pulseCount;
pulseCount = 0;
}
sei(); // Interrupt freigeben
if (tempCnt) Serial.println (tempCnt);
delay(100); // je Pulshäufigkeit, Lesegeschwindigkeit und Geschmack
}
Tommy, Michael, danke für Eure Vorschläge!
Es geht jetzt mit dem Code:
#define sensorPin_1 5
unsigned long cycleStart;
unsigned long now;
const int ic = 10000;
volatile uint32_t pulseCount;
void ICACHE_RAM_ATTR pulseCounter_1();
void ICACHE_RAM_ATTR pulseCounter_1(){
pulseCount++;
if (pulseCount > ic){
cli(); // Interrupt sperren
calcFreq();
}
}
void setup() {
Serial.begin(115200);
Serial.print ("Frequency: ");
attachInterrupt(sensorPin_1, pulseCounter_1, FALLING);
cycleStart = millis();
}
void calcFreq(){
uint32_t tempCnt;
now = millis();
if (now - cycleStart > 0){ //sollte nie der Fall sein,
Serial.print (ic / (now - cycleStart));
Serial.println (" interrupt/ms");
}
pulseCount = 0;
cycleStart = millis();
sei(); // Interrupt freigeben
}
void loop() {
}
Das Hauptproblem war der falsche Pin, ich habe den ESP Pinout falsch interpretiert, lol (ist mein erster ESP).
Tommys code kommt nie zum loop(). Vermutlich ist der ESP mit interrupts voll ausgelastet... ?
Sobald der Code in einer non-loop() Metode von interrupts händler aufgerufen wird, funktioniert es.
(Tommy, der Typ byte im ersten Snippet war ein Überbleibsel vom "wilden hin-, und hertesten
)
Grüße
Alex
Vergessen, so sieht der Output:
...
19:56:26.248 -> 125 interrupt/ms
19:56:26.329 -> 125 interrupt/ms
19:56:26.411 -> 125 interrupt/ms
19:56:26.456 -> 125 interrupt/ms
19:56:26.543 -> 126 interrupt/ms
19:56:26.625 -> 136 interrupt/ms <-- hier den Sensor angefasst
19:56:26.707 -> 151 interrupt/ms
19:56:26.753 -> 161 interrupt/ms
19:56:26.834 -> 161 interrupt/ms
19:56:26.879 -> 158 interrupt/ms
19:56:26.923 -> 181 interrupt/ms
...
Hab die Diskussion abgespalten.
Grüße Uwe
-
Eine Interrupt-Routine (ISR) läuft unter geschlossenem Interrupt, cli();
ist also überflüssig.
-
In der ISR ist ein Serial.print falsch. Rufe calcFreq()
lieber von loop aus auf.
-
Alle 10000 Pulse eine Berechnung und Ausgabe machen ist eine gute Idee.
Das kannst du noch vereinfachen: ISR setzt nach 10000 nur ein Fertig-Bit und fängt von vorn zu zählen an, loop / calcFreq prüft das, löscht den Merker, berechnet aus der Zeit seit dem letzten Mal dein Ergebnis und gibt es aus. Wenn loop nicht durch Unmengen von Serial.print gebremst wird, dauert ein loop Durchlauf mit/ohne Fertig-Bit und ggfls. Zeit merken weit unter 1 ms und dein Ergebnis ist exakt, mit nur dem einen atomaren Fertig-Merker zwischen ISR und loop.
Hat das (180 Pulse/ms) tatsächlich mit Giesomat und Erdfeuchte zu tun ??? 
Der ESP hat das Testing nicht überlebt... Ich kann ihn flaschen, er gibt aber (unabhängig vom code) nicht sinnvolles aus. S. unten.
michael_x:
Hat das (180 Pulse/ms) tatsächlich mit Giesomat und Erdfeuchte zu tun ??? 
Das macht mir auch Sorgen. Ich denke die hohe Frequenz ist der Grund aller komischen Fehler. Irgendwie misst ESP anders als Arduino.
Loop() war bei allen versuchten Varianten absolute unzuverlässig...
Momentan, beim reset mit einem WiFi Beispiel drauf:
18:13:00.054 -> ets Jan 8 2013,rst cause:2, boot mode:(3,6)
18:13:00.054 ->
18:13:00.054 -> load 0x4010f000, len 3456, room 16
18:13:00.054 -> tail 0
18:13:00.088 -> chksum 0x84
18:13:00.088 -> csum 0x84
18:13:00.088 -> va5432625
18:13:00.088 -> ~ld
18:13:00.088 -> V2
18:13:00.088 -> Mo
Und kurz vor dem Verabschieden:
Decoding stack results
0x4010027c: pvPortZalloc(size_t, char const*, int) at C:\Users\alex1\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.7.1\cores\esp8266\heap.cpp line 301
0x40100c51: __wrap_spi_flash_read(uint32_t, uint32_t*, size_t) at C:\Users\alex1\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.7.1\cores\esp8266\core_esp8266_phy.cpp line 309
0x40201c34: ESP8266WiFiSTAClass::disconnect(bool) at C:\Users\alex1\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.7.1\libraries\ESP8266WiFi\src\ESP8266WiFiSTA.cpp line 385
0x40201c10: ESP8266WiFiSTAClass::disconnect(bool) at C:\Users\alex1\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.7.1\libraries\ESP8266WiFi\src\ESP8266WiFiSTA.cpp line 378
0x40100648: umm_free_core(void*) at C:\Users\alex1\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.7.1\cores\esp8266\umm_malloc\umm_malloc.cpp line 316
0x40201cc4: ESP8266WiFiSTAClass::status() at C:\Users\alex1\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.7.1\libraries\ESP8266WiFi\src\ESP8266WiFiSTA.cpp line 634
0x402017f5: ESP8266WiFiMulti::run() at C:\Users\alex1\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.7.1\libraries\ESP8266WiFi\src\ESP8266WiFiMulti.cpp line 183
0x40207008: _strdup_r at /home/earle/src/esp-quick-toolchain/repo/newlib/newlib/libc/string/strdup_r.c line 11
0x4010091c: malloc(size_t) at C:\Users\alex1\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.7.1\cores\esp8266\umm_malloc\umm_malloc.cpp line 511
0x40203bb1: uart_write(uart_t*, char const*, size_t) at C:\Users\alex1\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.7.1\cores\esp8266\uart.cpp line 509
0x40203bb1: uart_write(uart_t*, char const*, size_t) at C:\Users\alex1\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.7.1\cores\esp8266\uart.cpp line 509
0x402022e0: HardwareSerial::write(unsigned char const*, unsigned int) at C:\Users\alex1\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.7.1\cores\esp8266/HardwareSerial.h line 164
0x402022ec: HardwareSerial::write(unsigned char const*, unsigned int) at C:\Users\alex1\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.7.1\cores\esp8266/HardwareSerial.h line 165
0x402025b5: Print::write(char const*) at C:\Users\alex1\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.7.1\cores\esp8266/Print.h line 62
0x402026ac: Print::println() at C:\Users\alex1\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.7.1\cores\esp8266\Print.cpp line 186
0x402010a0: setup() at C:\work\Arduino\ESP\test-wifi/test-wifi.ino line 16
0x40202e4c: loop_wrapper() at C:\Users\alex1\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.7.1\cores\esp8266\core_esp8266_main.cpp line 194