Бесплатный урок с нашим репетитором!

Узнать подробнее

Новая Школа - онлайн-школа подготовки к ЕГЭ
При поддержке
Посмотреть все вопросы нейросети
Бесплатный пробный урок с репетитором

Узнай больше про репетиторов Новой Школы и запишись на бесплатный пробный урок. Мы проверим твой уровень знаний и составим план обучения по любому предмету и классу

Вопрос от Анонимного юзера 09 октября 2025 05:39

Найдите все строки с ошибками (ошибки компиляции и/или логические и/или синтаксические) в коде ПИД-регулятора для управления нагревательным элементом с датчиком Dallas DS18B20. Строки 1-9 нужно указывать с префиксом 0. В ответе укажите строки по возрастанию 01: #include 02: #include 03: #include 04: 05: #define ONE_WIRE_BUS 2 06: #define TEMPERATURE_PRECISION 9 07: OneWire oneWire(ONE_WIRE_BUS); 08: DallasTemperature sensors(&oneWire); 09: 10: double Setpoint, Input, Output; 11: double Kp=2, Ki=5, Kd=1; 12: PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT); 13: 14: int RelayPin = 6; 15: 16: void setup() { 17: Serial.begin(9600); 18: sensors.begin(); 19: Input = sensors.getTempCByIndex(0); 20: Setpoint = 37.5; 21: myPID.SetMode(AUTOMATIC); 22: myPID.SetOutputLimits(0, 255); 23: pinMode(RelayPin, OUTPUT); 24: } 25: 26: void loop() { 27: sensors.requestTemperatures(); 28: Input = sensors.getTempCByIndex(0); 29: 30: if (Input == DEVICE_DISCONNECTED_C) { 31: Serial.println("Ошибка датчика"); 32: return; 33: } 34: 35: myPID.Compute(); 36: 37: if (Output > 128) { 38: digitalWrite(RelayPin, HIGH); 39: } else { 40: digitalWrite(RelayPin, LOW); 41: } 42: 43: Serial.print("Температура: "); 44: Serial.print(Input); 45: Serial.print(" Цель: "); 46: Serial.print(Setpoint); 47: Serial.print(" Выход: "); 48: Serial.println(Output); 49: 50: delay(1000); 51: }

Ответ нейросети

09 октября 2025 05:39

Ключевая ошибка с логической стороны:

  • 19: Input = sensors.getTempCByIndex(0);
    • Почему ошибка: в setup подписано чтение температуры до того, как были произведены запросы на измерение. DallasTemperature требует вызова sensors.requestTemperatures() перед чтением getTempCByIndex(). Чтение в setup возвращает неопределённое значение и может привести к неверному начальному состоянию регулятора.

Как исправить (предложение исправления):

  • Удалить чтение температуры из setup и перенести чтение в loop после вызова sensors.requestTemperatures().
  • Пример устранения проблемы:
    • В setup убрать строку 19.
    • В loop оставить уже существующие строки:
      • sensors.requestTemperatures();
      • Input = sensors.getTempCByIndex(0);

Дополнительно можно улучшить надёжность:

  • В setup можно добавить установка разрешения термодатчика, например: sensors.setResolution(TEMPERATURE_PRECISION); (используйте TEMPERATURE_PRECISION=9 в соответствии с вашим намерением).

Итог:

  • Ошибка на строке 19 (пользовательский номер: 19). Логический дефект — чтение значения температуры до выполнения запроса к датчику. Исправление — удалить чтение из setup и перенести в loop после sensors.requestTemperatures().

Задай свой вопрос

Напиши любую задачу или вопрос, а нейросеть её решит

Похожие вопросы 15

Бесплатно Мобильное приложение ГДЗ
Мобильное приложение ГДЗ

Задавай вопросы искуcственному интеллекту текстом или фотографиями в приложении на iPhone или Android

qr-codegoogle-playapp-store

Саша — ассистент в телеграмме

Найдите все строки с ошибками (ошибки компиляции и/или логические и/или синтаксические) в коде ПИД-регулятора для управления нагревательным элементом с датчиком Dallas DS18B20. Строки 1-9 нужно указывать с префиксом 0. В ответе укажите строки по возрастанию 01: #include 02: #include 03: #include 04: 05: #define ONE_WIRE_BUS 2 06: #define TEMPERATURE_PRECISION 9 07: OneWire oneWire(ONE_WIRE_BUS); 08: DallasTemperature sensors(&oneWire); 09: 10: double Setpoint, Input, Output; 11: double Kp=2, Ki=5, Kd=1; 12: PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT); 13: 14: int RelayPin = 6; 15: 16: void setup() { 17: Serial.begin(9600); 18: sensors.begin(); 19: Input = sensors.getTempCByIndex(0); 20: Setpoint = 37.5; 21: myPID.SetMode(AUTOMATIC); 22: myPID.SetOutputLimits(0, 255); 23: pinMode(RelayPin, OUTPUT); 24: } 25: 26: void loop() { 27: sensors.requestTemperatures(); 28: Input = sensors.getTempCByIndex(0); 29: 30: if (Input == DEVICE_DISCONNECTED_C) { 31: Serial.println("Ошибка датчика"); 32: return; 33: } 34: 35: myPID.Compute(); 36: 37: if (Output > 128) { 38: digitalWrite(RelayPin, HIGH); 39: } else { 40: digitalWrite(RelayPin, LOW); 41: } 42: 43: Serial.print("Температура: "); 44: Serial.print(Input); 45: Serial.print(" Цель: "); 46: Serial.print(Setpoint); 47: Serial.print(" Выход: "); 48: Serial.println(Output); 49: 50: delay(1000); 51: }
Ключевая ошибка с логической стороны: - 19: Input = sensors.getTempCByIndex(0); - Почему ошибка: в setup подписано чтение температуры до того, как были произведены запросы на измерение. DallasTemperature требует вызова sensors.requestTemperatures() перед чтением getTempCByIndex(). Чтение в setup возвращает неопределённое значение и может привести к неверному начальному состоянию регулятора. Как исправить (предложение исправления): - Удалить чтение температуры из setup и перенести чтение в loop после вызова sensors.requestTemperatures(). - Пример устранения проблемы: - В setup убрать строку 19. - В loop оставить уже существующие строки: - sensors.requestTemperatures(); - Input = sensors.getTempCByIndex(0); Дополнительно можно улучшить надёжность: - В setup можно добавить установка разрешения термодатчика, например: sensors.setResolution(TEMPERATURE_PRECISION); (используйте TEMPERATURE_PRECISION=9 в соответствии с вашим намерением). Итог: - Ошибка на строке 19 (пользовательский номер: 19). Логический дефект — чтение значения температуры до выполнения запроса к датчику. Исправление — удалить чтение из setup и перенести в loop после sensors.requestTemperatures().