Pin und GPIO Mapping bei NodeMCU ... ich schaffs nicht

Hallo,

ich hab meinen Windsensor mit Verwendung eines Interrupts am Arduino UNO lauffähig bekommen und wollte das Ganze jetzt auf einem NodeMCU übertragen.

Irgendwie schaffe ich es nicht den richtigen PIN für den Interrupt auszuwählen.
Laut Doku entspricht der GPIO4 dem D2-Pin und bis auf D0 unterstützt jeder Pin Interrupts.

Jetzt hab ich also den Sensor auf D2 angehängt und beide Varianten getestet.
digitalPinToInterrupt(2) und digitalPinToInterrupt(4)

Die Rückmeldung ist in beiden Fällen die gleiche ... keine

attachInterrupt(digitalPinToInterrupt(2), windpulscallback, RISING);
  Serial.println(String(digitalPinToInterrupt(2)));
  // Messung starten (5 Sekunden)
  pulses=0;
  start=micros();
  delay(DELAY); // in milliseconds
  end=micros();

  // shutdown
//  PCintPort::detachInterrupt(WINDSPEEDPIN);
  detachInterrupt(digitalPinToInterrupt(2));

Das Ganze 1:1 zurück auf den UNO portiert ... geht.
Und ich verstehs nicht :frowning:

lG
Gawan

Hallo,

was möchte uns der User damit sagen ... ?

Ich möchte meinen lauffähigen Code portieren. Kannst du mir sagen welche Pins ich benötige? Danke. Ich schaffe es nicht.

Der NodeMCU reagiert scheinbar nicht auf den Interrupt.
Verbunden habe ich D2 (laut doku = GPIO4) und die Funktion digitalPinToInterrupt() dann testweise mit wert 2 und 4 aufgerufen.
Trotz kennt er nix bzw. verhält er sich als gäbs keine Interrupts

Hallo,

ich versuche es nochmal anders.

Ich versuche ein anderes Auto zu fahren wie normalerweise. Welchen Schlüssel benötige ich dafür?

Jetzt solltest du dir in dem Fall als erstes die Frage stellen, was ist das denn für ein Auto ...

Naja, das andere Auto ist ein NodeMCU V3.
http://www.smartarduino.com/nodemcu-based-on-esp-12e-from-esp8266_p94571.html

Laut Pin-Belegungsschema entspricht dort GPIO4 dem Pin2.


Laut Doku ist der auch Interrupt-fähig.

Mein Sketch (der einen Windsensor auslesen soll) verwendet digitalPinToInterrupt() um den Interrupt-Pin zu spezifizieren.
Aber weder ein Aufruf mit digitalPinToInterrupt(2) noch mit digitalPinToInterrupt(4) liefert mir irgendein Ergebnis.

Dein Target ist ein ESP Board welches weder mit Node noch mit Arduino besonders viel gemeinsam hat. Vieleicht solltest Du besser in einem ESP Forum fragen.

In Arduino IDE stelle ich "NodeMCU 1.0 ESP-12E" ein, daher meine Vermutung dass da schon ein gewisser Zusammenhang besteht.

Abgesehen davon habe ich bisher so gut wie alle Sketches erfolgreich portiert - nur jetzt mit den Interrupts gibts irgendwo einen kleinen Haken ...

digitalPinToInterrupt(2) und digitalPinToInterrupt(4)

Meine letzten Experimente, ist schon was her, mit ESP und Interrupts haben funktioniert...

Da geht also was!
Aber an die Verwendung von digitalPinToInterrupt() kann ich mich nicht erinnern!
Meines Erachtens nach sollte ein:

attachInterrupt(2, callback, RISING);

ausreichend sein.

Hallo Combie,

ja, das wende ich auch an in meinem Sktech:

#include <SPI.h>
#include <Time.h>

#define DELAY 2000



unsigned long last_upload=0;
float current_speed=0.0f;
float accum_speed;

unsigned long sum_pulses=0;
unsigned long sum_delay=0;


unsigned long samples;
float current_direction=0.0f;
unsigned long pulses = 0;

void setup() {
  // start the serial library:
  Serial.begin(9600);
  Serial.println("Hello");

}

void windpulscallback() {
  pulses++;
  Serial.print("u");
}


void calculateSpeed() {
  unsigned long start;
  unsigned long end;
  unsigned long diff;

  // Vorbereitung

  attachInterrupt(digitalPinToInterrupt(2), windpulscallback, RISING);

  // Messung starten
  pulses=0;
  start=micros();
  delay(DELAY); 
  end=micros();

  detachInterrupt(digitalPinToInterrupt(2));

  // Berechnung 
  diff=end-start;
  Serial.print("Time(in microsec):");
  Serial.println(diff);
  Serial.print("Pulses:");
  Serial.println(pulses);
  sum_pulses+=pulses;
  sum_delay+=diff;
  
  current_speed=pulses*1000.0f*DELAY/6.0f/diff;
  Serial.print("Speed:");
  Serial.println(current_speed);

}


void loop()
{
  calculateSpeed();
  accum_speed+=current_speed;
  samples++;
}

Aber es keine Reaktion auf den Interrupt

ja, das wende ich auch an in meinem Sktech:

Das ist ja das was ich meine...
Warum tust du das?
Wozu?

Nachtrag:
Serial.print muss aus der ISR raus.

unsigned long pulses = 0;
Muss volatile werden. Oder?

combie:
Das ist ja das was ich meine...
Warum tust du das?
Wozu?

Nachtrag:
Serial.print muss aus der ISR raus.

unsigned long pulses = 0;
Muss volatile werden. Oder?

Und das läuft so 1:1 auf einem Arduino?

Die Beschreibung sagt:
Ard--uino-like hardware IO

Solche hardwarespezifische Sachen wie Interrupt sind sehr spezifisch je anch CPU/controller Du verwendest.
Das "The Newest V3 NodeMCU based on ESP-12E from ESP8266" hat welche/en Cpu/Controller??

Grüße Uwe