Advertisement
Guest User

Untitled

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