D1 Mini, analoger Eingang A0 und OneButton-Library

Hi zusammen,

ich versuche die OneButton-Library auf dem D1 Mini zu nutzen, leider ohne Erfolg.

Compiler und Upload funktionieren, allerdings wird der Eingang A0 direkt als LogPressStart (also geschlossen) angezeigt.
Der Pin A0 ist hierbei nicht verbunden.

Auf einem Nano funktioniert das ganze einwandfrei. Hierbei wird zum Impuls der analoge Anschluss auf GND gezogen.

Hat jemand einen Tipp, warum das mit dem D1 mini nicht funktioniert.

Danke
.d

Die OneButton-Library funktioniert auf digitalen Eingängen. Der A0 auf dem D1 Mini ist aber ein reiner analog-Eingang, der nicht als Digital-Eingang genutzt werden kann.
Auf dem Nano ist das anders, da kann der A0 auch wie ein Digital-Eingang angesprochen werden.

Ah, OK, das wusste ich nicht.
Kann ich dann einfach z.b. den D1 nehmen und gegen GND schalten?

denkteich:
Kann ich dann einfach z.b. den D1 nehmen und gegen GND schalten?

Das sollte funktionieren.

noiasca:
am Wemos D1 ist der Analog-Eingang des ESP über einen Spannungsteiler beschaltet.
Dass dir der 100K Widerstand auf Low zieht sieht man im Schaltbild.

Das ist in dem Fall aber vollkommen egal. Die OneButton versucht den A0 als Digitaleingang auszulesen. Das wird aber nicht unterstützt. Deshalb kommt da immer '0' raus, egal was am A0 anliegt.

Ich hab jetzt den d1 genommen und es funtkioert, wie beim nano.

Danke

MicroBahner:
… den A0 als Digitaleingang auszulesen. Das wird aber nicht unterstützt. Deshalb kommt da immer ‘0’ raus, egal was am A0 anliegt.

jo, wer nichts weiß, muss alles glauben - oder selber ausprobieren.

vermutlich liegts daran, dass der digitalRead im ESP Core nur bis PIN 16 arbeitet:

extern int ICACHE_RAM_ATTR __digitalRead(uint8_t pin) {
  if(pin < 16){
    return GPIP(pin);
  } else if(pin == 16){
    return GP16I & 0x01;
  }
  return 0;
}

imho hätte da ein else if (pin==17) aber auch noch Platz oder gibts einen sonstigen Grund, warum das im ESP Core nicht vorgesehen ist?

vermutlich liegts daran, dass der digitalRead im ESP Core nur bis PIN 16 arbeitet:

Das geht auch aus allen Pinout Bildchen und der ESP Doku klar hervor.

Der A0 ist eben kein GPIO!
Wieso sollte ein digitalWrite() oder digitalRead() damit umgehen können?

:o du kannst also gerne auf 17 erhöhen, bringt nur nix :o

“Wieso sollte digitalRead() damit umgehen können?”
→ wegen Kompatibilität, Einfachheit, Userfreundlichkeit.

Ich finde es zumindest konsequent das durchzuziehen.

Und nach einer kleinen Änderung in der core_esp8266_wiring_digital.cpp

extern int ICACHE_RAM_ATTR __digitalRead(uint8_t pin) {
  if(pin < 16){
    return GPIP(pin);
  } else if(pin == 16){
    return GP16I & 0x01;
  } else if(pin == 17){
    if (system_adc_read() > 1000) return 1; else return 0;
  }
  return 0;
}

kann man mit diesem Sketch auch testen:

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println(F("digitalRead on A0"));
}

void loop() {
  // put your main code here, to run repeatedly:
  int sensor = analogRead(A0);
  Serial.print(F("adc ")); Serial.println(sensor);
  sensor = digitalRead(A0);
  Serial.print(F("dig ")); Serial.println(sensor);

  delay(2000);
}

und die Testausgabe schaut gut aus:

digitalRead on A0
19:04:13.664 -> adc 1024
19:04:13.664 -> dig 1
19:04:15.661 -> adc 1024
19:04:15.661 -> dig 1
19:04:21.654 -> adc 19
19:04:21.654 -> dig 0
19:04:23.667 -> adc 58
19:04:23.667 -> dig 0
19:04:25.679 -> adc 1024
19:04:25.679 -> dig 1
19:04:27.645 -> adc 1024
19:04:27.645 -> dig 1

Änderungen am Core sind meistens kontraproduktiv, weil sie beim Update verschwinden.

Gruß Tommy