From 445f3ac65ee13997c15039a2ed292736378ae337 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anian=20B=C3=BChler?= <anian.buehler@reutlingen-university.de> Date: Fri, 19 Jan 2024 11:26:16 +0100 Subject: [PATCH] reorganized examples --- examples/Advanced/sPSN_Chat/sPSN_Chat.ino | 119 ++++++++++++++++ .../sPSN_Client1/sPSN_Client1.ino | 0 .../sPSN_Client2/sPSN_Client2.ino | 0 .../sPSN_ClientMinimal/sPSN_ClientMinimal.ino | 0 .../sPSN_PingTest/sPSN_PingTest.ino | 0 .../sPSN_PlotTopics/sPSN_PlotTopics.ino | 0 .../sPSN_PongTester/sPSN_PongTester.ino | 0 examples/Basic/sPSN_Chat/sPSN_Chat.ino | 132 ++++++++++++++++++ examples/sPSN_Chat/sPSN_Chat.ino | 117 ---------------- 9 files changed, 251 insertions(+), 117 deletions(-) create mode 100644 examples/Advanced/sPSN_Chat/sPSN_Chat.ino rename examples/{ => Advanced}/sPSN_Client1/sPSN_Client1.ino (100%) rename examples/{ => Advanced}/sPSN_Client2/sPSN_Client2.ino (100%) rename examples/{ => Advanced}/sPSN_ClientMinimal/sPSN_ClientMinimal.ino (100%) rename examples/{ => Advanced}/sPSN_PingTest/sPSN_PingTest.ino (100%) rename examples/{ => Advanced}/sPSN_PlotTopics/sPSN_PlotTopics.ino (100%) rename examples/{ => Advanced}/sPSN_PongTester/sPSN_PongTester.ino (100%) create mode 100644 examples/Basic/sPSN_Chat/sPSN_Chat.ino delete mode 100644 examples/sPSN_Chat/sPSN_Chat.ino diff --git a/examples/Advanced/sPSN_Chat/sPSN_Chat.ino b/examples/Advanced/sPSN_Chat/sPSN_Chat.ino new file mode 100644 index 0000000..1f4c24e --- /dev/null +++ b/examples/Advanced/sPSN_Chat/sPSN_Chat.ino @@ -0,0 +1,119 @@ +/** + * file: sPSN_Chat.ino + * author: letsgoING -> info@letsgoing.de + * + * description: + * Dieses Programm ist ein Teil eines Beispiels für ein einfaches Pub-Sub-Chat-Netzwerk. + * + * Für dieses Chat-Netzwerk werden mindestens 3 Arduinos benötigt: + * + * Arduino1: sPSN_Broker.ino + * - IR-Sender an Pin 11 IR-Empfänger an Pin10 + * + * Arduino2-n: sPSN_Chat.ino (dieses Programm) + * - IR-Sender an Pin 11 IR-Empfänger an Pin10 + * Funktion: + * Am Arduino2-n kann ein eigner Name (Sende-Topic) angeben werden. + * Danach kann angeben werden wem zugehört werden soll (Empfangs-Topics). + * Arduino1 (Server) übernimmt das Verteilen der Nachrichten. + * + * parameter: + * MAX_LEN_PAYLOAD = 20 Zeichen (didacticNet.h) + * MAX_LEN_TOPICS = 10 Zeichen (didacticNet.h) + * max Laenge der Eingegebenen Daten: 100 Zeichen (5*MAX_LEN_PAYLOAD) + * + * date: 13.07.2021 + */ +#include <Arduino.h> +#include "SoftwareSerial.h" +#include "DidacticNet.h" + +#define SERIAL_BAUD 2400 // lege Geschwindigkeit für serielle Schnittstellen fest + +#define TXT_STARTINFO "1. Den eigenen Namen mit einem # eingeben\nund mit Enter bestaetigen. -> \n#DeinName\n2. Die Namen deiner Chatpartner*innen mit einem @ eingeben ->\n@ChatPartner*in \t(mehrfach moeglich)\n3. Chatten:\nPro Nachricht duerfen maximal 20 Zeichen eingegeben werden!\n\nHINWEIS:\nStelle das Zeilenende im SerialMonitor auf \"ZEILENUMBRUCH (CR)\"\n*********************************************************************\n\n" + +char readData[MAX_LEN_PAYLOAD * 5] = {'\0'}; // Array für eingelesene Daten (mit Puffer für zu lange Eingaben) + +char topicSub[MAX_LEN_TOPICS] = {""}; // Array für neues Empfangs-Topic +char topicPub[MAX_LEN_TOPICS] = {""}; // Array für eigenes Sende-Topic + +// Callback-Funktion wird bei neuen Daten automatisch aufgerufen +void newData(char *topic, char *payload) +{ + // Ausgabe-> "Chatname": "geschriebene Nachricht" + Serial.print(topic); // topic entspricht im Chat dem NAmen des Chatpartners + Serial.print(":\t"); + Serial.println(payload); // payload enthält die geschriebene Nachricht +} + +SoftwareSerial sSerial(10, 11); // SoftwareSerial an Rx = Pin10 -> Empfänger | Tx = Pin11 -> Sender + +DidacticPSNetClient psnClient; // Erzeuge PubSub-Client-Instanz +SerialReader sReader; + +void setup() +{ + + Serial.begin(SERIAL_BAUD); // Starte Serielle Schnittstelle (zum PC) + + sSerial.begin(SERIAL_BAUD); // Starte SoftwareSerielle Schnittstelle (zu IR-Link-Modulen) + + psnClient.begin(sSerial, newData); // Starte PubSubClient mit SoftwareSerial und Callbackfunktion "clientCallback" + sReader.begin(Serial); + + // AUSGABE INFOTEXT + Serial.print(TXT_STARTINFO); +} + +void loop() +{ + + psnClient.handleNetwork(); // Verarbeiten der Daten, prüfen ob Netzwerk frei und versenden der Daten + + int nrOfAscii = sReader.readSerialData(readData, DN_ASCII_CR); // Einlesen der Nutzereingabe am SerialMonitor (Rueckgabewert = Anzahl der gelesenen Zeichen) + + if (nrOfAscii > 0) + { // Wenn Daten fertig eingelesen wurden + + // NEUEM CHATPARTNER FOLGEN + if (readData[0] == '@') + { // Wenn '@' vorne steht, dann neuer Chatpartner anlegen (neues Topic abonnieren) + strcpy(readData, &readData[1]); // verschiebe um ein Zeichen (entferne '@') + psnClient.subscribe(readData); // Lege fest zu welchem Topic Daten empfangen werden sollen (den Namen des Chatpartners) + + Serial.print("Nachrichten von "); // Ausgabe welches Topic abonniert wurde + Serial.print(readData); + Serial.println(" abonniert."); + } + + // CHATPARTNER ENTFOLGEN + else if (readData[0] == '!') + { // Wenn '@' vorne steht, dann neuer Chatpartner anlegen (neues Topic abonnieren) + strcpy(readData, &readData[1]); // verschiebe um ein Zeichen (entferne '!') + psnClient.unsubscribe(readData); // Lege fest zu welchem Topic Daten empfangen werden sollen (den Namen des Chatpartners) + + Serial.print("Nachrichten von "); // Ausgabe welches Topic abonniert wurde + Serial.print(readData); + Serial.println(" nicht mehr abonniert."); + } + + // EIGENEN NAMEN ANLEGEN + else if (readData[0] == '#') + { // Wenn '#' vorne steht, dann neuer eigener Name (neues Topic unter dem gesendet wird) + strcpy(topicPub, &readData[1]); // kopiere das neue Topic (deinen neuen Namen) in das passende Array (+ 1 = entferne '#') + // strcpy(topicPub, readData + 1); //-> Alternative zur Zeile oberhalb + + Serial.print("Dein Name:\t"); // Ausgabe unter welchem Topic veröffentlicht wird + Serial.println(topicPub); + } + + // NACHRICHT VERSCHICKEN (unter eigenem Namen) + else + { // Wenn "normale" Nachrichten eingegeben wurden, dann Daten unter eigenem Topic versenden + psnClient.publish(topicPub, readData); // Bereite eingegebene Daten zum Senden vor + + Serial.print("Ich:\t"); // Ausgabe was unter deinem Topic veröffentlicht wird + Serial.println(readData); + } + } +} \ No newline at end of file diff --git a/examples/sPSN_Client1/sPSN_Client1.ino b/examples/Advanced/sPSN_Client1/sPSN_Client1.ino similarity index 100% rename from examples/sPSN_Client1/sPSN_Client1.ino rename to examples/Advanced/sPSN_Client1/sPSN_Client1.ino diff --git a/examples/sPSN_Client2/sPSN_Client2.ino b/examples/Advanced/sPSN_Client2/sPSN_Client2.ino similarity index 100% rename from examples/sPSN_Client2/sPSN_Client2.ino rename to examples/Advanced/sPSN_Client2/sPSN_Client2.ino diff --git a/examples/sPSN_ClientMinimal/sPSN_ClientMinimal.ino b/examples/Advanced/sPSN_ClientMinimal/sPSN_ClientMinimal.ino similarity index 100% rename from examples/sPSN_ClientMinimal/sPSN_ClientMinimal.ino rename to examples/Advanced/sPSN_ClientMinimal/sPSN_ClientMinimal.ino diff --git a/examples/sPSN_PingTest/sPSN_PingTest.ino b/examples/Advanced/sPSN_PingTest/sPSN_PingTest.ino similarity index 100% rename from examples/sPSN_PingTest/sPSN_PingTest.ino rename to examples/Advanced/sPSN_PingTest/sPSN_PingTest.ino diff --git a/examples/sPSN_PlotTopics/sPSN_PlotTopics.ino b/examples/Advanced/sPSN_PlotTopics/sPSN_PlotTopics.ino similarity index 100% rename from examples/sPSN_PlotTopics/sPSN_PlotTopics.ino rename to examples/Advanced/sPSN_PlotTopics/sPSN_PlotTopics.ino diff --git a/examples/sPSN_PongTester/sPSN_PongTester.ino b/examples/Advanced/sPSN_PongTester/sPSN_PongTester.ino similarity index 100% rename from examples/sPSN_PongTester/sPSN_PongTester.ino rename to examples/Advanced/sPSN_PongTester/sPSN_PongTester.ino diff --git a/examples/Basic/sPSN_Chat/sPSN_Chat.ino b/examples/Basic/sPSN_Chat/sPSN_Chat.ino new file mode 100644 index 0000000..4cff2e4 --- /dev/null +++ b/examples/Basic/sPSN_Chat/sPSN_Chat.ino @@ -0,0 +1,132 @@ +/** + * file: sPSN_Chat.ino + * author: letsgoING -> info@letsgoing.de + * + * description: + * Dieses Programm ist ein Teil eines Beispiels für ein einfaches Pub-Sub-Chat-Netzwerk. + * + * Für dieses Chat-Netzwerk werden mindestens 3 Arduinos benötigt: + * + * Arduino1: sPSN_Broker.ino + * - IR-Sender an Pin 11 IR-Empfänger an Pin10 + * + * Arduino2-n: sPSN_Chat.ino (dieses Programm) + * - IR-Sender an Pin 11 IR-Empfänger an Pin10 + * Funktion: + * Am Arduino2-n kann ein eigner Name (Sende-Topic) angeben werden. + * Danach kann angeben werden wem zugehört werden soll (Empfangs-Topics). + * Arduino1 (Server) übernimmt das Verteilen der Nachrichten. + * + * parameter: + * MAX_LEN_PAYLOAD = 20 Zeichen (DidacticNet.h) + * MAX_LEN_TOPICS = 10 Zeichen (DidacticNet.h) + * MAX_LEN_USERINPUT = 41 Zeichen (DidacticNet.h) + * + * date: 13.07.2021 + */ +#include <Arduino.h> +#include "SoftwareSerial.h" +#include "DidacticNet.h" + +#define SERIAL_BAUD 2400 // lege Geschwindigkeit für serielle Schnittstellen fest + +#define TXT_STARTINFO "1. Den eigenen Namen mit einem # eingeben\nund mit Enter bestaetigen. -> \n#DeinName\n2. Die Namen deiner Chatpartner*innen mit einem @ eingeben ->\n@ChatPartner*in \t(mehrfach moeglich)\n3. Chatten:\nPro Nachricht duerfen maximal 20 Zeichen eingegeben werden!\n\nHINWEIS:\nStelle das Zeilenende im SerialMonitor auf \"ZEILENUMBRUCH (CR)\"\n*********************************************************************\n\n" + +char topicPub[MAX_LEN_TOPICS] = {""}; // Array für eigenes Sende-Topic + +// Callback-Funktion wird bei neuen Daten automatisch aufgerufen +void newData(char *topic, char *payload) +{ + // Ausgabe-> "Chatname": "geschriebene Nachricht" + Serial.print(topic); // topic entspricht im Chat dem NAmen des Chatpartners + Serial.print(":\t"); + Serial.println(payload); // payload enthält die geschriebene Nachricht +} + +SoftwareSerial sSerial(10, 11); // SoftwareSerial an Rx = Pin10 -> Empfänger | Tx = Pin11 -> Sender + +DidacticPSNetClient psnClient; // Erzeuge PubSub-Client-Instanz +serialMonitorUI serialUI; // Vereinfachtes Einlesen von Text und Befehlen per SerialMonitor + +void setup() +{ + + Serial.begin(SERIAL_BAUD); // Starte Serielle Schnittstelle (zum PC) + serialUI.begin(Serial); // Starte UserInterface via SerialMonitor + + sSerial.begin(SERIAL_BAUD); // Starte SoftwareSerielle Schnittstelle (zu IR-Link-Modulen) + psnClient.begin(sSerial); // Starte PubSubClient mit SoftwareSerial und Callbackfunktion "clientCallback" + + // AUSGABE INFOTEXT + Serial.print(TXT_STARTINFO); +} + +void loop() +{ + // NETWERK VERWALTEN + //******************** + psnClient.handleNetwork(); // Verarbeiten der Daten, prüfen ob Netzwerk frei und versenden der Daten + + // NEUE NACHRICHT? + //******************** + if (psnClient.available()) // Prüfen ob neue Nachricht verfügbar + { + char chatName[MAX_LEN_TOPICS] = {0}; // Array um Name von Chatpartner:in zu Speichern + char chatMessage[MAX_LEN_PAYLOAD] = {0}; // Array um Nachricht von Chatpartner:in zu Speichern + + psnClient.readTopic(chatName); // Einlesen des zuletzt empfangenen Topics (entspricht im Chat dem Namen) + psnClient.readPayload(chatMessage); // Einlesen der zuletzt empfangenen Payload (enthält die geschriebene Nachricht)) + + // AUSGABE EMPFANGENE NACHRICHT AUF SERIALMONITOR + Serial.print(chatName); + Serial.print(":\t"); + Serial.println(chatMessage); + } + + // NEUE EINGABE? + //******************** + if (serialUI.available()) // Prüfen ob neue Eingabe am SerialMonitor verfügbar + { + char command = serialUI.readCommand(); // Lese Steuerzeichen aus Eingabe aus -> @ / ! / # + + char userInput[MAX_LEN_PAYLOAD + 2]; + serialUI.readUserInput(userInput); // Speichere eingegebenen Text in Array + + // NEUEM CHATPARTNER FOLGEN + if (command == '@') + { // Wenn '@' vorne steht, dann neuer Chatpartner anlegen (neues Topic abonnieren) + psnClient.subscribe(userInput); // Lege fest zu welchem Topic Daten empfangen werden sollen (den Namen des Chatpartners) + + Serial.print("Nachrichten von "); // Ausgabe welches Topic abonniert wurde + Serial.print(userInput); + Serial.println(" abonniert."); + } + + // CHATPARTNER ENTFOLGEN + else if (command == '!') + { // Wenn '!' vorne steht, dann eingegebenen Chatpartner entfolgen + psnClient.unsubscribe(userInput); // Lege fest zu welchem Topic keine Daten mehr empfangen werden sollen (Namen des Chatpartners) + + Serial.print("Nachrichten von "); // Ausgabe welches Topic "entabonniert" wurde + Serial.print(userInput); + Serial.println(" nicht mehr abonniert."); + } + + // EIGENEN NAMEN ANLEGEN + else if (command == '#') + { // Wenn '#' vorne steht, dann neuer eigener Name (neues Topic unter dem gesendet wird) + strcpy(topicPub, userInput); // kopiere das neue Topic (deinen neuen Namen) in das topicPub-Array + Serial.print("Dein Name:\t"); // Ausgabe unter welchem Topic ab jetzt veröffentlicht wird + Serial.println(topicPub); + } + + // NACHRICHT VERSCHICKEN (unter eigenem Namen) + else + { // Wenn "normale" Nachrichten eingegeben wurden, dann Daten unter eigenem Topic versenden + psnClient.publish(topicPub, userInput); // Bereite eingegebene Daten zum Senden vor + + Serial.print("Ich:\t"); // Ausgabe was unter deinem Topic veröffentlicht wird + Serial.println(userInput); + } + } +} \ No newline at end of file diff --git a/examples/sPSN_Chat/sPSN_Chat.ino b/examples/sPSN_Chat/sPSN_Chat.ino deleted file mode 100644 index da9efdf..0000000 --- a/examples/sPSN_Chat/sPSN_Chat.ino +++ /dev/null @@ -1,117 +0,0 @@ -/** - * file: sPSN_Chat.ino - * author: letsgoING -> info@letsgoing.de - * - * description: - * Dieses Programm ist ein Teil eines Beispiels für ein einfaches Pub-Sub-Chat-Netzwerk. - * - * Für dieses Chat-Netzwerk werden mindestens 3 Arduinos benötigt: - * - * Arduino1: sPSN_Broker.ino - * - IR-Sender an Pin 11 IR-Empfänger an Pin10 - * - * Arduino2-n: sPSN_Chat.ino (dieses Programm) - * - IR-Sender an Pin 11 IR-Empfänger an Pin10 - * Funktion: - * Am Arduino2-n kann ein eigner Name (Sende-Topic) angeben werden. - * Danach kann angeben werden wem zugehört werden soll (Empfangs-Topics). - * Arduino1 (Server) übernimmt das Verteilen der Nachrichten. - * - * parameter: - * MAX_LEN_PAYLOAD = 20 Zeichen (didacticNet.h) - * MAX_LEN_TOPICS = 10 Zeichen (didacticNet.h) - * max Laenge der Eingegebenen Daten: 100 Zeichen (5*MAX_LEN_PAYLOAD) - * - * date: 13.07.2021 -*/ -#include <Arduino.h> -#include "SoftwareSerial.h" -#include "DidacticNet.h" - -#define SERIAL_BAUD 2400 //lege Geschwindigkeit für serielle Schnittstellen fest - -char readData[MAX_LEN_PAYLOAD * 5] = {'\0'}; //Array für eingelesene Daten (mit Puffer für zu lange Eingaben) - -char topicSub[MAX_LEN_TOPICS] = {""}; //Array für neues Empfangs-Topic -char topicPub[MAX_LEN_TOPICS] = {""}; //Array für eigenes Sende-Topic - -//Callback-Funktion wird bei neuen Daten automatisch aufgerufen -void newData(char* topic, char* payload) { - //Ausgabe-> "Chatname": "geschriebene Nachricht" - Serial.print(topic); //topic entspricht im Chat dem NAmen des Chatpartners - Serial.print(":\t"); - Serial.println(payload); //payload enthält die geschriebene Nachricht -} - -SoftwareSerial sSerial(10, 11); // SoftwareSerial an Rx = Pin10 -> Empfänger | Tx = Pin11 -> Sender - -DidacticPSNetClient psnClient; //Erzeuge PubSub-Client-Instanz -SerialReader sReader; - - -void setup() { - - Serial.begin(SERIAL_BAUD); //Starte Serielle Schnittstelle (zum PC) - - sSerial.begin(SERIAL_BAUD); //Starte SoftwareSerielle Schnittstelle (zu IR-Link-Modulen) - - psnClient.begin(sSerial, newData); //Starte PubSubClient mit SoftwareSerial und Callbackfunktion "clientCallback" - sReader.begin(Serial); - - //AUSGABE INFOTEXT - Serial.print("1. Den eigenen Namen mit einem # eingeben\nund mit Enter bestaetigen. -> "); - Serial.println("#DeinName"); - Serial.print("2. Die Namen deiner Chatpartner*innen mit einem @ eingeben -> "); - Serial.println("@ChatPartner*in \t (mehrfach moeglich)"); - Serial.print("3. Chatten: "); - Serial.println("Pro Nachricht duerfen maximal 20 Zeichen eingegeben werden!"); - Serial.println(); - Serial.println("HINWEIS:"); - Serial.println("Stelle das Zeilenende im SerialMonitor auf \"ZEILENUMBRUCH (CR)\""); - Serial.println("*********************************************************************\n"); -} - -void loop() { - - psnClient.handleNetwork(); //Verarbeiten der Daten, prüfen ob Netzwerk frei und versenden der Daten - - int nrOfAscii = sReader.readSerialData(readData, DN_ASCII_CR); //Einlesen der Nutzereingabe am SerialMonitor (Rueckgabewert = Anzahl der gelesenen Zeichen) - - if (nrOfAscii > 0) { //Wenn Daten fertig eingelesen wurden - - //NEUEM CHATPARTNER FOLGEN - if (readData[0] == '@') { //Wenn '@' vorne steht, dann neuer Chatpartner anlegen (neues Topic abonnieren) - strcpy(readData, &readData[1]); //verschiebe um ein Zeichen (entferne '@') - psnClient.subscribe(readData); //Lege fest zu welchem Topic Daten empfangen werden sollen (den Namen des Chatpartners) - - Serial.print("Nachrichten von "); //Ausgabe welches Topic abonniert wurde - Serial.print(readData); - Serial.println(" abonniert."); - } - //CHATPARTNER ENTFOLGEN - else if (readData[0] == '!') { //Wenn '@' vorne steht, dann neuer Chatpartner anlegen (neues Topic abonnieren) - strcpy(readData, &readData[1]); //verschiebe um ein Zeichen (entferne '!') - psnClient.unsubscribe(readData); //Lege fest zu welchem Topic Daten empfangen werden sollen (den Namen des Chatpartners) - - Serial.print("Nachrichten von "); //Ausgabe welches Topic abonniert wurde - Serial.print(readData); - Serial.println(" nicht mehr abonniert."); - } - //EIGENEN NAMEN ANLEGEN - else if (readData[0] == '#') { //Wenn '#' vorne steht, dann neuer eigener Name (neues Topic unter dem gesendet wird) - strcpy(topicPub, &readData[1]); //kopiere das neue Topic (deinen neuen Namen) in das passende Array (+ 1 = entferne '#') - //strcpy(topicPub, readData + 1); //-> Alternative zur Zeile oberhalb - - Serial.print("Dein Name:\t"); //Ausgabe unter welchem Topic veröffentlicht wird - Serial.println(topicPub); - } - //NACHRICHT VERSCHICKEN (unter eigenem Namen) - else { //Wenn "normale" Nachrichten eingegeben wurden, dann Daten unter eigenem Topic versenden - psnClient.publish(topicPub, readData); //Bereite eingegebene Daten zum Senden vor - - Serial.print("Ich:\t"); //Ausgabe was unter deinem Topic veröffentlicht wird - Serial.println(readData); - } - } - -} \ No newline at end of file -- GitLab