#include #include #include // Inkluder Wi-Fi-Multi bibliotek #include // Inkluder WebServer bibliotek #include // Inkluder bibliotek, som styrer temperatursensor #include // Inkluder hjælpefunktioner, som styrer kommunikation med ThingSpeak platformen // Includefilerne ovenfor benytter kode skrevet i andre filer. Det er meget brugt i C og svarer lidt til import i f.eks. Python // Define i C er makroer, der sådan bare er placeholdere for værdier, således at de kun beskrives een gang #define DHTTYPE DHT11 // definition af hvilken temperatursensor, vi benytter #define DHTPin D3 #define LEDPin D2 #define interval 15 // Antal sekunder mellem hver skrivning til ThingSpeak // *** Opdater Channel ID og APIKey fra ThingSpeak *** unsigned long channelID = 0; const char * APIKey = ""; const char * TSserver = "api.thingspeak.com"; // Deklaration og evt. instantiering af globale variable ESP8266WiFiMulti wifiMulti; WiFiClient client; ESP8266WebServer server(80); // Server, som lytter til port 80 - benyttes som default af din browser til HTTP DHT dht(DHTPin,DHTTYPE); // Deklarerer en temperatursensor // Deklaration af funktioner, som benyttes for hver side/route, som webserven kan vise void handleRoot(); void handleLED(); void handleTemp(); void handleNotFound(); // Setup er kode, der eksekveres een gang void setup() { Serial.begin(115200); // Serial er kommunikationen over kabel mellem enhed og din PC delay(10); pinMode(LEDPin, OUTPUT); // LEDPin (D2) sættes til at være en udgang digitalWrite(LEDPin,1); // LED tændes som default // Forbind til WiFi - udskift "ssidx" og "password" med givne oplysninger eller mobil hotspot ... eller begge Serial.println(); // *** Opdater med WiFi data *** wifiMulti.addAP("ssid1", "password"); // Primær WiFi, som søges først wifiMulti.addAP("ssid2", "password"); // Sekundær WiFi, som søges hvis primært ikke fundet ... osv Serial.println(); Serial.print("Forbinder til WiFi ..."); // Skriv prikker indtil der er forbundet til WiFi while (wifiMulti.run() != WL_CONNECTED) { delay(500); // Vent halvt sekund Serial.print("."); } // Når der er forbundet, udskriv da den modtagne IP adresse Serial.println(""); Serial.println("WiFi forbundet til "); Serial.println(WiFi.SSID()); Serial.println("IP adresse: "); Serial.println(WiFi.localIP()); // Definition af hvilke "routes" serveren skal lytte til med reference til funktion/handle server.on("/", HTTP_GET, handleRoot); server.on("/LED", HTTP_POST, handleLED); server.on("/TEMP", HTTP_GET, handleTemp); server.onNotFound(handleNotFound); // Start serveren server.begin(); dht.begin(); Serial.println("Server startet"); } // Funktionen "loop" køres kontinuerligt void loop() { // Check om en klient har prøvet at tilgå serveren. // Lyt i et antal sekunder (interval) og skriv derefter til CloudServer for (int i=0; i \

Webserver i Studiepraktik

\

Internet of Things (IoT) er \"tingenes Internet\" - dagligdags ting kommer på nettet og får ny værdi. Det kan løse mange udfordringer.

\

Her kommunikerer du med en webserver på en lille microcontroller af typen Arduino, som i dette tilfælde styrer en digital udgang, som du så igen kan bruge til at styre en lampe, en ventilator, tænde for varmen eller hvad du lyster

\

Klik på nedenstående knap for at tænde eller slukke LED på port D2

\
\

Med en Arduino ESP8266 kan du lave et hav af sjove projekter

\

Nu skal du udvide denne webserver med mere funktionalitet

\

F.eks. skal du opbygge funktionalitet således at nedenstående knap fører dig til en side som viser temperatur og luftfugtighed.

\
\ "; // Send svar til klienten. 200 betyder alt ok og "text/html" fortæller browseren at svaret er htmlformatteret kode server.send(200, "text/html", svar); } void handleLED() { digitalWrite(LEDPin,!digitalRead(LEDPin)); // Switcher LED server.sendHeader("Location","/"); // Redirecter tilbage til rodobjektet "/" server.send(303); // Benytter en 303 redirect som svar } void handleNotFound(){ // Denne benyttes, hvis ingen andre // Svaret 404 betyder "ikke fundet". Bemærk at svaret her er angivet i ren tekst uden html server.send(404, "text/plain", "404: Siden ikke fundet"); } void handleTemp() { // Lokaltemperatur og fugtighed fra måling DHT float h = 0; float t = 0; char svar[200]; // lokaltemp string genereres sprintf(svar, "

LokalTemperatur (Celsius): %.1f

Fugtighed: %.1f

",t,h); server.send(200,"text/html",svar); } void writeThingSpeak() { ThingSpeak.begin(client); // Sætter forbindelse til ThingSpeak if (client.connect(TSserver,80)) { long rssi = WiFi.RSSI(); // Aflæser RSSI // *** hent værdier fra temperatur og fugtighedssensor istedet for disse faste værdier float h = 0; float t = 0; ThingSpeak.setField(1,t); // Sender data til ThingSpeak ThingSpeak.setField(2,h); ThingSpeak.setField(3,rssi); Serial.println("Gemmer data i ThingSpeak cloudserver"); ThingSpeak.writeFields(channelID, APIKey); }; }