Select Git revision
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
sPSN_Client1.ino 3.33 KiB
/**
*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
* - IR-Sender an Pin 11 IR-Empfänger an Pin10
*
* Arduino2: sPSN_Client1.ino (dieses Programm)
* - IR-Sender an Pin 11 IR-Empfänger an Pin10
* - Taster an Pin2
* - LED an Pin9
*
* Arduino3: sPSN_Client2.ino
* - IR-Sender an Pin 11 IR-Empfänger an Pin10
* - Poti an PinA0
* - LED an Pin9
*
* Funktion:
* Mit dem Poti an Arduino3 kann die LED am Arduino2 gedimmt werden.
* Mit dem Taster an Arduino2 kann die LED an Arduino2 ein-/ausgeschaltet werden.
* Arduino1 übernimmt das Verteilen der Nachrichten.
*
*date: 14.12.2020
*version: 1.0
*/
#include "SoftwareSerial.h"
#include "didacticNet.h"
//lege Geschwindigkeit für serielle Schnittstellen fest
#define SERIAL_BAUD 2400
byte ledPin = 9;
byte potiPin = A0;
int lastValue = 0;
//Maximale Nachrichten- und Topic-Länge:
//MAX_LEN_DATA = 20 Zeichen
//MAX_LEN_TOPICS = 10 Zeichen
//kann erhöht werden (z. B. #define MAX_LEN_TOPICS 20) , dann aber Arduino-Mega als Server sinnvoll
//Arrays für Empfangs- und Sende Topic
char topicSub[MAX_LEN_TOPICS] = "buttonVal";
char topicPub[MAX_LEN_TOPICS] = "potiVal";
void myCallback(char* mTopic, int mToLength, char* mData, int mDaLength) {
Serial.println("Callback: ");
Serial.print("Topic: ");
Serial.print(mTopic);
Serial.print("\tData: ");
Serial.println(mData);
//Setze Ausgang entsprechend dem gesendeten Wert
digitalWrite(ledPin, (bool)atoi(mData));
}
//lege Pins für SoftwareSerielle Schnittstelle fest
// Rx = 10 -> Empfänger | Tx = 11 -> Sender
SoftwareSerial sSerial(10, 11);
//Erzeuge Client-Instanz
didacticPSNetClient psnClient;
void setup() {
//Starte Serielle Schnittstelle (zum PC)
Serial.begin(SERIAL_BAUD);
Serial.print("\nStarting sPSNet: \nlistening to:\t");
Serial.println(topicSub);
Serial.print("sending to:\t");
Serial.println(topicPub);
//Starte SoftwareSerielle Schnittstelle (zu IR-Link-Modulen)
sSerial.begin(SERIAL_BAUD);
pinMode(ledPin, OUTPUT);
//Lege fest welche Serielle Schnittstelle für sPSN verwendet werden soll
//psnClient.setStream(sSerial);
//Lege Callback-Funktion fest (wird ausgeführt wenn neue Daten ankommen)
//psnClient.setCallback(myCallback);
psnClient.begin(sSerial, myCallback);
//Lege fest zu welchem Topic Daten empfangen werden sollen
psnClient.subscribe(topicSub);
}
void loop() {
//Verarbeiten der Daten, prüfen ob Netzwerk frei und versenden der Daten
psnClient.handleNetwork();
//lese Poti ein und speichere Wert
int currentValue = analogRead(potiPin);
//Übertrage Werte nur, wenn sie sich geändert haben
if (abs(currentValue - lastValue) > 20) {
//warte kurz, um nicht zu oft zu senden
delay(500);
//lese den Poti erneut ein
currentValue = analogRead(potiPin);
//setze den Inhalt des Puffer-Arrays auf 0
char data[MAX_LEN_DATA] = {0};
//wandle int-Wert in ASCII-Zeichen
itoa(currentValue, data, 10);
//sende analog-Wert
psnClient.publish(topicPub, data);
//speichere aktuellen Wert, um zu erkennen, ob er sich ändert
lastValue = currentValue;
}
}