#1 2023-11-25 16:40:32

CeMeH
Учасник
Зареєстрований: 2023-11-25
Повідомлень: 3

Допоможітьзнайти помилку

Пробую зробити контроллер для керування світлом.
Є структура

// * Структура, яка описує точку керування ШИМ-каналів
struct ChannelPWM_t
{
    int8_t hour;   // встановлена година у точці керування
    int8_t minute; // встановлена хвилина у точці керування
    int8_t ledPWM; // значення ШИМ у точці керування
};

Є масив структури

ChannelPWM_t schedulePWM[maxPointPWM]; // Розклад з п'яти точок

заповнений значеннями які збкрігаються в EEPROM
16,0,0;
16,40,70;
20,0,70;
22,0,50;
23,0,0;


Є функція для автоматичного режиму.

void AutoMode()
{
    uint32_t currentTime_UL = GetTime.hour * 3600 +
                              GetTime.minute * 60 +
                              GetTime.second;

    uint32_t TimeStart_UL = schedulePWM[0].hour * 3600 +      // підозрюю, що підставляє адресу пам'яті а не значення змінної
                            schedulePWM[0].minute * 60;                     // як записати правильно

    uint32_t TimeFinish_UL = schedulePWM[maxPointPWM - 1].hour * 3600 + 
                             schedulePWM[maxPointPWM - 1].minute * 60;  // як записати правильно?????

    // !!Відладка (початок)

    Serial.print("Current ");       // все нормально!!!
    Serial.println(currentTime_UL); // виводить адекватні значення

    Serial.print("schedulePWM.hour ");
    Serial.println(schedulePWM[0].hour); // виводить адекватні значення
    Serial.print("schedulePWM.minute ");
    Serial.println(schedulePWM[0].minute); // виводить адекватні значення
    Serial.print("Start ");
    Serial.println(TimeStart_UL); // ДУРНЯ а не значення !!!!!
    Serial.println();

    Serial.print("schedulePWM.hour ");
    Serial.println(schedulePWM[maxPointPWM - 1].hour); // виводить адекватні значення
    Serial.print("schedulePWM.minute ");
    Serial.println(schedulePWM[maxPointPWM - 1].minute); // виводить адекватні значення
    Serial.print("Finish ");
    Serial.println(TimeFinish_UL); // ДУРНЯ а не значення !!!!!
    Serial.println();

    // !!Відладка (кінець)

    int8_t _currentPWM;

    if (currentTime_UL < TimeStart_UL)
    {
        Serial.println("111!!!"); // !!Відладка
        analogWrite(LEDPIN, 0);
    }

    if (currentTime_UL >= TimeStart_UL && currentTime_UL <= TimeFinish_UL)
    {
        Serial.println("222!!!"); // !!Відладка
        for (uint8_t i = 0; i < maxPointPWM - 1; i++)
        {

            uint32_t time1_UL;
            time1_UL = (schedulePWM[i].hour * 3600) + // Здесь по идеи тоже бред
                       (schedulePWM[i].minute * 60);

            uint32_t time2_UL;
            time2_UL = (schedulePWM[i + 1].hour * 3600) +
                       (schedulePWM[i + 1].minute * 60); // Здесь по идеи тоже бред

            if (currentTime_UL > time1_UL && currentTime_UL <= time2_UL)
            {
                _currentPWM = schedulePWM[i].ledPWM + (schedulePWM[i + 1].ledPWM - schedulePWM[i].ledPWM) *
                                                          (currentTime_UL - time1_UL) / (time2_UL - time1_UL);

                currentPWM = _currentPWM;
                analogWrite(LEDPIN, map(_currentPWM, 0, 99, 0, 255));
            }
        }
    }

    if (currentTime_UL > TimeFinish_UL)
    {
        Serial.println("333!!!"); // !!Відладка
        analogWrite(LEDPIN, 0);
    }
}

При відладці, якщо виводити в серіал значення, то окремо кожну змінну виводить правильно, а от розраховані взагалі неадекватні. Підозрюю, що під час розрахунків підставляється адреса пам'яті, де знаходяться змінні, а не значення.

Ось, що виводить в серіал.

00:00:04
schedulePWM.hour 16
schedulePWM.minute 0
Start 4294959360  Звідки таке число yikes

schedulePWM.hour 23
schedulePWM.minute 0
Finish 17264  Звідки таке число yikes

Current 4
111!!!
Mode : 2
Current_PWM = 0

Допоможіть розібратися.

Неактивний

#2 2023-11-25 18:38:50

Honey
Учасник
З Київ
Зареєстрований: 2020-09-26
Повідомлень: 407

Re: Допоможітьзнайти помилку

Замініть 60 і 3600 на 60UL і 3600UL, відбувається переповнення.

Неактивний

#3 2023-11-25 18:58:48

CeMeH
Учасник
Зареєстрований: 2023-11-25
Повідомлень: 3

Re: Допоможітьзнайти помилку

Дякую, запрацювало.  smile Але яке ж переповнення при uint32_t? Там же теоретично не може бути більше число. Чи це пов'язано із ти, що ардуина 8бітна? Велика Вам подяка, я вже два дні мучився із цією проблемо.

Неактивний

#4 2023-11-25 23:30:03

CeMeH
Учасник
Зареєстрований: 2023-11-25
Повідомлень: 3

Re: Допоможітьзнайти помилку

З переповненням розібрався. Воно там дійсно є.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму