From 3204095f724f29f0d0d6fb2535dad3b58e4399f5 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 12:19:15 +0100
Subject: [PATCH] updated Basic examples

---
 .../Advanced/sPSN_Client2/sPSN_Client2.ino    | 59 ++++++-------
 examples/Basic/sPSN_Client1/sPSN_Client1.ino  | 85 +++++++++++++++++++
 examples/Basic/sPSN_Client2/sPSN_Client2.ino  | 76 +++++++++++++++++
 .../sPSN_ClientMinimal/sPSN_ClientMinimal.ino | 66 ++++++++++++++
 4 files changed, 257 insertions(+), 29 deletions(-)
 create mode 100644 examples/Basic/sPSN_Client1/sPSN_Client1.ino
 create mode 100644 examples/Basic/sPSN_Client2/sPSN_Client2.ino
 create mode 100644 examples/Basic/sPSN_ClientMinimal/sPSN_ClientMinimal.ino

diff --git a/examples/Advanced/sPSN_Client2/sPSN_Client2.ino b/examples/Advanced/sPSN_Client2/sPSN_Client2.ino
index d7cde74..a68f5db 100644
--- a/examples/Advanced/sPSN_Client2/sPSN_Client2.ino
+++ b/examples/Advanced/sPSN_Client2/sPSN_Client2.ino
@@ -7,10 +7,10 @@
  * Für das Netwerk werden 3 Arduinos mit IR-Link-Modulen benötigt:
  *
  * Arduino1: sPSN_Broker.ino
- * 
+ *
  * Arduino2: sPSN_Client1.ino -> Sendet Wert des Potis | Empfängt Zustand des Tasters
  * (Poti an PinA0 | LED an Pin5)
- * 
+ *
  * Arduino3: sPSN_Client2.ino (dieses Programm) -> Sendet Zustand des Tasters | Empfängt Wert des Potis
  * (Taster an Pin2 | LED an Pin5)
  *
@@ -21,52 +21,53 @@
 #include "SoftwareSerial.h"
 #include "DidacticNet.h"
 
-#define SERIAL_BAUD 2400 //lege Geschwindigkeit für serielle Schnittstellen fest
+#define SERIAL_BAUD 2400 // lege Geschwindigkeit für serielle Schnittstellen fest
 
-#define LED_PIN    5
-#define LED2_PIN   6
+#define LED_PIN 5
+#define LED2_PIN 6
 #define BUTTON_PIN 2
 
-char topicPublish[MAX_LEN_TOPICS]   = "btnState";   //Topic unter dem (eigene) Daten veröffentlicht werden
-char topicSubscribe[MAX_LEN_TOPICS] = "potiVal";    //Topic (von anderem TN) das abboniert werden soll
+char topicPublish[MAX_LEN_TOPICS] = "btnNr";    // Topic unter dem (eigene) Daten veröffentlicht werden
+char topicSubscribe[MAX_LEN_TOPICS] = "potiNr"; // Topic (von anderem TN) das abboniert werden soll
 
-SoftwareSerial sSerial(10, 11); //Erzeuge SoftwareSerial-Instanz mit Rx = Pin10 -> Empfänger | Tx = Pin11 -> Sender
+SoftwareSerial sSerial(10, 11); // Erzeuge SoftwareSerial-Instanz mit Rx = Pin10 -> Empfänger | Tx = Pin11 -> Sender
 
-DidacticPSNetClient psnClient;  //Erzeuge PubSub-Client-Instanz
+DidacticPSNetClient psnClient; // Erzeuge PubSub-Client-Instanz
 
-//Callback-Funktion - wird beim Empfang neuer Daten aufgerufen
-void newData(char* topic, char* payload) {
+// Callback-Funktion - wird beim Empfang neuer Daten aufgerufen
+void newData(char *topic, char *payload)
+{
   Serial.print("New data from topic ");
   Serial.print(topic);
   Serial.print(": ");
   Serial.println(payload);
 
-  int valuePoti = atoi(payload);  //wandle ASCII-Zeichen in Wert
-  //Alternativ: sscanf(mData, "%d", &stateLED); //wandle ASCII-Zeichen in Wert
+  int valuePoti = atoi(payload); // wandle ASCII-Zeichen in Wert
+  // Alternativ: sscanf(mData, "%d", &stateLED); //wandle ASCII-Zeichen in Wert
 
   int mappedValue = map(valuePoti, 0, 1023, 0, 255);
-  int valueLED = constrain(mappedValue, 0, 255); //passe analogRead-Wert (0-1023) für analogWrite (0-255) an und begrenze
-  
-  analogWrite(LED_PIN, valueLED);        //Setze Ausgang entsprechend dem empfangenen Wert
-  analogWrite(LED2_PIN, 255-valueLED);   //Setze Ausgang invertiert zum empfangenen Wert
+  int valueLED = constrain(mappedValue, 0, 255); // passe analogRead-Wert (0-1023) für analogWrite (0-255) an und begrenze
+
+  analogWrite(LED_PIN, valueLED);        // Setze Ausgang entsprechend dem empfangenen Wert
+  analogWrite(LED2_PIN, 255 - valueLED); // Setze Ausgang invertiert zum empfangenen Wert
 }
 
+void setup()
+{
 
-void setup() {
-  
-  Serial.begin(SERIAL_BAUD);    //Starte Serielle Schnittstelle (zum PC)
-  sSerial.begin(SERIAL_BAUD);   //Starte SoftwareSerielle Schnittstelle (zu IR-Link-Modulen)
+  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 PubSub Client an SoftwareSerial Schnittstelle
-  
-  psnClient.subscribe(topicSubscribe); //Lege fest zu welchem Topic Daten empfangen werden sollen
+  psnClient.begin(sSerial, newData); // Starte PubSub Client an SoftwareSerial Schnittstelle
+
+  psnClient.subscribe(topicSubscribe); // Lege fest zu welchem Topic Daten empfangen werden sollen
 }
 
-void loop() {
+void loop()
+{
 
-  psnClient.handleNetwork();               //Verarbeiten der Daten, prüfen ob Netzwerk frei und versenden der Daten
+  psnClient.handleNetwork(); // Verarbeiten der Daten, prüfen ob Netzwerk frei und versenden der Daten
 
-  boolean buttonState = digitalRead(BUTTON_PIN); //lese Taster ein und speichere Wert
-  psnClient.publishOnChange(topicPublish, buttonState); //bereite Topic und Nutzdaten zum senden vor, wenn sich buttonState ändert
+  boolean buttonState = digitalRead(BUTTON_PIN);        // lese Taster ein und speichere Wert
+  psnClient.publishOnChange(topicPublish, buttonState); // bereite Topic und Nutzdaten zum senden vor, wenn sich buttonState ändert
 }
-
diff --git a/examples/Basic/sPSN_Client1/sPSN_Client1.ino b/examples/Basic/sPSN_Client1/sPSN_Client1.ino
new file mode 100644
index 0000000..34e9b61
--- /dev/null
+++ b/examples/Basic/sPSN_Client1/sPSN_Client1.ino
@@ -0,0 +1,85 @@
+/**
+ *file:  sPSN_Client1
+ *author:  letsgoING -> info@letsgoing.de
+ *
+ *description:
+ * Dieses Programm ist ein einfaches Beispiel für ein einfaches Pub-Sub-Netzwerk.
+ * Für das Netwerk werden 3 Arduinos mit IR-Link-Modulen benötigt:
+ *
+ * Arduino1: sPSN_Broker.ino
+ *
+ * Arduino2: sPSN_Client1.ino (dieses Programm)  -> Sendet Wert des Potis | Empfängt Zustand des Tasters
+ * (Poti an PinA0 | LED an Pin5)
+ *
+ * Arduino3: sPSN_Client2.ino -> Sendet Zustand des Tasters | Empfängt Wert des Potis
+ * (Taster an Pin2 | LED an Pin5)
+ *
+ * parameter:
+ *  MAX_LEN_PAYLOAD = 20 Zeichen (didacticNet.h)
+ *  MAX_LEN_TOPICS = 10 Zeichen (didacticNet.h)
+ *
+ *date:  06.07.2021
+ */
+#include <Arduino.h>
+#include "SoftwareSerial.h"
+#include "DidacticNet.h"
+
+#define SERIAL_BAUD 2400 // lege Geschwindigkeit für serielle Schnittstellen fest
+
+#define LED_PIN 5
+#define POTI_PIN A0
+
+#define THRESHOLD 10 // Schwellwert für min. Wertänderung
+
+char topicPublish[MAX_LEN_TOPICS] = "potiNr";  // Topic unter dem (eigene) Daten veröffentlicht werden
+char topicSubscribe[MAX_LEN_TOPICS] = "btnNr"; // Topic (von anderem TN) das abboniert werden soll
+
+SoftwareSerial sSerial(10, 11); // Erzeuge SoftwareSerial-Instanz mit Rx = Pin10 -> Empfänger | Tx = Pin11 -> Sender
+
+DidacticPSNetClient psnClient; // Erzeuge PubSub-Client-Instanz
+
+void setup()
+{
+
+  pinMode(LED_PIN, OUTPUT);
+
+  Serial.begin(SERIAL_BAUD); // Starte Serielle Schnittstelle (zum PC)
+
+  sSerial.begin(SERIAL_BAUD); // Starte SoftwareSerielle Schnittstelle (zu IR-Link-Modulen)
+  psnClient.begin(sSerial);   // Starte PubSub Client an SoftwareSerial Schnittstelle
+
+  psnClient.subscribe(topicSubscribe); // Lege fest zu welchem Topic Daten empfangen werden sollen
+}
+
+void loop()
+{
+
+  // VERWALTE NETZWERK
+  psnClient.handleNetwork(); // Verarbeiten der Daten, prüfen ob Netzwerk frei und versenden der Daten
+
+  // NEUE NACHRICHT VERFUEGBAR?
+  if (psnClient.available()) // Prüfen ob neue Nachricht verfügbar
+  {
+    char recievedTopic[MAX_LEN_TOPICS] = {0};
+    psnClient.readTopic(recievedTopic); // Einlesen des zuletzt empfangenen Topics in Array "recievedTopic"
+
+    bool recievedState = psnClient.readBooleanPayload(); // lese Payload als Boolean -> NUR WENN SICHER DASS BOOLEAN KOMMT!!
+
+    Serial.print("New data from ");
+    Serial.print(recievedTopic);
+    Serial.print(": ");
+    Serial.println(recievedState);
+
+    bool static stateLED = false; // static Variable verhält sich wie globale Variable (wird nicht gelöscht)
+
+    if (recievedState == true) // Wechsle Zustand der Variable "stateLED" wenn Taster beim Sender gedrueckt wurde
+    {
+      stateLED = !stateLED;            // Invertiere Zustand der LED => HIGH wird zu LOW / LOW wird zu HIGH
+      digitalWrite(LED_PIN, stateLED); // Setze Ausgang entsprechend dem empfangenen Wert
+    }
+  }
+
+  // BEREITE NACHRICHT BEI AENDERUNG AM POTI ZUM SENDEN VOR
+  int currentValue = analogRead(POTI_PIN); // lese Poti ein und speichere Wert
+  psnClient.publishOnChange(topicPublish, currentValue, THRESHOLD);
+}
diff --git a/examples/Basic/sPSN_Client2/sPSN_Client2.ino b/examples/Basic/sPSN_Client2/sPSN_Client2.ino
new file mode 100644
index 0000000..fb6c664
--- /dev/null
+++ b/examples/Basic/sPSN_Client2/sPSN_Client2.ino
@@ -0,0 +1,76 @@
+/**
+ *file:  sPSN_Client1
+ *author:  letsgoING -> info@letsgoing.de
+ *
+ *description:
+ * Dieses Programm ist ein einfaches Beispiel für ein einfaches Pub-Sub-Netzwerk.
+ * Für das Netwerk werden 3 Arduinos mit IR-Link-Modulen benötigt:
+ *
+ * Arduino1: sPSN_Broker.ino
+ *
+ * Arduino2: sPSN_Client1.ino -> Sendet Wert des Potis | Empfängt Zustand des Tasters
+ * (Poti an PinA0 | LED an Pin5)
+ *
+ * Arduino3: sPSN_Client2.ino (dieses Programm) -> Sendet Zustand des Tasters | Empfängt Wert des Potis
+ * (Taster an Pin2 | LED an Pin5)
+ *
+ *date:  06.07.2021
+ */
+
+#include <Arduino.h>
+#include "SoftwareSerial.h"
+#include "DidacticNet.h"
+
+#define SERIAL_BAUD 2400 // lege Geschwindigkeit für serielle Schnittstellen fest
+
+#define LED_PIN 5
+#define LED2_PIN 6
+#define BUTTON_PIN 2
+
+char topicPublish[MAX_LEN_TOPICS] = "btnNr";    // Topic unter dem (eigene) Daten veröffentlicht werden
+char topicSubscribe[MAX_LEN_TOPICS] = "potiNr"; // Topic (von anderem TN) das abboniert werden soll
+
+SoftwareSerial sSerial(10, 11); // Erzeuge SoftwareSerial-Instanz mit Rx = Pin10 -> Empfänger | Tx = Pin11 -> Sender
+
+DidacticPSNetClient psnClient; // Erzeuge PubSub-Client-Instanz
+
+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 PubSub Client an SoftwareSerial Schnittstelle
+
+  psnClient.subscribe(topicSubscribe); // Lege fest zu welchem Topic Daten empfangen werden sollen
+}
+
+void loop()
+{
+  // VERWALTE NETZWERK
+  psnClient.handleNetwork(); // Verarbeiten der Daten, prüfen ob Netzwerk frei und versenden der Daten
+
+  // NEUE NACHRICHT VERFUEGBAR?
+  if (psnClient.available()) // Prüfen ob neue Nachricht verfügbar
+  {
+    char recievedTopic[MAX_LEN_TOPICS] = {0};
+    psnClient.readTopic(recievedTopic); // Einlesen des zuletzt empfangenen Topics in Array "recievedTopic"
+
+    int recievedValue = psnClient.readIntegerPayload(); // lese Payload als Integer -> NUR WENN SICHER DASS INTEGER KOMMT!!
+
+    Serial.print("New data from ");
+    Serial.print(recievedTopic);
+    Serial.print(": ");
+    Serial.println(recievedValue);
+
+    int mappedValue = map(recievedValue, 0, 1023, 0, 255); // passe analogRead-Wert (0-1023) für analogWrite (0-255) an
+    int valueLED = constrain(mappedValue, 0, 255);         // begrenze für analogWrite (0-255)
+
+    analogWrite(LED_PIN, valueLED);        // Setze Ausgang entsprechend dem empfangenen Wert
+    analogWrite(LED2_PIN, 255 - valueLED); // Setze Ausgang invertiert zum empfangenen Wert
+  }
+
+  // BEREITE NACHRICHT BEI AENDERUNG AM TASTER ZUM SENDEN VOR
+  boolean buttonState = digitalRead(BUTTON_PIN);        // lese Taster ein und speichere Wert
+  psnClient.publishOnChange(topicPublish, buttonState); // bereite Topic und Nutzdaten zum senden vor, wenn sich buttonState ändert
+}
diff --git a/examples/Basic/sPSN_ClientMinimal/sPSN_ClientMinimal.ino b/examples/Basic/sPSN_ClientMinimal/sPSN_ClientMinimal.ino
new file mode 100644
index 0000000..cf88f7d
--- /dev/null
+++ b/examples/Basic/sPSN_ClientMinimal/sPSN_ClientMinimal.ino
@@ -0,0 +1,66 @@
+/**
+ *file:  sPSN_Client1
+ *author:  letsgoING -> info@letsgoing.de
+ *
+ *description:
+ * Dieses Programm ist das Minimal-Beispiel für ein einfaches Pub-Sub-Netzwerk.
+ * Es wird jede Sekunde ein analoger Messwert (AO) übertragen
+ * und die empfangenen Daten auf dem SerialMonitor ausgegeben
+ *
+ * Für das Netwerk werden 3 oder mehr Arduinos mit IR-Link-Modulen benötigt:
+ *
+ * Arduino1: sPSN_Broker.ino
+ *
+ * Arduino2-n: sPSN_ClientMinimal.ino (dieses Programm)
+ *
+ * parameter:
+ *  MAX_LEN_PAYLOAD = 20 Zeichen (didacticNet.h)
+ *  MAX_LEN_TOPICS = 10 Zeichen (didacticNet.h)
+ *
+ *date:  06.07.2021
+ */
+#include <Arduino.h>
+
+#include "SoftwareSerial.h"
+#include "DidacticNet.h"
+
+SoftwareSerial sSerial(10, 11); // Erzeuge SoftwareSerial-Instanz mit Rx = Pin10 -> Empfänger | Tx = Pin11 -> Sender
+
+DidacticPSNetClient psnClient; // Erzeuge PubSub-Client-Instanz
+
+void setup()
+{
+
+  Serial.begin(2400); // Starte Serielle Schnittstelle (zum PC)
+
+  sSerial.begin(2400);      // Starte SoftwareSerielle Schnittstelle (zu IR-Link-Modulen)
+  psnClient.begin(sSerial); // Starte PubSub Client an SoftwareSerial Schnittstelle
+
+  // Hier EMPFANGS-TOPIC ANPASSEN -> default "topic1"
+  psnClient.subscribe("topic1"); // Lege fest zu welchem Topic Daten empfangen werden sollen
+}
+
+void loop()
+{
+  // VERWALTE NETZWERK
+  psnClient.handleNetwork(); // Verarbeiten der Daten, prüfen ob Netzwerk frei und versenden der Daten
+
+  // NEUE NACHRICHT VERFUEGBAR?
+  if (psnClient.available()) // Prüfen ob neue Nachricht verfügbar
+  {
+    char recievedTopic[MAX_LEN_TOPICS] = {0};
+    char recievedPayload[MAX_LEN_PAYLOAD] = {0};
+
+    psnClient.readTopic(recievedTopic);     // Einlesen des zuletzt empfangenen Topics in Array "recievedTopic"
+    psnClient.readPayload(recievedPayload); // Einlesen der zuletzt empfangenen Payload in Array "recievedPayload"
+
+    Serial.print("New data from ");
+    Serial.print(recievedTopic);
+    Serial.print(": ");
+    Serial.println(recievedPayload);
+  }
+
+  // BEREITE NACHRICHT BEI AENDERUNG AM POTI ZUM SENDEN VOR
+  int currentValue = analogRead(A0);         // lese Poti ein und speichere Wert
+  psnClient.publish("topic1", currentValue); // Hier SENDE-TOPIC ANPASSEN -> default "topic1"
+}
-- 
GitLab