From 4db11e303576358c331eb6f67e11fd1af073c965 Mon Sep 17 00:00:00 2001 From: Sietse Jonker Date: Fri, 1 Mar 2024 14:14:11 +0100 Subject: [PATCH 01/10] adds gebruikerstest voor questions enquete --- docs/brainstorm/Questions Enquete.md | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/docs/brainstorm/Questions Enquete.md b/docs/brainstorm/Questions Enquete.md index e826a51..c685b84 100644 --- a/docs/brainstorm/Questions Enquete.md +++ b/docs/brainstorm/Questions Enquete.md @@ -1,11 +1,27 @@ # Questions ## Criteria -Questions shouldnt be able to measure using sensors. 3 possible answers. +Questions shouldn't be able to measure using sensors. 3 possible answers. ## Questions -How clean are the toilets? (clean, normal, disgusting). -How clean is the study area? (clean, normal, disgusting). -What do you think of the temperature in the study area? (hot, perfect, cold). -How crowded would you say the study area is?(not at all, its fine, really crowded). -Is there enough help available? (no, decently, yes). + +- How clean are the toilets? (clean, normal, disgusting). +- How clean is the study area? (clean, normal, disgusting). +- What do you think of the temperature in the study area? (hot, perfect, cold). +- How crowded would you say the study area is?(not at all, its fine, really crowded). +- Is there enough help available? (no, decently, yes). + +### Feedback questions + +- Zijn de vragen duidelijk en snel te beantwoorden hierboven? + +- Hebben jullie nog andere feedback voor gebouwbeheer, die niet gemeten kan worden door sensoren? + +## Feedback + +1. vraag 5 is onduidelijk. Wat bedoel je met genoeg hulp? Docenten, schoonmakers? Andere manier formuleren over welke hulp. Andere vragen zijn duidelijk. Er kan een vraag worden toegevoegd over of het goed gaat met de studie of over de dag. Dit is niet heel hulpvol voor gebouwbeheer maar voor de studenten zelf wel. + + +2. andere variant van antwoord geven op de vragen. Bijvoorbeeld een schaal van 1 tot 5. Of een schaal van 1 tot 10. Dit is makkelijker te verwerken en te analyseren. Voor de rest zijn de vragen duidelijk. Deze persoon heeft geen andere feedback voor gebouwbeheer want deze vragen zijn genoeg + +3. De vragen zijn duidelijk en snel te beantwoorden. behalve vraag 5 die onduidleijk is. geen andere vragen vragen als feedback. \ No newline at end of file From a70575d8b8bc35579524adeb06098942b712d1b2 Mon Sep 17 00:00:00 2001 From: Sietse Jonker Date: Fri, 1 Mar 2024 14:14:24 +0100 Subject: [PATCH 02/10] adds comments --- arduino/node-code/node-code-final.ino | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/arduino/node-code/node-code-final.ino b/arduino/node-code/node-code-final.ino index 2dc8896..475d905 100644 --- a/arduino/node-code/node-code-final.ino +++ b/arduino/node-code/node-code-final.ino @@ -148,6 +148,8 @@ bool checkForError(){ void update(){ // display sensordata on oled screen displayData(); + + // send data to websocket server webSocket.sendTXT("Temp: " + String(temperature)); webSocket.sendTXT("Humi: " + String(humidity)); webSocket.sendTXT("eCO2: " + String(sgp.eCO2)); @@ -159,6 +161,7 @@ void update(){ temperature = float(dht.readTemperature()); humidity = float(dht.readHumidity()); + // check if any errors occured when reading sensors checkForError(); } @@ -177,12 +180,14 @@ void displayData() { + "Humi: " + int(humidity) + "%" + '\n' + "eCO2: " + int(sgp.eCO2) + '\n' + "TVOC: " + int(sgp.TVOC)); - + + // display the screen display.display(); } // setup function void setup() { + // make serial connection at 115200 baud Serial.begin(115200); // tell display what settings to use @@ -196,7 +201,10 @@ void setup() { pinMode(MICPIN, INPUT); pinMode(DHTPIN, INPUT); + // setup websocket connection websocketSetup(); + + // reset values resetValues(); } From ce24a782ed21fcaec784c3493663e4cfa8808d0a Mon Sep 17 00:00:00 2001 From: Bram Barbieri Date: Mon, 4 Mar 2024 14:15:16 +0100 Subject: [PATCH 03/10] Bram Documentation themperature sensors. --- .../Sprint1/FirstDocumentation.md | 63 ++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/docs/LearningProcessBram/Sprint1/FirstDocumentation.md b/docs/LearningProcessBram/Sprint1/FirstDocumentation.md index 4fd608a..1d17993 100644 --- a/docs/LearningProcessBram/Sprint1/FirstDocumentation.md +++ b/docs/LearningProcessBram/Sprint1/FirstDocumentation.md @@ -57,7 +57,7 @@ examples, basics, fade \/ servo's examples, servo, sweep -### Linux and raspberrypi. +### Linux and raspberryPI. To gain more knowledge about linux, i first asked my class mates if they could get me started. They showed me how to gain acces to a server, and told me how to navigate through files. By doing this i got taught the following commands: @@ -71,4 +71,65 @@ By doing this i got taught the following commands: ~ $ 'ssh username@ip address' = open ssh connection. From here i went and looked up several linux video's wich taught me the following: +.... +### Air, temperature, and all sort of stuff. +After the linux coding i decided to take a step back and began gaining experience with sensors. +I began trying to make our group project's "node" for myself. +I did this by using one of the main sensors and tried programing it in myself. +I used this website for the information and for the right library:(https://randomnerdtutorials.com/esp32-dht11-dht22-temperature-humidity-sensor-arduino-ide/). +Aside from the website i used my teammates for help where it was needed. +I wanted to make my own spin on the original design by including a button to activate the sensor and an LED to show if its on. +At first I tried to use my own DHT11, but apparently it didn't work. So i used one from my Teammates. +The rest of the tutorial was clear and worked like a charm. +the code used looks like this: +``` +#include "DHT.h" + +#define DHTPIN 4 +#define DHTTYPE DHT11 + +DHT dht(DHTPIN, DHTTYPE); + +void setup() { + // put your setup code here, to run once: +Serial.begin(9600); +Serial.println(F("DHTxx test!")); +dht.begin(); +} + +void loop() { + delay(2000); + float h = dht.readHumidity(); +// Read temperature as Celsius (the default) +float t = dht.readTemperature(); +float f = dht.readTemperature(true); + + if (isnan(h) || isnan(t) || isnan(f)) { + Serial.println(F("Failed to read from DHT sensor!")); + return; + } + +// Compute heat index in Fahrenheit (the default) +float hif = dht.computeHeatIndex(f, h); +// Compute heat index in Celsius (isFahreheit = false) +float hic = dht.computeHeatIndex(t, h, false); + +Serial.print(F("Humidity: ")); +Serial.print(h); +Serial.print(F("% Temperature: ")); +Serial.print(t); +Serial.print(F("°C ")); +Serial.print(f); +Serial.print(F("°F Heat index: ")); +Serial.print(hic); +Serial.print(F("°C ")); +Serial.print(hif); +Serial.println(F("°F")); +} +``` +And The fysical board looks like this: + +And here it looks in action: + +Later on i could expand this code and the fysical product to include the rest of the sensors. From 5b26d6b844ee74b0db4cc3d7108906f35702c222 Mon Sep 17 00:00:00 2001 From: Bram Barbieri Date: Mon, 4 Mar 2024 15:28:05 +0100 Subject: [PATCH 04/10] Bram documentation buzzers pt 2 --- .../Sprint1/FirstDocumentation.md | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/docs/LearningProcessBram/Sprint1/FirstDocumentation.md b/docs/LearningProcessBram/Sprint1/FirstDocumentation.md index 1d17993..aea3318 100644 --- a/docs/LearningProcessBram/Sprint1/FirstDocumentation.md +++ b/docs/LearningProcessBram/Sprint1/FirstDocumentation.md @@ -133,3 +133,35 @@ And The fysical board looks like this: And here it looks in action: Later on i could expand this code and the fysical product to include the rest of the sensors. + +### Buzzers .pt 2 +I found out how to make multiple buzzers go off with the press of one button and increase as mutch as there are pins. +I tried to not look up anything for this one, but did ask questions form time to time. +I designed it to work with scaning if there is and input and then output this signal to activate the buzzers. +This output signal can activate over multiple pins so this one button can set off all sorts of stuff. +The code is short and simple: +``` +int button = 20; +int buzzerone = 12; +int buzzertwo = 11; + +void setup() { + // put your setup code here, to run once: +pinMode(button, INPUT); +pinMode(buzzerone, OUTPUT); +pinMode(buzzertwo, OUTPUT); +} + +void loop() { + + if(digitalRead(button) == HIGH){ + digitalWrite(buzzerone, HIGH); + digitalWrite(buzzertwo, HIGH); + }else{ + digitalWrite(buzzerone, LOW); + digitalWrite(buzzertwo, LOW); + } +} +``` + +and the fysical design looks like this: ... \ No newline at end of file From 9193a753ce7e85307a2b126b3fb3f2d1aca6301b Mon Sep 17 00:00:00 2001 From: Sietse Jonker Date: Tue, 5 Mar 2024 11:27:29 +0100 Subject: [PATCH 05/10] Refactor survey questions and add conclusion --- docs/brainstorm/Questions Enquete.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/brainstorm/Questions Enquete.md b/docs/brainstorm/Questions Enquete.md index c685b84..5fc8bc8 100644 --- a/docs/brainstorm/Questions Enquete.md +++ b/docs/brainstorm/Questions Enquete.md @@ -24,4 +24,8 @@ Questions shouldn't be able to measure using sensors. 3 possible answers. 2. andere variant van antwoord geven op de vragen. Bijvoorbeeld een schaal van 1 tot 5. Of een schaal van 1 tot 10. Dit is makkelijker te verwerken en te analyseren. Voor de rest zijn de vragen duidelijk. Deze persoon heeft geen andere feedback voor gebouwbeheer want deze vragen zijn genoeg -3. De vragen zijn duidelijk en snel te beantwoorden. behalve vraag 5 die onduidleijk is. geen andere vragen vragen als feedback. \ No newline at end of file +3. De vragen zijn duidelijk en snel te beantwoorden. behalve vraag 5 die onduidleijk is. geen andere vragen vragen als feedback. + +## Conclusion + +The questions are clear and easy to answer, except for question 5 which is unclear. \ No newline at end of file From bcbb8080c209f56790721a812f63ec460a8a7ff2 Mon Sep 17 00:00:00 2001 From: Sietse Jonker Date: Tue, 5 Mar 2024 11:40:25 +0100 Subject: [PATCH 06/10] Add Arduino code for sensor data collection and websocket communication --- .../node-code-final/node-code-final.ino | 214 ++++++++++++++++++ 1 file changed, 214 insertions(+) create mode 100644 arduino/node-code/node-code-final/node-code-final.ino diff --git a/arduino/node-code/node-code-final/node-code-final.ino b/arduino/node-code/node-code-final/node-code-final.ino new file mode 100644 index 0000000..c08b0b6 --- /dev/null +++ b/arduino/node-code/node-code-final/node-code-final.ino @@ -0,0 +1,214 @@ +// Sietse Jonker & Dano Bosch +// 28/02/2024 + +// include these libraries +#include +#include +#include +#include +#include +#include +#include + +// define pins on esp32 +#define MICPIN 6 +#define DHTPIN 7 +#define SCL 9 +#define SDA 8 +#define DHTTYPE DHT11 +#define SCREEN_WIDTH 128 +#define SCREEN_HEIGHT 64 +#define i2c_adress 0x3c +#define USE_SERIAL Serial + +// make new objects +Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire); +DHT dht(DHTPIN, DHTTYPE); +WiFiMulti WiFiMulti; +Adafruit_SGP30 sgp; +WebSocketsClient webSocket; + +// define variables +uint16_t TVOC_base, eCO2_base; +uint16_t counter = 0; +uint16_t eCO2 = 0; +uint16_t TVOC = 0; +uint16_t interval = 5000; +float temperature = 0; +float humidity = 0; +unsigned long currentMillis; +unsigned long lastMillis; +bool errorSGP30 = false; +bool errorDHT11 = false; +bool noise = false; + +// hexdump function for websockets binary handler +void hexdump(const void *mem, uint32_t len, uint8_t cols = 16) { + const uint8_t* src = (const uint8_t*) mem; + USE_SERIAL.printf("\n[HEXDUMP] Address: 0x%08X len: 0x%X (%d)", (ptrdiff_t)src, len, len); + for(uint32_t i = 0; i < len; i++) { + if(i % cols == 0) { + USE_SERIAL.printf("\n[0x%08X] 0x%08X: ", (ptrdiff_t)src, i); + } + USE_SERIAL.printf("%02X ", *src); + src++; + } + USE_SERIAL.printf("\n"); +} + +// handler for websocket events +void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) { + switch(type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[WSc] Disconnected!\n"); + break; + case WStype_CONNECTED: + USE_SERIAL.printf("[WSc] Connected to url: %s\n", payload); + + // send message to server when Connected + webSocket.sendTXT("Connected"); + break; + case WStype_TEXT: + USE_SERIAL.printf("[WSc] get text: %s\n", payload); + + // send message to server + // webSocket.sendTXT("message here"); + break; + case WStype_BIN: + USE_SERIAL.printf("[WSc] get binary length: %u\n", length); + hexdump(payload, length); + + // send data to server + // webSocket.sendBIN(payload, length); + break; + case WStype_ERROR: + case WStype_FRAGMENT_TEXT_START: + case WStype_FRAGMENT_BIN_START: + case WStype_FRAGMENT: + case WStype_FRAGMENT_FIN: + break; + } +} + +// special function to setup websocket +void websocketSetup(){ + WiFiMulti.addAP("iotroam", "vbK9gbDBIB"); + WiFiMulti.addAP("LansanKPN-boven", "19sander71vlieland14"); + + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + // server address, port and URL + webSocket.begin("145.92.8.114", 80, "/ws"); + + // event handler + webSocket.onEvent(webSocketEvent); + + // try ever 500 again if connection has failed + webSocket.setReconnectInterval(500); +} + +// fucntion to reset the values if needed +void resetValues() { + TVOC_base; + eCO2_base; + counter = 0; + temperature = 0; + humidity = 0; + eCO2 = 0; + TVOC = 0; + noise = false; + lastMillis = 0; + currentMillis = 0; +} + +// function to check for errors in sensors +bool checkForError(){ + if (!sgp.IAQmeasure()) { + Serial.println("SGP30: BAD"); + errorSGP30 = true; + } else { + Serial.println("SGP30: OK"); + errorSGP30 = false; + } + + if (isnan(temperature) || isnan(humidity)){ + Serial.println("DHT11: BAD"); + errorDHT11 = true; + } else { + Serial.println("DHT11: OK"); + errorDHT11 = false; + } + + return false; +} + +// function to update when interval is met (see intervalCounter variable) +void update(){ + // display sensordata on oled screen + displayData(); + + webSocket.sendTXT("{\"Temp\":\"" + String(temperature) + "\",\"Humi\":\"" + String(humidity) + "\",\"eCO2\":\"" + String(sgp.eCO2) + "\",\"TVOC\":\"" + String(sgp.TVOC) + "\"}"); + + sgp.getIAQBaseline(&eCO2_base, &TVOC_base); + + // read dht11 sensor + temperature = float(dht.readTemperature()); + humidity = float(dht.readHumidity()); + + checkForError(); +} + +// function to display data on oled screen +void displayData() { + // clear display for new info + display.clearDisplay(); + + // set custom text properties + display.setTextSize(2); + display.setTextColor(SH110X_WHITE); + display.setCursor(0, 0); + + // display info on oled screen + display.println((String) "Temp: " + int(temperature) + "C" + '\n' + + "Humi: " + int(humidity) + "%" + '\n' + + "eCO2: " + int(sgp.eCO2) + '\n' + + "TVOC: " + int(sgp.TVOC)); + + display.display(); +} + +// setup function +void setup() { + Serial.begin(115200); + + // tell display what settings to use + display.begin(i2c_adress, true); + display.clearDisplay(); + + // tell sensors to start reading + dht.begin(); + sgp.begin(); + + pinMode(MICPIN, INPUT); + pinMode(DHTPIN, INPUT); + + websocketSetup(); + resetValues(); +} + +// loop function +void loop() { + // loop the websocket connection so it stays alive + webSocket.loop(); + + // update when interval is met + if (currentMillis - lastMillis >= interval){ + lastMillis = millis(); + update(); + } + + // update the counter + currentMillis = millis(); +} \ No newline at end of file From db9380816c10a3a81a24aacb40de460e9f2591e5 Mon Sep 17 00:00:00 2001 From: Dano van den Bosch Date: Tue, 5 Mar 2024 13:42:12 +0100 Subject: [PATCH 07/10] added node identivication --- arduino/node-code/node-code-final/node-code-final.ino | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/arduino/node-code/node-code-final/node-code-final.ino b/arduino/node-code/node-code-final/node-code-final.ino index c08b0b6..2a3f43c 100644 --- a/arduino/node-code/node-code-final/node-code-final.ino +++ b/arduino/node-code/node-code-final/node-code-final.ino @@ -21,6 +21,9 @@ #define i2c_adress 0x3c #define USE_SERIAL Serial +// define node identification number +#define nodeIdentvicationNumber 1 + // make new objects Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire); DHT dht(DHTPIN, DHTTYPE); @@ -149,7 +152,8 @@ void update(){ // display sensordata on oled screen displayData(); - webSocket.sendTXT("{\"Temp\":\"" + String(temperature) + "\",\"Humi\":\"" + String(humidity) + "\",\"eCO2\":\"" + String(sgp.eCO2) + "\",\"TVOC\":\"" + String(sgp.TVOC) + "\"}"); + // webSocket.sendTXT("{\"Temp\":\"" + String(temperature) + "\",\"Humi\":\"" + String(humidity) + "\",\"eCO2\":\"" + String(sgp.eCO2) + "\",\"TVOC\":\"" + String(sgp.TVOC) + "\"}"); + webSocket.sendTXT("{\"node\": \"" + nodeIdentvicationNumber + "\", \"Temp\":\"" + String(temperature) + "\",\"Humi\":\"" + String(humidity) + "\",\"eCO2\":\"" + String(sgp.eCO2) + "\",\"TVOC\":\"" + String(sgp.TVOC) + "\"}"); sgp.getIAQBaseline(&eCO2_base, &TVOC_base); From 7476f985903c80c8999921b19c25f0f661531cdb Mon Sep 17 00:00:00 2001 From: Sietse Jonker Date: Tue, 5 Mar 2024 13:48:54 +0100 Subject: [PATCH 08/10] Commented out debug print statements in webSocketEvent function --- arduino/node-code/node-code-final/node-code-final.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arduino/node-code/node-code-final/node-code-final.ino b/arduino/node-code/node-code-final/node-code-final.ino index c08b0b6..5ac6157 100644 --- a/arduino/node-code/node-code-final/node-code-final.ino +++ b/arduino/node-code/node-code-final/node-code-final.ino @@ -69,13 +69,13 @@ void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) { webSocket.sendTXT("Connected"); break; case WStype_TEXT: - USE_SERIAL.printf("[WSc] get text: %s\n", payload); + // USE_SERIAL.printf("[WSc] get text: %s\n", payload); // send message to server // webSocket.sendTXT("message here"); break; case WStype_BIN: - USE_SERIAL.printf("[WSc] get binary length: %u\n", length); + // USE_SERIAL.printf("[WSc] get binary length: %u\n", length); hexdump(payload, length); // send data to server From 3ebe661de0fdf7269f9bd169a95339aeb9caac7c Mon Sep 17 00:00:00 2001 From: Dano van den Bosch Date: Tue, 5 Mar 2024 14:03:10 +0100 Subject: [PATCH 09/10] Fix node identification number in webSocket message --- arduino/node-code/node-code-final/node-code-final.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arduino/node-code/node-code-final/node-code-final.ino b/arduino/node-code/node-code-final/node-code-final.ino index b165275..c552578 100644 --- a/arduino/node-code/node-code-final/node-code-final.ino +++ b/arduino/node-code/node-code-final/node-code-final.ino @@ -153,7 +153,7 @@ void update(){ displayData(); // webSocket.sendTXT("{\"Temp\":\"" + String(temperature) + "\",\"Humi\":\"" + String(humidity) + "\",\"eCO2\":\"" + String(sgp.eCO2) + "\",\"TVOC\":\"" + String(sgp.TVOC) + "\"}"); - webSocket.sendTXT("{\"node\": \"" + nodeIdentvicationNumber + "\", \"Temp\":\"" + String(temperature) + "\",\"Humi\":\"" + String(humidity) + "\",\"eCO2\":\"" + String(sgp.eCO2) + "\",\"TVOC\":\"" + String(sgp.TVOC) + "\"}"); + webSocket.sendTXT("{\"node\": \"" + String(nodeIdentvicationNumber) + "\", \"Temp\":\"" + String(temperature) + "\",\"Humi\":\"" + String(humidity) + "\",\"eCO2\":\"" + String(sgp.eCO2) + "\",\"TVOC\":\"" + String(sgp.TVOC) + "\"}"); sgp.getIAQBaseline(&eCO2_base, &TVOC_base); From 1596f0c64103f5e810efecca5897a3657b20811d Mon Sep 17 00:00:00 2001 From: Sietse Jonker Date: Tue, 5 Mar 2024 14:09:31 +0100 Subject: [PATCH 10/10] Fix grammatical error from dano --- arduino/node-code/node-code-final/node-code-final.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arduino/node-code/node-code-final/node-code-final.ino b/arduino/node-code/node-code-final/node-code-final.ino index c552578..1229b9d 100644 --- a/arduino/node-code/node-code-final/node-code-final.ino +++ b/arduino/node-code/node-code-final/node-code-final.ino @@ -22,7 +22,7 @@ #define USE_SERIAL Serial // define node identification number -#define nodeIdentvicationNumber 1 +#define nodeIdentificationNumber 1 // make new objects Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire); @@ -153,7 +153,7 @@ void update(){ displayData(); // webSocket.sendTXT("{\"Temp\":\"" + String(temperature) + "\",\"Humi\":\"" + String(humidity) + "\",\"eCO2\":\"" + String(sgp.eCO2) + "\",\"TVOC\":\"" + String(sgp.TVOC) + "\"}"); - webSocket.sendTXT("{\"node\": \"" + String(nodeIdentvicationNumber) + "\", \"Temp\":\"" + String(temperature) + "\",\"Humi\":\"" + String(humidity) + "\",\"eCO2\":\"" + String(sgp.eCO2) + "\",\"TVOC\":\"" + String(sgp.TVOC) + "\"}"); + webSocket.sendTXT("{\"node\": \"" + String(nodeIdentificationNumber) + "\", \"Temp\":\"" + String(temperature) + "\",\"Humi\":\"" + String(humidity) + "\",\"eCO2\":\"" + String(sgp.eCO2) + "\",\"TVOC\":\"" + String(sgp.TVOC) + "\"}"); sgp.getIAQBaseline(&eCO2_base, &TVOC_base);