Skip to content
Snippets Groups Projects
Select Git revision
  • d56149990d5c17a9f60e6367137fac7bf2ef8fdd
  • master default protected
  • dev_simplemode
  • dev_AddAppl
  • dev2
  • dev_stdCallback
  • dev
7 results

sPSN_Client2.ino

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    sPSN_Client2.ino 3.26 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
     * 
     * 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 BUTTON_PIN 2
    
    #define SEND_DELAY 500  //Mindestwarezeit zwischen zwei Sendevorgängen
    
    char topicPublish[MAX_LEN_TOPICS]   = "buttonVal";    //Topic für zu sendende (eigene) Daten
    char topicSubscribe[MAX_LEN_TOPICS] = "potiVal"; //Topic für zu empfangende Daten (von anderem TN)
    
    char payload[MAX_LEN_PAYLOAD] = {0};
    boolean newData  = false;
    boolean ledState = false;
    
    SoftwareSerial sSerial(10, 11); //Erzeuge SoftwareSerial-Instanz mit Rx = Pin10 -> Empfänger | Tx = Pin11 -> Sender
    
    didacticPSNetClient psnClient;  //Erzeuge PubSub-Client-Instanz
    
    
    //Callback-Funktion - wird beim Empfang neuer Daten aufgerufen
    void clientCallback(char* mTopic, int mToLength, char* mData, int mDaLength) {
      Serial.print("CB: ");
      Serial.print(mTopic);
      Serial.print(" - ");
      Serial.println(mData);
    
      int valueLED = atoi(mData);                                      //wandle ASCII-Zeichen in Wert
      valueLED = constrain(map(valueLED, 0, 1023, 0, 255), 0, 255); //passe analogRead-Wert für analogWrite an
      //Alternativ: sscanf(mData, "%d", &stateLED); //wandle ASCII-Zeichen in Wert
    
      analogWrite(LED_PIN, valueLED);              //Setze Ausgang entsprechend dem empfangenen Wert
    }
    
    
    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, clientCallback); //Starte PubSub Client an SoftwareSerial Schnittstelle
      //psnClient.begin(Serial, clientCallback); //Starte PubSub Client an Serial Schnittstelle
    
      psnClient.subscribe(topicSubscribe); //Lege fest zu welchem Topic Daten empfangen werden sollen
    }
    
    void loop() {
    
      psnClient.handleNetwork();               //Verarbeiten der Daten, prüfen ob Netzwerk frei und versenden der Daten
    
      boolean buttonState = digitalRead(BUTTON_PIN); //lese Poti ein und speichere Wert
    
      if(psnClient.edgeDetected(buttonState) == RISING){
        ledState = !ledState;                               //Invertiere zu sendenden Wert "LED-Zustand"
        itoa(ledState, payload, 10);                        //wandle Wert in ASCII-Zeichen
        //Alternativ: sprintf(payload, "%d", currentValue); //wandle Wert in ASCII-Zeichen 
        newData = true;                                     //Flag: neue Daten zum Senden
      }
      if(psnClient.timeElapsed(SEND_DELAY) && newData){     //Sende neue Daten wenn Mindestwaretzeit abgelaufen
        psnClient.publish(topicPublish, payload); //bereite Topic und Nutzdaten zum senden vor
        newData = false;                          //Flag: keine neuen Daten vorhanden
      }
    }