TXT Problem Access Point und zweiten TXT 4.0 damit verbinden (MQTT)

Alles rund um TX(T) und RoboPro, mit ft-Hard- und Software
Computing using original ft hard- and software
Forumsregeln
Bitte beachte die Forumsregeln!
Benutzeravatar
calliope
Beiträge: 184
Registriert: 11 Mär 2025, 12:02

Re: TXT Problem Access Point und zweiten TXT 4.0 damit verbinden (MQTT)

Beitrag von calliope » 30 Jun 2026, 22:03

Hallo Holger,
na geht doch. Ich glaube die neue Welt heißt Internet of Things. Meine Motivation zu MQTT war eine Fernbedienung mit Joystick für den TXT40. Mit Bluetooth geht das ja nicht. Da brauchte ich zuerst einen zweiten TXT40 als Sender. Den ich dann durch Calliope mit dem WLAN Modul ersetzt habe.
Bei der Suche nach einem WLAN Modul hatte ich erst zwei Modelle, die zwar WLAN und TCP/IP konnten, aber kein MQTT.
Wenn WLAN drauf steht, ist nicht unbedingt MQTT drin.

Die Ausgabe in die Konsole macht der von alleine, wenn der mosquitto Prozess gestartet wird.
Screenshot 2026-06-30 213049.png
Screenshot 2026-06-30 213049.png (47.54 KiB) 284 mal betrachtet
Und das ist das einzige, was wir uns bei der neuen Firmware sparen können. Wenn wir den vorhandenen Broker nehmen.

Es ist aber weiter möglich einen eigenen zu starten.
Bei fischertechnik gibt es ein Beispiel, wie der Prozess auch wieder gekillt werden kann.

Sonst läuft dieser Linux Prozess durch bis der Strom aus geht. Das ist ein Server. Der hat nach dem Start nichts mehr mit Python zu tun.
Python beendet nur den MQTT Client.
I²C für Calliope, TXT 4.0 und RX Controller.
https://git.fischertechnik-cloud.com/users/i2c/projects

Benutzeravatar
fishfriend
Beiträge: 2548
Registriert: 26 Nov 2010, 11:45

Re: TXT Problem Access Point und zweiten TXT 4.0 damit verbinden (MQTT)

Beitrag von fishfriend » 04 Jul 2026, 12:41

Hallo...
Zweischenstand:
Sagen wirs mal so. Sooo eInfach geht es auch nicht, einen ESP32 in das Netzwerk einzuflechten.
Es ist schade, dass die Hersteller sich nicht mal auf einen Standart mit den Pinnen einigen konnten. Jeder kocht sein eigenes Süppchen.
Beispiele:
Wo ist nun Pin 4 und Pin 14?
Ich darf aber bei Wifi bestimmte Pins nicht als analoge Eingänge nutzen. Bei einigen sind ander Pinne nach Außen geführt.
Bei den Beispielen wird ein 10K NTC benutzt -aber- als Spannungsteiler mit einer speziellen Kurve. Natürlich ohne Schaltplan und ohne Angabe wie groß der Widerstand ist, geschweige denn wo nun Plus und GND angeschlossen werden sollen. Es gibt da bei den Beispielen im www zwei Möglichkeiten. Wer häte es auch anders vermutet.

Interessant ist auch die Latenzzeit, bis eine Reaktion kommt. Es ist auch die Frage ob nun eine serielle Schnittstelle für eine Ausgabe am "Seriellen Monitor" von der Arduino IDE genutzt wird oder nicht. Manchmal will der ESP32 auch nicht mehr und man muss ihn neu starten.
Auch manche USB-Netzteile mag mein Board einfach nicht. Man muss es einfach ausprobieren.

Hier mal ein funktionierendes Beispiel Programm für einen ESP 32 Wroom 32 (es gehen auch andere)
Den Taster kann man mit Pull down oder Pull up betreiben (bei drücken Plus oder halt Minus).
Wenn man den Taster drückt, wird eine MQTT Nachricht "off" an den Broker an das Topic SF/LED gesendet und die Temperatur übertragen.
Nach einer Zeit wir dann auch das Topic gelesen und die LED geht halt an (oder halt aus) wenn man gedrückt hält.
Es wechselt dann wieder beim loslassen.

Code: Alles auswählen

/*********
  Originalprojekt von
  :ref: https://randomnerdtutorials.com/esp32-mqtt-publish-subscribe-arduino-ide/
  https://docs.sunfounder.com/projects/kepler-kit/en/latest/iotproject/5.mqtt_pub.html
  Abgeändert für fischertechnik Broker TXT 4.0 mit
  ESP 32 Wroom 32 von Joyit
  Taster an Pin 14
  LED an Pin 4
  Thermowiderstand an Pin 32 (Wobei egal ist, ob einer angeschlossen ist oder ein anderer NTC)
  Ausprobiert mit Joy-it Sensorkid X40
  
  Ausgabe Serieller Monitor in der Arduino IDE mit 115200 Baud
  Programm schreibt und ließt Topics
  SF/LED
  SF/TEMP
  topic (Wird in diesem Fall von einem anderen TXT 4.0 erzeugt. Wird aber hier nicht gebraucht. Der zweite TXT 4.0 schreibt nur "Hallo" rein, was, wenn vorhanden auch ausgegeben wird.)
*********/

#include <WiFi.h>
#include <PubSubClient.h>
//#include <Wire.h>


// Replace the next variables with your SSID/Password combination
const char* ssid = "TXT4.0-abC1"; // Netzwerkname vom TXT 4.0 Access Point
const char* password = "123ABcd3"; // Passwort/Kennwort vom TXT 4.0 Access Point 

// Add your MQTT Broker address, example:
const char* mqtt_server = "192.168.8.2"; /Adresse vom Access Point des TXT 4.0
const char* unique_identifier = "ESP32"; // Wenn nur einer verwendet wir so lassen. Ansonsten einfach weiter nummerieren.

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
int value = 0;
String LEDio = "off";

// LED Pin
const int ledPin = 4;
const int buttonPin = 14;

// When you connect to WIFI, only 36 39 34 35 32 33 pins can be used for analog reading.
// Define constants
const int thermistorPin = 32; // Pin connected to the thermistor
const float referenceVoltage = 3.3;
const float referenceResistor = 10000; // Resistance value (10k)
const float beta = 3950; // Beta value (Typical Value)
const float nominalTemperature = 25; // Nominal temperature for calculating the temperature coefficient
const float nominalResistance = 10000; // Resistance value at nominal temperature



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

  // default settings
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);

  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
}

void setup_wifi() {
  delay(10);
  // We start by connecting to a WiFi network
  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.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* message, unsigned int length) {
  Serial.print("Message arrived on topic: ");
  Serial.print(topic);
  Serial.print(". Message: ");
  String messageTemp;

  for (int i = 0; i < length; i++) {
    Serial.print((char)message[i]);
    messageTemp += (char)message[i];
  }
  Serial.println();

  // If a message is received on the topic "SF/LED topic", you check if the message is either "on" or "off".
  // Changes the output state according to the message
  if (String(topic) == "SF/LED") {
    Serial.print("Changing state to ");
    if (messageTemp == "on") {
      Serial.println("on");
      digitalWrite(ledPin, HIGH);
    } else if (messageTemp == "off") {
      Serial.println("off");
      digitalWrite(ledPin, LOW);
    }
  }

}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect(unique_identifier)) {
      Serial.println("connected");
      // Subscribe
      client.subscribe("topic");
      client.subscribe("SF/TEMP");
      client.subscribe("SF/LED");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

float thermistor() {
  int adcValue = analogRead(thermistorPin); // Read ADC value
  float voltage = (adcValue * referenceVoltage) / 4095.0; // Calculate voltage
  float resistance = (voltage * referenceResistor) / (referenceVoltage - voltage); // Calculate thermistor resistance with updated configuration

  // Calculate temperature using the Beta parameter equation
  float tempK = 1 / (((log(resistance / nominalResistance)) / beta) + (1 / (nominalTemperature + 273.15)));
  
  float tempC = tempK - 273.15; // Get temperature in Celsius
  float tempF = 1.8 * tempC + 32.0; // Get temperature in Fahrenheit

  //Print temperature
  Serial.print("Temp: ");
  Serial.println(tempC);
  delay(200); //wait for 200 milliseconds
  return tempC;
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  // if the button pressed, publish the temperature to topic "SF/TEMP"
  if (digitalRead(buttonPin)) {
    client.publish("SF/LED", "on");
    long now = millis();
    if (now - lastMsg > 5000) {
      lastMsg = now;
      char tempString[8];
      dtostrf(thermistor(), 1, 2, tempString);
      client.publish("SF/TEMP", tempString);
    } 
  }
  else {
     client.publish("SF/LED", "off");
  }
      delay(200); //wait for 200 milliseconds;
  
}
Ist jetzt nich sooo Weltbewegend, aber es läuft. Der Broker (erste TXT 4.0) mit seinem Clienten oder der zweite TXT 4.0 kann nun auch auf das Topic SF/LED reagieren und ebenfals eine LED schalten oder was auch immer.

Was auch hilft, ist bei dem Board ein Elko bei VIN und GND bzw 3V3 und GND.
Die Maße dieser Boards sind für Steckbretter etwas ungünstig. Es gibt aber welche, die man aneinander reihen kann, wo es auch schmale Plus/Minus für gibt. Über so eine schmale Leiste kann man gut das Board in zwei Steckbretter (links und rechts) stecken. Dann hat man auch etwas Platz, um weitere Bauteile oder Kabel reinzusecken.
Bei "fertigen" Platinen mit Anschlussmöglichkeiten für diese Boards, hat man häufiger das Problem, dass die Anschlussbezeichnungen nicht mit dem eigenen Board übereinstimmen.
Mit freundlichen Grüßen
Holger
ft Riesenräder PDF: ftcommunity.de/knowhow/bauanleitungen
TX-Light: Arduino und ftduino mit RoboPro

Benutzeravatar
calliope
Beiträge: 184
Registriert: 11 Mär 2025, 12:02

Re: TXT Problem Access Point und zweiten TXT 4.0 damit verbinden (MQTT)

Beitrag von calliope » 04 Jul 2026, 20:35

Dann funktioniert doch MQTT. Für Arduino bin ich nicht zuständig. Ich habe Calliope...
I²C für Calliope, TXT 4.0 und RX Controller.
https://git.fischertechnik-cloud.com/users/i2c/projects

Antworten