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.
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.
TXT Problem Access Point und zweiten TXT 4.0 damit verbinden (MQTT)
Forumsregeln
Bitte beachte die Forumsregeln!
Bitte beachte die Forumsregeln!
Re: TXT Problem Access Point und zweiten TXT 4.0 damit verbinden (MQTT)
I²C für Calliope, TXT 4.0 und RX Controller.
https://git.fischertechnik-cloud.com/users/i2c/projects
https://git.fischertechnik-cloud.com/users/i2c/projects
- fishfriend
- Beiträge: 2548
- Registriert: 26 Nov 2010, 11:45
Re: TXT Problem Access Point und zweiten TXT 4.0 damit verbinden (MQTT)
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.
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
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;
}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
TX-Light: Arduino und ftduino mit RoboPro
Re: TXT Problem Access Point und zweiten TXT 4.0 damit verbinden (MQTT)
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
https://git.fischertechnik-cloud.com/users/i2c/projects