diff --git a/.vscode/settings.json b/.vscode/settings.json index c06dca8..6faeac7 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,5 +6,6 @@ "arduino.additionalUrls": "", "arduino.logLevel": "info", "arduino.enableUSBDetection": true, - "C_Cpp.intelliSenseEngine": "Default" + "C_Cpp.intelliSenseEngine": "Default", + "C_Cpp.clang_format_fallbackStyle": "{ BasedOnStyle: Google, IndentWidth: 4, ColumnLimit: 0}" } \ No newline at end of file diff --git a/MorsDuino.code-workspace b/MorsDuino.code-workspace index 44e6bc5..8568d59 100644 --- a/MorsDuino.code-workspace +++ b/MorsDuino.code-workspace @@ -8,7 +8,8 @@ "files.associations": { "vector": "cpp", "iosfwd": "cpp", - "iterator": "cpp" + "iterator": "cpp", + "__locale": "cpp" } } } \ No newline at end of file diff --git a/README.md b/README.md index 5ed0c3d..11fd607 100644 --- a/README.md +++ b/README.md @@ -2,22 +2,4 @@ The lightweight Arduino Library for generating Morse code on LEDs, light strips, and speakers. Every Arduino board is supported(library uses standart Wiring functions). -## What it can do - -## Usage - -``` C++ -#include "MorsDuino.h" - -MorsDuinoLed led(13); // Make new instance of MarsDuinoLed class with name 'led' - -void setup() { - Serial.begin(9600); // Start serial on 9600 baud rate -} - -void loop() { - while(!Serial.available()); // Wait until serial has some data - char data = Serial.read(); // Read data - led.displayChar(data); // Draw morse on 13 LED -} -``` +To see tutorials about using MorsDuino, visit Wiki. diff --git a/examples/Led/RgbSosBlink.ino b/examples/Led/RgbSosBlink.ino new file mode 100644 index 0000000..e69de29 diff --git a/examples/Led/SosBlick.ino b/examples/Led/SosBlick.ino new file mode 100644 index 0000000..e69de29 diff --git a/library.properties b/library.properties index 62eba38..eb1aa68 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=MorseDuino -version=1.0 +version=2.0-beta2 author=GGorAA maintainer=GGorAA sentence=Arduino library for generation morse code and displaying it on LEDs diff --git a/src/Led.cpp b/src/Led.cpp new file mode 100644 index 0000000..aa60f65 --- /dev/null +++ b/src/Led.cpp @@ -0,0 +1,240 @@ +#include "Arduino.h" +#include "MorsDuino.h" + +void MorsDuinoLed::_dot(int count = 1) { + int num = 1; + do { + digitalWrite(_pin, HIGH); + delay(125); + digitalWrite(_pin, LOW); + delay(125); + num++; + } while (num <= count); +} + +void MorsDuinoLed::_dash(int count = 1) { + int num = 1; + do { + digitalWrite(_pin, HIGH); + delay(500); + digitalWrite(_pin, LOW); + delay(125); + num++; + } while (num <= count); +} + +void MorsDuinoLed::_delaySeparator(int type) { + if (type == 1) { + delay(_letterSeparatorDelay); + } else if (type == 2) { + delay(_wordSeparatorDelay); + } +} + +void MorsDuinoLed::displayString(String text) { + size_t numberOfElements = sizeof(text) / sizeof(text[0]); + for (int i = 0; i <= numberOfElements; i++) { + MorsDuinoLed::displayChar(text[i]); + } +} + +void MorsDuinoLed::displayChar(char character) { + switch (character) { + // Numbers + case '1': + _dot(); + _dash(4); + _delaySeparator(1); + break; + case '2': + _dot(2); + _dash(3); + _delaySeparator(1); + break; + case '3': + _dot(3); + _dash(2); + _delaySeparator(1); + break; + case '4': + _dot(4); + _dash(1); + _delaySeparator(1); + break; + case '5': + _dot(5); + _delaySeparator(1); + break; + case '6': + _dash(1); + _dot(4); + _delaySeparator(1); + break; + case '7': + _dash(2); + _dot(3); + _delaySeparator(1); + break; + case '8': + _dash(3); + _dot(2); + _delaySeparator(1); + break; + case '9': + _dash(4); + _dot(1); + _delaySeparator(1); + break; + case '0': + _dash(5); + _delaySeparator(1); + break; + // English alphabet + case 'a': + _dot(); + _dash(); + _delaySeparator(1); + break; + case 'b': + _dash(); + _dot(3); + _delaySeparator(1); + break; + case 'c': + _dash(); + _dot(); + _dash(); + _dot(); + _delaySeparator(1); + break; + case 'd': + _dash(); + _dot(2); + _delaySeparator(1); + break; + case 'e': + _dot(); + _delaySeparator(1); + break; + case 'f': + _dot(2); + _dash(); + _dot(); + _delaySeparator(1); + break; + case 'g': + _dash(2); + _dot(); + _delaySeparator(1); + break; + case 'h': + _dot(4); + _delaySeparator(1); + break; + case 'i': + _dot(2); + _delaySeparator(1); + break; + case 'j': + _dot(); + _dash(3); + _delaySeparator(1); + break; + case 'k': + _dash(); + _dot(); + _dash(); + _delaySeparator(1); + break; + case 'l': + _dot(); + _dash(); + _dot(2); + _delaySeparator(1); + break; + case 'm': + _dash(2); + _delaySeparator(1); + break; + case 'n': + _dash(); + _dot(); + _delaySeparator(1); + break; + case 'o': + _dash(3); + _delaySeparator(1); + break; + case 'p': + _dot(); + _dash(2); + _dot(); + _delaySeparator(1); + break; + case 'q': + _dash(2); + _dot(); + _dash(); + _delaySeparator(1); + break; + case 'r': + _dot(); + _dash(); + _dot(); + _delaySeparator(1); + break; + case 's': + _dot(3); + _delaySeparator(1); + break; + case 't': + _dash(); + _delaySeparator(1); + break; + case 'u': + _dot(2); + _dash(); + _delaySeparator(1); + break; + case 'v': + _dot(3); + _dash(); + _delaySeparator(1); + break; + case 'w': + _dot(); + _dash(2); + _delaySeparator(1); + break; + case 'x': + _dash(); + _dot(2); + _dash(); + _delaySeparator(1); + break; + case 'y': + _dash(); + _dot(); + _dash(2); + _delaySeparator(1); + break; + case 'z': + _dash(2); + _dot(2); + _delaySeparator(1); + break; + case ' ': + _delaySeparator(2); + break; + default: + break; + } +} + +void MorsDuinoLed::displayInt(int number) { + String numbers = String(number); + size_t numberOfElements = sizeof(numbers) / sizeof(numbers[0]); + for (int i = 0; i <= numberOfElements; i++) { + MorsDuinoLed::displayChar(numbers[i]); + } +} \ No newline at end of file diff --git a/src/MorsDuino.cpp b/src/MorsDuino.cpp index 5e554da..6fd0a8e 100644 --- a/src/MorsDuino.cpp +++ b/src/MorsDuino.cpp @@ -1,262 +1,21 @@ -#include "Arduino.h" #include "MorsDuino.h" -MorsDuinoLed::MorsDuinoLed(int pin = 13) -{ +#include "Arduino.h" + +MorsDuinoLed::MorsDuinoLed(int pin = 13) { pinMode(pin, OUTPUT); _letterSeparatorDelay = 400; _wordSeparatorDelay = 1000; _pin = pin; } -void MorsDuinoLed::_dot(int count = 1) -{ - int num = 1; - do - { - digitalWrite(_pin, HIGH); - delay(125); - digitalWrite(_pin, LOW); - delay(125); - num++; - } while (num <= count); -} - -void MorsDuinoLed::_dash(int count = 1) -{ - int num = 1; - do - { - digitalWrite(_pin, HIGH); - delay(500); - digitalWrite(_pin, LOW); - delay(125); - num++; - } while (num <= count); -} - -void MorsDuinoLed::_delaySeparator(int type) -{ - if (type == 1) - { - delay(_letterSeparatorDelay); - } - else if (type == 2) - { - delay(_wordSeparatorDelay); - } -} - -void MorsDuinoLed::displayString(String text) -{ - size_t numberOfElements = sizeof(text) / sizeof(text[0]); - for (int i = 0; i <= numberOfElements; i++) - { - MorsDuinoLed::displayChar(text[i]); - } -} - -void MorsDuinoLed::displayChar(char character) -{ - switch (character) - { - // Numbers - case '1': - _dot(); - _dash(4); - _delaySeparator(1); - break; - case '2': - _dot(2); - _dash(3); - _delaySeparator(1); - break; - case '3': - _dot(3); - _dash(2); - _delaySeparator(1); - break; - case '4': - _dot(4); - _dash(1); - _delaySeparator(1); - break; - case '5': - _dot(5); - _delaySeparator(1); - break; - case '6': - _dash(1); - _dot(4); - _delaySeparator(1); - break; - case '7': - _dash(2); - _dot(3); - _delaySeparator(1); - break; - case '8': - _dash(3); - _dot(2); - _delaySeparator(1); - break; - case '9': - _dash(4); - _dot(1); - _delaySeparator(1); - break; - case '0': - _dash(5); - _delaySeparator(1); - break; - // English alphabet - case 'a': - _dot(); - _dash(); - _delaySeparator(1); - break; - case 'b': - _dash(); - _dot(3); - _delaySeparator(1); - break; - case 'c': - _dash(); - _dot(); - _dash(); - _dot(); - _delaySeparator(1); - break; - case 'd': - _dash(); - _dot(2); - _delaySeparator(1); - break; - case 'e': - _dot(); - _delaySeparator(1); - break; - case 'f': - _dot(2); - _dash(); - _dot(); - _delaySeparator(1); - break; - case 'g': - _dash(2); - _dot(); - _delaySeparator(1); - break; - case 'h': - _dot(4); - _delaySeparator(1); - break; - case 'i': - _dot(2); - _delaySeparator(1); - break; - case 'j': - _dot(); - _dash(3); - _delaySeparator(1); - break; - case 'k': - _dash(); - _dot(); - _dash(); - _delaySeparator(1); - break; - case 'l': - _dot(); - _dash(); - _dot(2); - _delaySeparator(1); - break; - case 'm': - _dash(2); - _delaySeparator(1); - break; - case 'n': - _dash(); - _dot(); - _delaySeparator(1); - break; - case 'o': - _dash(3); - _delaySeparator(1); - break; - case 'p': - _dot(); - _dash(2); - _dot(); - _delaySeparator(1); - break; - case 'q': - _dash(2); - _dot(); - _dash(); - _delaySeparator(1); - break; - case 'r': - _dot(); - _dash(); - _dot(); - _delaySeparator(1); - break; - case 's': - _dot(3); - _delaySeparator(1); - break; - case 't': - _dash(); - _delaySeparator(1); - break; - case 'u': - _dot(2); - _dash(); - _delaySeparator(1); - break; - case 'v': - _dot(3); - _dash(); - _delaySeparator(1); - break; - case 'w': - _dot(); - _dash(2); - _delaySeparator(1); - break; - case 'x': - _dash(); - _dot(2); - _dash(); - _delaySeparator(1); - break; - case 'y': - _dash(); - _dot(); - _dash(2); - _delaySeparator(1); - break; - case 'z': - _dash(2); - _dot(2); - _delaySeparator(1); - break; - case ' ': - _delaySeparator(2); - break; - default: - break; - } -} - -void MorsDuinoLed::displayInt(int number) -{ - String numbers = String(number); - size_t numberOfElements = sizeof(numbers) / sizeof(numbers[0]); - for (int i = 0; i <= numberOfElements; i++) - { - MorsDuinoLed::displayChar(numbers[i]); - } +MorsDuinoRgbLed::MorsDuinoRgbLed(int red, int green, int blue, int type) { + // Setup pins + pinMode(red, OUTPUT); + pinMode(green, OUTPUT); + pinMode(blue, OUTPUT); + // Setup local variables + _redPin = red; + _greenPin = green; + _bluePin = blue; } \ No newline at end of file diff --git a/src/MorsDuino.h b/src/MorsDuino.h index 52ee6ca..69f20ff 100644 --- a/src/MorsDuino.h +++ b/src/MorsDuino.h @@ -3,21 +3,58 @@ #include "Arduino.h" -class MorsDuinoLed -{ -public: +class MorsDuinoLed { + public: MorsDuinoLed(int pin); void displayString(String text); void displayChar(char character); void displayInt(int number); -private: + private: int _pin; int _letterSeparatorDelay; int _wordSeparatorDelay; - void _dot(int count = 1); - void _dash(int count = 1); + void _dot(int count); + void _dash(int count); void _delaySeparator(int type); }; +class MorsDuinoRgbLed { + public: + MorsDuinoRgbLed(int red, int green, int blue); -#endif // MORSDUINO_H \ No newline at end of file + void displayString(String text); + void displayInt(int number); + void displayChar(char character); + + void setColor(char color); + void setBrightness(int brightness); + void setState(bool state); + + private: + int _redPin; + int _greenPin; + int _bluePin; + + int _redColorBuffer; + int _greenColorBuffer; + int _blueColorBuffer; + + int _letterSeparatorDelay; + int _wordSeparatorDelay; + + char _savedColor; + + int _redPinMaxBrightnessBuffer; + int _greenPinMaxBrightnessBuffer; + int _bluePinMaxBrightnessBuffer; + + void _dot(int count); + void _dash(int count); + void _delaySeparator(int type); + void _changeState(bool state); + void _applyBrightnessSettings(); + void _drawColor(char color); + void _off(); +}; + +#endif // MORSDUINO_H \ No newline at end of file diff --git a/src/RgbLed.cpp b/src/RgbLed.cpp new file mode 100644 index 0000000..115c8d8 --- /dev/null +++ b/src/RgbLed.cpp @@ -0,0 +1,293 @@ +#include "Arduino.h" +#include "MorsDuino.h" + +void MorsDuinoRgbLed::setColor(char color) { + _drawColor(color); + _savedColor = color; + _applyBrightnessSettings(); +} + +void MorsDuinoRgbLed::setState(bool state) { + if (state) { + analogWrite(_redPin, _redColorBuffer); + analogWrite(_greenPin, _greenColorBuffer); + analogWrite(_bluePin, _blueColorBuffer); + } else { + analogWrite(_redPin, 0); + analogWrite(_greenPin, 0); + analogWrite(_bluePin, 0); + } +} + +// Function to display color +void MorsDuinoRgbLed::_drawColor(char color) { + int redColor = ((color >> 16) & 0xFF) / 255.0; // Extract the RR byte + int greenColor = ((color >> 8) & 0xFF) / 255.0; // Extract the GG byte + int blueColor = ((color)&0xFF) / 255.0; // Extract the BB byte + + // Save colors + _redColorBuffer = redColor; + _greenColorBuffer = greenColor; + _blueColorBuffer = blueColor; + + analogWrite(_redPin, redColor); + analogWrite(_greenPin, greenColor); + analogWrite(_bluePin, blueColor); +} + +void MorsDuinoRgbLed::_off() { + analogWrite(_redPin, 0); + analogWrite(_greenPin, 0); + analogWrite(_bluePin, 0); +} +void MorsDuinoRgbLed::_dot(int count = 1) { + int num = 1; + do { + _drawColor(_savedColor); + delay(125); + _off(); + delay(125); + num++; + } while (num <= count); +} +void MorsDuinoRgbLed::_dash(int count = 1) { + int num = 1; + do { + _drawColor(_savedColor); + delay(500); + _off(); + delay(125); + num++; + } while (num <= count); +} + +void MorsDuinoRgbLed::_delaySeparator(int type) { + if (type == 1) { + delay(_letterSeparatorDelay); + } else if (type == 2) { + delay(_wordSeparatorDelay); + } +} + +void MorsDuinoRgbLed::displayString(String text) { + size_t numberOfElements = sizeof(text) / sizeof(text[0]); + for (int i = 0; i <= numberOfElements; i++) { + MorsDuinoRgbLed::displayChar(text[i]); + } +} + +void MorsDuinoRgbLed::displayChar(char character) { + switch (character) { + // Numbers + case '1': + _dot(); + _dash(4); + _delaySeparator(1); + break; + case '2': + _dot(2); + _dash(3); + _delaySeparator(1); + break; + case '3': + _dot(3); + _dash(2); + _delaySeparator(1); + break; + case '4': + _dot(4); + _dash(1); + _delaySeparator(1); + break; + case '5': + _dot(5); + _delaySeparator(1); + break; + case '6': + _dash(1); + _dot(4); + _delaySeparator(1); + break; + case '7': + _dash(2); + _dot(3); + _delaySeparator(1); + break; + case '8': + _dash(3); + _dot(2); + _delaySeparator(1); + break; + case '9': + _dash(4); + _dot(1); + _delaySeparator(1); + break; + case '0': + _dash(5); + _delaySeparator(1); + break; + // English alphabet + case 'a': + _dot(); + _dash(); + _delaySeparator(1); + break; + case 'b': + _dash(); + _dot(3); + _delaySeparator(1); + break; + case 'c': + _dash(); + _dot(); + _dash(); + _dot(); + _delaySeparator(1); + break; + case 'd': + _dash(); + _dot(2); + _delaySeparator(1); + break; + case 'e': + _dot(); + _delaySeparator(1); + break; + case 'f': + _dot(2); + _dash(); + _dot(); + _delaySeparator(1); + break; + case 'g': + _dash(2); + _dot(); + _delaySeparator(1); + break; + case 'h': + _dot(4); + _delaySeparator(1); + break; + case 'i': + _dot(2); + _delaySeparator(1); + break; + case 'j': + _dot(); + _dash(3); + _delaySeparator(1); + break; + case 'k': + _dash(); + _dot(); + _dash(); + _delaySeparator(1); + break; + case 'l': + _dot(); + _dash(); + _dot(2); + _delaySeparator(1); + break; + case 'm': + _dash(2); + _delaySeparator(1); + break; + case 'n': + _dash(); + _dot(); + _delaySeparator(1); + break; + case 'o': + _dash(3); + _delaySeparator(1); + break; + case 'p': + _dot(); + _dash(2); + _dot(); + _delaySeparator(1); + break; + case 'q': + _dash(2); + _dot(); + _dash(); + _delaySeparator(1); + break; + case 'r': + _dot(); + _dash(); + _dot(); + _delaySeparator(1); + break; + case 's': + _dot(3); + _delaySeparator(1); + break; + case 't': + _dash(); + _delaySeparator(1); + break; + case 'u': + _dot(2); + _dash(); + _delaySeparator(1); + break; + case 'v': + _dot(3); + _dash(); + _delaySeparator(1); + break; + case 'w': + _dot(); + _dash(2); + _delaySeparator(1); + break; + case 'x': + _dash(); + _dot(2); + _dash(); + _delaySeparator(1); + break; + case 'y': + _dash(); + _dot(); + _dash(2); + _delaySeparator(1); + break; + case 'z': + _dash(2); + _dot(2); + _delaySeparator(1); + break; + case ' ': + _delaySeparator(2); + break; + default: + break; + } +} + +void MorsDuinoRgbLed::displayInt(int number) { + String numbers = String(number); + size_t numberOfElements = sizeof(numbers) / sizeof(numbers[0]); + for (int i = 0; i <= numberOfElements; i++) { + MorsDuinoRgbLed::displayChar(numbers[i]); + } +} + +void MorsDuinoRgbLed::setBrightness(int brightness) { + // Extract data + int redColor = ((_savedColor >> 16) & 0xFF) / 255.0; // Extract the RR byte + int greenColor = ((_savedColor >> 8) & 0xFF) / 255.0; // Extract the GG byte + int blueColor = ((_savedColor)&0xFF) / 255.0; // Extract the BB byte + + // Save data + _redPinMaxBrightnessBuffer = redColor; + + // Set brightness using percents. Just get a percent value from variables :) + analogWrite(_redPin, redColor % brightness); + analogWrite(_greenPin, greenColor % brightness); + analogWrite(_bluePin, blueColor % brightness); +} \ No newline at end of file