Merge branch '44-als-gebruiker-wil-ik-dat-de-website-automatisch-het-aantal-nodes-dat-ik-heb-aangesloten-op-de' into 'main'
working version to main See merge request propedeuse-hbo-ict/onderwijs/2023-2024/out-a-se-ti/blok-3/qaajeeqiinii59!6
This commit is contained in:
13
arduino/mac_adress.ino
Normal file
13
arduino/mac_adress.ino
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
// Complete Instructions to Get and Change ESP MAC Address: https://RandomNerdTutorials.com/get-change-esp32-esp8266-mac-address-arduino/
|
||||||
|
#include <WiFi.h>
|
||||||
|
|
||||||
|
void setup(){
|
||||||
|
Serial.begin(115200);
|
||||||
|
Serial.println();
|
||||||
|
Serial.print("ESP Board MAC Address: ");
|
||||||
|
Serial.println(WiFi.macAddress());
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop(){
|
||||||
|
|
||||||
|
}
|
42
arduino/node-code/node-code-final/headerFile.h
Normal file
42
arduino/node-code/node-code-final/headerFile.h
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
// 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>
|
||||||
|
#include <nodeCodeHeader.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 OLED_RESET -1 // QT-PY / XIAO
|
||||||
|
#define USE_SERIAL Serial
|
||||||
|
|
||||||
|
// make new objects
|
||||||
|
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
||||||
|
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;
|
@@ -1,49 +1,40 @@
|
|||||||
// Sietse Jonker & Dano van den Bosch
|
// include header file into code
|
||||||
// 28/02/2024
|
#include <headerFile.h>
|
||||||
|
|
||||||
// include these libraries
|
// setup function
|
||||||
#include <Wire.h>
|
void setup() {
|
||||||
#include <Adafruit_SH110X.h>
|
// make serial connection at 115200 baud
|
||||||
#include <Adafruit_SGP30.h>
|
Serial.begin(115200);
|
||||||
#include <DHT.h>
|
|
||||||
#include <WiFiMulti.h>
|
|
||||||
#include <WiFi.h>
|
|
||||||
#include <WebSocketsClient.h>
|
|
||||||
|
|
||||||
// define pins on esp32
|
// tell display what settings to use
|
||||||
#define MICPIN 6
|
display.begin(i2c_adress, true);
|
||||||
#define DHTPIN 7
|
display.clearDisplay();
|
||||||
#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
|
// tell sensors to start reading
|
||||||
#define nodeIdentificationNumber 1
|
dht.begin();
|
||||||
|
sgp.begin();
|
||||||
|
|
||||||
// make new objects
|
pinMode(MICPIN, INPUT);
|
||||||
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
|
pinMode(DHTPIN, INPUT);
|
||||||
DHT dht(DHTPIN, DHTTYPE);
|
|
||||||
WiFiMulti WiFiMulti;
|
|
||||||
Adafruit_SGP30 sgp;
|
|
||||||
WebSocketsClient webSocket;
|
|
||||||
|
|
||||||
// define variables
|
websocketSetup();
|
||||||
uint16_t TVOC_base, eCO2_base;
|
resetValues();
|
||||||
uint16_t counter = 0;
|
}
|
||||||
uint16_t eCO2 = 0;
|
|
||||||
uint16_t TVOC = 0;
|
// loop function
|
||||||
uint16_t interval = 5000;
|
void loop() {
|
||||||
float temperature = 0;
|
// loop the websocket connection so it stays alive
|
||||||
float humidity = 0;
|
webSocket.loop();
|
||||||
unsigned long currentMillis;
|
|
||||||
unsigned long lastMillis;
|
// update when interval is met
|
||||||
bool errorSGP30 = false;
|
if (currentMillis - lastMillis >= interval){
|
||||||
bool errorDHT11 = false;
|
lastMillis = millis();
|
||||||
bool noise = false;
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
// update the counter
|
||||||
|
currentMillis = millis();
|
||||||
|
}
|
||||||
|
|
||||||
// hexdump function for websockets binary handler
|
// hexdump function for websockets binary handler
|
||||||
void hexdump(const void *mem, uint32_t len, uint8_t cols = 16) {
|
void hexdump(const void *mem, uint32_t len, uint8_t cols = 16) {
|
||||||
@@ -112,7 +103,7 @@ void websocketSetup(){
|
|||||||
webSocket.setReconnectInterval(500);
|
webSocket.setReconnectInterval(500);
|
||||||
}
|
}
|
||||||
|
|
||||||
// fucntion to reset the values if needed
|
// function to reset the values if needed
|
||||||
void resetValues() {
|
void resetValues() {
|
||||||
TVOC_base;
|
TVOC_base;
|
||||||
eCO2_base;
|
eCO2_base;
|
||||||
@@ -153,7 +144,7 @@ void update(){
|
|||||||
displayData();
|
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\": \"" + String(nodeIdentificationNumber) + "\", \"Temp\":\"" + String(temperature) + "\",\"Humi\":\"" + String(humidity) + "\",\"eCO2\":\"" + String(sgp.eCO2) + "\",\"TVOC\":\"" + String(sgp.TVOC) + "\"}");
|
webSocket.sendTXT("{\"node\": \"" + String(WiFi.macAddress()) + "\", \"Temp\":\"" + String(temperature) + "\",\"Humi\":\"" + String(humidity) + "\",\"eCO2\":\"" + String(sgp.eCO2) + "\",\"TVOC\":\"" + String(sgp.TVOC) + "\"}");
|
||||||
|
|
||||||
sgp.getIAQBaseline(&eCO2_base, &TVOC_base);
|
sgp.getIAQBaseline(&eCO2_base, &TVOC_base);
|
||||||
|
|
||||||
@@ -184,38 +175,3 @@ void displayData() {
|
|||||||
// display the screen
|
// display the screen
|
||||||
display.display();
|
display.display();
|
||||||
}
|
}
|
||||||
|
|
||||||
// setup function
|
|
||||||
void setup() {
|
|
||||||
// make serial connection at 115200 baud
|
|
||||||
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();
|
|
||||||
}
|
|
@@ -2,226 +2,16 @@
|
|||||||
|
|
||||||
nodeReadings esp32Node();
|
nodeReadings esp32Node();
|
||||||
|
|
||||||
|
void setup()
|
||||||
|
{
|
||||||
|
// put your setup code here, to run once:
|
||||||
|
esp32Node.setup();
|
||||||
|
esp32Node.websocketSetup();
|
||||||
|
esp32Node.resetValues();
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
// Sietse Jonker & Dano van den Bosch
|
|
||||||
// 28/02/2024
|
|
||||||
|
|
||||||
// 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 loop()
|
||||||
void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) {
|
{
|
||||||
switch(type) {
|
// put your main code here, to run repeatedly:
|
||||||
case WStype_DISCONNECTED:
|
esp32Node.loop();
|
||||||
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("{\"message\": \"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());
|
|
||||||
|
|
||||||
// check if any errors occured when reading sensors
|
|
||||||
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 the screen
|
|
||||||
display.display();
|
|
||||||
}
|
|
||||||
|
|
||||||
// setup function
|
|
||||||
void setup() {
|
|
||||||
// make serial connection at 115200 baud
|
|
||||||
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();
|
|
||||||
}
|
}
|
||||||
|
63
arduino/node-code/node-code-final/nodeCodeHeader.cpp
Normal file
63
arduino/node-code/node-code-final/nodeCodeHeader.cpp
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
#include "arduino.h"
|
||||||
|
#include "nodeCodeHeader.h"
|
||||||
|
|
||||||
|
nodeReadings::nodeReadings() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void nodeReadings::setup(){
|
||||||
|
// make serial connection at 115200 baud
|
||||||
|
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);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void nodeReadings::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();
|
||||||
|
}
|
||||||
|
|
||||||
|
void nodeReadings::resetValues() {
|
||||||
|
counter = 0;
|
||||||
|
eCO2 = 0;
|
||||||
|
TVOC = 0;
|
||||||
|
temperature = 0;
|
||||||
|
humidity = 0;
|
||||||
|
currentMillis = 0;
|
||||||
|
lastMillis = 0;
|
||||||
|
errorSGP30 = false;
|
||||||
|
errorDHT11 = false;
|
||||||
|
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");
|
||||||
|
}
|
@@ -1,22 +1,18 @@
|
|||||||
#ifndef nodeClass_h
|
#ifndef nodeReading_h
|
||||||
#define nodeClass_h
|
#define nodeReading_h
|
||||||
|
|
||||||
// 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>
|
|
||||||
#include "Arduino.h"
|
#include "Arduino.h"
|
||||||
|
#include "headerFile.h"
|
||||||
|
|
||||||
|
|
||||||
class nodeReadings {
|
class nodeReadings {
|
||||||
|
|
||||||
private:
|
|
||||||
public:
|
public:
|
||||||
nodeReadings();
|
nodeReadings();
|
||||||
|
void setup();
|
||||||
|
void loop();
|
||||||
void resetValues();
|
void resetValues();
|
||||||
// class code goes here
|
private:
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
@@ -16,7 +16,74 @@ We can only use certain ports like 113, 80, 443. These are common ports and are
|
|||||||
|
|
||||||
A solution for this is to use a reverse proxy. (See [Reverse Proxy](./Reverse-Proxy.md))
|
A solution for this is to use a reverse proxy. (See [Reverse Proxy](./Reverse-Proxy.md))
|
||||||
|
|
||||||
|
## Classes
|
||||||
|
|
||||||
|
For the websockets we are going to use 2 classes. One for the nodes and one for the websites. The nodes are going to send data to the website and have multiple variables like temperature, humidity, eCO2, TVOC and sound. The website is going to send data to the nodes like names and settings. For this they have to use a userName and password.
|
||||||
|
|
||||||
|
``` mermaid
|
||||||
|
classDiagram
|
||||||
|
|
||||||
|
client --> User : website client
|
||||||
|
client --> Node : esp32 client
|
||||||
|
|
||||||
|
namespace raspberry pi clients {
|
||||||
|
class client {
|
||||||
|
+MacAdress
|
||||||
|
sendData()
|
||||||
|
}
|
||||||
|
|
||||||
|
class Node {
|
||||||
|
+eCO2
|
||||||
|
+Temperature
|
||||||
|
+Humidity
|
||||||
|
+TVOC
|
||||||
|
+Sound
|
||||||
|
+Settings
|
||||||
|
changeNodeName(name)
|
||||||
|
updateData(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
class User {
|
||||||
|
+userName
|
||||||
|
+password
|
||||||
|
changeNodeName(data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Code of the classes:
|
||||||
|
|
||||||
|
``` python
|
||||||
|
class client:
|
||||||
|
def __init__(self, macAdress):
|
||||||
|
self.macAdress = macAdress
|
||||||
|
|
||||||
|
class node(client):
|
||||||
|
def __init__(self, name, node, temperature, humidity, eCO2, TVOC, sound):
|
||||||
|
super().__init__(macAdress)
|
||||||
|
self.nodeNumber = node
|
||||||
|
self.temperature = temperature
|
||||||
|
self.humidity = humidity
|
||||||
|
self.eCO2 = eCO2
|
||||||
|
self.TVOC = TVOC
|
||||||
|
self.sound = sound
|
||||||
|
self.name = name
|
||||||
|
|
||||||
|
def updateData(self, temperature, humidity, eCO2, TVOC, sound):
|
||||||
|
self.temperature = temperature
|
||||||
|
self.humidity = humidity
|
||||||
|
self.eCO2 = eCO2
|
||||||
|
self.TVOC = TVOC
|
||||||
|
self.sound = sound
|
||||||
|
|
||||||
|
class Website(client):
|
||||||
|
def __init__(self, macAdress, user, password):
|
||||||
|
super().__init__(macAdress)
|
||||||
|
self.passWord = passWord
|
||||||
|
self.userName = userName
|
||||||
|
```
|
||||||
|
|
||||||
#### Sources:
|
#### Sources:
|
||||||
* https://websockets.readthedocs.io/en/stable/index.html
|
* https://websockets.readthedocs.io/en/stable/index.html
|
||||||
|
|
||||||
**Written by Sam**
|
**Written by Sam & Sietse**
|
@@ -8,7 +8,6 @@
|
|||||||
<link rel="stylesheet" href="styles.css">
|
<link rel="stylesheet" href="styles.css">
|
||||||
<title>Node dev page</title>
|
<title>Node dev page</title>
|
||||||
<!-- <link rel="icon" type="image/x-icon" href="favicon.ico"> -->
|
<!-- <link rel="icon" type="image/x-icon" href="favicon.ico"> -->
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
@@ -24,11 +23,8 @@
|
|||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
|
|
||||||
<div id="nodeDataLocation"></div>
|
<div id="nodeDataLocation"></div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!-- Include the js file -->
|
<!-- Include the js file -->
|
||||||
<script src="classes.js"></script>
|
<script src="classes.js"></script>
|
||||||
<script src="main.js"></script>
|
<script src="main.js"></script>
|
||||||
|
43
web/main.js
43
web/main.js
@@ -2,6 +2,8 @@
|
|||||||
// arrays and stuff
|
// arrays and stuff
|
||||||
const sensorData = {};
|
const sensorData = {};
|
||||||
let liveGraphs = [];
|
let liveGraphs = [];
|
||||||
|
let nodeArray = [];
|
||||||
|
let nodeDict = {};
|
||||||
|
|
||||||
// letiables
|
// letiables
|
||||||
let intervalDelay = 5000;
|
let intervalDelay = 5000;
|
||||||
@@ -45,39 +47,21 @@ function openConnection() {
|
|||||||
openConnection();
|
openConnection();
|
||||||
|
|
||||||
function handleIncomingData(data) {
|
function handleIncomingData(data) {
|
||||||
nodeNumber = data.node;
|
nodeAdressHandler(data.Node);
|
||||||
|
|
||||||
|
nodeNumber = nodeDict[data.Node];
|
||||||
temperature = data.Temp;
|
temperature = data.Temp;
|
||||||
humidity = data.Humi;
|
humidity = data.Humi;
|
||||||
CO2 = data.eCO2;
|
CO2 = data.eCO2;
|
||||||
TVOC = data.TVOC;
|
TVOC = data.TVOC;
|
||||||
|
|
||||||
processNodeData(nodeNumber, temperature, humidity, CO2, TVOC);
|
|
||||||
}
|
|
||||||
|
|
||||||
function processNodeData(nodeNumber, temperature, humidity, CO2, TVOC) {
|
|
||||||
// Initialize the array for this node if it doesn't exist yet
|
|
||||||
if (!sensorData[nodeNumber]) {
|
|
||||||
sensorData[nodeNumber] = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Push the new data onto the array for this node
|
|
||||||
sensorData[nodeNumber].push({
|
|
||||||
'node': nodeNumber,
|
|
||||||
'temp': temperature,
|
|
||||||
'humi': humidity,
|
|
||||||
'CO2': CO2,
|
|
||||||
'TVOC': TVOC,
|
|
||||||
});
|
|
||||||
|
|
||||||
// updateNodeData(node, temperature, humidity, lightIntensity)
|
|
||||||
updateNodeData(nodeNumber, temperature, humidity, CO2, TVOC);
|
updateNodeData(nodeNumber, temperature, humidity, CO2, TVOC);
|
||||||
|
}
|
||||||
|
|
||||||
// Log the array for this node
|
function nodeAdressHandler(node) {
|
||||||
console.log(sensorData[nodeNumber]);
|
if (!nodeArray.includes(node)) {
|
||||||
|
nodeArray.push(node);
|
||||||
// If the array for this node has more than 10 elements, remove the oldest one
|
nodeDict[node] = nodeArray.length;
|
||||||
if (sensorData[nodeNumber].length >= 10) {
|
|
||||||
sensorData[nodeNumber].shift();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -191,8 +175,11 @@ function updateNodeData(node, temperature, humidity, eCO2, TVOC) {
|
|||||||
document.getElementById("TVOCStatus").textContent = "Connected";
|
document.getElementById("TVOCStatus").textContent = "Connected";
|
||||||
|
|
||||||
// Update the graph
|
// Update the graph
|
||||||
liveGraphs[node - 1].updateData(temperature, humidity, eCO2, TVOC);
|
liveGraphs[0].updateData(temperature, humidity, eCO2, TVOC);
|
||||||
liveGraphs[node - 1].updateGraph();
|
liveGraphs[0].updateGraph();
|
||||||
|
|
||||||
|
console.log(nodeDict[node]);
|
||||||
|
console.log(nodeArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call the function to create the HTML structure
|
// Call the function to create the HTML structure
|
||||||
|
Reference in New Issue
Block a user