diff --git a/ES/ES assignment 1/embedded systems.pdf b/ES/ES assignment 1/embedded systems.pdf new file mode 100644 index 0000000..5a6a82f Binary files /dev/null and b/ES/ES assignment 1/embedded systems.pdf differ diff --git a/ES/ES assignment 2/ES communicatie protocol.zip b/ES/ES assignment 2/ES communicatie protocol.zip new file mode 100644 index 0000000..b26775b Binary files /dev/null and b/ES/ES assignment 2/ES communicatie protocol.zip differ diff --git a/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/.gitignore b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/.gitignore new file mode 100644 index 0000000..89cc49c --- /dev/null +++ b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/.gitignore @@ -0,0 +1,5 @@ +.pio +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch diff --git a/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/.vscode/extensions.json b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/.vscode/extensions.json new file mode 100644 index 0000000..080e70d --- /dev/null +++ b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/.vscode/extensions.json @@ -0,0 +1,10 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "platformio.platformio-ide" + ], + "unwantedRecommendations": [ + "ms-vscode.cpptools-extension-pack" + ] +} diff --git a/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/.vscode/settings.json b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/.vscode/settings.json new file mode 100644 index 0000000..6282a70 --- /dev/null +++ b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "idf.portWin": "COM11" +} \ No newline at end of file diff --git a/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/include/README b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/include/README new file mode 100644 index 0000000..194dcd4 --- /dev/null +++ b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/include/README @@ -0,0 +1,39 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/lib/README b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/lib/README new file mode 100644 index 0000000..2593a33 --- /dev/null +++ b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/lib/README @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into executable file. + +The source code of each library should be placed in an own separate directory +("lib/your_library_name/[here are source files]"). + +For example, see a structure of the following two libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +PlatformIO Library Dependency Finder will find automatically dependent +libraries scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/platformio.ini b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/platformio.ini new file mode 100644 index 0000000..dbb4289 --- /dev/null +++ b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/platformio.ini @@ -0,0 +1,16 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:esp32dev] +platform = espressif32 +board = esp32dev +framework = arduino +monitor_speed = 115200 +lib_deps = plerup/EspSoftwareSerial@^8.2.0 diff --git a/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/src/SerialProcess.cpp b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/src/SerialProcess.cpp new file mode 100644 index 0000000..3a216f7 --- /dev/null +++ b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/src/SerialProcess.cpp @@ -0,0 +1,74 @@ +#include "SerialProcess.h" +#include + +// Constructor +SerialProcess::SerialProcess(int addr) + : address(addr), ndx(0), rc(0), newData(false), rcCheck(false) { + Serial.begin(115200); +} + +// Processes Serial Input +void SerialProcess::SerialInput() { + while (Serial.available() > 0) { + rc = static_cast(Serial.read()); + + if (rc == beginMarker) { + rcCheck = true; // Start reading after the begin marker + ndx = 0; // Reset index for new message + } + + if (rcCheck) { + // Store the character if within bounds + if (ndx < numChars - 1) { + receivedChars[ndx++] = rc; + } + + // Check for end marker + if (rc == endMarker) { + receivedChars[ndx] = '\0'; // Null-terminate the string + newData = true; // Mark new data as available + rcCheck = false; // Stop reading until the next begin marker + } + } + } +} + +// Check if new data is available +bool SerialProcess::isNewDataAvailable() { + return newData; +} + +// Get the received data +char* SerialProcess::getReceivedData() { + if (newData) { + newData = false; // Reset the flag after accessing the data + return receivedChars; + } + return nullptr; // No new data +} + +// Process the received message +void SerialProcess::getPayload(char *payload) { + if (newData) { + uint8_t source; + uint8_t destination; + char data[255]; // Allocate a buffer for the data + int parsed = sscanf(receivedChars, "#%hhu:%hhu:%63s;", &source, &destination, data); + if (parsed == 3 && destination == address) { // Ensure all fields are parsed correctly + strcpy(payload, data); // Copy data to the provided buffer + newData = false; // Mark the data as processed + } else if (address != source) { + Serial.print(receivedChars); // Forward the message + } + } +} + +// Send a message in the correct format +void SerialProcess::sendMessage(int receiver, const char* payload) { + Serial.printf("#%u:%u:%s;", address, receiver, payload); +} + + +void SerialProcess::changeAddress(int addr) { + address = addr; // Update the device address +} \ No newline at end of file diff --git a/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/src/SerialProcess.h b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/src/SerialProcess.h new file mode 100644 index 0000000..42e9165 --- /dev/null +++ b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/src/SerialProcess.h @@ -0,0 +1,39 @@ +#include +#ifndef SERIALPROCESS_H +#define SERIALPROCESS_H + +class SerialProcess { +private: + uint8_t ndx; // Current index for the buffer + const char beginMarker = '#'; // Marker to indicate the start of a message + const char endMarker = ';'; // Marker to indicate the end of a message + char rc; // Character read from Serial + int address; // Device address + bool newData; // Flag for new data availability + static const uint8_t numChars = 255; // Maximum size of the buffer + char receivedChars[numChars]; // Buffer for incoming data + bool rcCheck; + +public: + // Constructor + explicit SerialProcess(int addr); + + // Store Serial Input (if available) + void SerialInput(); + + // Check if new data is available + bool isNewDataAvailable(); + + // Get the received data + char* getReceivedData(); + + // Process the received message + void getPayload(char* payload); + + // Send message in the correct format + void sendMessage(int receiver, const char* payload); + + void changeAddress(int addr); +}; + +#endif // SERIALPROCESS_H diff --git a/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/src/main.cpp b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/src/main.cpp new file mode 100644 index 0000000..2fd1ade --- /dev/null +++ b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/src/main.cpp @@ -0,0 +1,186 @@ +#include +SoftwareSerial mySerial(16, 17); // RX, TX + +const int red = 14; +const int yellow = 33; +const int green = 12; + +const unsigned long greenDuration = 5000; +const unsigned long yellowDuration = 2000; +const unsigned long redDuration = 5000; +const unsigned long transitionDuration = 2000; +const unsigned long heartbeatInterval = 1000; +const unsigned long heartbeatTimeout = 3000; +const unsigned long blinkInterval = 500; + +String receivedData = ""; +bool receiving = false; + +unsigned long previousMillis = 0; +unsigned long lastHeartbeatMillis = 0; +unsigned long lastBlinkMillis = 0; +bool blinkState = false; +bool isError = false; + +enum State { GREEN, YELLOW, RED, TRANSITION, ERROR }; +State currentState = GREEN; + +#define REPEAT_SEND false + +void sendCommand(String cmd) { + mySerial.print("<"); + mySerial.print(cmd); + mySerial.println(">"); + Serial.print("Sent: "); + Serial.println(cmd); +} + +void sendHeartbeat() { + mySerial.print(""); + Serial.println("Sent: Heartbeat"); +} + +void ledRed() { + digitalWrite(red, HIGH); + digitalWrite(yellow, LOW); + digitalWrite(green, LOW); + } + + void ledYellow() { + digitalWrite(red, LOW); + digitalWrite(yellow, HIGH); + digitalWrite(green, LOW); + } + + void ledGreen() { + digitalWrite(red, LOW); + digitalWrite(yellow, LOW); + digitalWrite(green, HIGH); + } + +void updateLights() { + switch (currentState) { + case GREEN: + ledGreen(); + sendCommand("G"); + break; + case YELLOW: + ledYellow(); + sendCommand("Y"); + break; + case RED: + ledRed(); + sendCommand("R"); + break; + case TRANSITION: + sendCommand("T"); + break; + case ERROR: + if (millis() - lastBlinkMillis >= blinkInterval) { + blinkState = !blinkState; + digitalWrite(yellow, blinkState ? HIGH : LOW); + lastBlinkMillis = millis(); + } + break; + } +} + +void setup() { + pinMode(green, OUTPUT); + pinMode(yellow, OUTPUT); + pinMode(red, OUTPUT); + mySerial.begin(115200); + Serial.begin(115200); + previousMillis = millis(); + lastHeartbeatMillis = millis(); + updateLights(); +} + +void loop() { + unsigned long currentMillis = millis(); + + // Send heartbeat regularly + if (currentMillis - lastHeartbeatMillis >= heartbeatInterval) { + sendHeartbeat(); + lastHeartbeatMillis = currentMillis; + } + + // Heartbeat timeout check + if (currentMillis - lastHeartbeatMillis >= heartbeatTimeout) { + if (!isError) { + isError = true; + } + } + + // State transitions + switch (currentState) { + case GREEN: + if (currentMillis - previousMillis >= greenDuration) { + currentState = YELLOW; + previousMillis = currentMillis; + updateLights(); + } + break; + case YELLOW: + if (currentMillis - previousMillis >= yellowDuration) { + currentState = RED; + previousMillis = currentMillis; + updateLights(); + } + break; + case RED: + if (currentMillis - previousMillis >= redDuration) { + currentState = TRANSITION; + previousMillis = currentMillis; + updateLights(); + } + break; + case TRANSITION: + if (currentMillis - previousMillis >= transitionDuration) { + currentState = GREEN; + previousMillis = millis(); + updateLights(); + } + break; + case ERROR: + updateLights(); + break; + } + + // Handle received data + while (mySerial.available()) { + char incomingByte = mySerial.read(); + + if (incomingByte == '<') { + receivedData = ""; + receiving = true; + } else if (incomingByte == '>') { + receiving = false; + Serial.print("Received Data: "); + Serial.println(receivedData); + + if (receivedData == "HB") { + lastHeartbeatMillis = millis(); + if (isError) { + digitalWrite(yellow, LOW); + } + isError = false; + } + + receivedData = ""; + } else if (receiving) { + if (incomingByte >= 32 && incomingByte <= 126) { + receivedData += incomingByte; + } + } + } + + // Blinking yellow light in error state + if (isError) { + if (currentMillis - lastBlinkMillis >= blinkInterval) { + blinkState = !blinkState; + digitalWrite(yellow, blinkState ? HIGH : LOW); + lastBlinkMillis = currentMillis; + } + } +} \ No newline at end of file diff --git a/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/test/README b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/test/README new file mode 100644 index 0000000..9b1e87b --- /dev/null +++ b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol Master/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PlatformIO Test Runner and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PlatformIO Unit Testing: +- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html diff --git a/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol slave/ES state machine/.gitignore b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol slave/ES state machine/.gitignore new file mode 100644 index 0000000..89cc49c --- /dev/null +++ b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol slave/ES state machine/.gitignore @@ -0,0 +1,5 @@ +.pio +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch diff --git a/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol slave/ES state machine/.vscode/extensions.json b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol slave/ES state machine/.vscode/extensions.json new file mode 100644 index 0000000..080e70d --- /dev/null +++ b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol slave/ES state machine/.vscode/extensions.json @@ -0,0 +1,10 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "platformio.platformio-ide" + ], + "unwantedRecommendations": [ + "ms-vscode.cpptools-extension-pack" + ] +} diff --git a/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol slave/ES state machine/include/SerialProcess.h b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol slave/ES state machine/include/SerialProcess.h new file mode 100644 index 0000000..42e9165 --- /dev/null +++ b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol slave/ES state machine/include/SerialProcess.h @@ -0,0 +1,39 @@ +#include +#ifndef SERIALPROCESS_H +#define SERIALPROCESS_H + +class SerialProcess { +private: + uint8_t ndx; // Current index for the buffer + const char beginMarker = '#'; // Marker to indicate the start of a message + const char endMarker = ';'; // Marker to indicate the end of a message + char rc; // Character read from Serial + int address; // Device address + bool newData; // Flag for new data availability + static const uint8_t numChars = 255; // Maximum size of the buffer + char receivedChars[numChars]; // Buffer for incoming data + bool rcCheck; + +public: + // Constructor + explicit SerialProcess(int addr); + + // Store Serial Input (if available) + void SerialInput(); + + // Check if new data is available + bool isNewDataAvailable(); + + // Get the received data + char* getReceivedData(); + + // Process the received message + void getPayload(char* payload); + + // Send message in the correct format + void sendMessage(int receiver, const char* payload); + + void changeAddress(int addr); +}; + +#endif // SERIALPROCESS_H diff --git a/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol slave/ES state machine/lib/README b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol slave/ES state machine/lib/README new file mode 100644 index 0000000..9379397 --- /dev/null +++ b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol slave/ES state machine/lib/README @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into the executable file. + +The source code of each library should be placed in a separate directory +("lib/your_library_name/[Code]"). + +For example, see the structure of the following example libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional. for custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +Example contents of `src/main.c` using Foo and Bar: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +The PlatformIO Library Dependency Finder will find automatically dependent +libraries by scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol slave/ES state machine/platformio.ini b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol slave/ES state machine/platformio.ini new file mode 100644 index 0000000..dbb4289 --- /dev/null +++ b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol slave/ES state machine/platformio.ini @@ -0,0 +1,16 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:esp32dev] +platform = espressif32 +board = esp32dev +framework = arduino +monitor_speed = 115200 +lib_deps = plerup/EspSoftwareSerial@^8.2.0 diff --git a/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol slave/ES state machine/src/SerialProcess.cpp b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol slave/ES state machine/src/SerialProcess.cpp new file mode 100644 index 0000000..3a216f7 --- /dev/null +++ b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol slave/ES state machine/src/SerialProcess.cpp @@ -0,0 +1,74 @@ +#include "SerialProcess.h" +#include + +// Constructor +SerialProcess::SerialProcess(int addr) + : address(addr), ndx(0), rc(0), newData(false), rcCheck(false) { + Serial.begin(115200); +} + +// Processes Serial Input +void SerialProcess::SerialInput() { + while (Serial.available() > 0) { + rc = static_cast(Serial.read()); + + if (rc == beginMarker) { + rcCheck = true; // Start reading after the begin marker + ndx = 0; // Reset index for new message + } + + if (rcCheck) { + // Store the character if within bounds + if (ndx < numChars - 1) { + receivedChars[ndx++] = rc; + } + + // Check for end marker + if (rc == endMarker) { + receivedChars[ndx] = '\0'; // Null-terminate the string + newData = true; // Mark new data as available + rcCheck = false; // Stop reading until the next begin marker + } + } + } +} + +// Check if new data is available +bool SerialProcess::isNewDataAvailable() { + return newData; +} + +// Get the received data +char* SerialProcess::getReceivedData() { + if (newData) { + newData = false; // Reset the flag after accessing the data + return receivedChars; + } + return nullptr; // No new data +} + +// Process the received message +void SerialProcess::getPayload(char *payload) { + if (newData) { + uint8_t source; + uint8_t destination; + char data[255]; // Allocate a buffer for the data + int parsed = sscanf(receivedChars, "#%hhu:%hhu:%63s;", &source, &destination, data); + if (parsed == 3 && destination == address) { // Ensure all fields are parsed correctly + strcpy(payload, data); // Copy data to the provided buffer + newData = false; // Mark the data as processed + } else if (address != source) { + Serial.print(receivedChars); // Forward the message + } + } +} + +// Send a message in the correct format +void SerialProcess::sendMessage(int receiver, const char* payload) { + Serial.printf("#%u:%u:%s;", address, receiver, payload); +} + + +void SerialProcess::changeAddress(int addr) { + address = addr; // Update the device address +} \ No newline at end of file diff --git a/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol slave/ES state machine/src/main.cpp b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol slave/ES state machine/src/main.cpp new file mode 100644 index 0000000..1da2807 --- /dev/null +++ b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol slave/ES state machine/src/main.cpp @@ -0,0 +1,238 @@ +#include +#include "SerialProcess.h" + +#define LEDRED 14 +#define LEDORANGE 13 +#define LEDGREEN 12 + +unsigned long previousMillis = 0; +const unsigned long greenDuration = 5000; +const unsigned long yellowDuration = 2000; +const unsigned long redDuration = 5000; +const unsigned long transitionDuration = 2000; +const unsigned long heartbeatInterval = 1000; +const unsigned long heartbeatTimeout = 3000; +const unsigned long blinkInterval = 500; +unsigned long lastHeartbeatMillis = 0; +unsigned long lastBlinkMillis = 0; +bool blinkState = false; + +enum State { GREEN, YELLOW, RED, TRANSITION, ERROR }; +State currentState = GREEN; + +const char *slavecheck = "#slvchck;"; +const char *slaveack = "#slvack;"; +const char *masterack = "#mstack;"; + +const char *turnRed = "tr"; +const char *turnOrange = "to"; +const char *turnGreen = "tg"; +const char *heartbeat = "hb"; + +int node; // other bord addres number +int address = 0; // Device address + +void setRed(){ + digitalWrite(LEDRED, HIGH); + digitalWrite(LEDORANGE, LOW); + digitalWrite(LEDGREEN, LOW); +} +void setOrange(){ + digitalWrite(LEDRED, LOW); + digitalWrite(LEDORANGE, HIGH); + digitalWrite(LEDGREEN, LOW); +} +void setGreen(){ + digitalWrite(LEDRED, LOW); + digitalWrite(LEDORANGE, LOW); + digitalWrite(LEDGREEN, HIGH); +} + +SerialProcess serialcom(0); + +bool MasterCheck() { + SerialProcess serialcomchecker(1000); + const unsigned long timeout = 2000; + unsigned long startTime = millis(); + bool isMaster = true; + bool checkSent = false; + bool gotResponse = false; + + delay(random(100, 600)); // Randomize startup slightly + + Serial.print(slavecheck); // Send check to see if someone replies + checkSent = true; + + while (millis() - startTime < timeout) { + if (Serial.available()) { + serialcomchecker.SerialInput(); + char* payload = serialcomchecker.getReceivedData(); + + if (strcmp(payload, slavecheck) == 0) { + // Got a check while we also sent a check — respond and become SLAVE + Serial.print(slaveack); + isMaster = false; + break; + } else if (strcmp(payload, slaveack) == 0) { + // Got an ACK from the other side — we are master + Serial.print(masterack); + isMaster = true; + break; + } else if (strcmp(payload, masterack) == 0) { + // Got master ack — we must be slave + isMaster = false; + break; + } + } + } + + // Failsafe: no response at all + if (!Serial.available() && !gotResponse) { + // Assume we are master + isMaster = true; + Serial.print(masterack); + } + + return isMaster; +} + + +void updateLights() { + switch (currentState) { + case GREEN: + setGreen(); + serialcom.sendMessage(node, turnGreen); + break; + case YELLOW: + setOrange(); + serialcom.sendMessage(node, turnOrange); + break; + case RED: + setGreen(); + serialcom.sendMessage(node, turnRed); + break; + case TRANSITION: + serialcom.sendMessage(node, turnOrange); + break; + case ERROR: + if (millis() - lastBlinkMillis >= blinkInterval) { + blinkState = !blinkState; + digitalWrite(LEDORANGE, blinkState ? HIGH : LOW); + lastBlinkMillis = millis(); + } + break; + } +} + +void sendHeartbeat() { + serialcom.sendMessage(node,heartbeat); + Serial.println("Sent: Heartbeat"); +} + +void master(){ + bool running = true; + while (running){ + unsigned long currentMillis = millis(); + + if (currentMillis - lastHeartbeatMillis >= heartbeatInterval) { + sendHeartbeat(); + lastHeartbeatMillis = currentMillis; + } + + if (currentMillis - lastHeartbeatMillis > heartbeatTimeout) { + currentState = ERROR; + updateLights(); + return; + } + + switch (currentState) { + case GREEN: + if (currentMillis - previousMillis >= greenDuration) { + currentState = YELLOW; + previousMillis = currentMillis; + updateLights(); + } + break; + case YELLOW: + if (currentMillis - previousMillis >= yellowDuration) { + currentState = RED; + previousMillis = currentMillis; + updateLights(); + } + break; + case RED: + if (currentMillis - previousMillis >= redDuration) { + currentState = TRANSITION; + previousMillis = currentMillis; + updateLights(); + } + break; + case TRANSITION: + if (currentMillis - previousMillis >= transitionDuration) { + currentState = GREEN; + previousMillis = millis(); + updateLights(); + } + break; + case ERROR: + updateLights(); + break; + } + } +} + +void setup() { + Serial.begin(115200); + pinMode(LEDGREEN, OUTPUT); + pinMode(LEDORANGE, OUTPUT); + pinMode(LEDRED, OUTPUT); + bool MorS = MasterCheck(); // Check if master or slave + //set address for master or slave + if (MorS == false){ + address = 2; // Set address for this slave + node = 1; // Set address for master + } else { + address = 1; // Set address for this master + node = 2; // Set address for slave + } + previousMillis = millis(); + lastHeartbeatMillis = millis(); + updateLights(); + setRed(); + serialcom.changeAddress(address); // Set address for serial communication +} + +void slave(){ + bool running = true; + char *command; + while (running && Serial.available() > 0){ + serialcom.SerialInput(); + serialcom.getPayload(command); + if (strcmp(command, turnRed)) setRed(); + else if (strcmp(command, turnOrange)) setOrange(); + else if (strcmp(command, turnGreen)) setGreen(); + else if (strcmp(command, heartbeat)) { + lastHeartbeatMillis = millis(); + digitalWrite(LEDRED, LOW); // Reset the orange blink pattern + digitalWrite(LEDORANGE, LOW); + } + else { + Serial.print("slave: unknown command"); + } + } + if (millis() - lastHeartbeatMillis > heartbeatTimeout) { + // Blink the red and yellow LEDs to indicate an error (orange light) + if (millis() - lastBlinkMillis >= blinkInterval) { + blinkState = !blinkState; + digitalWrite(LEDORANGE, blinkState ? HIGH : LOW); + lastBlinkMillis = millis(); + } + } +} + +void loop(){ + serialcom.changeAddress(2); + if (address == 1) slave(); //master + else if (address == 2) slave(); //slave + else Serial.print("master slave issue"); +} diff --git a/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol slave/ES state machine/test/README b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol slave/ES state machine/test/README new file mode 100644 index 0000000..9b1e87b --- /dev/null +++ b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol slave/ES state machine/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PlatformIO Test Runner and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PlatformIO Unit Testing: +- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html diff --git a/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol.docx b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol.docx new file mode 100644 index 0000000..bf9dcdc Binary files /dev/null and b/ES/ES assignment 2/ES communicatie protocol/ES communicatie protocol.docx differ diff --git a/ES/ES assignment 2/ES communicatie protocol/Video van WhatsApp op 2025-04-05 om 10.26.10_a1a476bf.mp4 b/ES/ES assignment 2/ES communicatie protocol/Video van WhatsApp op 2025-04-05 om 10.26.10_a1a476bf.mp4 new file mode 100644 index 0000000..3d4ec53 Binary files /dev/null and b/ES/ES assignment 2/ES communicatie protocol/Video van WhatsApp op 2025-04-05 om 10.26.10_a1a476bf.mp4 differ diff --git a/ES/ES assignment 2/ES communicatie protocol/state diagram es.drawio b/ES/ES assignment 2/ES communicatie protocol/state diagram es.drawio new file mode 100644 index 0000000..4a1984b --- /dev/null +++ b/ES/ES assignment 2/ES communicatie protocol/state diagram es.drawio @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ES/ESAssignment3(KnightRider).zip b/ES/ES assignment 3/ESAssignment3(KnightRider).zip similarity index 100% rename from ES/ESAssignment3(KnightRider).zip rename to ES/ES assignment 3/ESAssignment3(KnightRider).zip diff --git a/ES/ES assignment 3.pdf b/ES/ES assignment 3/ESAssignment3(KnightRider)/ES assignment 3.pdf similarity index 100% rename from ES/ES assignment 3.pdf rename to ES/ES assignment 3/ESAssignment3(KnightRider)/ES assignment 3.pdf diff --git a/ES/WhatsApp Video 2025-05-19 at 15.36.29(1).mp4 b/ES/ES assignment 3/ESAssignment3(KnightRider)/WhatsApp Video 2025-05-19 at 15.36.29(1).mp4 similarity index 100% rename from ES/WhatsApp Video 2025-05-19 at 15.36.29(1).mp4 rename to ES/ES assignment 3/ESAssignment3(KnightRider)/WhatsApp Video 2025-05-19 at 15.36.29(1).mp4 diff --git a/ES/main.cpp b/ES/ES assignment 3/ESAssignment3(KnightRider)/main.cpp similarity index 100% rename from ES/main.cpp rename to ES/ES assignment 3/ESAssignment3(KnightRider)/main.cpp diff --git a/ES/ES assignment 4/ES assignment 3 I2C.zip b/ES/ES assignment 4/ES assignment 3 I2C.zip new file mode 100644 index 0000000..ab33e16 Binary files /dev/null and b/ES/ES assignment 4/ES assignment 3 I2C.zip differ diff --git a/ES/ES assignment 4/ES assignment 3 I2C/Assignment-A/BME280.cpp b/ES/ES assignment 4/ES assignment 3 I2C/Assignment-A/BME280.cpp new file mode 100644 index 0000000..988dd37 --- /dev/null +++ b/ES/ES assignment 4/ES assignment 3 I2C/Assignment-A/BME280.cpp @@ -0,0 +1,85 @@ + +#include "BME280.h" + +// I2C read 1 byte +uint8_t readRegister(uint8_t reg) { + Wire.beginTransmission(BME280_ADDRESS); + Wire.write(reg); + Wire.endTransmission(); + Wire.requestFrom(BME280_ADDRESS, 1); + return Wire.read(); +} + +// I2C write 1 byte +void writeRegister(uint8_t reg, uint8_t value) { + Wire.beginTransmission(BME280_ADDRESS); + Wire.write(reg); + Wire.write(value); + Wire.endTransmission(); +} + +// Public functions +uint8_t BME280_GetID() { + return readRegister(BME280_REG_ID); +} + +void BME280_Reset() { + writeRegister(BME280_REG_RESET, BME280_RESET_CMD); +} + +uint8_t BME280_CtrlHum() { + return readRegister(BME280_REG_CTRL_HUM); +} + +void BME280_CtrlHum(uint8_t bitpattern) { + writeRegister(BME280_REG_CTRL_HUM, bitpattern); +} + +uint8_t BME280_CtrlMeas() { + return readRegister(BME280_REG_CTRL_MEAS); +} + +void BME280_CtrlMeas(uint8_t bitpattern) { + writeRegister(BME280_REG_CTRL_MEAS, bitpattern); +} + +long BME280_ReadTemperature() { + Wire.beginTransmission(BME280_ADDRESS); + Wire.write(BME280_REG_TEMP_MSB); + Wire.endTransmission(); + Wire.requestFrom(BME280_ADDRESS, 3); + + long msb = Wire.read(); + long lsb = Wire.read(); + long xlsb = Wire.read(); + long adc_T = ((msb << 16) | (lsb << 8) | xlsb) >> 4; + + return adc_T; // Raw value (compensation needed) +} + +int BME280_ReadHumidity() { + Wire.beginTransmission(BME280_ADDRESS); + Wire.write(BME280_REG_HUM_MSB); + Wire.endTransmission(); + Wire.requestFrom(BME280_ADDRESS, 2); + + int msb = Wire.read(); + int lsb = Wire.read(); + int adc_H = (msb << 8) | lsb; + + return adc_H; // Raw value +} + +long BME280_ReadPressure() { + Wire.beginTransmission(BME280_ADDRESS); + Wire.write(BME280_REG_PRESS_MSB); + Wire.endTransmission(); + Wire.requestFrom(BME280_ADDRESS, 3); + + long msb = Wire.read(); + long lsb = Wire.read(); + long xlsb = Wire.read(); + long adc_P = ((msb << 16) | (lsb << 8) | xlsb) >> 4; + + return adc_P; // Raw value +} \ No newline at end of file diff --git a/ES/ES assignment 4/ES assignment 3 I2C/Assignment-A/BME280.h b/ES/ES assignment 4/ES assignment 3 I2C/Assignment-A/BME280.h new file mode 100644 index 0000000..da6bb71 --- /dev/null +++ b/ES/ES assignment 4/ES assignment 3 I2C/Assignment-A/BME280.h @@ -0,0 +1,43 @@ +#ifndef BME280_H +#define BME280_H + +#include +#include + +// I2C address for BME280 (default) +#define BME280_ADDRESS 0x76 + +// Register addresses from datasheet +#define BME280_REG_ID 0xD0 +#define BME280_REG_RESET 0xE0 +#define BME280_REG_CTRL_HUM 0xF2 +#define BME280_REG_STATUS 0xF3 +#define BME280_REG_CTRL_MEAS 0xF4 +#define BME280_REG_CONFIG 0xF5 +#define BME280_REG_PRESS_MSB 0xF7 +#define BME280_REG_TEMP_MSB 0xFA +#define BME280_REG_HUM_MSB 0xFD + +// Reset command +#define BME280_RESET_CMD 0xB6 + +// Function declarations +uint8_t BME280_GetID(); + +void BME280_Reset(); + +uint8_t BME280_CtrlHum(); + +void BME280_CtrlHum(uint8_t bitpattern); + +uint8_t BME280_CtrlMeas(); + +void BME280_CtrlMeas(uint8_t bitpattern); + +long BME280_ReadTemperature(); + +int BME280_ReadHumidity(); + +long BME280_ReadPressure(); + +#endif \ No newline at end of file diff --git a/ES/ES assignment 4/ES assignment 3 I2C/Assignment-A/main.cpp b/ES/ES assignment 4/ES assignment 3 I2C/Assignment-A/main.cpp new file mode 100644 index 0000000..a8b6e95 --- /dev/null +++ b/ES/ES assignment 4/ES assignment 3 I2C/Assignment-A/main.cpp @@ -0,0 +1,37 @@ +#include +#include +#include "BME280.h" + +void setup() { + Serial.begin(9600); + Wire.begin(); + + Serial.println("Initializing BME280..."); + + uint8_t id = BME280_GetID(); + Serial.print("Sensor ID: 0x"); + Serial.println(id, HEX); + + BME280_Reset(); + + // Set oversampling for humidity = x1 (00000001) + BME280_CtrlHum(0x01); + + // Set oversampling for temp and pressure = x1, mode = normal (00100111) + BME280_CtrlMeas(0x27); + + Serial.println("BME280 Setup Done."); +} + +void loop() { + long temp_raw = BME280_ReadTemperature(); + int hum_raw = BME280_ReadHumidity(); + long press_raw = BME280_ReadPressure(); + + Serial.print("Raw Temperature: "); + Serial.print(temp_raw); + Serial.print(" | Raw Humidity: "); + Serial.print(hum_raw); + Serial.print(" | Raw Pressure: "); + Serial.println(press_raw); +} diff --git a/ES/ES assignment 4/ES assignment 3 I2C/Assignment-B/Master.cpp b/ES/ES assignment 4/ES assignment 3 I2C/Assignment-B/Master.cpp new file mode 100644 index 0000000..a6b1118 --- /dev/null +++ b/ES/ES assignment 4/ES assignment 3 I2C/Assignment-B/Master.cpp @@ -0,0 +1,30 @@ +#include +#include + +uint8_t count = 0; + +void setup() { + Wire.begin(); // Master + Serial.begin(9600); +} + +void loop() { + + // Send count to slave + Wire.beginTransmission(0x42); + Wire.write(count); + Wire.endTransmission(); + + Serial.print("Sent: "); + Serial.println(count); + + // Request response from slave + Wire.requestFrom(0x42, 1); + if (Wire.available()) { + uint8_t response = Wire.read(); + Serial.print("Received: "); + Serial.println(response); + } + + count++; +} diff --git a/ES/ES assignment 4/ES assignment 3 I2C/Assignment-B/Slave.cpp b/ES/ES assignment 4/ES assignment 3 I2C/Assignment-B/Slave.cpp new file mode 100644 index 0000000..708f1ce --- /dev/null +++ b/ES/ES assignment 4/ES assignment 3 I2C/Assignment-B/Slave.cpp @@ -0,0 +1,29 @@ +#include +#include + +volatile uint8_t receivedValue = 0; + +void setup() { + Wire.begin(0x42); + Wire.onReceive(receiveEvent); + Wire.onRequest(requestEvent); + Serial.begin(9600); +} + +void loop() { +} + +void receiveEvent(int howMany) { + if (howMany > 0) { + receivedValue = Wire.read(); + Serial.print("Received from master: "); + Serial.println(receivedValue); + } +} + +void requestEvent() { + uint8_t reply = (receivedValue > 100) ? 2 : 4; + Wire.write(reply); + Serial.print("Sent to master: "); + Serial.println(reply); +} diff --git a/ES/ES assignment 4/ES assignment 3 I2C/Assignment-D/BME280.cpp b/ES/ES assignment 4/ES assignment 3 I2C/Assignment-D/BME280.cpp new file mode 100644 index 0000000..988dd37 --- /dev/null +++ b/ES/ES assignment 4/ES assignment 3 I2C/Assignment-D/BME280.cpp @@ -0,0 +1,85 @@ + +#include "BME280.h" + +// I2C read 1 byte +uint8_t readRegister(uint8_t reg) { + Wire.beginTransmission(BME280_ADDRESS); + Wire.write(reg); + Wire.endTransmission(); + Wire.requestFrom(BME280_ADDRESS, 1); + return Wire.read(); +} + +// I2C write 1 byte +void writeRegister(uint8_t reg, uint8_t value) { + Wire.beginTransmission(BME280_ADDRESS); + Wire.write(reg); + Wire.write(value); + Wire.endTransmission(); +} + +// Public functions +uint8_t BME280_GetID() { + return readRegister(BME280_REG_ID); +} + +void BME280_Reset() { + writeRegister(BME280_REG_RESET, BME280_RESET_CMD); +} + +uint8_t BME280_CtrlHum() { + return readRegister(BME280_REG_CTRL_HUM); +} + +void BME280_CtrlHum(uint8_t bitpattern) { + writeRegister(BME280_REG_CTRL_HUM, bitpattern); +} + +uint8_t BME280_CtrlMeas() { + return readRegister(BME280_REG_CTRL_MEAS); +} + +void BME280_CtrlMeas(uint8_t bitpattern) { + writeRegister(BME280_REG_CTRL_MEAS, bitpattern); +} + +long BME280_ReadTemperature() { + Wire.beginTransmission(BME280_ADDRESS); + Wire.write(BME280_REG_TEMP_MSB); + Wire.endTransmission(); + Wire.requestFrom(BME280_ADDRESS, 3); + + long msb = Wire.read(); + long lsb = Wire.read(); + long xlsb = Wire.read(); + long adc_T = ((msb << 16) | (lsb << 8) | xlsb) >> 4; + + return adc_T; // Raw value (compensation needed) +} + +int BME280_ReadHumidity() { + Wire.beginTransmission(BME280_ADDRESS); + Wire.write(BME280_REG_HUM_MSB); + Wire.endTransmission(); + Wire.requestFrom(BME280_ADDRESS, 2); + + int msb = Wire.read(); + int lsb = Wire.read(); + int adc_H = (msb << 8) | lsb; + + return adc_H; // Raw value +} + +long BME280_ReadPressure() { + Wire.beginTransmission(BME280_ADDRESS); + Wire.write(BME280_REG_PRESS_MSB); + Wire.endTransmission(); + Wire.requestFrom(BME280_ADDRESS, 3); + + long msb = Wire.read(); + long lsb = Wire.read(); + long xlsb = Wire.read(); + long adc_P = ((msb << 16) | (lsb << 8) | xlsb) >> 4; + + return adc_P; // Raw value +} \ No newline at end of file diff --git a/ES/ES assignment 4/ES assignment 3 I2C/Assignment-D/BME280.h b/ES/ES assignment 4/ES assignment 3 I2C/Assignment-D/BME280.h new file mode 100644 index 0000000..da6bb71 --- /dev/null +++ b/ES/ES assignment 4/ES assignment 3 I2C/Assignment-D/BME280.h @@ -0,0 +1,43 @@ +#ifndef BME280_H +#define BME280_H + +#include +#include + +// I2C address for BME280 (default) +#define BME280_ADDRESS 0x76 + +// Register addresses from datasheet +#define BME280_REG_ID 0xD0 +#define BME280_REG_RESET 0xE0 +#define BME280_REG_CTRL_HUM 0xF2 +#define BME280_REG_STATUS 0xF3 +#define BME280_REG_CTRL_MEAS 0xF4 +#define BME280_REG_CONFIG 0xF5 +#define BME280_REG_PRESS_MSB 0xF7 +#define BME280_REG_TEMP_MSB 0xFA +#define BME280_REG_HUM_MSB 0xFD + +// Reset command +#define BME280_RESET_CMD 0xB6 + +// Function declarations +uint8_t BME280_GetID(); + +void BME280_Reset(); + +uint8_t BME280_CtrlHum(); + +void BME280_CtrlHum(uint8_t bitpattern); + +uint8_t BME280_CtrlMeas(); + +void BME280_CtrlMeas(uint8_t bitpattern); + +long BME280_ReadTemperature(); + +int BME280_ReadHumidity(); + +long BME280_ReadPressure(); + +#endif \ No newline at end of file diff --git a/ES/ES assignment 4/ES assignment 3 I2C/Assignment-D/Master.cpp b/ES/ES assignment 4/ES assignment 3 I2C/Assignment-D/Master.cpp new file mode 100644 index 0000000..7e50120 --- /dev/null +++ b/ES/ES assignment 4/ES assignment 3 I2C/Assignment-D/Master.cpp @@ -0,0 +1,61 @@ +#include +#include +#include "BME280.h" + +#define PARALLEL_SLAVE_ADDR 0x77 + +void writeToRegister(uint8_t deviceAddr, uint8_t reg, uint8_t value) { + Wire.beginTransmission(deviceAddr); + Wire.write(reg); + Wire.write(value); + Wire.endTransmission(); +} + +uint8_t readFromRegister(uint8_t deviceAddr, uint8_t reg) { + Wire.beginTransmission(deviceAddr); + Wire.write(reg); + Wire.endTransmission(); + Wire.requestFrom(deviceAddr, 1); + return Wire.available() ? Wire.read() : 0xFF; +} + +void setup() { + Serial.begin(9600); + Wire.begin(); + + // BME280 initialisatie + BME280_Reset(); + BME280_CtrlHum(0x01); // x1 oversampling + BME280_CtrlMeas(0x27); // temp/press x1, mode normal + + Serial.println("Setup done."); +} + +void loop() { + // === Lezen van BME280 === + long temp = BME280_ReadTemperature(); + long press = BME280_ReadPressure(); + int hum = BME280_ReadHumidity(); + + Serial.println("--- BME280 Readings ---"); + Serial.print("Raw Temp: "); Serial.println(temp); + Serial.print("Raw Press: "); Serial.println(press); + Serial.print("Raw Hum: "); Serial.println(hum); + + // === Testen van parallelle slave === + uint8_t a = random(0, 100); + uint8_t b = random(0, 100); + + writeToRegister(PARALLEL_SLAVE_ADDR, 0x21, a); // INA + writeToRegister(PARALLEL_SLAVE_ADDR, 0x22, b); // INB + + uint8_t minVal = readFromRegister(PARALLEL_SLAVE_ADDR, 0x23); // MIN + uint8_t maxVal = readFromRegister(PARALLEL_SLAVE_ADDR, 0x24); // MAX + + Serial.println("--- Parallel Slave ---"); + Serial.print("a: "); Serial.print(a); + Serial.print(", b: "); Serial.print(b); + Serial.print(" => MIN: "); Serial.print(minVal); + Serial.print(", MAX: "); Serial.println(maxVal); + +} diff --git a/ES/ES assignment 4/ES assignment 3 I2C/Assignment-D/Slave.cpp b/ES/ES assignment 4/ES assignment 3 I2C/Assignment-D/Slave.cpp new file mode 100644 index 0000000..32afec4 --- /dev/null +++ b/ES/ES assignment 4/ES assignment 3 I2C/Assignment-D/Slave.cpp @@ -0,0 +1,65 @@ +#include +#include + +#define SLAVE_ADDRESS 0x77 + +uint8_t registers[256] = {0}; // Simuleer registermap +uint8_t regAddr = 0; // Registeradres voor read/write + +void setup() { + Wire.begin(SLAVE_ADDRESS); + Wire.onReceive(receiveEvent); + Wire.onRequest(requestEvent); + Serial.begin(9600); + Serial.println("Slave ready."); +} + +void loop() { +} + +// Ontvangen van master (write) +void receiveEvent(int howMany) { + if (howMany < 1) return; + + regAddr = Wire.read(); // Eerste byte is altijd registeradres + + if (howMany > 1) { + // Daarna komen data bytes + int bytesToRead = howMany - 1; + for (int i = 0; i < bytesToRead; i++) { + if (Wire.available()) { + uint8_t val = Wire.read(); + registers[regAddr + i] = val; + Serial.print("Reg "); + Serial.print(regAddr + i); + Serial.print(" written with "); + Serial.println(val); + } + } + + // Update min/max registers als 0x21 of 0x22 is gewijzigd + if (regAddr == 0x21 || regAddr == 0x22) { + uint8_t a = registers[0x21]; + uint8_t b = registers[0x22]; + registers[0x23] = (a < b) ? a : b; // MIN + registers[0x24] = (a > b) ? a : b; // MAX + + Serial.print("Updated MIN (0x23): "); + Serial.println(registers[0x23]); + Serial.print("Updated MAX (0x24): "); + Serial.println(registers[0x24]); + } + } + // else alleen registeradres ontvangen, niks schrijven (read setup) +} + +// Master vraagt data op (read) +void requestEvent() { + uint8_t val = registers[regAddr]; + Wire.write(val); + + Serial.print("Sent reg "); + Serial.print(regAddr, HEX); + Serial.print(": "); + Serial.println(val); +} diff --git a/ES/ES assignment 4/ES assignment 3 I2C/ES Assingment 3.pdf b/ES/ES assignment 4/ES assignment 3 I2C/ES Assingment 3.pdf new file mode 100644 index 0000000..e68e2ef Binary files /dev/null and b/ES/ES assignment 4/ES assignment 3 I2C/ES Assingment 3.pdf differ diff --git a/ES/ES assignment 4/ES assignment 3 I2C/assignment-C/Master.cpp b/ES/ES assignment 4/ES assignment 3 I2C/assignment-C/Master.cpp new file mode 100644 index 0000000..5fe7054 --- /dev/null +++ b/ES/ES assignment 4/ES assignment 3 I2C/assignment-C/Master.cpp @@ -0,0 +1,60 @@ +#include +#include + +#define DEVICE_ADDRESS 0x50 + +// Virtual hardware registers +uint8_t reg_INA = 0; +uint8_t reg_INB = 0; +uint8_t reg_pointer = 0; // acts as address register for reads + + + +// Called when master writes data +void receiveEvent(int howMany) { + if (howMany < 1) return; + + // First byte is always register address + reg_pointer = Wire.read(); + howMany--; + + if (howMany == 1) { + // Second byte is data to write + uint8_t value = Wire.read(); + if (reg_pointer == 0x21) { + reg_INA = value; + Serial.println("INA set"); + } else if (reg_pointer == 0x22) { + reg_INB = value; + Serial.println("INB set"); + } else { + // Writes to read-only registers are ignored + Serial.println("Write to read-only register ignored"); + } + } +} + +// Called when master reads data +void requestEvent() { + uint8_t value = 0; + + switch (reg_pointer) { + case 0x21: value = reg_INA; break; + case 0x22: value = reg_INB; break; + case 0x23: value = min(reg_INA, reg_INB); break; + case 0x24: value = max(reg_INA, reg_INB); break; + default: value = 0xFF; break; // undefined register + } + + Wire.write(value); +} + +void setup() { + Wire.begin(DEVICE_ADDRESS); + Wire.onReceive(receiveEvent); + Wire.onRequest(requestEvent); + Serial.begin(9600); +} + +void loop() { +} \ No newline at end of file diff --git a/ES/ES assignment 4/ES assignment 3 I2C/assignment-C/Slave.cpp b/ES/ES assignment 4/ES assignment 3 I2C/assignment-C/Slave.cpp new file mode 100644 index 0000000..32afec4 --- /dev/null +++ b/ES/ES assignment 4/ES assignment 3 I2C/assignment-C/Slave.cpp @@ -0,0 +1,65 @@ +#include +#include + +#define SLAVE_ADDRESS 0x77 + +uint8_t registers[256] = {0}; // Simuleer registermap +uint8_t regAddr = 0; // Registeradres voor read/write + +void setup() { + Wire.begin(SLAVE_ADDRESS); + Wire.onReceive(receiveEvent); + Wire.onRequest(requestEvent); + Serial.begin(9600); + Serial.println("Slave ready."); +} + +void loop() { +} + +// Ontvangen van master (write) +void receiveEvent(int howMany) { + if (howMany < 1) return; + + regAddr = Wire.read(); // Eerste byte is altijd registeradres + + if (howMany > 1) { + // Daarna komen data bytes + int bytesToRead = howMany - 1; + for (int i = 0; i < bytesToRead; i++) { + if (Wire.available()) { + uint8_t val = Wire.read(); + registers[regAddr + i] = val; + Serial.print("Reg "); + Serial.print(regAddr + i); + Serial.print(" written with "); + Serial.println(val); + } + } + + // Update min/max registers als 0x21 of 0x22 is gewijzigd + if (regAddr == 0x21 || regAddr == 0x22) { + uint8_t a = registers[0x21]; + uint8_t b = registers[0x22]; + registers[0x23] = (a < b) ? a : b; // MIN + registers[0x24] = (a > b) ? a : b; // MAX + + Serial.print("Updated MIN (0x23): "); + Serial.println(registers[0x23]); + Serial.print("Updated MAX (0x24): "); + Serial.println(registers[0x24]); + } + } + // else alleen registeradres ontvangen, niks schrijven (read setup) +} + +// Master vraagt data op (read) +void requestEvent() { + uint8_t val = registers[regAddr]; + Wire.write(val); + + Serial.print("Sent reg "); + Serial.print(regAddr, HEX); + Serial.print(": "); + Serial.println(val); +} diff --git a/ES/ES assignment 4/ES assignment 3 I2C/include/README b/ES/ES assignment 4/ES assignment 3 I2C/include/README new file mode 100644 index 0000000..49819c0 --- /dev/null +++ b/ES/ES assignment 4/ES assignment 3 I2C/include/README @@ -0,0 +1,37 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the convention is to give header files names that end with `.h'. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/ES/ES assignment 4/ES assignment 3 I2C/lib/README b/ES/ES assignment 4/ES assignment 3 I2C/lib/README new file mode 100644 index 0000000..9379397 --- /dev/null +++ b/ES/ES assignment 4/ES assignment 3 I2C/lib/README @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into the executable file. + +The source code of each library should be placed in a separate directory +("lib/your_library_name/[Code]"). + +For example, see the structure of the following example libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional. for custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +Example contents of `src/main.c` using Foo and Bar: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +The PlatformIO Library Dependency Finder will find automatically dependent +libraries by scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/ES/ES assignment 4/ES assignment 3 I2C/platformio.ini b/ES/ES assignment 4/ES assignment 3 I2C/platformio.ini new file mode 100644 index 0000000..629e82f --- /dev/null +++ b/ES/ES assignment 4/ES assignment 3 I2C/platformio.ini @@ -0,0 +1,15 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:uno] +platform = atmelavr +board = uno +framework = arduino +lib_deps = adafruit/Adafruit BusIO@^1.17.1 diff --git a/ES/ES assignment 4/ES assignment 3 I2C/test/README b/ES/ES assignment 4/ES assignment 3 I2C/test/README new file mode 100644 index 0000000..9b1e87b --- /dev/null +++ b/ES/ES assignment 4/ES assignment 3 I2C/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PlatformIO Test Runner and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PlatformIO Unit Testing: +- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html diff --git a/ES/ES assignment 5/ES 5/Assignment-A/main.cpp b/ES/ES assignment 5/ES 5/Assignment-A/main.cpp new file mode 100644 index 0000000..a09ba87 --- /dev/null +++ b/ES/ES assignment 5/ES 5/Assignment-A/main.cpp @@ -0,0 +1,71 @@ +#include +#define DEBOUNCE_DELAY 50 +#define BLINK_INTERVAL 500 + +unsigned long lastBlinkTime = 0; +bool blinkState = false; + +bool isPressed(uint8_t pinMask, volatile uint8_t* pinReg) { + static unsigned long lastDebounceTime[8] = {0}; + static bool lastStableState[8] = {true}; + static bool lastReadState[8] = {true}; + + uint8_t pinIndex = 0; + while ((pinMask >> pinIndex) != 1) pinIndex++; // bepaalt welk bit van toepassing is + + bool reading = (*pinReg & pinMask); // leest huidige status van de pin + + if (reading != lastReadState[pinIndex]) { + lastDebounceTime[pinIndex] = millis(); // bij verandering: debounce timer starten + lastReadState[pinIndex] = reading; + } + + if ((millis() - lastDebounceTime[pinIndex]) > DEBOUNCE_DELAY) { + lastStableState[pinIndex] = reading; // status pas bijwerken na stabiele periode + } + + return lastStableState[pinIndex]; +} + +void setup() { + DDRD |= _BV(DDD5) | _BV(DDD6); + Serial.begin(9600); +} + +void loop() { + // Knopstatussen uitlezen met debounce + bool Button1Pressed = isPressed(_BV(PINB2), &PINB); // D10 + bool Button2Pressed = isPressed(_BV(PINB3), &PINB); // D11 + + if (Button1Pressed && !Button2Pressed) { + // Alleen Button1 ingedrukt: LED D5 aan, D6 uit + PORTD |= _BV(PORTD5); + PORTD &= ~_BV(PORTD6); + } else if (!Button1Pressed && Button2Pressed) { + // Alleen Button2 ingedrukt: LED D6 aan, D5 uit en "Hello World!" printen + PORTD &= ~_BV(PORTD5); + PORTD |= _BV(PORTD6); + static unsigned long lastHelloTime = 0; + if (millis() - lastHelloTime > 100) { + Serial.println("Hello World!\n"); + lastHelloTime = millis(); + } + } else if (Button1Pressed && Button2Pressed) { + // Beide knoppen ingedrukt: LEDs knipperen om en om + if (millis() - lastBlinkTime >= BLINK_INTERVAL) { + blinkState = !blinkState; + lastBlinkTime = millis(); + } + + if (blinkState) { + PORTD |= _BV(PORTD5); + PORTD &= ~_BV(PORTD6); + } else { + PORTD &= ~_BV(PORTD5); + PORTD |= _BV(PORTD6); + } + } else { + // Geen knop ingedrukt: beide LEDs uit + PORTD &= ~(_BV(PORTD5) | _BV(PORTD6)); + } +} \ No newline at end of file diff --git a/ES/ES assignment 5/ES 5/Assignment-B/main.cpp b/ES/ES assignment 5/ES 5/Assignment-B/main.cpp new file mode 100644 index 0000000..93ed09c --- /dev/null +++ b/ES/ES assignment 5/ES 5/Assignment-B/main.cpp @@ -0,0 +1,88 @@ +#include + +#define BLINK_INTERVAL 500 +#define DEBOUNCE_DELAY 50 + +volatile bool Button1 = false; +volatile bool Button2 = false; + +volatile unsigned long lastDebounceTimeButton1 = 0; +volatile unsigned long lastDebounceTimeButton2 = 0; + +bool lastButton1State = true; +bool lastButton2State = true; + +unsigned long lastBlinkTime = 0; +bool blinkState = false; + +void setup() { + // LEDs op D5 en D6 als output + DDRD |= _BV(DDD5) | _BV(DDD6); + + // Knoppen D10 (PB2) en D11 (PB3) als input met pull-up + DDRB &= ~(_BV(DDB2) | _BV(DDB3)); + PORTB |= _BV(PORTB2) | _BV(PORTB3); + + // Pin Change Interrupts activeren voor PB2 en PB3 + PCICR |= _BV(PCIE0); // Enable PCINT[7:0] (PORTB) + PCMSK0 |= _BV(PCINT2) | _BV(PCINT3); + + sei(); + + Serial.begin(9600); +} + +ISR(PCINT0_vect) { + unsigned long now = millis(); + + // Lees huidige toestand + bool currentButton1 = PINB & _BV(PINB2); + bool currentButton2 = PINB & _BV(PINB3); + + // Detecteer falling edge voor button1 (hoog -> laag) + if (lastButton1State && !currentButton1 && (now - lastDebounceTimeButton1 > DEBOUNCE_DELAY)) { + Button1 = !Button1; // toggle status + lastDebounceTimeButton1 = now; + } + + // Detecteer falling edge voor button 2 + if (lastButton2State && !currentButton2 && (now - lastDebounceTimeButton2 > DEBOUNCE_DELAY)) { + Button2 = !Button2; // toggle status + lastDebounceTimeButton2 = now; + } + + // Update vorige staat + lastButton1State = currentButton1; + lastButton2State = currentButton2; +} + +void loop() { + if (Button1 && !Button2) { + PORTD |= _BV(PORTD5); + PORTD &= ~_BV(PORTD6); + } else if (!Button1 && Button2) { + PORTD &= ~_BV(PORTD5); + PORTD |= _BV(PORTD6); + + static unsigned long lastHelloTime = 0; + if (millis() - lastHelloTime > 100) { + Serial.println("Hello World!"); + lastHelloTime = millis(); + } + } else if (Button1 && Button2) { + if (millis() - lastBlinkTime >= BLINK_INTERVAL) { + blinkState = !blinkState; + lastBlinkTime = millis(); + } + + if (blinkState) { + PORTD |= _BV(PORTD5); + PORTD &= ~_BV(PORTD6); + } else { + PORTD &= ~_BV(PORTD5); + PORTD |= _BV(PORTD6); + } + } else { + PORTD &= ~(_BV(PORTD5) | _BV(PORTD6)); + } +} diff --git a/ES/ES assignment 5/ES 5/Assignment-C/main.cpp b/ES/ES assignment 5/ES 5/Assignment-C/main.cpp new file mode 100644 index 0000000..0f318f0 --- /dev/null +++ b/ES/ES assignment 5/ES 5/Assignment-C/main.cpp @@ -0,0 +1,101 @@ +#include + +#define LED0 PORTD5 // D5 +#define LED1 PORTD6 // D6 +#define LED2 PORTB0 // D8 +#define LED3 PORTB1 // D9 +#define BUILTIN_LED PORTB5 // D13 + +#define BUTTON_SLOW PINB2 // D10 +#define BUTTON_FAST PINB3 // D11 + +#define COMPARE_MIN 1000 +#define COMPARE_MAX 50000 + +volatile unsigned char counter = 0; +volatile unsigned int compareValue = COMPARE_MAX; + +void setupIO() { + // LEDs output + DDRD |= (1 << LED0) | (1 << LED1); + DDRB |= (1 << LED2) | (1 << LED3) | (1 << BUILTIN_LED); + + // Buttons input with pull-up + DDRB &= ~((1 << BUTTON_SLOW) | (1 << BUTTON_FAST)); + PORTB |= (1 << BUTTON_SLOW) | (1 << BUTTON_FAST); + + // Pin change interrupt for D10/D11 + PCICR |= (1 << PCIE0); + PCMSK0 |= (1 << PCINT2) | (1 << PCINT3); +} + +// Setup Timer1 with COMPA (counter) and COMPB (1Hz LED) +void setupTimer1() { + TCCR1A = 0; + TCCR1B = (1 << WGM12) | (1 << CS11) | (1 << CS10); // CTC, prescaler 64 + + OCR1A = compareValue; // 4-bit counter update speed + OCR1B = 249999; // 1 Hz = (16e6 / 64) / 250000 + TIMSK1 = (1 << OCIE1A) | (1 << OCIE1B); +} + +// Show counter value on 4 LEDs +void updateLEDs(unsigned char val) { + if (val & 0x01) PORTD |= (1 << LED0); else PORTD &= ~(1 << LED0); + if (val & 0x02) PORTD |= (1 << LED1); else PORTD &= ~(1 << LED1); + if (val & 0x04) PORTB |= (1 << LED2); else PORTB &= ~(1 << LED2); + if (val & 0x08) PORTB |= (1 << LED3); else PORTB &= ~(1 << LED3); +} + +// Counter interrupt (frequency adjustable) +ISR(TIMER1_COMPA_vect) { + counter = (counter + 1) & 0x0F; + updateLEDs(counter); +} + +ISR(TIMER1_COMPB_vect) { + PINB |= (1 << BUILTIN_LED); // Toggle built-in LED +} + +// Button interrupt: handle speed control +ISR(PCINT0_vect) { + static unsigned char lastState = 0xFF; + unsigned char current = PINB; + + // Falling edge: slow down + if (!(current & (1 << BUTTON_SLOW)) && (lastState & (1 << BUTTON_SLOW))) { + if (compareValue < COMPARE_MAX) { + compareValue <<= 1; + if (compareValue > COMPARE_MAX) compareValue = COMPARE_MAX; + } + } + + // Falling edge: speed up + if (!(current & (1 << BUTTON_FAST)) && (lastState & (1 << BUTTON_FAST))) { + if (compareValue > COMPARE_MIN) { + compareValue >>= 1; + if (compareValue < COMPARE_MIN) compareValue = COMPARE_MIN; + } + } + + lastState = current; +} + +void setup() { + cli(); + setupIO(); + setupTimer1(); + sei(); +} + +void loop() { + static unsigned int lastValue = 0; + cli(); + if (compareValue != lastValue) { + TIMSK1 &= ~(1 << OCIE1A); + OCR1A = compareValue; + TIMSK1 |= (1 << OCIE1A); + lastValue = compareValue; +} +sei(); +} \ No newline at end of file diff --git a/ES/ES assignment 5/ES 5/ES assignment 5.docx b/ES/ES assignment 5/ES 5/ES assignment 5.docx new file mode 100644 index 0000000..8fdda36 Binary files /dev/null and b/ES/ES assignment 5/ES 5/ES assignment 5.docx differ diff --git a/ES/ES assignment 5/Rens en Gijs assignment 5.zip b/ES/ES assignment 5/Rens en Gijs assignment 5.zip new file mode 100644 index 0000000..d57b489 Binary files /dev/null and b/ES/ES assignment 5/Rens en Gijs assignment 5.zip differ