Anfängerfrage: LoLin NodeMcu V3 und JSN-SR04T bringt mit Rx und Tx nur 0

Hi Leute,

ich habe hinterm Haus einen alten "Öltankkeller". Der ist sehr schwer zu erreichen. Mitten beim Hausbau vor Jahrzehnten hat man sich allerdings umentschieden und auf Gasheizung umgestellt. Daraufhin musste der Öltank zu Gunsten von einem Regenwassertank weichen. Wegen dem schlechten Zugang ist der Wasserstand sehr schwer zu ermitteln und das abkärchern machen wir sicherheitshallber nur bei Regen.
Vor einem halben Jahr habe ich einen LoLin NodeMcu V3 geschenkt bekommen und wusste ne ganze Weile lang nicht, was ich damit machen soll.
Jetzt habe ich den JSN-SR04T gefunden und mich hat das Fieber gepackt.
Ich habe jetzt alles zum Blinken und laufen gebracht, allerdings hat der LoLin zum größten Teil nur 0 Werte ausgegeben, so etwa alle 1 bis 2 Minuten kam mal ein Wert, der aber auch nicht stimmte. Nach der Messung habe ich ein 2 Sekunden delay drin.
Also habe ich ein bisschen experimentiert und den Trigger Pin gezogen und plötzlich stimmte die Messung mit einem Offset von 5 cm und einer ungenauigkeit / toggeln von 1 bis 2 cm.
Bei meinem Testaufbau (Abstand 1 Meter) kommen allerdings immer wieder ausreißer (alle 5 bis 30 min einer) von 300 - 500 cm. Die bleiben bis zur nächsten Wertänderung im Bussystem stehen und sorgen für verwirrung.
Woher kommt das nun?
Sind es die 3.3 V statt den 5 V? Der LoLin hat leider nur die 3.3 V Ausgänge.
Warum funktioniert das ohne den Trigger und kann ich das so überhaupt betreiben?

Ich hoffe ihr könnt mir da n bissl Infos geben oder hattet vielleicht schonmal ein ähnliches Problem.

Nachtrag: hier noch die Ergebnisse des "1 Meter Testaufbau"

Hallo @checkers

herzlich willkommen im Arduino-Forum.

Wir könnten dir Infos geben wenn du denn genügend Infos über dein Programm zur Verfügung stellen würdest.
Das bedeutet poste deinen kompletten Sketch als Code-Section
In IDE 2.X so
rechtsklick im Editor

IDE 1.8.X rechtsklick

Wie soll der Ultraschallsensor Messungen machen wenn du das Trigger-Signal abklemmst???
Entweder du hast das Triggersignal gar nicht abgeklemmt oder du hast mehrere Kabel am Trigger-Pin oder was weiß ich.

Also auch mal einen Schaltplan posten

Hi @StefanL38 ,

ich nutze Visual Studio Code, aber hier mal der Code:


#define LED LED_BUILTIN
#define DistanceIn 14
#define _DistanceOut 12

uint duration;
uint distanceRaw;
uint distanceRawLast;
uint distanceAvg;
uint distanceAvgLast;

int measureDelay = 5;
const char* mqttTopicMeasureDelay = "Gartenhaus/settings/measureDelay";
const char* mqttTopicDistanceRaw = "Gartenhaus/Distance/raw";
int rawCorrection = 5;
const char* mqttTopicRawCorrection = "Gartenhaus/settings/rawCorrection";
const int avgCount = 10;
const char* mqttTopicDistanceAvg = "Gartenhaus/Distance/avg";
const char* mqttTopicRssi = "Gartenhaus/WiFi/RSSI";
int rssiLast = 0;

char msgOut[128];
int DistanceValue[avgCount];

WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);

void setup_wifi();
void connect_mqtt();
void callback_mqtt(char*, byte*, unsigned int);
void calcDistance();
int calcAvg(int);
void publishInfo();

void setup() {
	pinMode(LED, OUTPUT);
#ifdef DistanceOut
	pinMode(DistanceOut, OUTPUT);
#endif
	pinMode(DistanceIn, INPUT);
	digitalWrite(LED, HIGH);
	Serial.begin(9800);
	setup_wifi();
	mqttClient.setServer(mqtt_server, mqtt_server_port);
	mqttClient.setCallback(callback_mqtt);
}

void loop() {
	if(WiFi.status() == WL_CONNECTED) {
		digitalWrite(LED, LOW);
	} else {
		digitalWrite(LED, HIGH);
		setup_wifi();
	}
	if(!mqttClient.connected()) {
		connect_mqtt();
	}
	calcDistance();
	if(distanceRawLast != distanceRaw) {
		sprintf(msgOut, "%u", distanceRaw);
		mqttClient.publish(mqttTopicDistanceRaw, msgOut);
	}
	if(distanceAvgLast != distanceAvg) {
		sprintf(msgOut, "%u", distanceAvg);
		mqttClient.publish(mqttTopicDistanceAvg, msgOut);
	}
	mqttClient.loop();
	publishInfo();
}

void setup_wifi() {
	delay(10);
	Serial.println();
	Serial.print("Connecting to ");
	Serial.println(ssid);
	WiFi.begin(ssid, password);
	while(WiFi.status() != WL_CONNECTED) {
		delay(500);
		Serial.print(".");
	}
	Serial.println();
	Serial.print("WiFi Connected: ");
	Serial.println(WiFi.localIP());
}

void connect_mqtt() {
	Serial.println();
	Serial.print("Connecting MQTT ");
	Serial.print(mqtt_server);
	Serial.print(":");
	Serial.println(mqtt_server_port);
	String mqttClientId = "Fuellstand";
	while(!mqttClient.connected()) {
		Serial.print(".");
		if(mqttClient.connect(mqttClientId.c_str())) {
			Serial.println();
			Serial.print("MQTT Connected as: ");
			Serial.println(mqttClientId);
			mqttClient.publish(mqttTopicDistanceRaw, "0");
			mqttClient.publish(mqttTopicDistanceAvg, "0");
			sprintf(msgOut, "%d", measureDelay);
			mqttClient.publish(mqttTopicMeasureDelay, msgOut);
			sprintf(msgOut, "%d", rawCorrection);
			mqttClient.publish(mqttTopicRawCorrection, msgOut);
			mqttClient.subscribe(mqttTopicMeasureDelay);
			mqttClient.subscribe(mqttTopicRawCorrection);
		} else {
			Serial.print("failed, rc=");
			Serial.print(mqttClient.state());
			Serial.println(" will try again in 5 seconds");
			delay(5000);
		}
	}
}

void callback_mqtt(char* topic, byte* payload, unsigned int length) {
	if(strcmp(topic, mqttTopicMeasureDelay) == 0) {
		payload[length] = '\0'; // Add a NULL to the end of the char* to make it a string.
		measureDelay = atoi((char *)payload);
		Serial.print("Setting found on topic: '");
		Serial.print(topic);
		Serial.print("' with value: ");
		Serial.println(measureDelay);
	}
	if(strcmp(topic, mqttTopicRawCorrection) == 0) {
		payload[length] = '\0'; // Add a NULL to the end of the char* to make it a string.
		rawCorrection = atoi((char *)payload);
		Serial.print("Setting found on topic: '");
		Serial.print(topic);
		Serial.print("' with value: ");
		Serial.println(rawCorrection);
	}
}

void calcDistance() {
#ifdef DistanceOut
	digitalWrite(DistanceOut, LOW);
	delayMicroseconds(2);
	digitalWrite(DistanceOut, HIGH);
	delayMicroseconds(10);
	digitalWrite(DistanceOut, LOW);
#endif
	duration = pulseIn(DistanceIn, HIGH);
	distanceRawLast = distanceRaw;
	distanceRaw = (duration * 0.034 / 2) + rawCorrection;
	distanceAvgLast = distanceAvg;
	distanceAvg = calcAvg(distanceRaw);
	delay(measureDelay * 1000);
}

int calcAvg(int raw) {
	int avg = 0;
	for(int i = 0; i < avgCount - 1; i++) {
		DistanceValue[i] = DistanceValue[i + 1];
		avg += DistanceValue[i] * (i + 1);
	}
	DistanceValue[avgCount - 1] = raw;
	avg += raw * 10;
	return round(avg / 55);
}

void publishInfo() {
	if(rssiLast != WiFi.RSSI()) {
		rssiLast = WiFi.RSSI();
		sprintf(msgOut, "%d", rssiLast);
		mqttClient.publish(mqttTopicRssi, msgOut);
	}
}

Die Konstante 'DistanceOut' ist mit einem '_' ausgeblendet und auf der Hardware ist das Kabel gezogen. Bild folgt bei nächster Antwort...

verstehe ich nicht

Er hat das #define von DistanceOut in _DistanceOut umbenannt. Er hätte es auch Paul nennen können. Ein etwas unüblicher Weg.

Gruß Tommy

Hier habe ich mal ein Bild (schaltplanähnlich) gemacht und 'zusammen-ge-jpg-ed':
grafik
(bearbeitet - richtiges Bild eingefügt)

hier nochmal ein Bild von dem Testaufbau:


deutlich zu sehen: das rote Kabel ist getrennt.

und dem Sensor Provisorium:

Ist eigentlich ein einfacher aufbau, der mit dem roten Kabel am D6 nur 0 geliefert hat.
Das rote und das braune Kabel habe ich testweise auch mal vertauscht, ebenfalls der Wert 0.

versehentlich ist mir dann das rote Kabel vom Pin gerutscht, auf einmal lieferte er Werte.

Ne Idee warum?

und hier noch das MQTT Ergebnis des raw und des avg Wertes ohne rotes Kabel mit Ausreißer:

Gefunden auf:

Auf dem Modul befindet sich neben den Pins der Jumper R27. Diesen könnt ihr offen lassen, ihr könnt einen 47 kOhm Widerstand dazwischen löten oder einen 120 kOhm Widerstand nehmen. Mit dieser Maßnahme legt ihr den Betriebsmodus fest.

Modus 1: R27 offen

In diesem Modus verhält sich der JSN-SR04T-2.0 wie der HC-SR04, d. h. ihr steuert ihn über den Trigger und den Echo Pin an. Ihr könnt denselben Arduino Sketch wie für den HC-SR04 verwenden, jedoch ggf. mit einer kleinen Änderung. Bei jeder fünften bis zehnten Messung erhielt ich als Ergebnis eine Null. Habt ihr dasselbe Problem, dann erhöht die „HIGH-Zeit“ am Trigger Pin von 10 auf 20 Mikrosekunden (Zeile 18 in HC_SR04_Proximity.ino). Mit dieser Maßnahme trat der Fehler bei mir nicht mehr auf.

Vlt hilft Dir das weiter...

Hi @Moko ,
leider nich...


Am raw Wert siehtman deutlich, wann ich die Änderungen gemacht habe und dass seit dem der Wert sehr viel öfter auf 0 steht.

Hast du dir denn auch die Beschreibung zu deinem US-Sensor bei Wolle (Link @Moko) durchgelesen.
Da steht ganz genau drin wie der Sensor betrieben wird.

Hi @HotSystems ,
joa, das hab ich.
Habe auch nach dem Tutorial als Vorlage gearbeitet:
https://randomnerdtutorials.com/esp8266-nodemcu-hc-sr04-ultrasonic-arduino/
is eigentlich das gleiche, nur in englisch.

Also mir ist das Prinzip schon klar, wie das funktioniert. Deshalb ja auch eingangs die Frage:

Also hast du es nicht gelesen.

da steht eindeutig drin:

Zitat:

Modus 1: R27 offen

In diesem Modus verhält sich der JSN-SR04T-2.0 wie der HC-SR04, d. h. ihr steuert ihn über den Trigger und den Echo Pin an. Ihr könnt denselben Arduino Sketch wie für den HC-SR04 verwenden, jedoch ggf. mit einer kleinen Änderung. Bei jeder fünften bis zehnten Messung erhielt ich als Ergebnis eine Null. Habt ihr dasselbe Problem, dann erhöht die „HIGH-Zeit“ am Trigger Pin von 10 auf 20 Mikrosekunden (Zeile 18 in HC_SR04_Proximity.ino). Mit dieser Maßnahme trat der Fehler bei mir nicht mehr auf.

Mit einem 47 kOhm Widerstand an R27 wechselt der JSN-SR04T-2.0 in einen kontinuierlichen Betriebsmodus. In diesem Modus erfolgt alle 100 ms eine Messung. Das Ergebnis dieser Messung ist die Distanz in Millimetern, die als 16 Bit Wert seriell übermittelt wird. Der Trigger Pin wird dabei zu RX, der Echo Pin wird zu TX. Der JSN-SR04T-2.0 überträgt 4 Bytes pro Messung: usw.

Hi @HotSystems ,
im post #10 war ich vielleicht n bisschen zu ungenau.
Tschuldigung.

Also, der R27 ist bei mir offen -> d.h. Modus 1 ist aktiv.
Ich habe die Zeit von 10 auf 20 erhöht, den Trigger aktiviert, mit dem Ergebnis, dass wieder die 0 Werte kommen:

rot ist ohne Trigger und ab grün ist er aktiv mit 20ms, später dann zum test mit 50ms - ohne erkennbare Besserung.
Zitat Wolle:

Teilweise haben JSN-SR04T-2.0 Modelle Probleme mit Fehlmessungen. Dabei werden sporadisch Abstandswerte von um die 20 cm ermittelt obwohl sich nichts in diesem Bereich befindet.

Ich habe auch den JSN-SR04T bestellt und den JSN-SR04T-2 (Version 2.0).
Die Beschriebenen Fehlmessungen beziehen sich aber im Wolle-Beitrag um einen Abstand von 20 cm und nicht um eine +300% Messung.

Zitat Wolle:

Bei jeder fünften bis zehnten Messung erhielt ich als Ergebnis eine Null.

Mit Trigger ist so jede zehnte bis zwanzigste Messung nicht 0, aber weit weit weg von den erwarteten 100 cm.
Ohne Trigger springt der bei mir sporadisch von 100 cm auf 300 - 500 cm und wieder zurück.
Und warum misst der ohne Trigger und ohne Jumperwiderstand überhaupt? Und das auch noch bei ca. 90% der Messungen recht genau.

Ich denke, ich habe den Beitrag gelesen und umgesetzt. Leider habe ich aber keine Ahnung warum meine Hardware das macht, was sie macht.

Ok, jetzt habe ich es verstanden.
Mein Tipp:
Ohne Widerstand solltest du mit Trigger arbeiten, damit der Sensor auch weiß, was er machen soll. Der Trigger ist für den Sensor quasi das Startsignal. Damit sendet er ein US-Signal aus, und ab da misst er die Zeit.
Mit Widerstand soll das alles automatisch ? passieren.

Ok, nun...
Mir ist aufgefallen, dass die LED am SR04T ohne Trigger sehr stark frequentiert blinkte. Mit Trigger leuchtete Sie durchgängig.
Mit viiiiiiiieeeeel Geduld hab ich dann gemerkt, dass tatsächlich so alle 30 - 120 sek die LED am SR04T genau 1 x blinkt.
Das war der Ansatz, jetzt folgten gaaaaanz viiiieeeele Serial.print(DebugWas);

Ohne Wiederstand und mit Trigger ist auch meine bevorzugte Betriebsart. Irgendein schlauer Kopf hat sich da wahrscheinlich was dabei gedacht. :crazy_face:
Bei mir ist das jetzt so, dass nur jede 10 - 30te Messung tatsächlich klappt und einen anderen Wert als 0 liefert und zwar unabhängig von der häufigkeit der Abfrage. Also habe ich die Abfragehäufigkeit von 'alle 5000 ms' auf 'alle 100 ms' reduziert.
Gleichzeitig habe ich mit den Verzögerungszeiten beim Trigger rumgespielt, das trial and error Scenario hat allerdings keinen erkennbaren Erfog gebracht.

Mein Workarround ist jetzt folgender: Ich stoße alle 100 ms einen Messwet-Trigger an und sende das Resultat nicht zum MQTT Broker. Ist er 0, oder größer / kleiner als +/- 10% des letzten Messzykluses fliegt er raus. Habe ich 10 gültige Messwerte, bilde ich einen Mittelwert. Diesen benutze ich im nächsten Messzyklus für die +/- 10 % Filterung und der Mittelwert wird an den Broker gepuplished. So bekomme ich den Füllstand recht realitätsnah auf die Visualisierung.
Der Wasserstand ist ja auch sehr träge und eine Wertänderung nur beim Blumengießen oder bei Regen zu erwarten.
Allerdings ist das keine Option, um den Sensor als z.B. Bewegungsmelder einzusetzen.
Ich vermutete einen Hardware defekt und habe statt dem SR04T mal einen DHT11 auf die Pins gesteckt. Dieser funktionierte, weswegen ich den Vielleicht-Defekt am LoLin NodeMcu und dessen Pins eigentlich ausschließen kann.
Ich werde mir mal einen weiteren SR04T zulegen, um die Hardware-Defekt-Theorie zu verdichten oder sie aufzulösen. Zudem wird auf der Einkaufsliste ein D1 Mini stehen, da der einen onboard 5V Ausgang hat.

Ich werde die Erkenntnisse dann hier posten, falls ein zukunfts-Jemand auch auf so ein Phänomen stoßen sollte.

Grüße

wenn der NodeMCU an USB hängt, miss mal den VIN pin. Der hat doch 5V. Das ist bei einem D1 Mini sehr ähnlich.

Hast Du da etwas falsch verstanden oder falsch beschrieben? Alle Ausgänge des 8266 haben maximal 3,3V. Wenn Du den D1 mini mit USB betreibst, kannst Du 5V Versorgung am 5V Pin abnehmen.

Gruß Tommy

Hi @Tommy56 ,
natürlich habe ich's nicht verstanden - sonst wäre ich ja nicht hier. :grin:
Also der ESP2866 kommt nur mit 3.3 V zurecht - hab ich verstanden.
Das Board, wo der drauf sitzt schleift von USB die 5 V am ESP8266 vorbei direkt auf den VIN - OK
Wenn ich den SR04T aber da dran hänge, passiert leider nix.

Hi @noiasca ,
ohne zu messen versuchte ich das selbstverständlich mit dem VIN damals, da tat sich beim SR04T aber leider nix.
Hab jetzt mal gemessen:
Am VIN liegen bei mir 0.2 V an.
Als referenz:
Die 3.3 V Pins haben auch die gewollten 3.3 V.

Gruß

Messe mall so VIN und die USB Buchse(auf das Blech),neben VIN ist kein GND was auf manschen Boards drauf stecht Das ist so nur bei manchen ESP32 Sorry, ob das auch bei ESP8266 so ist müsste suchen.Also auf VIN wird keine Spannung drauf sein dort ist Diode eingebaut wen auf deinem Modul VU drauf ist, manchmal als Reserve kennzeichnet. Must mall messen :wink: