Ви не увійшли.
Сторінки 1
Пробую зробити контроллер для керування світлом.
Є структура
// * Структура, яка описує точку керування ШИМ-каналів
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 Звідки таке число
schedulePWM.hour 23
schedulePWM.minute 0
Finish 17264 Звідки таке число
Current 4
111!!!
Mode : 2
Current_PWM = 0
Допоможіть розібратися.
Неактивний
Дякую, запрацювало. Але яке ж переповнення при uint32_t? Там же теоретично не може бути більше число. Чи це пов'язано із ти, що ардуина 8бітна? Велика Вам подяка, я вже два дні мучився із цією проблемо.
Неактивний
Сторінки 1