Advertisement
Guest User

Untitled

a guest
Aug 22nd, 2019
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.72 KB | None | 0 0
  1. // P8, Marie Steinbrügge und Lisa-Marie Rosendorff
  2. // 2019 Marie Steinbrügge
  3.  
  4.  
  5. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// BIBLIOTHEKEN
  6.  
  7. //Bibliotheken implementieren für MQTT und ESP (beinhalten spezifische Funktionen)
  8. //extern "C" wird verwendet, um eine C-Bibliothek einzubinden
  9. extern "C" {
  10. #include <user_interface.h>
  11. }
  12.  
  13. #include <ESP8266WiFi.h> // mit dieser Bibliothek kann der ESP mit einem WIFI-Netzwerk verbunden werden, sodass Daten gesendet und empfangen werden können
  14. #include <PubSubClient.h> // Bibliothek bietet Client-Funktion zum einfachen Publizieren/Abonnieren von Nachrichten an einen Server, der MQTT unterstützt
  15.  
  16. #include<Wire.h> // diese Bibliothek ermöglicht die Kommunikation mit I2C Geräten
  17. #include <Adafruit_NeoPixel.h> // Bibliothek zur Verwendung des Neo-Pixel LED-Rings
  18.  
  19. #ifdef _AVR_
  20. #include <avr/power.h>
  21. #endif
  22.  
  23. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  24.  
  25.  
  26. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// WICHTIGE VARIABLEN
  27.  
  28. Adafruit_NeoPixel pixels = Adafruit_NeoPixel(8, 1, NEO_GRB + NEO_KHZ800); // Definition des verwendeten Neo-Pixel LED-Rings
  29.  
  30.  
  31. const int MPU=0x68;
  32. int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ,PAcX,PAcY,PAcZ,PGyX,PGyY,PGyZ;
  33.  
  34. uint8_t rgb_values[3];
  35. bool ActivatePuck = false;
  36.  
  37. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  38.  
  39.  
  40. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// MQTT-STUFF
  41.  
  42. // konstante Variablen für das verwendete Netzwerk des Servers eintragen!
  43. // notwendig für eine funktionierende Verbindung!
  44. const char* ssid = "LauritzsMac"; // Name des Netzwerks
  45. const char* password = "Toastbrot"; // Passwort des Netzwerks
  46. const char* mqtt_server = "192.168.137.149"; // IP-Adresse des Geräts, auf welchem der Mosquitto-Broker läuft
  47.  
  48. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  49.  
  50.  
  51. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// MQTT-STUFF
  52.  
  53. bool WiFi_MQTT_connect;
  54. bool WiFi_Sniffer_connect;
  55. const char PUCK_ID [] = "123";
  56. char Topic_PuckID [64];
  57. char Topic_MyTurn [64];
  58.  
  59. //Erstellt einen Client, der eine Verbindung zu einer bestimmten Internet-IP-Adresse und einem Port herstellen kann
  60. WiFiClient espClient;
  61.  
  62. //Erzeugt eine Client-Instanz, welcher ermöglicht wird, mit dem Mosquitto-Broker zu kommunizieren
  63. PubSubClient client(espClient);
  64.  
  65. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  66.  
  67.  
  68. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  69.  
  70. void setup() {
  71. // Stellt die Datenrate in Bits pro Sekunde für die serielle Datenübetragung ein
  72. Serial.begin(115200);
  73. delay(1000);
  74.  
  75. setup_wifi(); // die Funktion zur Verbindung zum WIFI wird aufgerufen
  76. client.setServer(mqtt_server, 1883); // der Server und der zugehörige Port werden übergeben
  77. client.setCallback(callback);
  78.  
  79. pixels.begin();
  80. pixels.clear();
  81.  
  82. pixels.setBrightness(60); // Helligkeit der Pixel des LED-Rings definieren
  83.  
  84. // alle 8 Pixel in einem gold-gelb Ton einfärben
  85. for(int i=0;i<8;i++){
  86. pixels.setPixelColor(i, pixels.Color(255,215,0));
  87. }
  88.  
  89. pixels.show(); // alle Pixel werden auf einmal aktualisiert, sobald die Show-Methode aufgerufen wird
  90.  
  91. Wire.pins(0, 2);
  92. Wire.begin(); // Rückgriff auf I2C, um mit dem Acc./Gyr. kommunizieren zu können
  93. Wire.beginTransmission(MPU);
  94. Wire.write(0x6B);
  95. Wire.write(0);
  96. Wire.endTransmission(true);
  97. }
  98.  
  99. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  100.  
  101.  
  102. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// MQTT-STUFF
  103.  
  104. void setup_wifi() {
  105.  
  106. //die Verbindung zum Netzwerk wird hergestellt
  107. Serial.println();
  108. Serial.print("Connecting to ");
  109. Serial.println(ssid);
  110.  
  111. //ESP 8266versucht sich einzuloggen
  112. WiFi.begin(ssid, password);
  113.  
  114. //Während noch keine Verbindung besteht, werden Punkte ausgegeben
  115. //WiFi.status() gibt den Status der WiFi-Verbindung zurück
  116. while (WiFi.status() != WL_CONNECTED) {
  117. delay(500);
  118. Serial.print(".");
  119. }
  120.  
  121. //Sobald eine Verbindung besteht wird dies ausgegeben
  122. Serial.println("");
  123. Serial.println("WiFi connected");
  124. Serial.println("IP address: ");
  125. Serial.println(WiFi.localIP());
  126. }
  127.  
  128. //Funktion für den Fall, dass keine Verbindung aufgebaut werden kann bzw. die Verbindung verloren ging
  129. void reconnect() {
  130.  
  131. // Loopt, bis ESP8266 wieder eine Verbindung hat
  132. while (!client.connected()) {
  133. Serial.print("Attempting MQTT connection...");
  134.  
  135. //Client versucht sich zu verbinden
  136. if (client.connect("ESP8266ClientPublisher2")) {
  137. Serial.println("connected");
  138. }
  139. else {
  140.  
  141. //Falls keine Verbindung hergestellt werden konnte, wird nach 5 Sekunden ein Neuversuch gestartet
  142. Serial.print("failed, rc=");
  143. Serial.print(client.state());
  144. Serial.println(" try again in 5 seconds");
  145. delay(5000);
  146. }
  147. }
  148. }
  149.  
  150. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  151.  
  152.  
  153. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// MQTT-CALLBACK
  154.  
  155. // eingehende Nachrichten werden in der Callback-Funktion analysiert und interpretiert
  156. void callback(char* topic, byte* payload, unsigned int length) {
  157. char msg[length+1];
  158. for (int i = 0; i < length; i++) {
  159. msg[i] = (char)payload[i];
  160. }
  161.  
  162. msg[length] = '\0';
  163. Serial.println("");
  164.  
  165. // Sollte "AN" als Nachricht eingehen, so…
  166. if(strcmp(msg,"AN")==0){
  167. ActivatePuck = true; // …wird der Puck aktiviert
  168. client.publish("Test/Debug", "Ich wurde angesprochen als 123");
  169. }
  170.  
  171. // Sollte "AUS" als Nachricht eingehen, so…
  172. else if(strcmp(msg,"AUS")==0){
  173. ActivatePuck = false; // …wird der Puck deaktivert
  174. client.publish("Test/Debug", "Ich wurde NICHT angesprochen als 123");
  175. }
  176.  
  177. /*// Sollte "Error" als Nachricht eingehen, so…
  178. else if(strcmp(msg,"Fail")==0){
  179. fault = false; // …wird der Puck deaktivert…
  180. client.publish("Fault", "Fault ist false.");
  181. }*/
  182. }
  183.  
  184. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  185.  
  186.  
  187. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// SENSORDATEN
  188.  
  189. void Sensordaten() {
  190.  
  191. // es wird wieder auf die I2C Methode zurückgegriffen und die Sensordaten werden ausgelesen
  192. Wire.beginTransmission(MPU);
  193. Wire.write(0x3B);
  194. Wire.endTransmission(false);
  195. Wire.requestFrom(MPU,12,true);
  196. PAcX = AcX;
  197. PAcY= AcY;
  198. PAcZ = AcZ;
  199. PGyX = GyX;
  200. PGyY = GyY;
  201. PGyZ = GyZ;
  202.  
  203. AcX=Wire.read()<<8|Wire.read();
  204. AcY=Wire.read()<<8|Wire.read();
  205. AcZ=Wire.read()<<8|Wire.read();
  206. GyX=Wire.read()<<8|Wire.read();
  207. GyY=Wire.read()<<8|Wire.read();
  208. GyZ=Wire.read()<<8|Wire.read();
  209.  
  210. // sollte keine Bewegung des Pucks erfolgen und der Puck aktiv sein, so…
  211. if((abs(AcX-PAcX)<=8000 || abs(AcY-PAcY)<=8000 || abs(AcZ-PAcZ)<=8000) && ActivatePuck == true){
  212.  
  213. client.publish("Test/Debug", "Ich schalten die LED ein");
  214. pixels.setBrightness(60); // …wird die Helligkeit und
  215.  
  216. for(int i=0;i<8;i++){ // …die Farbe der Pixel des LED-Rings festgelegt
  217. pixels.setPixelColor(i, pixels.Color(255,215,0));
  218. }
  219.  
  220. pixels.show(); // alle Pixel werden auf einmal aktualisiert, sobald die Show-Methode aufgerufen wird
  221.  
  222. client.publish("Test/Debug", "Die LED ist an");
  223. }
  224.  
  225. // sollte eine Bewegung des Pucks erfolgen und der Puck aktiv sein, so…
  226. else if((abs(AcX-PAcX)>=8000 || abs(AcY-PAcY)>=8000 || abs(AcZ-PAcZ)>=8000) && ActivatePuck == true){
  227.  
  228. client.publish("Test/Debug", "Ich habe Bewegung gemessen");
  229. pixels.setBrightness(0); // …wird die Helligkeit auf 0 gesetzt
  230.  
  231. pixels.show(); // alle Pixel werden auf einmal aktualisiert, sobald die Show-Methode aufgerufen wird
  232.  
  233. // ESP-01 veröffentlicht auf einer Topic mit seiner Puck-ID als Variablen
  234. snprintf(Topic_PuckID, sizeof(Topic_PuckID), "Badezimmer/Sensordaten/%s/Bewegung", PUCK_ID);
  235. client.publish(Topic_PuckID, PUCK_ID); // …eine Info hierüber wird an das Hintergrundscript geschickt.
  236.  
  237. client.publish("Test/Debug", "Ich die LED ausgeschaltet");
  238. }
  239.  
  240. /*// sollte eine Bewegung des Pucks vorhanden und der Puck nicht aktiv sein, so…
  241. else if((abs(AcX-PAcX)>=6000 || abs(AcY-PAcY)>=6000 || abs(AcZ-PAcZ)>=6000) && ActivatePuck == false && fault == false){
  242.  
  243. fault = true;
  244.  
  245. //…wird eine Error-Nachricht veröffentlicht und…
  246. snprintf(Topic_PuckID, sizeof(Topic_PuckID), "Badezimmer/Sensordaten/%s/Error", PUCK_ID);
  247. client.publish(Topic_PuckID, PUCK_ID);
  248.  
  249. //client.publish("TEST", "Error-404"); // …eine Kontrollnachricht ausgegeben
  250. }*/
  251.  
  252. // sollte keiner der oberen Fälle zutreffen, so ist der Puck deaktiviert, ausgeschaltet und es liegt keine Bewegung vor
  253. else{
  254. pixels.setBrightness(0);
  255. //client.publish("Test/Debug", "keiner der Fälle ist eingetreten");
  256. }
  257. }
  258.  
  259. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  260.  
  261.  
  262. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  263.  
  264. void loop() {
  265.  
  266. //setup_wifi();
  267.  
  268. Sensordaten();
  269.  
  270. // solange der ESP-01 nicht mit dem WIFI-Netwerk verbunden ist, wird versucht, sich neu zu verbinden
  271. if (!client.connected()) {
  272. reconnect();
  273. }
  274.  
  275. // ESP-01 abonniert eine Topic mit seiner Puck-ID als Variablen
  276. snprintf(Topic_MyTurn, sizeof(Topic_MyTurn), "Badezimmer/Zähneputzen/Step/%s", PUCK_ID);
  277. client.subscribe(Topic_MyTurn);
  278. client.subscribe("Badezimmer/Sensordaten/Error");
  279.  
  280. pixels.show(); // alle Pixel werden auf einmal aktualisiert, sobald die Show-Methode aufgerufen wird
  281. client.loop();
  282. }
  283.  
  284. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// CODE ENDE
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement