Skip to content
Snippets Groups Projects
Commit ff6ff78b authored by Anian Bühler's avatar Anian Bühler
Browse files

Updated Chat.ino and removed Server.ino

parent eed80fb8
No related branches found
No related tags found
2 merge requests!3Dev to master,!2Dev to Master
/** /**
*file: sPSN_Chat.ino * file: sPSN_Chat.ino
*author: letsgoING -> info@letsgoing.de * author: letsgoING -> info@letsgoing.de
*
* description:
* Dieses Programm ist ein Teil eines Beispiels für ein einfaches Pub-Sub-Chat-Netzwerk.
* *
*description: * Für dieses Chat-Netzwerk werden mindestens 3 Arduinos benötigt:
* 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 * Arduino1: sPSN_Broker.ino
* - IR-Sender an Pin 11 IR-Empfänger an Pin10 * - IR-Sender an Pin 11 IR-Empfänger an Pin10
* *
* Arduino2-n: sPSN_Chat.ino (dieses Programm) * Arduino2-n: sPSN_Chat.ino (dieses Programm)
* - IR-Sender an Pin 11 IR-Empfänger an Pin10 * - IR-Sender an Pin 11 IR-Empfänger an Pin10
* Funktion: * Funktion:
* Am Arduino2-n kann ein eigner Name (Sende-Topic) angeben werden. * Am Arduino2-n kann ein eigner Name (Sende-Topic) angeben werden.
* Danach kann angeben werden wem zugehört werden soll (Empfangs-Topics). * Danach kann angeben werden wem zugehört werden soll (Empfangs-Topics).
* Arduino1 (Server) übernimmt das Verteilen der Nachrichten. * Arduino1 (Server) übernimmt das Verteilen der Nachrichten.
* *
*date: 14.12.2020 * parameter:
*version: 1.0 * 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 "SoftwareSerial.h"
#include "didacticNet.h" #include "didacticNet.h"
//lege Geschwindigkeit für serielle Schnittstellen fest #define SERIAL_BAUD 2400 //lege Geschwindigkeit für serielle Schnittstellen fest
#define SERIAL_BAUD 2400
unsigned long lastTime = 0L;
bool dataReadDone = false; char readData[MAX_LEN_PAYLOAD * 5] = {'\0'}; //Array für eingelesene Daten (mit Puffer für zu lange Eingaben)
//Maximale Nachrichten- und Topic-Länge: char topicSub[MAX_LEN_TOPICS] = {""}; //Array für neues Empfangs-Topic
//MAX_LEN_PAYLOAD = 20 Zeichen char topicPub[MAX_LEN_TOPICS] = {""}; //Array für eigenes Sende-Topic
//MAX_LEN_TOPICS = 10 Zeichen
//kann erhöht werden (z. B. #define MAX_LEN_TOPICS 20) , dann aber Arduino-Mega als Server sinnvoll
char readData[MAX_LEN_PAYLOAD * 5] = {'\0'}; //Callback-Funktion wird bei neuen Daten automatisch aufgerufen
char arrayBuffer[MAX_LEN_PAYLOAD + 1] = {'\0'}; void clientCallback(char* mTopic, int mToLength, char* mData, int mDaLength) {
int counter = 0;
//Arrays für Empfangs- und Sende Topic
char topicSub[MAX_LEN_TOPICS] = {""};
char topicPub[MAX_LEN_TOPICS] = {""};
void myCallback(char* mTopic, int mToLength, char* mData, int mDaLength) {
Serial.print(mTopic); Serial.print(mTopic);
Serial.print(":\t"); Serial.print(":\t");
Serial.println(mData); Serial.println(mData);
} }
//lege Pins für SoftwareSerielle Schnittstelle fest SoftwareSerial sSerial(10, 11); // SoftwareSerial an Rx = Pin10 -> Empfänger | Tx = Pin11 -> Sender
// Rx = 10 -> Empfänger | Tx = 11 -> Sender
SoftwareSerial sSerial(10, 11);
//Erzeuge Client-Instanz didacticPSNetClient psnClient; //Erzeuge PubSub-Client-Instanz
didacticPSNetClient psnClient;
void setup() { void setup() {
//Starte Serielle Schnittstelle (zum PC)
Serial.begin(SERIAL_BAUD);
//Starte SoftwareSerielle Schnittstelle (zu IR-Link-Modulen)
sSerial.begin(SERIAL_BAUD);
//Lege fest welche Serielle Schnittstelle für sPSN verwendet werden soll Serial.begin(SERIAL_BAUD); //Starte Serielle Schnittstelle (zum PC)
//psnClient.setStream(sSerial);
//Lege Callback-Funktion fest (wird ausgeführt wenn neue Daten ankommen) sSerial.begin(SERIAL_BAUD); //Starte SoftwareSerielle Schnittstelle (zu IR-Link-Modulen)
//psnClient.setCallback(myCallback);
psnClient.begin(sSerial, myCallback); psnClient.begin(sSerial, clientCallback); //Starte PubSubClient mit SoftwareSerial und Callbackfunktion "clientCallback"
//AUSGABE INFOTEXT
Serial.print("Bitte den eigenen Namen mit einem # eingeben\nund mit Enter bestaetigen. -> "); Serial.print("Bitte den eigenen Namen mit einem # eingeben\nund mit Enter bestaetigen. -> ");
Serial.println("#DeinName"); Serial.println("#DeinName");
Serial.print("Gebe dann die Namen deiner Chatpartner mit einem @ ein. -> "); Serial.print("Gebe dann die Namen deiner Chatpartner mit einem @ ein. -> ");
Serial.println("@ChatPartner"); Serial.println("@ChatPartner");
Serial.println("Anschließend kannst du mit ihnen schreiben"); Serial.println("Anschließend kannst du mit ihnen schreiben.");
Serial.println("Pro Nachricht duerfen maximal 20 Zeichen eingegeben werden!");
Serial.println(); Serial.println();
Serial.println("HINWEIS:"); Serial.println("HINWEIS:");
Serial.println("Stelle das Zeilenende im SerialMonitor auf \"Zeilenumbruch (CR)\""); Serial.println("Stelle das Zeilenende im SerialMonitor auf \"Zeilenumbruch (CR)\"");
...@@ -86,60 +69,37 @@ void setup() { ...@@ -86,60 +69,37 @@ void setup() {
} }
void loop() { void loop() {
//Verarbeiten der Daten, prüfen ob Netzwerk frei und versenden der Daten
psnClient.handleNetwork();
//Lese Daten ein bis zum Zeichen Zeilenumbruch "CR"
if (Serial.available()) {
char buffer = Serial.read();
readData[counter] = buffer;
//Wenn Zeilenumbruch "CR", dann merke, dass Einlesen fertig
//und setze String Abschluss "\0" ans Ende
if (buffer == 13) {
readData[counter] = '\0';
counter = 0;
dataReadDone = true;
} else {
counter++;
}
}
//Wenn Daten fertig eingelesen wurden psnClient.handleNetwork(); //Verarbeiten der Daten, prüfen ob Netzwerk frei und versenden der Daten
if (dataReadDone && strlen(readData) <= MAX_LEN_PAYLOAD * 5 ) {
//Wenn "@" vorne steht, dann neuer Chatpartner anlegen (neues Topic dem zugehört wird) int nrOfAscii = readSerialData(Serial, readData, 13); //Einlesen der Nutzereingabe am SerialMonitor (Rueckgabewert = Anzahl der gelesenen Zeichen)
if (readData[0] == '@') {
//kopiere das neue Topic (den Namen des Chatpartners) in das passende Array if (nrOfAscii > 0) { //Wenn Daten fertig eingelesen wurden
strcpy(readData, readData + 1);
//Lege fest zu welchem Topic Daten empfangen werden sollen (den Namen des Chatpartners) if (readData[0] == '@') { //Wenn '@' vorne steht, dann neuer Chatpartner anlegen (neues Topic abonnieren)
psnClient.subscribe(readData); strcpy(readData, readData + 1); //verschiebe um ein Zeichen (entferne '@')
Serial.print("Kontakt zu "); 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.print(readData);
Serial.println(" hergestellt"); Serial.println(" abonniert");
} }
//Wenn "#" vorne steht, dann neuer eigener Name (neues Topic unter dem gesendet wird)
else if (readData[0] == '#') { else if (readData[0] == '#') { //Wenn '#' vorne steht, dann neuer eigener Name (neues Topic unter dem gesendet wird)
//kopiere das neue Topic (deinen neuen Namen) in das passende Array strcpy(topicPub, readData + 1); //kopiere das neue Topic (deinen neuen Namen) in das passende Array (+ 1 = entferne '#')
strcpy(topicPub, readData + 1);
Serial.print("Dein Name:\t"); Serial.print("Dein Name:\t"); //Ausgabe unter welchem Topic veröffentlicht wird
Serial.println(topicPub); Serial.println(topicPub);
} }
//Wenn normale Nachrichten eingegeben wurden, dann Daten unter eigenem Topic versenden
else { else { //Wenn "normale" Nachrichten eingegeben wurden, dann Daten unter eigenem Topic versenden
for (int i = 0; i * MAX_LEN_PAYLOAD < strlen(readData); i++) { readData[MAX_LEN_PAYLOAD] = '\0'; //Schreibe String-Ende an letzte Stelle im Array
memset(arrayBuffer, '\0', MAX_LEN_PAYLOAD + 1); psnClient.publish(topicPub, readData); //Bereite eingegebene Daten zum Senden vor
strncpy(arrayBuffer, &readData[MAX_LEN_PAYLOAD * i], dataReadDone);
//Serial.print("ReadData: ");Serial.print(readData);Serial.print("\t");Serial.print(arrayBuffer); Serial.print("Ich:\t"); //Ausgabe was unter deinem Topic veröffentlicht wird
psnClient.publish(topicPub, arrayBuffer); Serial.println(readData);
//Solange Daten zu versenden sind (wenn Text länger als max Länge einer Nachricht)
while (psnClient.isDataToSend()) {
//Verarbeiten der Daten, prüfen ob Netzwerk frei und versenden der Daten
psnClient.handleNetwork();
}
Serial.print("Ich:\t");
Serial.println(arrayBuffer);
}
} }
dataReadDone = false;
} }
} }
\ No newline at end of file
...@@ -14,9 +14,12 @@ ...@@ -14,9 +14,12 @@
* Arduino3: sPSN_Client2.ino -> Sendet Zustand des Tasters | Empfängt Wert des Potis * Arduino3: sPSN_Client2.ino -> Sendet Zustand des Tasters | Empfängt Wert des Potis
* (Taster an Pin2 | LED an Pin5) * (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 *date: 06.07.2021
*/ */
#include <Arduino.h> #include <Arduino.h>
#include "SoftwareSerial.h" #include "SoftwareSerial.h"
#include "didacticNet.h" #include "didacticNet.h"
......
/**
*file: sPSN_Server.ino
*author: letsgoING -> info@letsgoing.de
*
*description:
* Dieses Programm ist ein Teil eines Beispiels für ein einfaches Pub-Sub-Netzwerk.
*
* Für ein Sensor-Netwerk werden 3 Arduinos mit IR-Link-Modulen benötigt:
* Arduino1: sPSN_Broker.ino (dieses Programm)
* - IR-Sender an Pin 11 IR-Empfänger an Pin10
* Arduino2: sPSN_Client1.ino
* - 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
*
* Für ein Chat-Netzwerk werden mindestens 3 Arduinos benötigt:
* Arduino1: sPSN_Server.ino (dieses Programm)
* - IR-Sender an Pin 11 IR-Empfänger an Pin10
* Arduino2-n: sPSN_Chat.ino
* - IR-Sender an Pin 11 IR-Empfänger an Pin10
*
*date: 14.12.2020
*version: 1.0
*/
#include "SoftwareSerial.h"
#include "didacticNet.h"
//lege Geschwindigkeit für serielle Schnittstellen fest
#define SERIAL_BAUD 2400
//lege Pins für SoftwareSerielle Schnittstelle fest
// Rx = 10 -> Empfänger | Tx = 11 -> Sender
SoftwareSerial sSerial(10, 11);
//Erzeuge Broker-Instanz
didacticPSNetBroker psnBroker;
void setup() {
//Starte Serielle Schnittstelle (zum PC)
Serial.begin(SERIAL_BAUD);
//Starte SoftwareSerielle Schnittstelle (zu IR-Link-Modulen)
sSerial.begin(SERIAL_BAUD);
//Lege fest welche Serielle Schnittstelle für sPSN verwendet werden soll
//psnBroker.setStream(sSerial);
psnBroker.begin(sSerial);
}
void loop() {
//hier verarbeitet der Server alle Daten
psnBroker.handleNetwork();
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment