Merge branch 'main' of https://gitlab.fdmci.hva.nl/propedeuse-hbo-ict/onderwijs/2023-2024/out-a-se-ti/blok-3/qaajeeqiinii59
This commit is contained in:
@@ -148,6 +148,8 @@ bool checkForError(){
|
|||||||
void update(){
|
void update(){
|
||||||
// display sensordata on oled screen
|
// display sensordata on oled screen
|
||||||
displayData();
|
displayData();
|
||||||
|
|
||||||
|
// send data to websocket server
|
||||||
webSocket.sendTXT("Temp: " + String(temperature));
|
webSocket.sendTXT("Temp: " + String(temperature));
|
||||||
webSocket.sendTXT("Humi: " + String(humidity));
|
webSocket.sendTXT("Humi: " + String(humidity));
|
||||||
webSocket.sendTXT("eCO2: " + String(sgp.eCO2));
|
webSocket.sendTXT("eCO2: " + String(sgp.eCO2));
|
||||||
@@ -159,6 +161,7 @@ void update(){
|
|||||||
temperature = float(dht.readTemperature());
|
temperature = float(dht.readTemperature());
|
||||||
humidity = float(dht.readHumidity());
|
humidity = float(dht.readHumidity());
|
||||||
|
|
||||||
|
// check if any errors occured when reading sensors
|
||||||
checkForError();
|
checkForError();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -178,11 +181,13 @@ void displayData() {
|
|||||||
+ "eCO2: " + int(sgp.eCO2) + '\n'
|
+ "eCO2: " + int(sgp.eCO2) + '\n'
|
||||||
+ "TVOC: " + int(sgp.TVOC));
|
+ "TVOC: " + int(sgp.TVOC));
|
||||||
|
|
||||||
|
// display the screen
|
||||||
display.display();
|
display.display();
|
||||||
}
|
}
|
||||||
|
|
||||||
// setup function
|
// setup function
|
||||||
void setup() {
|
void setup() {
|
||||||
|
// make serial connection at 115200 baud
|
||||||
Serial.begin(115200);
|
Serial.begin(115200);
|
||||||
|
|
||||||
// tell display what settings to use
|
// tell display what settings to use
|
||||||
@@ -196,7 +201,10 @@ void setup() {
|
|||||||
pinMode(MICPIN, INPUT);
|
pinMode(MICPIN, INPUT);
|
||||||
pinMode(DHTPIN, INPUT);
|
pinMode(DHTPIN, INPUT);
|
||||||
|
|
||||||
|
// setup websocket connection
|
||||||
websocketSetup();
|
websocketSetup();
|
||||||
|
|
||||||
|
// reset values
|
||||||
resetValues();
|
resetValues();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
218
arduino/node-code/node-code-final/node-code-final.ino
Normal file
218
arduino/node-code/node-code-final/node-code-final.ino
Normal file
@@ -0,0 +1,218 @@
|
|||||||
|
// Sietse Jonker & Dano Bosch
|
||||||
|
// 28/02/2024
|
||||||
|
|
||||||
|
// include these libraries
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_SH110X.h>
|
||||||
|
#include <Adafruit_SGP30.h>
|
||||||
|
#include <DHT.h>
|
||||||
|
#include <WiFiMulti.h>
|
||||||
|
#include <WiFi.h>
|
||||||
|
#include <WebSocketsClient.h>
|
||||||
|
|
||||||
|
// 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
|
||||||
|
|
||||||
|
// define node identification number
|
||||||
|
#define nodeIdentificationNumber 1
|
||||||
|
|
||||||
|
// 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) + "\"}");
|
||||||
|
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);
|
||||||
|
|
||||||
|
// 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();
|
||||||
|
}
|
@@ -57,7 +57,7 @@ examples, basics, fade
|
|||||||
\/ servo's
|
\/ servo's
|
||||||
examples, servo, sweep
|
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.
|
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.
|
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:
|
By doing this i got taught the following commands:
|
||||||
@@ -71,4 +71,97 @@ By doing this i got taught the following commands:
|
|||||||
~ $ 'ssh username@ip address' = open ssh connection.
|
~ $ 'ssh username@ip address' = open ssh connection.
|
||||||
|
|
||||||
From here i went and looked up several linux video's wich taught me the following:
|
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.
|
||||||
|
|
||||||
|
### 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: ...
|
@@ -1,11 +1,31 @@
|
|||||||
# Questions
|
# Questions
|
||||||
|
|
||||||
## Criteria
|
## 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
|
## Questions
|
||||||
How clean are the toilets? (clean, normal, disgusting).
|
|
||||||
How clean is the study area? (clean, normal, disgusting).
|
- How clean are the toilets? (clean, normal, disgusting).
|
||||||
What do you think of the temperature in the study area? (hot, perfect, cold).
|
- How clean is the study area? (clean, normal, disgusting).
|
||||||
How crowded would you say the study area is?(not at all, its fine, really crowded).
|
- What do you think of the temperature in the study area? (hot, perfect, cold).
|
||||||
Is there enough help available? (no, decently, yes).
|
- 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.
|
||||||
|
|
||||||
|
## Conclusion
|
||||||
|
|
||||||
|
The questions are clear and easy to answer, except for question 5 which is unclear.
|
Reference in New Issue
Block a user