Gas Sensor & ESP32

Velkommen til vores sidste blogindlæg i denne serie, hvor vi dykker ned i spændende verden af luftkvalitetsmåling ved hjælp af MQ135 gas sensoren og ESP32. Luftforurening er en voksende bekymring i vores moderne samfund, og det er vigtigt at overvåge luftkvaliteten for at beskytte vores sundhed og miljø.


Vi skruer i dag lidt op for kompleksiteten af projektet, men det er intet vi ikke kan klare! I denne blog vil vi nemlig udforske hvordan MQ135 gas sensoren og ESP32, en kraftfuld IoT-platform, kan bruges til at måle forskellige forureninger i luften såsom CO2, ammoniak, alkohol og andre skadelige gasser. Vi vil guide dig gennem hele processen med at oprette forbindelse mellem MQ135 sensoren og ESP32 og opsætte koden til at analysere luftkvalitetsdata i realtid.


Vores mål med denne blog er at give dig en grundig forståelse af, hvordan du kan bygge dit eget luftkvalitetsmålesystem ved hjælp af MQ135 sensoren og ESP32 og sende den data til en lokal hjemmesode.

Så lad os dykke ned i detaljerne og udforske potentialet i MQ135 gas sensoren og ESP32-platformen for at skabe et robust og pålideligt luftkvalitetsmålesystem.

 

 Nødvendige komponenter for projektet:

MQ-135 Gas Sensor
ESP32
Breadboard
1k Ohm Resistor
LED's
Buzzer
eller
Luftkvalitetsmålesystem Kit

  1. MQ135 gas sensoren: Denne sensor er designet til at måle forskellige typer af luftforureninger såsom CO2, ammoniak og alkohol. Den leverer os med luftkvalitetsdata i form af PPM (parts per million).

  2. ESP32: ESP32 er en kraftfuld mikrocontroller-platform, der er ideel til IoT-applikationer. Den har indbygget WiFi-funktionalitet, hvilket betyder, at den kan oprette forbindelse til internettet og kommunikere med andre enheder eller skytjenester. ESP32 fungerer som hjernen i vores projekt og styrer hele processen med at måle luftkvaliteten og rapportere dataene.

ESP32's WiFi-funktion er afgørende i dette projekt af flere grunde:

  • Det tillader ESP32 at oprette forbindelse til vores lokale WiFi-netværk, hvilket giver os adgang til internettet og mulighed for at sende data til eksterne enheder eller skytjenester.
  • Ved at oprette en webserver på ESP32 kan vi oprette en brugergrænseflade, hvor brugere kan se og overvåge luftkvalitetsdataen i realtid via en webbrowser.
  • WiFi-funktionaliteten giver også mulighed for at oprette en WebSocket-forbindelse, som giver os mulighed for at sende opdateringer af luftkvaliteten til klientenheder i realtid uden at skulle foretage gentagne HTTP-anmodninger.

I koden har vi initialiseret WiFi-forbindelsen ved at angive navnet på vores WiFi-netværk (SSID) og adgangskoden. ESP32 opretter forbindelse til WiFi-netværket og får tildelt en IP-adresse, som vi printer i Serial Monitor. Vi kopierer denne IP-adresse og indsætter den i vores søge-felt i vores browser. *ENTER*
Dette er nemlig hjemmesiden, som vi sender data til.

Derefter opretter vi en webserver og en WebSocket-forbindelse. Webserveren leverer en simpel HTML-side, der viser luftkvaliteten og dens status. WebSocket-forbindelsen bruges til at sende opdateringer af luftkvaliteten til klientenheder via en JSON-pakke. Det lyder måske lidt forvirrende nu, men inden længe er det ikke så skræmmende.

I loop-funktionen måler vi luftkvaliteten ved hjælp af MQ135 sensoren og sender dataene til WebSocket-klienter. Vi kontrollerer også luftkvalitetsgrænserne og styrer en grøn LED, en rød LED og en buzzer afhængigt af luftkvaliteten. ESP32 fortsætter med at gentage denne proces i loopet med en passende forsinkelse.

Ud over MQ135 gas sensoren og ESP32 bruger vi også følgende komponenter i vores projekt:

  1. Breadboard: Et breadboard er en praktisk platform til midlertidig prototypering af elektroniske kredsløb. Det giver os mulighed for at forbinde vores komponenter og ledninger på en struktureret og fleksibel måde uden at skulle lodde dem sammen.

  2. 1k ohm modstand: Modstanden bruges som en del af kredsløbet for at beskytte vores buzzer mod at blive overbelastet og for at opretholde en passende strøm gennem kredsløbet.

  3. Buzzer: En buzzer er en elektromekanisk enhed, der kan generere lyde eller toner. I vores projekt bruger vi buzzeren til at afgive lydsignaler afhængigt af luftkvaliteten. Når luftkvaliteten er god, vil buzzeren være stille, men når luftkvaliteten overskrider en bestemt tærskelværdi, vil buzzeren generere en alarmlyd.

  4. Grøn LED: Den grønne LED lyser, når luftkvaliteten er god, og der er ingen forhøjet forurening. Det giver en visuel indikation til brugeren om, at luften er sikker og af høj kvalitet.

  5. Rød LED: Den røde LED lyser, når luftkvaliteten overskrider en bestemt tærskelværdi, og der er forhøjet forurening. Dette signalerer til brugeren, at luftkvaliteten er dårlig eller farlig og kræver handling.

Med alle disse komponenter samlet kan vi opnå en omfattende luftforureningsovervågningsløsning, der kombinerer sensoraflæsninger, datatransmission via Wi-Fi, lyd- og visuel feedback til brugerne og en brugervenlig grænseflade.

Før vi begyndert at se på koden til dette projekt, er det vigtigt at bemærke, at MQ135 gas sensoren ikke er kalibreret. Projektet er designet til at demonstrere funktionaliteten af sensoren og give en grundlæggende forståelse af luftforureningsovervågning. Hvis du ønsker at opnå mere nøjagtige PPM (Parts Per Million) værdier, kræver det en kalibrering af sensoren ved hjælp af specifikke procedurer og metoder.

For at forenkle processen og sikre en smidig implementering af sensoren, anvender vi MQ135 biblioteket udviklet af GeorgK. Du kan downloade og installere dette bibliotek ved at klikke HER. Her er en trinvis guide til installation af MQ135 biblioteket i Arduino IDE:

  1. Download biblioteket

  2. Åbn Arduino IDE.

  3. Gå til Sketch (Tegning) > Include Library (Inkludér bibliotek) > Add .ZIP Library (Tilføj .ZIP-bibliotek)...

  4. Vælg den downloadede fil.

  5. Klik på "Åbn" knappen.

  6. Vent på en meddelelse i Arduino IDE's statuslinje, der bekræfter, at biblioteket er installeret korrekt.

Når MQ135 biblioteket er installeret, kan vi få vores PPM-værdier ved hjælp af de følgende to linjer:

MQ135 gasSensor = MQ135(A0); float air_quality = gasSensor.getPPM();

 

Det er dog vigtigt at understrege, at kalibrering af MQ135 sensoren er afgørende for at opnå præcise og pålidelige luftkvalitetsmålinger. For at kalibrere sensoren anbefales det at køre en dedikeret kalibreringskode i 12 til 24 timer og derefter registrere RZERO-værdien, som er et nøgleparameter for sensorens nøjagtighed.

Man kan benytte denne kalibreringskode:

#include "MQ135.h" void setup (){ Serial.begin (9600); } void loop() { MQ135 gasSensor = MQ135(A0); // Attach sensor to pin A0 float rzero = gasSensor.getRZero(); Serial.println (rzero); delay(1000); }

Efter at have fået RZERO-værdien. Sæt RZERO-værdien i biblioteksfilen, du downloadede "MQ135.h" ved at definere denne værdi såleds #define RZERO (RZERO-værdien indsættes her (fjern alle paranteser)).

F. eks.: #define RZERO 123.456

Projektets Kredsløb

I vores projekt er der tre komponenter, der er tilsluttet vores ESP32: Buzzer, to LED'er og MQ135 gas sensoren.
Men måden vi tilkobler disse komponenter til vores ESP32 er ikke på samme måde som vi gjorde det med vores Arduino UNO.

På Arduino Uno har du en række GPIO-pins til rådighed, der er klar til brug. Du kan nemt tilslutte komponenter direkte til disse pins ved hjælp af jumper-ledninger. Arduino Uno har også en færdiglavet headerstik, der gør det nemt at tilslutte og afbryde komponenter uden lodning.

På den anden side kræver ESP32 en lidt anderledes tilgang. ESP32 er ikke udstyret med en færdiglavet headerstik, så du er nødt til at forbinde den til et breadboard eller lodde pins direkte til ESP32-WROOM-modulet. Dette betyder, at du skal bruge jumper-ledninger eller loddeteknik for at forbinde komponenter til ESP32 pinsene.

Begge metoder har deres fordele og ulemper. Arduino Uno er mere brugervenlig og velegnet til begyndere, da den har en klar struktur og nem tilslutning af komponenter. ESP32 giver dig større fleksibilitet og mulighed for at tilpasse dine tilslutninger efter behov, men kræver lidt mere teknisk viden og arbejde.

 

 

Buzzeren er tilsluttet pin 5 på ESP32-boardet. Derudover kræver buzzeren forbindelse til både 5V-forbindelsen og jordforbindelsen (GND) på ESP32-boardet for at fungere korrekt. Hvis du har fulgt vores tidligere projekter, vil du være fortrolig med disse forbindelser.

De to LED'er er tilsluttet henholdsvis pin 2 og pin 4 på ESP32-boardet. For at sikre korrekt drift af LED'erne og forhindre overdreven strømflod er der en 1k ohm modstand forbundet i serie med hver LED. Modstanden hjælper med at begrænse strømmen og beskytter LED'erne mod skader.

MQ135 gas sensoren er tilsluttet pin 34 på ESP32-boardet. Derudover skal sensoren have forbindelse til 5V-forbindelsen og jordforbindelsen (GND) på ESP32-boardet for at fungere korrekt. Sensoren registrerer luftkvalitetsdata og bruger en indbygget analog-digital konvertering til at sende disse data til ESP32-boardet.

Ved at forbinde disse komponenter korrekt til ESP32-boardet kan vi oprette forbindelse, indsamle data og styre LED'erne og buzzeren baseret på luftkvalitetsmålinger fra MQ135 sensoren.


Kode

#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <AsyncWebSocket.h>
#include <MQ135.h>

const char *ssid = "skriv navnet på dit internet her";
const char *password = "skriv koden for dit internet her";

AsyncWebServer server(80);
AsyncWebSocket ws("/ws");

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
  <title>IOT luftforurening overvaagningssystem</title>
</head>
<body>
  <h1>IOT Luftforurening Overvaagningssystem</h1>
  <h2>Luftkvaliteten er <span id="air-quality">-</span> PPM</h2>
  <p id="air-quality-status"></p>

<script>
  var socket = new WebSocket("ws://" + location.hostname + "/ws");

  socket.onmessage = function(event) {
  var data = JSON.parse(event.data);
  document.getElementById("air-quality").textContent = data.airQuality;

  var airQualityStatusElement = document.getElementById("air-quality-status");

  if (data.airQuality >= 20) {
    airQualityStatusElement.textContent = "Daarlig luftkvalitet";
  } else {
    airQualityStatusElement.textContent = "God luftkvalitet";
  }
  };
</script>
</body>
</html>
)rawliteral";


MQ135 gasSensor(34); // Define MQ135 sensor instance

const int greenLedPin = 2; // Green LED pin
const int redLedPin = 4;   // Red LED pin
const int buzzerPin = 5;   // Buzzer pin
const int goodAirQualityThreshold = 20;  // Threshold value for good air quality


void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) {
  if (type == WS_EVT_CONNECT) {
  Serial.println("WebSocket client connected");
  } else if (type == WS_EVT_DISCONNECT) {
  Serial.println("WebSocket client disconnected");
  }
}

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
  delay(1000);
  Serial.println("Connecting to WiFi...");
  }

  IPAddress IP = WiFi.localIP();
  Serial.print("Connected to WiFi. IP address: ");
  Serial.println(IP);

  pinMode(greenLedPin, OUTPUT);
  pinMode(redLedPin, OUTPUT);
  pinMode(buzzerPin, OUTPUT);

  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
  request->send_P(200, "text/html", index_html);
  });

  ws.onEvent(onWsEvent);
  server.addHandler(&ws);
  server.begin();
}

void loop() {
  float airQuality = gasSensor.getPPM(); // Get air quality data in PPM

  // Prepare JSON data
  String jsonData = "{\"airQuality\": " + String(airQuality) + "}";

  // Send JSON data to WebSocket clients
  ws.textAll(jsonData);

  // Check air quality thresholds and control buzzer and LEDs
  if (airQuality <= goodAirQualityThreshold) {
  digitalWrite(greenLedPin, HIGH);
  digitalWrite(redLedPin, LOW);
  noTone(buzzerPin);
  } else if (airQuality > goodAirQualityThreshold) {
  digitalWrite(greenLedPin, LOW);
  digitalWrite(redLedPin, HIGH);
  tone(buzzerPin, 1000);
  } else {
  digitalWrite(greenLedPin, LOW);
  digitalWrite(redLedPin, LOW);
  noTone(buzzerPin);
  }

  delay(1000); // Adjust the delay according to your needs
}
 
Lad os kigge lidt nærmere på koden og lad os starte med en kort forklaring af den...

Koden starter med at inkludere de nødvendige biblioteker og oprette de nødvendige objekter og variabler. Vi bruger WiFi-biblioteket til at oprette forbindelse til vores Wi-Fi-netværk og AsyncWebServer-biblioteket til at oprette en webserver på ESP32-boardet.

Vi definerer også HTML-koden, der skal vises på hjemmesiden. Denne HTML-kode indeholder et sted, hvor vi vil vise luftkvaliteten og dens status.

I setup-funktionen etablerer vi Wi-Fi-forbindelsen og konfigurerer de nødvendige GPIO-pinde som output-pinde. Vi opretter også en HTTP-rute til vores hjemmeside og tilføjer en WebSocket-håndteringsfunktion.

I loop-funktionen får vi luftkvalitetsdataen fra MQ135-sensoren ved hjælp af gasSensor.getPPM()-metoden. Vi opretter en JSON-streng med luftkvalitetsdataen og sender den til WebSocket-klienterne ved hjælp af ws.textAll(jsonData).

Herefter kontrollerer vi luftkvalitetens værdi i forhold til en tærskelværdi (goodAirQualityThreshold) og styrer buzzeren og LED'erne baseret på resultatet. Hvis luftkvaliteten er under eller lig med tærskelværdien, lyser den grønne LED og buzzeren er slukket. Hvis luftkvaliteten er over tærskelværdien, lyser den røde LED og buzzeren aktiveres med en tone på 1000 Hz.

Til sidst er der en kort forsinkelse på 1 sekund, før koden gentages.

Den indlejrede JavaScript-sektion i HTML-koden bruger en WebSocket til at modtage JSON-data fra ESP32-boardet. Denne data bruges til at opdatere luftkvalitetsværdien og vise den på hjemmesiden. Derudover bruger JavaScript-sektionen også en betinget kontrolstruktur til at ændre luftkvalitetens status afhængigt af dens værdi.

Ok. Lad os nu dykke ned i hver sektion i koden og se om vi kan få det til at give mening:

#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <AsyncWebSocket.h>
#include <MQ135.h>

const char *ssid = "skriv navnet på dit internet her";
const char *password = "skriv koden for dit internet her";

AsyncWebServer server(80);
AsyncWebSocket ws("/ws");

Denne del af koden inkluderer de nødvendige biblioteker og opretter objekter og variabler til at håndtere Wi-Fi, webserver og WebSocket-kommunikation.

Klip på de følgende hyperlinks og installer dem på samme som <MQ135.h> biblioteket.

  1. Download biblioteket

  2. Åbn Arduino IDE.

  3. Gå til Sketch (Tegning) > Include Library (Inkludér bibliotek) > Add .ZIP Library (Tilføj .ZIP-bibliotek)...

  4. Vælg den downloadede fil.

  5. Klik på "Åbn" knappen.

  6. Vent på en meddelelse i Arduino IDE's statuslinje, der bekræfter, at biblioteket er installeret korrekt.

De biblioteker der ikke er hyper-links er indbyggede biblioteker.
så.. Sketch --> Include Library --> Manage Libraries --> *Klik på søgefeltet og skriv navnet på biblioteket du leder efter og tryk 'Install'*

#include <WiFi.h>: Dette bibliotek gør det muligt for ESP32-boardet at oprette forbindelse til Wi-Fi-netværket ved hjælp af Wi-Fi-funktionerne og -metoderne.

#include <AsyncTCP.h>: Dette bibliotek er en asynkron TCP-bibliotek til ESP32, der giver mulighed for ikke-blokerende TCP-kommunikation.

#include <ESPAsyncWebServer.h>: Dette bibliotek giver en asynkron webserver-klasse til ESP32, der gør det muligt at betjene HTTP-anmodninger og sende HTTP-respons asynkront.

#include <AsyncWebSocket.h>: Dette bibliotek giver mulighed for oprettelse af en asynkron WebSocket-server på ESP32-boardet. Det giver WebSocket-funktionalitet til at sende og modtage data i realtid mellem klienter og server.

#include <MQ135.h>: Dette bibliotek har vi snakket lidt om tidligere i bloggen. Det er specifikt til MQ135-gassensoren og giver metoder til at få luftkvalitetsdata fra sensoren.

const char *ssid = "skriv navnet på dit internet her";: Denne linje definerer en karakterstrengsvariabel, der indeholder navnet (SSID) på dit Wi-Fi-netværk. Du skal erstatte "skriv navnet på dit internet her" med dit faktiske netværksnavn (SSID).

const char *password = "skriv koden for dit internet her";: Denne linje definerer en karakterstrengsvariabel, der indeholder adgangskoden til dit Wi-Fi-netværk. Du skal erstatte "skriv koden for dit internet her" med din faktiske adgangskode.

AsyncWebServer server(80);: Denne linje opretter en asynkron webserver-objekt med portnummeret 80, som er standardporten til HTTP-kommunikation. Dette objekt bruges til at betjene HTTP-anmodninger og håndtere routing og levering af websider og ressourcer.

AsyncWebSocket ws("/ws");: Denne linje opretter en asynkron WebSocket-objekt med en sti "/ws". Dette objekt bruges til at oprette WebSocket-kommunikation og håndtere WebSocket-hændelser og beskeder.

Disse biblioteker og objekter er afgørende for at oprette Wi-Fi-forbindelse, håndtere webserverfunktionalitet og implementere WebSocket-kommunikation i projektet.

 

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
  <title>IOT luftforurening overvaagningssystem</title>
</head>
<body>
  <h1>IOT Luftforurening Overvaagningssystem</h1>
  <h2>Luftkvaliteten er <span id="air-quality">-</span> PPM</h2>
  <p id="air-quality-status"></p>

<script>
  var socket = new WebSocket("ws://" + location.hostname + "/ws");

  socket.onmessage = function(event) {
  var data = JSON.parse(event.data);
  document.getElementById("air-quality").textContent = data.airQuality;

  var airQualityStatusElement = document.getElementById("air-quality-status");

  if (data.airQuality >= 20) {
    airQualityStatusElement.textContent = "Daarlig luftkvalitet";
  } else {
    airQualityStatusElement.textContent = "God luftkvalitet";
  }
  };
</script>
</body>
</html>
)rawliteral";

Denne del af koden definerer en HTML-skabelon, der bruges til at oprette webgrænsefladen for luftforureningsovervågningssystemet. HTML-skabelonen indeholder følgende elementer:

  • <h1>: Overskriftselementet viser teksten "IOT Luftforurening Overvaagningssystem" som den primære overskrift på websiden.
  • <h2>: Dette element viser teksten "Luftkvaliteten er <span id="air-quality">-</span> PPM". Det indeholder også et <span>-element med id'et "air-quality", hvor luftkvalitetsdataen vil blive indsat dynamisk.
  • <p>: Dette element med id'et "air-quality-status" bruges til at vise statusbeskeden baseret på luftkvaliteten.
  • <script>: Dette script-element opretter en WebSocket-forbindelse til ESP32 ved hjælp af den aktuelle værts IP-adresse og stien "/ws". Når der modtages en besked fra WebSocket-forbindelsen, opdateres HTML-elementerne dynamisk ved hjælp af JavaScript-kode. Luftkvaliteten vises i <span>-elementet med id'et "air-quality", og statusbeskeden opdateres baseret på luftkvaliteten.

Denne HTML-skabelon giver en enkel og interaktiv webgrænseflade til at vise luftkvalitetsdataen, der modtages fra ESP32 via WebSocket-forbindelsen.


MQ135 gasSensor(34); // Define MQ135 sensor instance

const int greenLedPin = 2; // Green LED pin
const int redLedPin = 4;   // Red LED pin
const int buzzerPin = 5;   // Buzzer pin
const int goodAirQualityThreshold = 20;  // Threshold value for good air quality

Denne del af koden definerer forskellige variabler og instanser, der bruges til at styre forskellige komponenter i projektet:

  • MQ135 gasSensor(34);: Dette opretter en instans af MQ135-sensoren og forbinder den med pin 34 på ESP32. Sensoren bruges til at måle luftkvaliteten.

  • const int greenLedPin = 2;: Dette definerer en variabel greenLedPin, der er tilknyttet pin 2 på ESP32. Denne pin styrer den grønne LED, som bruges til at angive god luftkvalitet.

  • const int redLedPin = 4;: Dette definerer en variabel redLedPin, der er tilknyttet pin 4 på ESP32. Denne pin styrer den røde LED, som bruges til at angive dårlig luftkvalitet.

  • const int buzzerPin = 5;: Dette definerer en variabel buzzerPin, der er tilknyttet pin 5 på ESP32. Denne pin styrer buzzeren, der bruges til at generere en lydalarmsignal i tilfælde af dårlig luftkvalitet.

  • const int goodAirQualityThreshold = 20;: Dette definerer en variabel goodAirQualityThreshold, der repræsenterer en tærskelværdi for god luftkvalitet. Hvis den målte luftkvalitet er under denne tærskelværdi, indikerer det god luftkvalitet, og de grønne LED'er og buzzeren er deaktiveret. Hvis luftkvaliteten overstiger tærskelværdien, indikerer det dårlig luftkvalitet, og de røde LED'er og buzzeren aktiveres.

Disse variabler og instanser bruges i hovedløkken til at opdatere statusen for LED'er og buzzer baseret på målt luftkvalitet og tærskelværdien for god luftkvalitet.


void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) {
  if (type == WS_EVT_CONNECT) {
  Serial.println("WebSocket client connected");
  } else if (type == WS_EVT_DISCONNECT) {
  Serial.println("WebSocket client disconnected");
  }
}

Denne del af koden definerer en funktion kaldet onWsEvent, som er en event-handler for WebSocket-hændelser. Denne funktion kaldes, når der opstår en begivenhed relateret til WebSocket-forbindelsen.

  • void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len): Dette er funktionens signatur, der specificerer parametrene, den modtager.

  • AsyncWebSocket *server: Dette er en pointer til den AsyncWebSocket-server, der håndterer WebSocket-forbindelsen.

  • AsyncWebSocketClient *client: Dette er en pointer til den klient, der udløste begivenheden.

  • AwsEventType type: Dette er typen af begivenhed, der er opstået. Det kan være enten WS_EVT_CONNECT, hvis en klient er forbundet, eller WS_EVT_DISCONNECT, hvis en klient er frakoblet.

  • void *arg: Dette er en generisk peker til yderligere argumenter, der kan være relevante for begivenheden.

  • uint8_t *data: Dette er en pointer til data, der er modtaget fra klienten under begivenheden.

  • size_t len: Dette er længden af de modtagne data.

Inde i funktionen er der en betinget kontrolstruktur (if-else if), der bestemmer, hvilken type begivenhed der er opstået. Afhængigt af begivenhedstypen udskrives der en passende meddelelse til serielterminalen ved hjælp af Serial.println(). Hvis begivenheden er WS_EVT_CONNECT, udskrives "WebSocket client connected". Hvis begivenheden er WS_EVT_DISCONNECT, udskrives "WebSocket client disconnected".

Denne funktion kan bruges til at håndtere og reagere på begivenheder relateret til WebSocket-forbindelsen, f.eks. for at registrere, når en klient forbinder eller frakobler sig.

 

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
  delay(1000);
  Serial.println("Connecting to WiFi...");
  }

  IPAddress IP = WiFi.localIP();
  Serial.print("Connected to WiFi. IP address: ");
  Serial.println(IP);

  pinMode(greenLedPin, OUTPUT);
  pinMode(redLedPin, OUTPUT);
  pinMode(buzzerPin, OUTPUT);

  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
  request->send_P(200, "text/html", index_html);
  });

  ws.onEvent(onWsEvent);
  server.addHandler(&ws);
  server.begin();
}
  • Serial.begin(115200): Denne linje initialiserer den serielle kommunikation mellem ESP32 og computeren via USB-porten. Serial.begin()-funktionen indstiller den ønskede baudrate (115200 bps i dette tilfælde) for dataoverførsel mellem enhederne. Dette gør det muligt at sende og modtage seriel data, som kan bruges til debugging og fejlfinding.

  • WiFi.begin(ssid, password): Her forsøger ESP32 at oprette forbindelse til et trådløst netværk ved at kalde WiFi.begin()-funktionen og angive SSID (netværksnavn) og adgangskode som parametre. ESP32 vil bruge disse oplysninger til at identificere og forbinde til det specifikke netværk.

  • while (WiFi.status() != WL_CONNECTED) { ... }: Dette er en løkke, der kører, indtil ESP32 har oprettet forbindelse til det trådløse netværk. I hver iteration af løkken kontrolleres Wi-Fi-statusen ved at kalde WiFi.status()-funktionen. Hvis statusen ikke er "WL_CONNECTED" (dvs. ESP32 ikke er forbundet), vil løkken fortsætte med at køre og vente i 1 sekund ved hjælp af delay(1000). Derudover udskrives beskeden "Connecting to WiFi..." ved hjælp af Serial.println() for at informere brugeren om processen.

  • IPAddress IP = WiFi.localIP(): Når ESP32 er blevet tilsluttet det trådløse netværk, bruger denne linje WiFi.localIP()-funktionen til at få tildelt IP-adressen fra den lokale Wi-Fi-router. IP-adressen gemmes derefter i variablen IP af typen IPAddress.

  • pinMode(greenLedPin, OUTPUT), pinMode(redLedPin, OUTPUT), pinMode(buzzerPin, OUTPUT): Disse linjer konfigurerer tilstanden af de GPIO-pinde, der bruges til at styre LED'er og buzzer. Ved at kalde pinMode()-funktionen med parametret OUTPUT angives det, at GPIO-pindene skal fungere som udgange. Det betyder, at de kan styre tilstanden (tændt/slukket) af de tilsluttede komponenter.

  • server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) { ... }): Her defineres en HTTP GET-anmodningshåndteringsfunktion for roden af webserveren ("/"). Når en klient sender en GET-anmodning til roden, udløses denne funktion. I funktionen bruges request->send_P()-metoden til at sende HTTP-statuskoden 200 (OK) og HTML-indholdet fra index_html til klienten.

  • ws.onEvent(onWsEvent): Denne linje registrerer onWsEvent-funktionen som en håndteringsfunktion for WebSocket-hændelser. Når der opstår en WebSocket-hændelse, vil onWsEvent-funktionen blive kaldt med de relevante oplysninger om hændelsen.

  • server.addHandler(&ws): Ved at tilføje WebSocket-serveren som en håndteringsmetode til webserveren muliggør denne linje håndtering af både HTTP-anmodninger og WebSocket-forbindelser af samme server. Det betyder, at både HTML-sider og realtidsdata kan leveres fra samme server.

  • server.begin(): Til sidst starter denne linje webserveren og gør den aktiv. Når server.begin()-funktionen er kaldt, begynder webserveren at lytte efter indgående anmodninger og behandle dem i henhold til de definerede håndteringsfunktioner.

Samlet set konfigurerer void setup() forskellige aspekter af systemet, såsom serielle kommunikation, Wi-Fi-forbindelse, GPIO-pindtilstande og håndtering af HTTP-anmodninger og WebSocket-hændelser. Det er en vigtig del af opsætningen af IoT-luftforureningsovervågningssystemet.


void loop() {
  float airQuality = gasSensor.getPPM(); // Get air quality data in PPM

  // Prepare JSON data
  String jsonData = "{\"airQuality\": " + String(airQuality) + "}";

  // Send JSON data to WebSocket clients
  ws.textAll(jsonData);

  // Check air quality thresholds and control buzzer and LEDs
  if (airQuality <= goodAirQualityThreshold) {
  digitalWrite(greenLedPin, HIGH);
  digitalWrite(redLedPin, LOW);
  noTone(buzzerPin);
  } else if (airQuality > goodAirQualityThreshold) {
  digitalWrite(greenLedPin, LOW);
  digitalWrite(redLedPin, HIGH);
  tone(buzzerPin, 1000);
  } else {
  digitalWrite(greenLedPin, LOW);
  digitalWrite(redLedPin, LOW);
  noTone(buzzerPin);
  }

  delay(1000); // Adjust the delay according to your needs
}

void loop()-funktionen er en kontinuerlig løkke, der kører efter void setup() er blevet udført. Her er en forklaring på dens funktionalitet:

  • float airQuality = gasSensor.getPPM();: Denne linje henter luftkvalitetsdata i ppm (parts per million) ved at kalde getPPM()-metoden på gasSensor-objektet. Luftkvaliteten måles af MQ135-sensoren, og værdien gemmes i variablen airQuality.

  • String jsonData = "{\"airQuality\": " + String(airQuality) + "}";: Denne linje opretter en JSON-streng ved at sammensætte en tekststreng med værdien af airQuality. JSON-strengen er i formen {"airQuality": <værdi>} og indeholder luftkvalitetsdataen i et JSON-format.

  • ws.textAll(jsonData);: Denne linje sender JSON-dataen til alle tilsluttede WebSocket-klienter ved at kalde textAll()-metoden på ws-objektet. Dette sikrer, at klienterne modtager opdaterede luftkvalitetsdata i realtid.

  • Kontrol af luftkvalitetstærskler og styring af buzzer og LED'er:

    • Hvis airQuality er mindre end eller lig med goodAirQualityThreshold, betyder det, at luftkvaliteten er god. Derfor sættes den grønne LED til tændt (HIGH), den røde LED til slukket (LOW) og buzzeren slukkes ved at kalde noTone(buzzerPin).
    • Hvis airQuality er større end goodAirQualityThreshold, betyder det, at luftkvaliteten er dårlig. Derfor sættes den grønne LED til slukket (LOW), den røde LED til tændt (HIGH) og buzzeren aktiveres med en tone på 1000 Hz ved at kalde tone(buzzerPin, 1000)
    • delay(1000);: Denne linje introducerer en pause på 1 sekund (1000 millisekunder) mellem hver iteration af løkken ved hjælp af delay()-funktionen. Du kan justere denne værdi efter behov for at ændre opdateringshastigheden for luftkvalitetsdata og styring af komponenter.

Loop-funktionen gentages derefter, og processen med at opdatere luftkvalitetsdata og styre LED'er og buzzer fortsætter kontinuerligt så længe systemet kører.



Tak for denne gang

I denne serie af blogs har vi introduceret dig til verdenen af elektronik og givet dig en grundlæggende forståelse for nogle af de mest almindelige komponenter og koncepter. Vi har udforsket Arduino-platformen og lært, hvordan man opbygger enkle projekter ved hjælp af mikrocontrolleren.

I denne sidste blog øgede vi vores kampkraft og fokuserede på at opbygge et luftkvalitetsmonitoreringssystem ved hjælp af MQ135-gassensoren og ESP32-mikrocontrolleren. Vi har forklaret kredsløbet, herunder tilslutning af LED'er, en buzzer og sensorer. Vi har også vist dig, hvordan man opsætter en webserver og bruger WebSocket-protokollen til at sende opdaterede luftkvalitetsdata til en webbaseret brugergrænseflade.

Dette projekt har ikke kun givet dig mulighed for at lære om elektroniske komponenter og kodning, men det har også givet dig en praktisk anvendelse af teknologien. Ved at bygge et luftkvalitetsmonitoreringssystem kan du blive mere bevidst om din omgivende luftkvalitet og træffe foranstaltninger for at forbedre den.

Husk, at de projekter, vi har udforsket i denne serie, kun er begyndelsen på rejsen ind i elektronikkens verden. Der er utallige muligheder for at udforske og opbygge mere komplekse systemer og interaktioner. Ved at kombinere din viden om komponenter, kodning og kreativ tænkning kan du skabe spændende og innovative elektroniske løsninger.

Vi håber, at denne serie af blogs har givet dig en solid introduktion til elektronik og inspireret dig til at fortsætte med at lære og udforske. Husk altid at eksperimentere sikkert og have det sjovt undervejs!

Tak for din interesse i vores begyndervejledning til elektronik. Held og lykke med dine fremtidige projekter

Skriv kommentar!

Relevante produkter

TS101 digital loddekolbeTS101 digital loddekolbe i hånd
TS101 digital loddekolbe med USB C forsyning
Tilbudspris Fra 699,00 kr
14 på lager
TS80P USB-C Loddekolbe kitTS80P Loddekolbe
TS80P USB-C Loddekolbe kit
Tilbudspris Fra 799,00 kr
2 på lager
bruge Loddekolbe Renser til at rengøre loddekolbespidsenLoddekolbe Renser
Luksus Loddekolbe renser
Tilbudspris 89,00 kr
8 på lager