AS3935 mit NodeMCU ESP8266-12E

Hallo Zusammen,

Hat Jemand einen AS3935 mit einer NodeMCU ESP8266-12E am Laufen?

Alles was ich bisher via Google gefunden habe funktioniert leider nicht.

Idealerweise sollte es mit I2C und nicht mit der SPI Schnittstelle sein.

Nö, was is das und was genau willst du damit machen?

Bitte Hyperlink zum Datenblatt und dein Sketch in Code Tags.

Dann findet sich bestimmt jemand der hilft.

Lieben Gruß,
Chris

Ich denke mal, dass Diejenigen, die mir helfen können, oder wollen, wissen, was ein AS3935 ist und was man damit macht. :wink:

Da Du wohl kaum mit dem nackten IC arbeiten wirst, sondern wohl irgendein Modul einsetzt, wäre es in Deinem Interesse dieses zu verlinken.

Gruß Tommy

http://www.playingwithfusion.com/productview.php?pdid=22

Ich hab für so was die "Blitzortung Gewitter-Monitor" App

themanfrommoon:
Ich hab für so was die "Blitzortung Gewitter-Monitor" App

Und in wie fern hat das mit dem Topic zu tun??

Na offenbar willst du wissen wo ein Gewitter ist. Aber das verrät du uns ja nicht.
Du verrätst uns auch nicht welche Library du nutzt und wie dein Sketch aussieht.
Du verrätst uns nicht was nicht geht und was du für ne Fehlermeldung bekommst.
Aus dem schließe ich das du wenig Interesse an deiner Problemlösung hast und dann habe ich dir ne Lösung gegeben von der ich weiss das sie funktioniert. Thema erledigt

Das war eine URL, kein Link.
Die Links unten auf der Seite hast Du ausprobiert?

Hast Du mit einem I2C-Scanner die Adresse des Moduls geprüft?

Probleme bei I2C am ESP8266 resultieren meist darin, dass in den Libs die Pins für I2C für den ESP nicht nachgeführt sind. Oft hilft es dann, in der Lib das Wire.begin raus zu werfen und das im Setup aufzurufen.

Ansonsten schau auch mal hier.

Gruß Tommy

Wie ist denn der Aufbau?
ESP im Haus und der Sensor an einem 25m langen Kabel im Garten?

Ich zitiere mal, was in dem "Link" steht: ^^

The example code above doesn’t work an a ESP8266.

Ja, die dort verwendete I2C-Lib ist nicht für den ESP8266 geeignet, obwohl der oben mit angegeben ist.

Gruß Tommy

Der Sketch sieht so aus:

/*
-------------------------------
AS3935   |  ESP8266 (NodeMCU)
---------+---------------------
MISO/SDA |  D3
MISO     |  GND
SCK/SCL  |  D4
IRQ      |  D5
SI       |  +3,3V
CS       |  GND
GND      |  GND
Vdd      |  +3,3V
------------------------------
*/

#include <AsyncDelay.h>
#include <SoftWire.h>
#include <AS3935.h>

#define SDA_PIN D3
#define SCL_PIN D4
#define IRQ_PIN D5

AS3935 as3935;
bool ledState = true;
AsyncDelay d;

void int2Handler(void)
{
  as3935.interruptHandler();
}


void readRegs(uint8_t start, uint8_t end)
{
  for (uint8_t reg = start; reg < end; ++reg) {
    delay(50);
    uint8_t val;
    as3935.readRegister(reg, val);

    Serial.print("Reg: 0x");
    Serial.print(reg, HEX);
    Serial.print(": 0x");
    Serial.println(val, HEX);
    Serial.flush();
  }
  Serial.print("State: ");
  Serial.println(as3935.getState(), DEC);
  Serial.println("-------------");
}

void setup(void)
{

  Serial.begin(115200);
  as3935.initialise(SDA_PIN, SCL_PIN, 0x03, 3, true, NULL);
  as3935.start();
  d.start(1000, AsyncDelay::MILLIS);

  while (!d.isExpired())
    as3935.process();
  
  readRegs(0, 0x09);
  as3935.setNoiseFloor(0);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, ledState);
  pinMode(IRQ_PIN, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(IRQ_PIN), int2Handler, RISING);
  d.start(1000, AsyncDelay::MILLIS);
  Serial.println("setup() done");
}

uint8_t count = 0;
void loop(void)
{
  if (as3935.process()) {
    uint8_t flags = as3935.getInterruptFlags();
    uint8_t dist = as3935.getDistance();

    Serial.println("-------------------");
    Serial.print("Interrupt flags: ");
    Serial.println(flags, HEX);
    Serial.print("Distance: ");
    Serial.println(dist, DEC);
  }
  if (as3935.getBusError()) 
    Serial.println("Bus error!");

    if (as3935.getTriggered()) 
    Serial.println("Triggered!");


  if (d.isExpired()) {
    ledState = !ledState;
    digitalWrite(LED_BUILTIN, ledState);
    
    if (++count > 5) {
      count = 0;
      readRegs(0, 0x09);
    }
    d.start(1000, AsyncDelay::MILLIS);
  }
  
}

Die Ausgabe ist dann immer “triggert”:

PORT OPEN 115200

Communication with MCU..Got answer! Communication with MCU established.
AutoDetect firmware...

Can't autodetect firmware, because proper answer not received (may be unknown firmware). 
Please, reset module or continue.
$
Reg: 0x1: 0x22
Reg: 0x2: 0xC2
Reg: 0x3: 0x0
Reg: 0x4: 0x0
Reg: 0x5: 0x0
Reg: 0x6: 0x0
Reg: 0x7: 0x3F
Reg: 0x8: 0x3
State: 4
-------------
setup() done
Reg: 0x0: 0x24
Reg: 0x1: 0x2
Reg: 0x2: 0xC2
Reg: 0x3: 0x0
Reg: 0x4: 0x0
Reg: 0x5: 0x0
Reg: 0x6: 0x0
Reg: 0x7: 0x3F
Reg: 0x8: 0x3
State: 5
-------------
-------------------
Interrupt flags: 1
Distance: 63
Triggered!
Triggered!
Triggered!
Triggered!
Triggered!
Triggered!
Triggered!
Triggered!
Triggered!
Triggered!
Triggered!
Triggered!
Triggered!
-------------------
Interrupt flags: 1
Distance: 63
Triggered!
Triggered!
Triggered!
Triggered!
Triggered!
Triggered!
Triggered!
Triggered!
Triggered!
Triggered!
Triggered!
Triggered!
Triggered!
Triggered!
-------------------

So wie ich vermute, liegt es wohl am IRQ handling, leider aber sehe ich nicht, wo der Fehler liegen könnte?

Das ist die verwendete Libary.

Keine weiteren Vorschläge mehr? :frowning:

Wie ich Dir bereits schrieb, wird das Problem an der nicht angepassten I2C-Verbindung liegen.
Die Libs zu diesem IC verwenden aus mir unbekannten Gründen nicht die übliche Wire-Lib, sondern irgendwelche Eigengewächse, die nicht kompatibel mit dem ESP8266 sind.

Du könntest selbst versuchen, mit der normalen Wire-Lib (bei mir ist übrigens SDA GPIO 4 und SCL GPOI 5) und dem Datenblatt erst mal eine eigene Grundstruktur mit einfachen Befehlen zu bauen.

Das ist das, was mir dazu einfällt.

Gruß Tommy