• Source
    1. // Привет всем! Сегодня поиграемся с хаосом и светом
    2. class ChaosGen { // создаем класс
    3. public: // обявляем публичные переменные и функции (свойства и методы)
    4. ChaosGen(float a, float r, float b, float x, float y, float z, float dt); // Конструктор класса
    5. float dx; // next value for x
    6. float dy; // next value for y
    7. float dz; // next value for z
    8. void updateGen(); // метод, вызов которого решает уравнение генератора хаоса
    9. void setParam(float a, float r, float b); // опциональный метод, вызов которого определяет входящие параметры генератора вместо стандартных 10.0, 28.0, 8/3
    10. void setInit(float x, float y, float z); // опциональный метод, вызов которого определяет начальные условия генератора вместо стандартных 0, 1, 0
    11. void setdt(float dt); // опциональный метод, вызов которого определяет шаг времени дифференциирования генератора вместо стандартных 0.003
    12. private: // обявляем приватные переменные (свойства)
    13. float _a; // declare value for s
    14. float _r; // declare value for r
    15. float _b; // declare value for b
    16. float _x; // declare starting value for x
    17. float _y; // declare starting value for y
    18. float _z; // declare starting value for z
    19. float _dt; // declare value for dt
    20. };
    21. byte ledPin = 5; // LED connected to digital pin 5
    22. // a r b x0 y0 z0 dt
    23. ChaosGen Lorenz(10.0, 28.0, 8 / 3, 0, 1, 0, 0.003); // создаем объект "генератора Лоренца" со стандартными начальными параметрами и входящими значениями "из книжки"/
    24. // таких обектов только с разными параметрами можно создать скольео угодно, например ChaosGen Lorenz1(8, 25, 7, 0, 1, 0, 0.003); и т.д.
    25. void setup() {
    26. Serial.begin(57600); // запускаем монитор порта USB
    27. Lorenz.setdt(0.00015); // [0.02-0.0001] опционально! устанавливаем шаг времени дифференциирования dt (физический смысл - расстояние между соседними точками на кривой аттрактора)
    28. // Большое время не позволит генератору запустится, а слишком маленькое не даст лицезреть смены результатов в адекватных временных рамках
    29. }
    30.  
    31. void loop() {
    32. Lorenz.updateGen(); // решаем уравнение генератора хаоса и получаем новые x, y, z
    33. //Serial.print(Lorenz.dx); Serial.print(" "); Serial.print(Lorenz.dy); Serial.print(" "); Serial.println(Lorenz.dz); //выводим в порт значения генератора хаоса (x, y, z)
    34. byte xmod = constrain(abs(Lorenz.dx), 1, 254); // следим за тем, чтобы значения не были ниже 1 и если так - инвертируем их относительно 0 взяв модуль значения
    35. analogWrite(ledPin, xmod); // управляем яркостью LED кольца значением x
    36. }
    37.  
    38.  
    39. ChaosGen::ChaosGen(float a, float r, float b, float x, float y, float z, float dt) {
    40. _a = a; // declare value for a
    41. _r = r; // declare value for r
    42. _b = b; // declare value for b
    43. _x = x; // declare starting value for x
    44. _y = y; // declare starting value for y
    45. _z = z; // declare starting value for z
    46. _dt = dt; // declare value for dt
    47. }
    48.  
    49. void ChaosGen::updateGen() {
    50. dx = _x + _a * (_y - _x) * _dt;
    51. dy = _y + (_r * _x - _y - _x * _z) * _dt;
    52. dz = _z + (_x * _y - _b * _z) * _dt;
    53. _x = dx;
    54. _y = dy;
    55. _z = dz;
    56. }
    57.  
    58. void ChaosGen::setParam(float a, float r, float b) {
    59. _a = a; // declare value for a
    60. _r = r; // declare value for r
    61. _b = b; // declare value for b
    62. }
    63.  
    64. void ChaosGen::setInit(float x, float y, float z) {
    65. _x = x; // declare starting value for x
    66. _y = y; // declare starting value for y
    67. _z = z; // declare starting value for z
    68. }
    69.  
    70. void ChaosGen::setdt(float dt) {
    71. _dt = dt; // declare value for dt
    72. }
    73.