diff --git a/examples/Advanced/sPSN_Client2/sPSN_Client2.ino b/examples/Advanced/sPSN_Client2/sPSN_Client2.ino index d7cde74b8cda0b5f75dbb95dc84dbbd15e19bf6b..a68f5db9fe9b41b826182f4853d6655332d14669 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 0000000000000000000000000000000000000000..34e9b616088aa0c6b5455b2db1dd0e6d19b2ab85 --- /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 0000000000000000000000000000000000000000..fb6c6649d6c1e9e7a96078cdbe683c50467ce347 --- /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 0000000000000000000000000000000000000000..cf88f7de8cbadc21e6e0a9e6ae91f7494c6bb996 --- /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" +}