// Привет всем! Сегодня поиграемся с хаосом и светом
class ChaosGen { // создаем класс
public: // обявляем публичные переменные и функции (свойства и методы)
ChaosGen(float a, float r, float b, float x, float y, float z, float dt); // Конструктор класса
float dx; // next value for x
float dy; // next value for y
float dz; // next value for z
void updateGen(); // метод, вызов которого решает уравнение генератора хаоса
void setParam(float a, float r, float b); // опциональный метод, вызов которого определяет входящие параметры генератора вместо стандартных 10.0, 28.0, 8/3
void setInit(float x, float y, float z); // опциональный метод, вызов которого определяет начальные условия генератора вместо стандартных 0, 1, 0
void setdt(float dt); // опциональный метод, вызов которого определяет шаг времени дифференциирования генератора вместо стандартных 0.003
private: // обявляем приватные переменные (свойства)
float _a; // declare value for s
float _r; // declare value for r
float _b; // declare value for b
float _x; // declare starting value for x
float _y; // declare starting value for y
float _z; // declare starting value for z
float _dt; // declare value for dt
};
byte ledPin = 5; // LED connected to digital pin 5
// a r b x0 y0 z0 dt
ChaosGen Lorenz(10.0, 28.0, 8 / 3, 0, 1, 0, 0.003); // создаем объект "генератора Лоренца" со стандартными начальными параметрами и входящими значениями "из книжки"/
// таких обектов только с разными параметрами можно создать скольео угодно, например ChaosGen Lorenz1(8, 25, 7, 0, 1, 0, 0.003); и т.д.
void setup() {
Serial.begin(57600); // запускаем монитор порта USB
Lorenz.setdt(0.00015); // [0.02-0.0001] опционально! устанавливаем шаг времени дифференциирования dt (физический смысл - расстояние между соседними точками на кривой аттрактора)
// Большое время не позволит генератору запустится, а слишком маленькое не даст лицезреть смены результатов в адекватных временных рамках
}
void loop() {
Lorenz.updateGen(); // решаем уравнение генератора хаоса и получаем новые x, y, z
//Serial.print(Lorenz.dx); Serial.print(" "); Serial.print(Lorenz.dy); Serial.print(" "); Serial.println(Lorenz.dz); //выводим в порт значения генератора хаоса (x, y, z)
byte xmod = constrain(abs(Lorenz.dx), 1, 254); // следим за тем, чтобы значения не были ниже 1 и если так - инвертируем их относительно 0 взяв модуль значения
analogWrite(ledPin, xmod); // управляем яркостью LED кольца значением x
}
ChaosGen::ChaosGen(float a, float r, float b, float x, float y, float z, float dt) {
_a = a; // declare value for a
_r = r; // declare value for r
_b = b; // declare value for b
_x = x; // declare starting value for x
_y = y; // declare starting value for y
_z = z; // declare starting value for z
_dt = dt; // declare value for dt
}
void ChaosGen::updateGen() {
dx = _x + _a * (_y - _x) * _dt;
dy = _y + (_r * _x - _y - _x * _z) * _dt;
dz = _z + (_x * _y - _b * _z) * _dt;
_x = dx;
_y = dy;
_z = dz;
}
void ChaosGen::setParam(float a, float r, float b) {
_a = a; // declare value for a
_r = r; // declare value for r
_b = b; // declare value for b
}
void ChaosGen::setInit(float x, float y, float z) {
_x = x; // declare starting value for x
_y = y; // declare starting value for y
_z = z; // declare starting value for z
}
void ChaosGen::setdt(float dt) {
_dt = dt; // declare value for dt
}