PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ESP8266 D1 mini durch ESP32 D1 mini ersetzen



inka
11.12.2020, 17:46
hallo allerseits,

ich habe ein projekt mit ESP8266 (links im bild) ausgeführt, es funktionierte so weit alles, nun möchte ich etwas ähnliches mit dem ESP32 (rechts im bild) realisieren.
35358
an beiden controlern ist ein 4-tastenfeld angeschlossen. Am ESP8266 am A0, dem einzigen pin, den man analog auslesen kann. Mit drei widerständen funktioniert auch das identifizieren und auswerten der einzelnen tasten....
Nun zum ESP32.
Das pinout der beiden inneren pinreihen des ESP32 ist ja identisch mit dem pinout des ESP8266, deshalb wollte ich auch am ESP32 den "A0" - hier GPIO36 nutzen. Was ich auch mache, es klappt einfach nicht. Weder mit "normal" analog auslesen des GPIO36, noch mit hilfe der adc-library (#include "driver/adc.h") wie es im netz auch behandelt wird...

Hat sich jemand mit sowas schon mal beschäftigt? Ich habe inzwischen schon zwei tage dran verbracht - wäre für jeden tipp dankbar...

Bumbum
12.12.2020, 08:31
Hallo inka,

ich habe auch diese Woche ein Projekt mit dem ESP32 angefangen. (mein erstes mit diesem Controller). Da ging das analogRead einwandfrei. Vielleicht zeigst du mal einen Schaltplan und etwas Code, damit wir schauen können woran es liegt?

Viele Grüße
Andreas

inka
12.12.2020, 09:48
das ist der aufbau
35359
so ist der ESP verdrahtet
35360

code_1

//node 32s

#include "driver/adc.h"

//tastenfeld
uint8_t taste_keypad;


void setup()
{
Serial.begin(115200);

adc1_config_width(ADC_WIDTH_BIT_12);
adc1_config_channel_atten(ADC1_CHANNEL_0, ADC_ATTEN_DB_0);


}

void loop()
{
taste_keypad = adc1_get_raw(ADC1_CHANNEL_0);

Serial.println(taste_keypad);
delay(2000);
}

code_2

//node 32s

//tastenfeld
uint8_t taste_keypad;


void setup()
{
Serial.begin(115200);

//tasten abfrage initialisieren
pinMode(36, INPUT_PULLUP);//A0
}

void loop()
{
taste_keypad = analogRead (36);

Serial.println(taste_keypad);
delay(2000);
}


bei beiden codebeispielen wird "255" auf dem serial monitor ausgegeben, wobei code_2 für den ESP8266 geschrieben wurde und dort auch die vier tastenwerte ausgegeben werden.
Ich denke das liegt an der "initialisierung" des GPIO36, ich habe aber nicht rausfinden können wo dort das problem liegt. Wie gesagt, code_2 (mit A0 statt GPIO36) funktioniert bei ESP8266

Bumbum
12.12.2020, 10:06
Hallo inka,

du liest einen 12 Bit-Wert in eine 8-Bit Variable ein. ändere mal folgendes:



//tastenfeld
uint16_t taste_keypad;


Viele Grüße
Andreas

- - - Aktualisiert - - -

Nachtrag: folgendes solltest du weglassen:

pinMode(36, INPUT_PULLUP);//A0

damit konfiguiest du den Pin als digitalen Eingang. Ich habe diese Woche auch bemerkt, dass INPUT_PULLUP nicht funktioniert.

inka
12.12.2020, 10:55
danke Andreas,
beides geändert, die ausgabe ist nun 4095 statt 255...

noch eine idee?

Bumbum
12.12.2020, 11:39
Hallo Inka,

ich kenne dein Board nicht, aber bei GPIO36 steht auf deinem Plan auch "NC", was oft not connected bedeutet. Kannst du mal testweise GPIO 33, 34 oder 35 probieren? (dies sind die einzigen ADC1 Eingänge auf deinem Board)

Sollte auch das nicht gehen würde ich mal die Spannung am Pin messen.

Viele Grüße
Andreas

inka
12.12.2020, 12:13
hallo Andreas,
das NC steht für den pin daneben, also aus der äusseren reihe. aber ich ptobiere einen anderen pin...

inka
19.12.2020, 11:14
das mit den anderen pins hat nicht für die analoge abfrage der pins funktioniert. Nun habe ich 4 digitale GPIOS genommen (16,17,21,22) und frage diese mit dem code ab:



//board "node32s"

// RGB LED
#define ledPin_bl 19
#define ledPin_gn 23
#define ledPin_rt 5


//tastenfeld
#define taste_1 21
#define taste_2 22
#define taste_3 16
#define taste_4 17

//int ausgang_1 = 13;

boolean zustand_taste_1 = LOW;
boolean zustand_taste_2 = LOW;
boolean zustand_taste_3 = LOW;
boolean zustand_taste_4 = LOW;

#include <SoftwareSerial.h>
SoftwareSerial BTserial(18, 26); //9,10

void setup()
{
Serial.begin(115200);
// pinMode(ausgang_1, OUTPUT);

//tastenfeld
pinMode(taste_1, INPUT);
pinMode(taste_2, INPUT);
pinMode(taste_3, INPUT);
pinMode(taste_4, INPUT);

//RGB LED
pinMode(ledPin_bl, OUTPUT);
pinMode(ledPin_gn, OUTPUT);
pinMode(ledPin_rt, OUTPUT);



BTserial.begin(115200);

}

void loop()
{
zustand_taste_1 = digitalRead(taste_1);
zustand_taste_2 = digitalRead(taste_2);
zustand_taste_3 = digitalRead(taste_3);
zustand_taste_4 = digitalRead(taste_4);


if (zustand_taste_1 == HIGH)
{
digitalWrite(zustand_taste_1, HIGH);
BTserial.println("e");

digitalWrite(ledPin_bl, HIGH);
//digitalWrite(ledPin_rt, HIGH);
delay(500);
digitalWrite(ledPin_bl, LOW);
//digitalWrite(ledPin_rt, LOW);
delay(500);

Serial.println("taste 1 gedrückt");
delay(1000);
}

if (zustand_taste_2 == HIGH)
{
digitalWrite(zustand_taste_2, HIGH);
BTserial.println("f");

digitalWrite(ledPin_rt, HIGH);
delay(500);
digitalWrite(ledPin_rt, LOW);
delay(500);

Serial.println("taste 2 gedrückt");
delay(1000);
}

if (zustand_taste_3 == HIGH)
{
digitalWrite(zustand_taste_3, HIGH);
BTserial.println("g");

digitalWrite(ledPin_gn, HIGH);
delay(500);
digitalWrite(ledPin_gn, LOW);
delay(500);

Serial.println("taste 3 gedrückt");
delay(1000);
}

if (zustand_taste_4 == HIGH)
{
digitalWrite(zustand_taste_4, HIGH);
BTserial.println("h");

digitalWrite(ledPin_rt, HIGH);
digitalWrite(ledPin_gn, HIGH);
delay(500);
digitalWrite(ledPin_gn, LOW);
digitalWrite(ledPin_rt, LOW);
delay(500);

Serial.println("taste 4 gedrückt");
delay(1000);
}

}


die abfrage als solche funktioniert nun einwandfrei, ein anderes problem tauchte auf:

die tasten (es ist ein folientastenfeld) verhalten sich nun als induktive tasten, will heissen ich muss sie gar nicht drücken, sondern nur mit dem finger in die nähe kommen und schon schalten sie. Ist ungünstig, weil ich eine haptische rückmeldung über das drücken einer taste brauche :-(

Ich glaube, die pins sind zu empfindlich. Wie kann ich diese empfindlichkeit reduzieren?

btw: wenn ich die pindefinition um "_PULLUP" ergänze, werden die tasten der reihe nach durchgeschaltet, ohne das man was tut...

Bumbum
19.12.2020, 11:33
Hallo Inka,

wie in meinen Post #4 erwähnt funktioniert INPUT_PULLUP nicht nach meiner Erfarhung. Du musst die Widerstände manuell setzen. So ab 1 kOhm oder höher würde ich empfehlen.

Viele Grüße
Andreas