mirror of
https://gitlab.fdmci.hva.nl/technische-informatica-sm3/ti-projectten/rooziinuubii79.git
synced 2025-08-05 12:54:57 +00:00
Compare commits
33 Commits
1fd88c7636
...
22-als-dev
Author | SHA1 | Date | |
---|---|---|---|
|
466a8659d0 | ||
|
523ccd87e3 | ||
|
c905bda662 | ||
|
d865a50951 | ||
|
d7a643460c | ||
|
f021ebebcb | ||
|
32e0583c1b | ||
|
c0cf6f1360 | ||
|
730d2b47b8 | ||
|
4c5cea71b2 | ||
|
dcd3f1006d | ||
|
4f79695d9c | ||
|
b2d233386c | ||
|
160b43f49e | ||
|
afe8ae3357 | ||
|
66d5444488 | ||
|
bcbd6743fb | ||
|
9997bf2319 | ||
|
0ae0b83e4b | ||
|
db8758e1e5 | ||
|
08dff8bbc1 | ||
|
f0260c1a91 | ||
|
40d601a35b | ||
|
3525479b17 | ||
|
2e08bf7e74 | ||
|
12c25b33a7 | ||
|
5b27974d5a | ||
|
f4ce50db18 | ||
|
9bd9b6c4b2 | ||
|
c08f1e434c | ||
|
fb35d2a84d | ||
|
b67c51e56b | ||
|
8b03438d47 |
28
docs/explanation/Sensorbehuizing.md
Normal file
28
docs/explanation/Sensorbehuizing.md
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# Sensor behuizing
|
||||||
|
|
||||||
|
Voor de sensoren op onze Kobuki wouden wij graag een behuizing zodat deze sensoren niet los liggen op de Kobuki.
|
||||||
|
|
||||||
|
Deze behuizing had een paar eisen en die eisen waren als volgt
|
||||||
|
- Hij moet klein zijn zodat hij niet veel ruimte in neemt op de Kobuki.
|
||||||
|
- De behuizing moet makkelijk vast te maken zijn aan de Kobuki.
|
||||||
|
- In de behuizing moet een esp32 passen en de 3 sensoren.
|
||||||
|
- De behuizing moet makkelijk uit elkaar te halen zijn zodat als we onderhoud moeten plegen dit makkelijk kan.
|
||||||
|
|
||||||
|
Met deze eisen zijn we uiteindelijk een behuizing gaan maken in onshape.
|
||||||
|
Onshape is gratis ontwerp software wat te gebruiken is via je browser.
|
||||||
|
Hierdoor hoef je dus geen applicatie te runnen op je computer en kan je op elk apparaat inloggen om zo gemakkelijk door te gaan aan je ontwerp.
|
||||||
|
Ik (Yannick) heb voor deze software gekozen omdat ik deze software al veel vaker heb gebruikt en hier dus al bekend mee ben.
|
||||||
|
|
||||||
|
Uiteindelijk zijn we op het volgende design uitgekomen.
|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
Wij hebben gekozen voor dit design omdat dit de breedte en lengte heeft van een esp32 dus de esp past precies waardoor wij hem niet nog extra vast hoeven te zetten.
|
||||||
|
Er zitten gaten in de zijkant van het bakje voor de kabel en voor een 5 volt kabel voor de MQ5 sensor.
|
||||||
|
De dht11 sensor past er precies in en deze blijft daardoor precies vast zitten.
|
||||||
|
Voor de M5stack sensor is er een gat gemaakt zodat deze kabel erdoorheen past en vervolgens wordt deze sensor op de bovenkant van de behuizing vastgeplakt.
|
||||||
|
Voor de MQ5 sensor is een gat gemaakt waar de sensor door heen kan en het printplaatje wordt aan de onderkant vast gemaakt met stevige M3 tape.
|
||||||
|
|
||||||
|
In de onderkant van de behuizing zitten 2 gaten hiermee kan de behuizing goed vastgemaakt worden aan de kobuki.
|
||||||
|
De onderkant en de bovenkant van de behuizing zijn makkelijk uit elkaar te halen omdat deze doormiddel van 4 sterke magneten aan elkaar vast zitten.
|
||||||
|
Hierdoor is het ook makkelijk om onderhoud te plegen omdat het bakje door de magneten makkelijk uit elkaar te halen is maar niet zo makkelijk dat hij door trillingen los kan komen.
|
79
docs/explanation/Sensoronderzoek.md
Normal file
79
docs/explanation/Sensoronderzoek.md
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
# Sensor onderzoek
|
||||||
|
|
||||||
|
In dit bestand gaan we onderzoek doen naar de sensoren die we willen gebruiken op de Kobuki.
|
||||||
|
Hierin gaan we meerdere sensoren vergelijken met elkaar en kijken welke wij het beste kunnen gebruiken voor ons project.
|
||||||
|
|
||||||
|
## Probleem
|
||||||
|
Voor ons project moeten wij een manier vinden om gassen/stoffen te detecteren zodat je in een gebouw weet waar je niet veilig naartoe kan.
|
||||||
|
|
||||||
|
## De vraag
|
||||||
|
> Welke sensoren kunnen wij het beste gebruiken om schadelijke gassen/stoffen te vinden in een gebouw ?
|
||||||
|
|
||||||
|
## Voorwaarden
|
||||||
|
De voorwaarden waar de sensors aan moeten voldoen zijn:
|
||||||
|
|
||||||
|
- De sensoren moeten op de kobuki passen.
|
||||||
|
- We moeten zo weining mogelijk sensoren gebruiken zodat we genoeg plek over houden voor andere onderdelen van de Kobuki.
|
||||||
|
|
||||||
|
## Hoe aansluiten
|
||||||
|
Wij gaan deze sensoren aansluiten op een esp32 en deze laten wij via MQTT de gegevens doorsturen naar de raspberry pi.
|
||||||
|
|
||||||
|
## De sensoren.
|
||||||
|
Wij zijn uitgekomen op 3 sensoren.
|
||||||
|
|
||||||
|
- De dht11 sensor
|
||||||
|
- De tvoc/eC02 Gas Unit.
|
||||||
|
- Gravity: Elektrochemische zuurstof-/O2-sensor (0-25%Vol, I2C) SEN0322
|
||||||
|
- Gassensor MQ-5 module (OT2018-D55)
|
||||||
|
|
||||||
|
Wij hebben voor de Dht11 en de tvoc/eC02 gas unit gekozen omdat wij deze bij james konden lenen. En wij hebben gekozen voor de Gassensor MQ-5 module (OT2018-D55) Omdat dit een mooie kleine sensor is die wij makkelijk kwijt kunnen op de kobuki.
|
||||||
|
Voor de o2 sensor hebben wij gekozen voor de Gravity: Elektrochemische zuurstof-/O2-sensor (0-25%Vol, I2C) SEN0322. Deze sensor is helaas op het moment van schrijven (29-10-2024) niet op voorraad dus deze sensor kunnen wij helaas nog niet toevoegen. Zodra deze sensor op voorraad is zal ik deze bestellen en aan de esp toevoegen.
|
||||||
|
|
||||||
|
## Sensor uitleg
|
||||||
|
#### Dht11
|
||||||
|
De dht11 is een eenvoudige en goedkope sensor die wordt gebruikt om de temperatuur en luchtvochtigheid te meten.
|
||||||
|
|
||||||
|
De sensor bevat de volgende onderdelen om te werken:
|
||||||
|
- Een thermistor : Dit is een component die temperatuur meet door variaties in elektronische weerstand.
|
||||||
|
- Een capacitieve vochtigheidssensor : Deze meet de relatieve luchtvochtigheid door de verandering in het materiaal tussen de condensatorplaten te meten. Deze verandering gebeurt door de waterdamp in de lucht.
|
||||||
|
- Een geïntegreerde microcontroller : Deze microcontroller verwerkt de gegevens van de sensoren en zet deze om in een digitaal signaal.
|
||||||
|
|
||||||
|
Het meetbereik van de sensor is 0 tot 50 graden voor temperatuur en voor de luchtvochtigheid is het 20 tot 90%
|
||||||
|
Hierbij is de temperatuur tot ±2 graden nauwkeurig en de luchtvochtigheid ±5 procent.
|
||||||
|
|
||||||
|
De DHT11 kan aangesloten worden op een 3.3 of 5 volt voeding.
|
||||||
|
Wij kunnen deze sensor dus zonder problemen compleet aansluiten op de esp32s3
|
||||||
|
|
||||||
|
#### Tvoc/eC02 Gas Unit
|
||||||
|
De M5Stack TVOC/eCO2-Gassensensor-eenheid (SGP30) is een compacte sensor ontwikkeld om vluchtige organische stoffen (TVOC) en schijnbare CO₂-concentraties (eCO2) te meten.
|
||||||
|
Deze component maakt gebruik van de SGP30-sensor van Adafruit
|
||||||
|
|
||||||
|
De SGP30 is gebaseerd op een metal-oxide (MOX) halfgeleidertechnologie.
|
||||||
|
Deze technologie detecteert veranderingen in elektrische weerstand bij blootstelling aan vluchtige organische stoffen (VOC's),
|
||||||
|
zoals ethanol en aceton.
|
||||||
|
|
||||||
|
De sensor bevat ingebouwde algoritmes om de gemeten VOC waarden om te zetten in tvoc en eco2.
|
||||||
|
- TVOC : Dit is de totale concentratie vluchtige organische stoffen.
|
||||||
|
- ECO2 : Dit is een geschatte koolstofdioxideconcentratie.
|
||||||
|
Dit is een schatting op basis van de VOC metingen.
|
||||||
|
|
||||||
|
Deze sensor werkt op 3.3 en 5 volt dus ook voor deze sensor kunnen wij de esp32s3 gebruiken.
|
||||||
|
|
||||||
|
#### MQ5 Gassensor
|
||||||
|
|
||||||
|
De MQ5-gassensor is een veelgebruikte sensor voor het detecteren van brandbare gassen, zoals aardgas (methaan), vloeibaar petroleumgas (LPG), waterstof en koolmonoxide. Het werkt op basis van veranderingen in elektrische weerstand van het sensorelement wanneer het wordt blootgesteld aan specifieke gassen.
|
||||||
|
|
||||||
|
De kern van de MQ5 sensor is een chemisch gecoat metalen oxide (meestal tinoxide).
|
||||||
|
Dit materiaal reageert op de aanwezigheid van brandbare gassen.
|
||||||
|
Wanneer de sensor gasdeeltjes detecteert, reageren deze met zuurstofionen op het oppervlak van het tinoxide. Deze reactie veroorzaakt een verandering in de elektrische geleidbaarheid (weerstand) van het materiaal.
|
||||||
|
De verandering in weerstand wordt door een elektronisch circuit omgezet in een elektrisch signaal dat de concentratie van gas vertegenwoordigt.
|
||||||
|
|
||||||
|
De MQ5 sensor heeft ook een ingebouwde verwarmingsspiraal die het sensorelement op een hoge temperatuur houdt (ongeveer 300-500°C). Deze temperatuur zorgt ervoor dat gassen efficiënt reageren met het tinoxide-oppervlak.
|
||||||
|
|
||||||
|
Het enige nadeel van deze sensor is dat hij niet selectief is dus de sensor kan geen onderscheid maken tussen bijvoorbeeld methaan en lpg.
|
||||||
|
|
||||||
|
## Aansluitschema
|
||||||
|

|
||||||
|
|
||||||
|
Hierboven is te zien hoe wij de sensoren hebben aangesloten op de esp32.
|
||||||
|
|
BIN
docs/explanation/image.png
Normal file
BIN
docs/explanation/image.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 54 KiB |
BIN
docs/explanation/images/Aansluitschema_sensors.png
Normal file
BIN
docs/explanation/images/Aansluitschema_sensors.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 123 KiB |
BIN
docs/explanation/images/Behuizingfoto1.png
Normal file
BIN
docs/explanation/images/Behuizingfoto1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 68 KiB |
BIN
docs/explanation/images/Behuizingfoto2.png
Normal file
BIN
docs/explanation/images/Behuizingfoto2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 49 KiB |
123
src/Arduino/Sensors/Sensors.ino
Normal file
123
src/Arduino/Sensors/Sensors.ino
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
#include <DHT.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
#include "Adafruit_SGP30.h"
|
||||||
|
#include <WiFi.h>
|
||||||
|
#include <PubSubClient.h>
|
||||||
|
#include <ArduinoWebsockets.h>
|
||||||
|
|
||||||
|
using namespace websockets;
|
||||||
|
|
||||||
|
Adafruit_SGP30 sgp;
|
||||||
|
|
||||||
|
// Definieert de pins voor de sensoren
|
||||||
|
#define DHTPIN 4
|
||||||
|
#define DHTTYPE DHT11
|
||||||
|
|
||||||
|
#define MQ5_PIN 2
|
||||||
|
|
||||||
|
#define SDA_PIN 10
|
||||||
|
#define SCL_PIN 11
|
||||||
|
|
||||||
|
DHT dht(DHTPIN, DHTTYPE);
|
||||||
|
|
||||||
|
// WiFi en MQTT instellingen
|
||||||
|
const char* ssid = "";
|
||||||
|
const char* password = "";
|
||||||
|
|
||||||
|
const char* mqtt_server = "192.168.68.104";
|
||||||
|
const int mqtt_port = 8080; //websocket-poort
|
||||||
|
const char* mqtt_topic = "sensors/data";
|
||||||
|
|
||||||
|
// MQTT client
|
||||||
|
WiFiClient espClient;
|
||||||
|
WebsocketsClient websocket;
|
||||||
|
PubSubClient client(espClient);
|
||||||
|
|
||||||
|
// Functie om verbinding te maken met WiFi
|
||||||
|
void setup_wifi() {
|
||||||
|
Serial.print("Verbinden met WiFi...");
|
||||||
|
WiFi.begin(ssid, password);
|
||||||
|
while (WiFi.status() != WL_CONNECTED) {
|
||||||
|
delay(500);
|
||||||
|
Serial.print(".");
|
||||||
|
}
|
||||||
|
Serial.println("Verbonden!");
|
||||||
|
}
|
||||||
|
|
||||||
|
void reconnectMQTT() {
|
||||||
|
while (!client.connected()) {
|
||||||
|
Serial.print("Verbinding maken met MQTT via WebSockets...");
|
||||||
|
if (client.connect("ESP32Client")) {
|
||||||
|
Serial.println("Verbonden!");
|
||||||
|
} else {
|
||||||
|
Serial.print("Fout: ");
|
||||||
|
Serial.print(client.state());
|
||||||
|
delay(5000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// Start de seriële monitor
|
||||||
|
Serial.begin(9600);
|
||||||
|
|
||||||
|
dht.begin();
|
||||||
|
|
||||||
|
pinMode(MQ5_PIN, INPUT);
|
||||||
|
|
||||||
|
Wire.begin(SDA_PIN, SCL_PIN);
|
||||||
|
Serial.println("SGP30 test");
|
||||||
|
|
||||||
|
// SGP30 initialiseren
|
||||||
|
if (!sgp.begin()) {
|
||||||
|
Serial.println("SGP30 sensor niet gevonden :(");
|
||||||
|
while (1);
|
||||||
|
}
|
||||||
|
if (!sgp.IAQinit()) {
|
||||||
|
Serial.println("SGP30 IAQ-initialisatie mislukt!");
|
||||||
|
while (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verbind met WiFi en MQTT-broker
|
||||||
|
setup_wifi();
|
||||||
|
// Stel MQTT-broker in met websockets
|
||||||
|
client.setServer(mqtt_server, mqtt_port);
|
||||||
|
reconnectMQTT();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// Zorgt ervoor dat MQTT verbonden blijft
|
||||||
|
if (!client.connected()) {
|
||||||
|
reconnectMQTT();
|
||||||
|
}
|
||||||
|
client.loop();
|
||||||
|
|
||||||
|
float h = dht.readHumidity();
|
||||||
|
float t = dht.readTemperature();
|
||||||
|
int mq5Value = analogRead(MQ5_PIN);
|
||||||
|
|
||||||
|
// Check of de sensorwaarden geldig zijn
|
||||||
|
if (isnan(h) || isnan(t) || mq5Value < 0) {
|
||||||
|
Serial.println("Fout bij het lezen van de sensors!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Maak een JSON-payload
|
||||||
|
String payload = "{";
|
||||||
|
payload += "\"humidity\":" + String(h) + ",";
|
||||||
|
payload += "\"temperature\":" + String(t) + ",";
|
||||||
|
payload += "\"mq5\":" + String(mq5Value) + ",";
|
||||||
|
payload += "\"tvoc\":" + String(sgp.TVOC) + ",";
|
||||||
|
payload += "\"eco2\":" + String(sgp.eCO2);
|
||||||
|
payload += "}";
|
||||||
|
|
||||||
|
// Verzend de payload via MQTT
|
||||||
|
if (client.publish(mqtt_topic, payload.c_str())) {
|
||||||
|
Serial.println("Bericht verzonden: " + payload);
|
||||||
|
} else {
|
||||||
|
Serial.println("Fout bij verzenden van bericht!");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wacht 5 seconden voor de volgende meting
|
||||||
|
delay(5000);
|
||||||
|
}
|
40
src/Arduino/TestM5/TestM5.ino
Normal file
40
src/Arduino/TestM5/TestM5.ino
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
// Test code is merged to main sensor code os this file is not needed anymore
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
#include "Adafruit_SGP30.h"
|
||||||
|
|
||||||
|
Adafruit_SGP30 sgp;
|
||||||
|
|
||||||
|
#define SDA_PIN 10
|
||||||
|
#define SCL_PIN 11
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(115200);
|
||||||
|
while (!Serial) { delay(10); }
|
||||||
|
|
||||||
|
Wire.begin(SDA_PIN, SCL_PIN);
|
||||||
|
|
||||||
|
Serial.println("SGP30 test");
|
||||||
|
|
||||||
|
if (!sgp.begin()) {
|
||||||
|
Serial.println("SGP30 sensor not found :(");
|
||||||
|
while (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start measurements (initialize baseline)
|
||||||
|
if (! sgp.IAQinit()) {
|
||||||
|
Serial.println("SGP30 IAQinit failed!");
|
||||||
|
while (1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
if (! sgp.IAQmeasure()) {
|
||||||
|
Serial.println("Measurement failed");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Serial.print("TVOC "); Serial.print(sgp.TVOC); Serial.print(" ppb\t");
|
||||||
|
Serial.print("eCO2 "); Serial.print(sgp.eCO2); Serial.println(" ppm");
|
||||||
|
|
||||||
|
delay(1000); // 1 second delay
|
||||||
|
}
|
Reference in New Issue
Block a user