Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // P8, Marie Steinbrügge und Lisa-Marie Rosendorff
- // 2019 Marie Steinbrügge
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// BIBLIOTHEKEN
- //Bibliotheken implementieren für MQTT und ESP (beinhalten spezifische Funktionen)
- //extern "C" wird verwendet, um eine C-Bibliothek einzubinden
- extern "C" {
- #include <user_interface.h>
- }
- #include <ESP8266WiFi.h> // mit dieser Bibliothek kann der ESP mit einem WIFI-Netzwerk verbunden werden, sodass Daten gesendet und empfangen werden können
- #include <PubSubClient.h> // Bibliothek bietet Client-Funktion zum einfachen Publizieren/Abonnieren von Nachrichten an einen Server, der MQTT unterstützt
- #include<Wire.h> // diese Bibliothek ermöglicht die Kommunikation mit I2C Geräten
- #include <Adafruit_NeoPixel.h> // Bibliothek zur Verwendung des Neo-Pixel LED-Rings
- #ifdef _AVR_
- #include <avr/power.h>
- #endif
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// WICHTIGE VARIABLEN
- Adafruit_NeoPixel pixels = Adafruit_NeoPixel(8, 1, NEO_GRB + NEO_KHZ800); // Definition des verwendeten Neo-Pixel LED-Rings
- const int MPU=0x68;
- int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ,PAcX,PAcY,PAcZ,PGyX,PGyY,PGyZ;
- uint8_t rgb_values[3];
- bool ActivatePuck = false;
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// MQTT-STUFF
- // konstante Variablen für das verwendete Netzwerk des Servers eintragen!
- // notwendig für eine funktionierende Verbindung!
- const char* ssid = "LauritzsMac"; // Name des Netzwerks
- const char* password = "Toastbrot"; // Passwort des Netzwerks
- const char* mqtt_server = "192.168.137.149"; // IP-Adresse des Geräts, auf welchem der Mosquitto-Broker läuft
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// MQTT-STUFF
- bool WiFi_MQTT_connect;
- bool WiFi_Sniffer_connect;
- const char PUCK_ID [] = "123";
- char Topic_PuckID [64];
- char Topic_MyTurn [64];
- //Erstellt einen Client, der eine Verbindung zu einer bestimmten Internet-IP-Adresse und einem Port herstellen kann
- WiFiClient espClient;
- //Erzeugt eine Client-Instanz, welcher ermöglicht wird, mit dem Mosquitto-Broker zu kommunizieren
- PubSubClient client(espClient);
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- void setup() {
- // Stellt die Datenrate in Bits pro Sekunde für die serielle Datenübetragung ein
- Serial.begin(115200);
- delay(1000);
- setup_wifi(); // die Funktion zur Verbindung zum WIFI wird aufgerufen
- client.setServer(mqtt_server, 1883); // der Server und der zugehörige Port werden übergeben
- client.setCallback(callback);
- pixels.begin();
- pixels.clear();
- pixels.setBrightness(60); // Helligkeit der Pixel des LED-Rings definieren
- // alle 8 Pixel in einem gold-gelb Ton einfärben
- for(int i=0;i<8;i++){
- pixels.setPixelColor(i, pixels.Color(255,215,0));
- }
- pixels.show(); // alle Pixel werden auf einmal aktualisiert, sobald die Show-Methode aufgerufen wird
- Wire.pins(0, 2);
- Wire.begin(); // Rückgriff auf I2C, um mit dem Acc./Gyr. kommunizieren zu können
- Wire.beginTransmission(MPU);
- Wire.write(0x6B);
- Wire.write(0);
- Wire.endTransmission(true);
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// MQTT-STUFF
- void setup_wifi() {
- //die Verbindung zum Netzwerk wird hergestellt
- Serial.println();
- Serial.print("Connecting to ");
- Serial.println(ssid);
- //ESP 8266versucht sich einzuloggen
- WiFi.begin(ssid, password);
- //Während noch keine Verbindung besteht, werden Punkte ausgegeben
- //WiFi.status() gibt den Status der WiFi-Verbindung zurück
- while (WiFi.status() != WL_CONNECTED) {
- delay(500);
- Serial.print(".");
- }
- //Sobald eine Verbindung besteht wird dies ausgegeben
- Serial.println("");
- Serial.println("WiFi connected");
- Serial.println("IP address: ");
- Serial.println(WiFi.localIP());
- }
- //Funktion für den Fall, dass keine Verbindung aufgebaut werden kann bzw. die Verbindung verloren ging
- void reconnect() {
- // Loopt, bis ESP8266 wieder eine Verbindung hat
- while (!client.connected()) {
- Serial.print("Attempting MQTT connection...");
- //Client versucht sich zu verbinden
- if (client.connect("ESP8266ClientPublisher2")) {
- Serial.println("connected");
- }
- else {
- //Falls keine Verbindung hergestellt werden konnte, wird nach 5 Sekunden ein Neuversuch gestartet
- Serial.print("failed, rc=");
- Serial.print(client.state());
- Serial.println(" try again in 5 seconds");
- delay(5000);
- }
- }
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// MQTT-CALLBACK
- // eingehende Nachrichten werden in der Callback-Funktion analysiert und interpretiert
- void callback(char* topic, byte* payload, unsigned int length) {
- char msg[length+1];
- for (int i = 0; i < length; i++) {
- msg[i] = (char)payload[i];
- }
- msg[length] = '\0';
- Serial.println("");
- // Sollte "AN" als Nachricht eingehen, so…
- if(strcmp(msg,"AN")==0){
- ActivatePuck = true; // …wird der Puck aktiviert
- client.publish("Test/Debug", "Ich wurde angesprochen als 123");
- }
- // Sollte "AUS" als Nachricht eingehen, so…
- else if(strcmp(msg,"AUS")==0){
- ActivatePuck = false; // …wird der Puck deaktivert
- client.publish("Test/Debug", "Ich wurde NICHT angesprochen als 123");
- }
- /*// Sollte "Error" als Nachricht eingehen, so…
- else if(strcmp(msg,"Fail")==0){
- fault = false; // …wird der Puck deaktivert…
- client.publish("Fault", "Fault ist false.");
- }*/
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// SENSORDATEN
- void Sensordaten() {
- // es wird wieder auf die I2C Methode zurückgegriffen und die Sensordaten werden ausgelesen
- Wire.beginTransmission(MPU);
- Wire.write(0x3B);
- Wire.endTransmission(false);
- Wire.requestFrom(MPU,12,true);
- PAcX = AcX;
- PAcY= AcY;
- PAcZ = AcZ;
- PGyX = GyX;
- PGyY = GyY;
- PGyZ = GyZ;
- AcX=Wire.read()<<8|Wire.read();
- AcY=Wire.read()<<8|Wire.read();
- AcZ=Wire.read()<<8|Wire.read();
- GyX=Wire.read()<<8|Wire.read();
- GyY=Wire.read()<<8|Wire.read();
- GyZ=Wire.read()<<8|Wire.read();
- // sollte keine Bewegung des Pucks erfolgen und der Puck aktiv sein, so…
- if((abs(AcX-PAcX)<=8000 || abs(AcY-PAcY)<=8000 || abs(AcZ-PAcZ)<=8000) && ActivatePuck == true){
- client.publish("Test/Debug", "Ich schalten die LED ein");
- pixels.setBrightness(60); // …wird die Helligkeit und
- for(int i=0;i<8;i++){ // …die Farbe der Pixel des LED-Rings festgelegt
- pixels.setPixelColor(i, pixels.Color(255,215,0));
- }
- pixels.show(); // alle Pixel werden auf einmal aktualisiert, sobald die Show-Methode aufgerufen wird
- client.publish("Test/Debug", "Die LED ist an");
- }
- // sollte eine Bewegung des Pucks erfolgen und der Puck aktiv sein, so…
- else if((abs(AcX-PAcX)>=8000 || abs(AcY-PAcY)>=8000 || abs(AcZ-PAcZ)>=8000) && ActivatePuck == true){
- client.publish("Test/Debug", "Ich habe Bewegung gemessen");
- pixels.setBrightness(0); // …wird die Helligkeit auf 0 gesetzt
- pixels.show(); // alle Pixel werden auf einmal aktualisiert, sobald die Show-Methode aufgerufen wird
- // ESP-01 veröffentlicht auf einer Topic mit seiner Puck-ID als Variablen
- snprintf(Topic_PuckID, sizeof(Topic_PuckID), "Badezimmer/Sensordaten/%s/Bewegung", PUCK_ID);
- client.publish(Topic_PuckID, PUCK_ID); // …eine Info hierüber wird an das Hintergrundscript geschickt.
- client.publish("Test/Debug", "Ich die LED ausgeschaltet");
- }
- /*// sollte eine Bewegung des Pucks vorhanden und der Puck nicht aktiv sein, so…
- else if((abs(AcX-PAcX)>=6000 || abs(AcY-PAcY)>=6000 || abs(AcZ-PAcZ)>=6000) && ActivatePuck == false && fault == false){
- fault = true;
- //…wird eine Error-Nachricht veröffentlicht und…
- snprintf(Topic_PuckID, sizeof(Topic_PuckID), "Badezimmer/Sensordaten/%s/Error", PUCK_ID);
- client.publish(Topic_PuckID, PUCK_ID);
- //client.publish("TEST", "Error-404"); // …eine Kontrollnachricht ausgegeben
- }*/
- // sollte keiner der oberen Fälle zutreffen, so ist der Puck deaktiviert, ausgeschaltet und es liegt keine Bewegung vor
- else{
- pixels.setBrightness(0);
- //client.publish("Test/Debug", "keiner der Fälle ist eingetreten");
- }
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- void loop() {
- //setup_wifi();
- Sensordaten();
- // solange der ESP-01 nicht mit dem WIFI-Netwerk verbunden ist, wird versucht, sich neu zu verbinden
- if (!client.connected()) {
- reconnect();
- }
- // ESP-01 abonniert eine Topic mit seiner Puck-ID als Variablen
- snprintf(Topic_MyTurn, sizeof(Topic_MyTurn), "Badezimmer/Zähneputzen/Step/%s", PUCK_ID);
- client.subscribe(Topic_MyTurn);
- client.subscribe("Badezimmer/Sensordaten/Error");
- pixels.show(); // alle Pixel werden auf einmal aktualisiert, sobald die Show-Methode aufgerufen wird
- client.loop();
- }
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// CODE ENDE
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement