Skip to content
Snippets Groups Projects
Select Git revision
  • b94d1200e845c4060e40995cc387e0cf68fa1210
  • 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 2.75 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 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 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
    UnblockingTimer uTimer;
    
    
    //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 valuePoti = atoi(mData);  //wandle ASCII-Zeichen in Wert
      //Alternativ: sscanf(mData, "%d", &stateLED); //wandle ASCII-Zeichen in Wert
    
      int valueLED = constrain(map(valuePoti, 0, 1023, 0, 255), 0, 255); //passe analogRead-Wert für analogWrite an
      
      analogWrite(LED_PIN, valueLED);        //Setze Ausgang entsprechend dem empfangenen Wert
      analogWrite(LED2_PIN, 255-valueLED);   //Setze Ausgang invertiert zum 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 Taster ein und speichere Wert
      psnClient.publishOnChange(topicPublish, buttonState, CHANGE); //bereite Topic und Nutzdaten zum senden vor, wenn sich buttonState ändert
    }