Merge branch 'main' into '44-als-gebruiker-wil-ik-dat-de-website-automatisch-het-aantal-nodes-dat-ik-heb-aangesloten-op-de'
# Conflicts: # arduino/node-code/node-code-final/node-code-final.ino # arduino/node-code/node-code-final/nodeCodeFinal.ino # arduino/node-code/node-code-final/nodeCodeHeader.h
This commit is contained in:
@@ -39,27 +39,5 @@ void loop() {
|
|||||||
// writeText(Answer[0], 2, 50, 300, 4000);
|
// writeText(Answer[0], 2, 50, 300, 4000);
|
||||||
displayText.writeText(Question[i], 3, 0, 0, 0, true, false);
|
displayText.writeText(Question[i], 3, 0, 0, 0, true, false);
|
||||||
displayText.writeText(Answer[i], 3, 0, 200, 0, true, true);
|
displayText.writeText(Answer[i], 3, 0, 200, 0, true, true);
|
||||||
delay(20000);
|
delay(2000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// void writeText(char* text, int size, int posX, int posY, int screenTime, bool center){
|
|
||||||
// //if true overwrites x
|
|
||||||
// if (center){
|
|
||||||
// posX = centerText(text);
|
|
||||||
// }
|
|
||||||
// tft.setCursor(posX, posY); // Set the cursor to the top left corner
|
|
||||||
// tft.setTextSize(size); // Set textsize
|
|
||||||
// tft.println(text);
|
|
||||||
// delay(screenTime);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// int centerText(char* text) {
|
|
||||||
// int16_t x1, y1;
|
|
||||||
// uint16_t w, h;
|
|
||||||
|
|
||||||
// tft.getTextBounds(text, 0, 0, &x1, &y1, &w, &h); // Calculate the width of the text
|
|
||||||
// int x = (tft.width() - w) / 2; // Calculate the x-coordinate for the centered text
|
|
||||||
|
|
||||||
// return x;
|
|
||||||
// }
|
|
@@ -6,20 +6,21 @@ DisplayText::DisplayText(Adafruit_ST7796S_kbv& tftDisplay) : tft(tftDisplay) {
|
|||||||
tft.setCursor(0,0);
|
tft.setCursor(0,0);
|
||||||
tft.fillScreen(ST7796S_BLACK);
|
tft.fillScreen(ST7796S_BLACK);
|
||||||
}
|
}
|
||||||
|
//display text public function
|
||||||
void DisplayText::writeText(char* text, int size, int posX, int posY, int screenTime, bool center, bool bottom) {
|
void DisplayText::writeText(char* text, int size, int posX, int posY, int screenTime, bool center, bool bottom) {
|
||||||
if (center) {
|
if (center) {
|
||||||
posX = centerText(text);
|
posX = centerText(text);
|
||||||
}
|
}
|
||||||
if (bottom) {
|
// if (bottom) {
|
||||||
posY = bottomText(text);
|
// posY = bottomText(text);
|
||||||
}
|
// }
|
||||||
tft.setCursor(posX, posY);
|
tft.setCursor(posX, posY);
|
||||||
tft.setTextSize(size);
|
tft.setTextSize(size);
|
||||||
printWordsFull(text);
|
printWordsFull(text);
|
||||||
delay(screenTime);
|
delay(screenTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//to center the text when enabled in the public function
|
||||||
int DisplayText::centerText(char* text) {
|
int DisplayText::centerText(char* text) {
|
||||||
int16_t x1, y1;
|
int16_t x1, y1;
|
||||||
uint16_t w, h;
|
uint16_t w, h;
|
||||||
@@ -28,45 +29,48 @@ int DisplayText::centerText(char* text) {
|
|||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
int DisplayText::bottomText(char* text) {
|
// //to display the text at the bottom when enabled in the public function
|
||||||
int16_t x1, y1;
|
// int DisplayText::bottomText(char* text) {
|
||||||
uint16_t w, h;
|
// int16_t x1, y1;
|
||||||
tft.getTextBounds(text, 0, 0, &x1, &y1, &w, &h);
|
// uint16_t w, h;
|
||||||
int y = (tft.height() - h);
|
// tft.getTextBounds(text, 0, 0, &x1, &y1, &w, &h);
|
||||||
return y;
|
// int y = (tft.height() - h);
|
||||||
}
|
// return y;
|
||||||
|
// }
|
||||||
|
|
||||||
|
//attempt to write the text out in full (wip)
|
||||||
void DisplayText::printWordsFull(char* text) {
|
void DisplayText::printWordsFull(char* text) {
|
||||||
|
const int screenWidth = 320; // replace with your TFT display width
|
||||||
char* textArray[100];
|
const int lineHeight = 22; // replace with your text line height
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
char* textCopy = strdup(text);
|
|
||||||
|
|
||||||
char* word = strtok(text, " ");
|
char* word = strtok(text, " ");
|
||||||
|
char line[100] = "";
|
||||||
|
int lineCount = 0;
|
||||||
|
|
||||||
while (word != NULL) {
|
while (word != NULL) {
|
||||||
textArray[i] = word;
|
char tempLine[100];
|
||||||
|
strcpy(tempLine, line);
|
||||||
|
strcat(tempLine, word);
|
||||||
|
strcat(tempLine, " ");
|
||||||
|
|
||||||
|
int16_t x1, y1;
|
||||||
|
uint16_t w, h;
|
||||||
|
tft.getTextBounds(tempLine, 0, 0, &x1, &y1, &w, &h);
|
||||||
|
|
||||||
|
if (w > screenWidth && strlen(line) > 0) {
|
||||||
|
tft.setCursor(0, lineHeight * lineCount);
|
||||||
|
tft.println(line);
|
||||||
|
lineCount++;
|
||||||
|
strcpy(line, word);
|
||||||
|
strcat(line, " ");
|
||||||
|
} else {
|
||||||
|
strcpy(line, tempLine);
|
||||||
|
}
|
||||||
|
|
||||||
word = strtok(NULL, " ");
|
word = strtok(NULL, " ");
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int lineWidth = 0;
|
// print the last line
|
||||||
int maxLineWidth = 320; // replace with the width of your TFT display
|
tft.setCursor(0, lineHeight * lineCount);
|
||||||
int charWidth = 11; // replace with the width of your characters
|
tft.println(line);
|
||||||
|
|
||||||
for (int j = 0; j < i; j++) {
|
|
||||||
int wordLength = strlen(textArray[j]);
|
|
||||||
|
|
||||||
// If the word won't fit on the current line, move to the next line
|
|
||||||
if (lineWidth + wordLength * charWidth > maxLineWidth) {
|
|
||||||
tft.println();
|
|
||||||
lineWidth = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
tft.print(textArray[j]);
|
|
||||||
tft.print(" ");
|
|
||||||
lineWidth += (wordLength + 1) * charWidth; // +1 for the space
|
|
||||||
}
|
|
||||||
free(textCopy);
|
|
||||||
|
|
||||||
}
|
}
|
@@ -8,7 +8,7 @@ class DisplayText {
|
|||||||
private:
|
private:
|
||||||
Adafruit_ST7796S_kbv& tft;
|
Adafruit_ST7796S_kbv& tft;
|
||||||
int centerText(char* text);
|
int centerText(char* text);
|
||||||
int bottomText(char* text);
|
// int bottomText(char* text);
|
||||||
void printWordsFull(char* text);
|
void printWordsFull(char* text);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@@ -3,8 +3,6 @@
|
|||||||
#include "Adafruit_ST7796S_kbv.h"
|
#include "Adafruit_ST7796S_kbv.h"
|
||||||
#include "displayText.h"
|
#include "displayText.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define TFT_CS 14
|
#define TFT_CS 14
|
||||||
#define TFT_DC 13
|
#define TFT_DC 13
|
||||||
#define TFT_RST 12
|
#define TFT_RST 12
|
||||||
|
18
arduino/node-code/node-code-final/nodeCode.cpp
Normal file
18
arduino/node-code/node-code-final/nodeCode.cpp
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
#include "arduino.h"
|
||||||
|
#include "nodeCodeHeader.h"
|
||||||
|
|
||||||
|
nodeReadings::nodeReadings() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void nodeReadings::resetValues() {
|
||||||
|
counter = 0;
|
||||||
|
eCO2 = 0;
|
||||||
|
TVOC = 0;
|
||||||
|
temperature = 0;
|
||||||
|
humidity = 0;
|
||||||
|
currentMillis = 0;
|
||||||
|
lastMillis = 0;
|
||||||
|
errorSGP30 = false;
|
||||||
|
errorDHT11 = false;
|
||||||
|
noise = false;
|
||||||
|
}
|
@@ -9,6 +9,7 @@ nav:
|
|||||||
- 🎮 Arduino documentation:
|
- 🎮 Arduino documentation:
|
||||||
- I2C: arduino-documentation/i2c-ESP32
|
- I2C: arduino-documentation/i2c-ESP32
|
||||||
- TFT screen : node-documentation/TFT-screen
|
- TFT screen : node-documentation/TFT-screen
|
||||||
|
- Classes : arduino-documentation/classes
|
||||||
- 🍓 RPi Documentation:
|
- 🍓 RPi Documentation:
|
||||||
- Raspberry pi: Sp1SchetsProject/InfrastructuurDocumentatie/raspberryPi
|
- Raspberry pi: Sp1SchetsProject/InfrastructuurDocumentatie/raspberryPi
|
||||||
- MariaDB: rpi-documentation/mariadb-installation
|
- MariaDB: rpi-documentation/mariadb-installation
|
||||||
@@ -24,5 +25,5 @@ nav:
|
|||||||
- Taskflow: brainstorm/Taskflow
|
- Taskflow: brainstorm/Taskflow
|
||||||
- Design: Sp1SchetsProject/FirstDesign
|
- Design: Sp1SchetsProject/FirstDesign
|
||||||
- 🖨️ Software:
|
- 🖨️ Software:
|
||||||
- Dev page: brainstorm/SotwareDocumentatie/Dev_page
|
- Dev page: brainstorm/SoftwareDocumentatie/Dev_page
|
||||||
|
|
@@ -1,18 +1,18 @@
|
|||||||
## Bram's Learning Curve
|
## Bram's Learning Curve
|
||||||
Here i post my progress on learning and mastering arduino. I originally did the Gamedevelopment study but decided to switch to "Technische Informatica". That is why i need to learn everything from scratch, and everything is new to me.
|
|
||||||
This is the reason that i made these documents, in order to track my progression in this new study.
|
|
||||||
|
|
||||||
|
Here I post my progress on learning and mastering Arduino. I originally did the Game development study but decided to switch to "Technische Informatica". That is why I need to learn everything from scratch, and everything is new to me.
|
||||||
|
This is the reason that I made these documents, in order to track my progression in this new study.
|
||||||
|
|
||||||
### Buzzer
|
### Buzzer
|
||||||
For one of my first projects I wanted to learn how to use a buzzer with different notes.
|
For one of my first projects, I wanted to learn how to use a buzzer with different notes.
|
||||||
To achieve this, i went on a search accross sites to see how i can use frequenties to make different sounds.
|
To achieve this, I went on a search across sites to see how I can use frequencies to make different sounds.
|
||||||
Then i came accross a teaching site (https://www.codingkids.nl/arduino-buzzer.html) that taught me the language to communicate to the buzzer what frequenties to use. This way i can make any sound come out of this simple buzzer.
|
Then I came across a teaching site (https://www.codingkids.nl/arduino-buzzer.html) that taught me the language to communicate to the buzzer what frequencies to use. This way I can make any sound come out of this simple buzzer.
|
||||||
|
|
||||||
### Arduino Video
|
### Arduino Video
|
||||||
I watched a video about using arduino and took alot op notes along the way.
|
I watched a video about using Arduino and took a lot of op notes along the way.
|
||||||
The link is: (https://www.youtube.com/watch?v=BLrHTHUjPuw).
|
The link is: (https://www.youtube.com/watch?v=BLrHTHUjPuw).
|
||||||
|
|
||||||
\/\/arduino information:
|
\/\/Arduino information:
|
||||||
|
|
||||||
\/pinnumber(locatie, in-/output)
|
\/pinnumber(locatie, in-/output)
|
||||||
|
|
||||||
@@ -21,10 +21,13 @@ The link is: (https://www.youtube.com/watch?v=BLrHTHUjPuw).
|
|||||||
\/delay(time in millisec)
|
\/delay(time in millisec)
|
||||||
|
|
||||||
\/int... <- variable
|
\/int... <- variable
|
||||||
|
|
||||||
\/with a decimal its a double -> 1,2
|
\/with a decimal its a double -> 1,2
|
||||||
|
|
||||||
\/a character is a char -> "a"
|
\/a character is a char -> "a"
|
||||||
|
|
||||||
\/\/serial communications:
|
\/\/serial communications:
|
||||||
|
|
||||||
\/setup:
|
\/setup:
|
||||||
Serial.begin(9600) -> the text speed
|
Serial.begin(9600) -> the text speed
|
||||||
Serial.sprintLn(text)
|
Serial.sprintLn(text)
|
||||||
@@ -37,79 +40,106 @@ Serial.printLn(....) -> variable because no "
|
|||||||
The text speed needs to be the same as given.
|
The text speed needs to be the same as given.
|
||||||
|
|
||||||
\/\/If Statements:
|
\/\/If Statements:
|
||||||
|
|
||||||
if(condition){
|
if(condition){
|
||||||
|
|
||||||
action
|
action
|
||||||
|
|
||||||
}else{
|
}else{
|
||||||
|
|
||||||
action
|
action
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
\/&& = "and"
|
\/&& = "and"
|
||||||
|
|
||||||
\/|| = "or"
|
\/|| = "or"
|
||||||
|
|
||||||
\/\/For loops:
|
\/\/For loops:
|
||||||
|
|
||||||
For(int*i; i <= 10 ; i++){
|
For(int*i; i <= 10 ; i++){
|
||||||
|
|
||||||
serial.print(i)
|
serial.print(i)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
\/The fading of led's:
|
\/The fading of led's:
|
||||||
|
|
||||||
examples, basics, fade
|
examples, basics, fade
|
||||||
|
|
||||||
\/ servo's
|
\/ servo's
|
||||||
|
|
||||||
examples, servo, sweep
|
examples, servo, sweep
|
||||||
|
|
||||||
### Linux and raspberry PI.
|
### Linux and raspberry PI.
|
||||||
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:
|
|
||||||
|
|
||||||
~ $ 'ls -la' = show file / volders
|
To gain more knowledge about Linux, I first asked my classmates if they could get me started.
|
||||||
|
|
||||||
|
They showed me how to gain access to a server and told me how to navigate through files.
|
||||||
|
|
||||||
|
By doing this I got taught the following commands:
|
||||||
|
|
||||||
|
~ $ 'ls -la' = show file / folders
|
||||||
|
|
||||||
~ $ 'top' = see currently running programs
|
~ $ 'top' = see currently running programs
|
||||||
|
|
||||||
~ $ 'cd ' = change directory
|
~ $ 'cd ' = change directory
|
||||||
|
|
||||||
~ $ 'mkdir name' = make directory
|
~ $ 'mkdir name' = make directory
|
||||||
|
|
||||||
~ $ 'touch name' = make file
|
~ $ 'touch name' = make file
|
||||||
|
|
||||||
~ $ 'ping ip addres'
|
~ $ 'ping ip addres'
|
||||||
|
|
||||||
~ $ '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:
|
|
||||||
....
|
|
||||||
|
|
||||||
### Air, temperature, and all sort of stuff.
|
### Air, temperature, and all sort of stuff.
|
||||||
After the linux coding i decided to take a step back and began gaining experience with sensors.
|
|
||||||
|
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 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 did this by using one of the main sensors and tried programing it myself.
|
||||||
I used this website for the information and for the right library:(https://randomnerdtutorials.com/esp32-dht11-dht22-temperature-humidity-sensor-arduino-ide/).
|
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.
|
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.
|
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.
|
||||||
The rest of the tutorial was clear and worked like a charm.
|
The rest of the tutorial was clear and worked like a charm.
|
||||||
the code used looks like this:
|
the code used looks like this:
|
||||||
|
|
||||||
```
|
```
|
||||||
#include "DHT.h"
|
#include "DHT.h"
|
||||||
|
|
||||||
#define DHTPIN 4
|
#define DHTPIN 4
|
||||||
#define DHTTYPE DHT11
|
#define DHTTYPE DHT11
|
||||||
|
|
||||||
DHT dht(DHTPIN, DHTTYPE);
|
DHT dht(DHTPIN, DHTTYPE);
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
|
//the serial port:
|
||||||
Serial.begin(9600);
|
Serial.begin(9600);
|
||||||
|
|
||||||
|
//the initial test if the code works
|
||||||
Serial.println(F("DHTxx test!"));
|
Serial.println(F("DHTxx test!"));
|
||||||
|
//the library start
|
||||||
dht.begin();
|
dht.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
delay(2000);
|
delay(2000);
|
||||||
|
//a float has decimal numbers and the library reads the measurements.
|
||||||
float h = dht.readHumidity();
|
float h = dht.readHumidity();
|
||||||
float t = dht.readTemperature();
|
float t = dht.readTemperature();
|
||||||
float f = dht.readTemperature(true);
|
float f = dht.readTemperature(true);
|
||||||
|
|
||||||
|
//isnan = there is no reading , the || is "or"
|
||||||
if (isnan(h) || isnan(t) || isnan(f)) {
|
if (isnan(h) || isnan(t) || isnan(f)) {
|
||||||
|
|
||||||
Serial.println(F("Failed to read from DHT sensor!"));
|
Serial.println(F("Failed to read from DHT sensor!"));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
float hif = dht.computeHeatIndex(f, h);
|
float hif = dht.computeHeatIndex(f, h);
|
||||||
float hic = dht.computeHeatIndex(t, h, false);
|
float hic = dht.computeHeatIndex(t, h, false);
|
||||||
|
|
||||||
|
//all serial.ptint's send stuff to the serial board to showcase.
|
||||||
Serial.print(F("Humidity: "));
|
Serial.print(F("Humidity: "));
|
||||||
Serial.print(h);
|
Serial.print(h);
|
||||||
Serial.print(F("% Temperature: "));
|
Serial.print(F("% Temperature: "));
|
||||||
@@ -123,32 +153,39 @@ Serial.print(hif);
|
|||||||
Serial.println(F("°F"));
|
Serial.println(F("°F"));
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
And The fysical board looks like this:
|
And the physical board looks like this:
|
||||||
|

|
||||||
And here it looks in action:
|
And here it looks in action:
|
||||||
|

|
||||||
|
|
||||||
|
Later on, I could expand this code and the physical product to include the rest of the sensors.
|
||||||
|
|
||||||
|
|
||||||
Later on i could expand this code and the fysical product to include the rest of the sensors.
|
|
||||||
|
|
||||||
### Buzzers .pt 2
|
### 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 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 tried to not look up anything for this one but did ask questions from time to time.
|
||||||
I designed it to work with scaning if there is and input and then output this signal to activate the buzzers.
|
I designed it to work with scanning if there is any 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.
|
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:
|
The code is short and simple:
|
||||||
|
|
||||||
```
|
```
|
||||||
|
//set up some variables
|
||||||
int button = 20;
|
int button = 20;
|
||||||
int buzzerone = 12;
|
int buzzerone = 12;
|
||||||
int buzzertwo = 11;
|
int buzzertwo = 11;
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
// put your setup code here, to run once:
|
//put down some pins that will output , and some that input.
|
||||||
pinMode(button, INPUT);
|
pinMode(button, INPUT);
|
||||||
pinMode(buzzerone, OUTPUT);
|
pinMode(buzzerone, OUTPUT);
|
||||||
pinMode(buzzertwo, OUTPUT);
|
pinMode(buzzertwo, OUTPUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
|
||||||
|
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
//read is there is input on the button pin, if so send output to the other pins., otherwise keep them off.
|
||||||
if(digitalRead(button) == HIGH){
|
if(digitalRead(button) == HIGH){
|
||||||
digitalWrite(buzzerone, HIGH);
|
digitalWrite(buzzerone, HIGH);
|
||||||
digitalWrite(buzzertwo, HIGH);
|
digitalWrite(buzzertwo, HIGH);
|
||||||
@@ -159,4 +196,51 @@ void loop() {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
and the fysical design looks like this: ...
|
Here I made the physical design but instead of buzzers i used lights in order to show it working.
|
||||||
|

|
||||||
|
And here is the the board working:
|
||||||
|

|
||||||
|
|
||||||
|
### Python For Dummies.
|
||||||
|
My job was to make a connection between the WebSocket and the database we had set up, and to do this we wanted to use python.
|
||||||
|
I had never used python before and was totally new to the entire code structure and wording.
|
||||||
|
Because I was totally new to all of python, I asked ChatGPT for and example and some concrete code.
|
||||||
|
I asked it my question which was the assignment I was given and tried to reverse learn this way.
|
||||||
|
I went and looked up fitting tutorials on W3SChools.
|
||||||
|
The following were used:
|
||||||
|
|
||||||
|
(https://www.w3schools.com/python/python_mysql_getstarted.asp)
|
||||||
|
|
||||||
|
(https://websockets.readthedocs.io/en/stable/)
|
||||||
|
|
||||||
|
(https://www.w3schools.com/python/python_mysql_insert.asp)
|
||||||
|
|
||||||
|
(https://www.w3schools.com/python/python_json.asp)
|
||||||
|
|
||||||
|
After still not getting it very well i asked Dano (a teammate of mine) if he could teach me some basics, and so we did.
|
||||||
|
He taught me how to make a simple calculator and told me why my code worked the way it did.
|
||||||
|
(This was the code:
|
||||||
|
|
||||||
|
// this prints a cheatsheet to know if the user wants plus or minus.
|
||||||
|
print("1 = + 2 = -")
|
||||||
|
c = int(input())
|
||||||
|
|
||||||
|
// a input is given for the first number.
|
||||||
|
print("first number")
|
||||||
|
a = input()
|
||||||
|
|
||||||
|
//a input is given for the second number.
|
||||||
|
print("second number")
|
||||||
|
b= input()
|
||||||
|
|
||||||
|
//a if-statement to see if it is plus or minus.
|
||||||
|
if c == 1:
|
||||||
|
print(int(a) + int(b))
|
||||||
|
elif c == 2:
|
||||||
|
print(int(a) - int(b))
|
||||||
|
)
|
||||||
|
|
||||||
|
Even if it looked simple, this was the ignition I needed to understand python better and continue my own research.
|
||||||
|
|
||||||
|
### Python for dummmies pt2
|
||||||
|
after some intense trail and error, I managed to connect to the websocket.
|
BIN
docs/LearningProcessBram/Sprint1/assets/Buzzer board off.jpg
Normal file
BIN
docs/LearningProcessBram/Sprint1/assets/Buzzer board off.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 MiB |
BIN
docs/LearningProcessBram/Sprint1/assets/Buzzer board on.jpg
Normal file
BIN
docs/LearningProcessBram/Sprint1/assets/Buzzer board on.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.0 MiB |
BIN
docs/LearningProcessBram/Sprint1/assets/DHT11 state 1.jpg
Normal file
BIN
docs/LearningProcessBram/Sprint1/assets/DHT11 state 1.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 572 KiB |
BIN
docs/LearningProcessBram/Sprint1/assets/DHT11 state 2.jpg
Normal file
BIN
docs/LearningProcessBram/Sprint1/assets/DHT11 state 2.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 596 KiB |
73
docs/arduino-documentation/classes.md
Normal file
73
docs/arduino-documentation/classes.md
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
# Arduino classes
|
||||||
|
|
||||||
|
|
||||||
|
## How do I make a class?
|
||||||
|
|
||||||
|
First you need to start out with a header file. This file will contain the class definition. And which functions of the class are public and which are private.
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
#ifndef DISPLAYTEXT_H
|
||||||
|
#define DISPLAYTEXT_H
|
||||||
|
|
||||||
|
#include "Adafruit_GFX.h"
|
||||||
|
#include "Adafruit_ST7796S_kbv.h"
|
||||||
|
|
||||||
|
class DisplayText {
|
||||||
|
private:
|
||||||
|
Adafruit_ST7796S_kbv& tft;
|
||||||
|
int centerText(char* text);
|
||||||
|
int bottomText(char* text);
|
||||||
|
void printWordsFull(char* text);
|
||||||
|
|
||||||
|
public:
|
||||||
|
DisplayText(Adafruit_ST7796S_kbv& tftDisplay);
|
||||||
|
void writeText(char* text, int size, int posX, int posY, int screenTime, bool center, bool bottom);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
```
|
||||||
|
```#ifndef``` DISPLAYTEXT_H is a preprocessor directive that checks if DISPLAYTEXT_H is defined. If it is not defined, the code between #ifndef and #endif will be included in the compilation. If it is defined, the code will be excluded from the compilation. This is to prevent the same code from being included multiple times in the same file.
|
||||||
|
|
||||||
|
|
||||||
|
To start out with a class you need a constructor. This is a function that is called when the class is created. This function is used to initialize the class.
|
||||||
|
```cpp
|
||||||
|
DisplayText::DisplayText(Adafruit_ST7796S_kbv& tftDisplay) : tft(tftDisplay) {
|
||||||
|
tft.fillScreen(0x0000);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
The library gets passed to tftdisplay. And the tft gets initialized with the tftdisplay.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## How do I create a function in a class?
|
||||||
|
```cpp
|
||||||
|
void DisplayText::centerText() {
|
||||||
|
//insert code here
|
||||||
|
}
|
||||||
|
```
|
||||||
|
This is a example of a function in a class. The function is called centerText and it is a private function. This means that it can only be called from within the class.
|
||||||
|
|
||||||
|
|
||||||
|
When creating a class you also need to reference it in the header file like this
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
#include "DisplayText.h"
|
||||||
|
|
||||||
|
class DisplayText {
|
||||||
|
private:
|
||||||
|
int centerText();
|
||||||
|
//other functions
|
||||||
|
|
||||||
|
public:
|
||||||
|
//other functions
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
# Sources
|
||||||
|
* https://www.circuitbasics.com/programming-with-classes-and-objects-on-the-arduino/
|
||||||
|
|
||||||
|
|
||||||
|
|
BIN
docs/assets/Technical/Enquete box.f3d
Normal file
BIN
docs/assets/Technical/Enquete box.f3d
Normal file
Binary file not shown.
@@ -67,16 +67,18 @@ We aren't using the cs2 and the pen pin because we arent utilizing the touch fun
|
|||||||
```mermaid
|
```mermaid
|
||||||
classDiagram
|
classDiagram
|
||||||
|
|
||||||
displayTex <|-- Adafruit_ST7796S_kbv
|
displayText <|-- Adafruit_ST7796S_kbv
|
||||||
loop <-- displayTex
|
|
||||||
|
|
||||||
class displayTex{
|
|
||||||
|
class displayText{
|
||||||
+text
|
+text
|
||||||
+color
|
+color
|
||||||
+size
|
+size
|
||||||
+posx
|
+posx
|
||||||
+posy
|
+posy
|
||||||
+void writeText()
|
+void writeText()
|
||||||
|
-int bottomText(char* text)
|
||||||
|
-void printWordsFull(char* text)
|
||||||
-int centerText(char* text)
|
-int centerText(char* text)
|
||||||
|
|
||||||
|
|
||||||
|
16
docs/rpi-documentation/Flask.md
Normal file
16
docs/rpi-documentation/Flask.md
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# Flask
|
||||||
|
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
Flask is a micro web framework written in Python. It is easy to use and has a lot of documentation. We are going to use Flask to serve our REST api.
|
||||||
|
|
||||||
|
## Cheatsheet
|
||||||
|
```python
|
||||||
|
print(f"Hello world have a nice {args}!")
|
||||||
|
```
|
||||||
|
This way you can put variables in a string. This is called f-strings.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Rules for python
|
||||||
|
* You can only use one return statement in a function.
|
@@ -9,6 +9,8 @@ There are different languages to serve websockets with, but we are going to use
|
|||||||
|
|
||||||
## Issues
|
## Issues
|
||||||
|
|
||||||
|
Not all ports are open so we need to make a reverse proxy to use websockets.
|
||||||
|
|
||||||
### Ports
|
### Ports
|
||||||
We can only use certain ports like 113, 80, 443. These are common ports and are not blocked by firewalls. Something in the network is blocking all other ports which makes it hard to use websockets.
|
We can only use certain ports like 113, 80, 443. These are common ports and are not blocked by firewalls. Something in the network is blocking all other ports which makes it hard to use websockets.
|
||||||
|
|
||||||
|
117
server/Database/DatabasewithMAC.sql
Normal file
117
server/Database/DatabasewithMAC.sql
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
-- MySQL Script generated by MySQL Workbench
|
||||||
|
-- Wed Mar 13 16:04:58 2024
|
||||||
|
-- Model: New Model Version: 1.0
|
||||||
|
-- MySQL Workbench Forward Engineering
|
||||||
|
|
||||||
|
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
|
||||||
|
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
|
||||||
|
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
|
||||||
|
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
-- Schema NodeData
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
-- Schema NodeData
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
CREATE SCHEMA IF NOT EXISTS `NodeData` DEFAULT CHARACTER SET utf8 ;
|
||||||
|
USE `NodeData` ;
|
||||||
|
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
-- Table `NodeData`.`Question`
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
CREATE TABLE IF NOT EXISTS `NodeData`.`Question` (
|
||||||
|
`QuestionID` INT NOT NULL,
|
||||||
|
`Question` VARCHAR(45) NULL,
|
||||||
|
PRIMARY KEY (`QuestionID`))
|
||||||
|
ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
-- Table `NodeData`.`Node`
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
CREATE TABLE IF NOT EXISTS `NodeData`.`Node` (
|
||||||
|
`NodeID` INT NOT NULL,
|
||||||
|
`Name` VARCHAR(45) NULL,
|
||||||
|
`Location` VARCHAR(45) NULL,
|
||||||
|
`MAC` VARCHAR(45) NULL,
|
||||||
|
PRIMARY KEY (`NodeID`))
|
||||||
|
ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
-- Table `NodeData`.`Measurement`
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
CREATE TABLE IF NOT EXISTS `NodeData`.`Measurement` (
|
||||||
|
`NodeID` INT NOT NULL,
|
||||||
|
`TimeStamp` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
`Type` VARCHAR(45) NULL,
|
||||||
|
`Value` FLOAT NULL,
|
||||||
|
CONSTRAINT `fk_Measurement_Node1`
|
||||||
|
FOREIGN KEY (`NodeID`)
|
||||||
|
REFERENCES `NodeData`.`Node` (`NodeID`)
|
||||||
|
ON DELETE NO ACTION
|
||||||
|
ON UPDATE NO ACTION)
|
||||||
|
ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
-- Table `NodeData`.`Enquete`
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
CREATE TABLE IF NOT EXISTS `NodeData`.`Enquete` (
|
||||||
|
`EnqueteID` INT NOT NULL AUTO_INCREMENT,
|
||||||
|
PRIMARY KEY (`EnqueteID`))
|
||||||
|
ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
-- Table `NodeData`.`enqueteQuestion`
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
CREATE TABLE IF NOT EXISTS `NodeData`.`enqueteQuestion` (
|
||||||
|
`Enquete_EnqueteID` INT NOT NULL,
|
||||||
|
`Question_QuestionID` INT NOT NULL,
|
||||||
|
PRIMARY KEY (`Enquete_EnqueteID`, `Question_QuestionID`),
|
||||||
|
INDEX `fk_Enquete_has_Question_Question1_idx` (`Question_QuestionID` ASC) VISIBLE,
|
||||||
|
INDEX `fk_Enquete_has_Question_Enquete1_idx` (`Enquete_EnqueteID` ASC) VISIBLE,
|
||||||
|
CONSTRAINT `fk_Enquete_has_Question_Enquete1`
|
||||||
|
FOREIGN KEY (`Enquete_EnqueteID`)
|
||||||
|
REFERENCES `NodeData`.`Enquete` (`EnqueteID`)
|
||||||
|
ON DELETE NO ACTION
|
||||||
|
ON UPDATE NO ACTION,
|
||||||
|
CONSTRAINT `fk_Enquete_has_Question_Question1`
|
||||||
|
FOREIGN KEY (`Question_QuestionID`)
|
||||||
|
REFERENCES `NodeData`.`Question` (`QuestionID`)
|
||||||
|
ON DELETE NO ACTION
|
||||||
|
ON UPDATE NO ACTION)
|
||||||
|
ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
-- Table `NodeData`.`Reply`
|
||||||
|
-- -----------------------------------------------------
|
||||||
|
CREATE TABLE IF NOT EXISTS `NodeData`.`Reply` (
|
||||||
|
`Node_NodeID` INT NOT NULL,
|
||||||
|
`enqueteQuestion_Enquete_EnqueteID` INT NOT NULL,
|
||||||
|
`enqueteQuestion_Question_QuestionID` INT NOT NULL,
|
||||||
|
`Result` INT NULL,
|
||||||
|
`Time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
`AnswerID` INT NOT NULL AUTO_INCREMENT,
|
||||||
|
PRIMARY KEY (`AnswerID`, `Node_NodeID`, `enqueteQuestion_Enquete_EnqueteID`, `enqueteQuestion_Question_QuestionID`),
|
||||||
|
INDEX `fk_Node_has_enqueteQuestion_enqueteQuestion1_idx` (`enqueteQuestion_Enquete_EnqueteID` ASC, `enqueteQuestion_Question_QuestionID` ASC) VISIBLE,
|
||||||
|
INDEX `fk_Node_has_enqueteQuestion_Node1_idx` (`Node_NodeID` ASC) VISIBLE,
|
||||||
|
CONSTRAINT `fk_Node_has_enqueteQuestion_Node1`
|
||||||
|
FOREIGN KEY (`Node_NodeID`)
|
||||||
|
REFERENCES `NodeData`.`Node` (`NodeID`)
|
||||||
|
ON DELETE NO ACTION
|
||||||
|
ON UPDATE NO ACTION,
|
||||||
|
CONSTRAINT `fk_Node_has_enqueteQuestion_enqueteQuestion1`
|
||||||
|
FOREIGN KEY (`enqueteQuestion_Enquete_EnqueteID` , `enqueteQuestion_Question_QuestionID`)
|
||||||
|
REFERENCES `NodeData`.`enqueteQuestion` (`Enquete_EnqueteID` , `Question_QuestionID`)
|
||||||
|
ON DELETE NO ACTION
|
||||||
|
ON UPDATE NO ACTION)
|
||||||
|
ENGINE = InnoDB;
|
||||||
|
|
||||||
|
|
||||||
|
SET SQL_MODE=@OLD_SQL_MODE;
|
||||||
|
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
|
||||||
|
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
|
43
server/Flask/main.py
Normal file
43
server/Flask/main.py
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
from flask import Flask, request
|
||||||
|
import mysql.connector
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
@app.route('/')
|
||||||
|
def index():
|
||||||
|
node = request.args.get('node', default = None)
|
||||||
|
dataType = request.args.get('dataType', default = None)
|
||||||
|
return getData(node, dataType)
|
||||||
|
|
||||||
|
def getData(node, dataType):
|
||||||
|
try:
|
||||||
|
mydb = mysql.connector.connect(
|
||||||
|
host="localhost",
|
||||||
|
user="root",
|
||||||
|
password="Dingleberries69!",
|
||||||
|
database="NodeData"
|
||||||
|
)
|
||||||
|
#turn this into a switch statement
|
||||||
|
cursor = mydb.cursor()
|
||||||
|
if node:
|
||||||
|
query = f"SELECT * FROM Measurement WHERE NodeID = {node}"
|
||||||
|
elif dataType:
|
||||||
|
query = f"SELECT * FROM Measurement WHERE Type = '{dataType}'"
|
||||||
|
else:
|
||||||
|
query = "SELECT * FROM `Measurement`"
|
||||||
|
cursor.execute(query)
|
||||||
|
result = cursor.fetchall() # Fetch the results
|
||||||
|
|
||||||
|
# Convert the results to a string for display
|
||||||
|
result_str = ', '.join([str(row) for row in result])
|
||||||
|
|
||||||
|
cursor.close()
|
||||||
|
mydb.close()
|
||||||
|
|
||||||
|
return result
|
||||||
|
except mysql.connector.Error as err:
|
||||||
|
print("MySQL Error:", err)
|
||||||
|
return "MySQL Error: " + str(err)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app.run(debug=True, host='localhost')
|
@@ -1,21 +1,34 @@
|
|||||||
import websockets;
|
import websockets
|
||||||
import asyncio;
|
import asyncio
|
||||||
|
|
||||||
|
connected = set()
|
||||||
|
|
||||||
async def handler(websocket):
|
async def handler(websocket):
|
||||||
|
# Register.
|
||||||
|
connected.add(websocket)
|
||||||
|
try:
|
||||||
while True:
|
while True:
|
||||||
#Save the incoming message in variable message.
|
|
||||||
message = await websocket.recv()
|
message = await websocket.recv()
|
||||||
print(message)
|
print(message)
|
||||||
|
await broadcast(message)
|
||||||
|
except websockets.ConnectionClosedOK:
|
||||||
|
print("Client disconnected")
|
||||||
|
finally:
|
||||||
|
connected.remove(websocket)
|
||||||
|
|
||||||
|
async def broadcast(message):
|
||||||
|
if connected: # asyncio.wait doesn't accept an empty list
|
||||||
|
await asyncio.wait([ws.send(message) for ws in connected])
|
||||||
|
|
||||||
|
async def sendClientId():
|
||||||
|
if connected: # asyncio.wait doesn't accept an empty list
|
||||||
|
await asyncio.wait([ws.send(message) for ws in connected])
|
||||||
|
|
||||||
async def main():
|
async def main():
|
||||||
async with websockets.serve(handler, "145.92.8.114" , 8001):
|
async with websockets.serve(handler, "0.0.0.0", 8001):
|
||||||
await asyncio.Future() # run forever
|
await asyncio.Future() # run forever
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
asyncio.run(main())
|
asyncio.run(main())
|
||||||
|
|
||||||
|
|
||||||
#https://websockets.readthedocs.io/en/stable/reference/sync/server.html#websockets.sync.server.serve
|
#https://websockets.readthedocs.io/en/stable/reference/sync/server.html#websockets.sync.server.serve
|
@@ -29,3 +29,17 @@ and im going to continue with working on the connection between the websocket an
|
|||||||
Dano is going to be writing some documentation and will be working with classes in arduino.
|
Dano is going to be writing some documentation and will be working with classes in arduino.
|
||||||
Bram will do research on python to finish the connection to the database and the websocket.
|
Bram will do research on python to finish the connection to the database and the websocket.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
12 - 3 - 2024 {
|
||||||
|
Sam is going to continue to build his custom library for out custom questionaire screen.
|
||||||
|
Sietse is going to make a class in python.
|
||||||
|
Dano is making classes for the code of the node.
|
||||||
|
Bram is correcting some of his documentation and will continue the coding in python( to still make the connection between the database and the websocket.)
|
||||||
|
}
|
||||||
|
|
||||||
|
13 - 3 - 2024 {
|
||||||
|
Dano: website scaling + css fixing and arduino OOP.
|
||||||
|
Sam: making a rest api to pull stuff from database.
|
||||||
|
Sietse: OOP python.
|
||||||
|
Bram: Finaly finishing connection between database and websocket.
|
||||||
|
}
|
Reference in New Issue
Block a user