Значения NaN в инкубаторе для яиц

sensors error temperature

Недавно я собрал свой инкубатор Arduino, который состоит из датчика DHT22, экрана ЖК-клавиатуры, нескольких вентиляторов, резисторов и т. д.

Я загрузил эскиз, и все вроде нормально. Однако, когда я пытаюсь выбрать нужную мне температуру и влажность, мне ничего не удается изменить и появляется сообщение «Температура: NanC, Влажность: Nan%».

Что я делаю не так? Я не сам писал код. Я скопировал его у парня, который сделал свой инкубатор и сам написал его код. У него есть проект инкубатора на github.

Как вы можете видеть на опубликованных им фотографиях, все работает нормально. В чем может быть проблема? У меня не так много знаний об Arduino, хотя я хорошо читаю и работаю с кодом.

На дисплее ниже отображается значение NaN, когда я пытаюсь выбрать собственную температуру/влажность. Когда я вижу текущую температуру/влажность, все работает нормально. Датчик работает без проблем, хотя подтягивающий резистор я не подключал. Я попробую добавить один. Однако мне кажется, что проблема не в этом. Я получаю ошибки NaN при попытке выбрать собственное значение. Зуммер подает звуковой сигнал, сервопривод вращается, вентилятор работает нормально. Как было сказано выше, датчик DHT работает и отправляет значения.

Ошибка, которую я получаю при попытке установить температуру. Та же ошибка при выборе влажности.

Полезные ссылки:

Код (Github)

Схема (Github)

Весь проект инкубатора (Github)

Обновление – 1 июля 2019 г. Благодаря Jot теперь все работает нормально! Он исправил мой код и посоветовал мне сбросить значения в EEPROM. Я бы отказался от проекта, если бы он мне не помог. Я полностью завершил сборку, хотя планирую добавить некоторые функции в будущем.

Хочу добавить:

  • Резервный источник питания (свинцово-кислотный аккумулятор)
  • Большие вентиляционные отверстия.
  • Улучшения дизайна
  • Возможность контролировать все с помощью последовательного монитора, чтобы я мог подключиться к Arduino через Интернет (используя имеющийся у меня сервер хранения MFP)
  • Большая коробка для большего количества яиц.
  • Система, которая автоматически переворачивает яйца.
  • Насос, который также автоматически перекачивает воду в губку.

Однако без помощи Джота ничего сделать было бы невозможно. Еще раз большое спасибо Джоту за его помощь и усилия, которые он приложил, чтобы помочь мне. Я очень ценю это, поскольку у меня нет никаких знаний об Arduino (мне 14 лет), и я нашел его советы и комментарии очень полезными.

Я поместил в инкубатор 5 яиц, и он сейчас работает. Я считаю в обратном порядке, начиная с сегодняшнего дня, и примерно через 21 день у меня будут цыплята!

Вот несколько фотографий машины для тех, кому интересно (или просто любопытно!):

Инкубатор работает, с включенным экраном: [9]

Комната для высиживания яиц: (Внутри влажная губка, все приспособления и конечно же 5 яиц!)

, 👍1

Обсуждение

я думаю, что nan означает не число ..... закомментируйте эту строку H = dht.readHumidity(); и добавьте H = 0.5; ..... что вы получите тогда показывать?, @jsotola

Пожалуйста, опубликуйте весь код, который вы используете., @leoc7

Код приведен по ссылке выше. Однако вот ссылка: https://github.com/quantenschaum/egg-incubator/blob/master/incubator.ino. Вначале я внес лишь несколько изменений, поэтому на ЖК-экране отображается и дата, и время. На самом деле, я не думаю, что это влияет на ошибку, так как не имеет к этому никакого отношения. В дополнение к вышесказанному я импортировал код в Arduino (прежде чем что-либо менять), и похоже, что проблема существует., @Lefteris Garyfalakis

@jsotola спасибо за ответ! Однако похоже, что H = dht.readHumidity(); уже включено. Взгляните на это: if (!key) { // звуковой сигнал(2000, 50); Т = dht.readTemperature() + T_OFFSET; H = dht.readHumidity(); if ((isnan(T) || T < 10 || T > 60) || (Hcontrol && (isnan(H) || H < 5 || H > 95))) { обогреватель(0); ЖК.Очистить(); lcd.print("ОШИБКА ДАТЧИКА!"); Похоже, что он включает их, а также подает сигнал тревоги, если отображается значение nan. Когда я добавляю H = 0,5;, он пищит и перезагружается, как говорит код. Моя проблема в том, что я выбираю t/h., @Lefteris Garyfalakis

@jsotola Кроме того, на экране отображается «ОШИБКА ДАТЧИКА», и это то, что говорит код. Как видно из предыдущего кода, если отображается значение nan, включается сигнал тревоги. Для получения дополнительной информации вы также можете увидеть весь код по прилагаемой ссылке. Следует отметить, что у меня возникают проблемы только с выбором значений, например, температуры или влажности. Я без проблем вижу текущую температуру и влажность. Однако когда я захожу в меню выбора, все заданные значения представляют собой значения NaN., @Lefteris Garyfalakis

Ты сам отложил эти яйца?, @user2497


1 ответ


Лучший ответ:

1

Привет, Лефтерис, строитель!
StackExchange — это вопросы и ответы.
Arduino – это обучение и быстрое создание прототипов.

Для руководства вашим проектом более подходящим является форум по адресу http://forum.arduino.cc/.

Я полагаю, что многие из нас читали код, который вы используете. Мы действительно читаем код.
Этот код неплох, но в нем есть несколько слабых мест:

  • Недостаточно комментариев, чтобы объяснить, что происходит.
  • Множество условий с флагами. Это нормально, но флаги иногда являются логическими и иногда байт, и нет пояснения, что это за флаг используется для.
  • Множество проверок isnan(). Означает ли это, что может возникнуть проблема с плавающей запятой "nan" в любой момент эскиза?
  • Большая часть кода находится в цикле(). Я не против этого, но другие предпочитают помещать в функции большие блоки кода.

Похоже, что ваше оборудование работает нормально.

Трудно подтвердить, что код алгоритма Холта-Уинтерса работает.

Все это вместе сейчас нас слишком сбивает с толку.


Я изменил свой ответ, похоже, оборудование работает.


Ниже приведен измененный эскиз, чтобы протестировать его без дополнительного оборудования.
Я использую последовательный монитор. Клавиши sadw (за которыми следует Enter) — это клавиши курсора, а пробел (за которым следует Enter) — выбор.

#include <avr/wdt.h>
// #include <Servo.h>
// #include <LiquidCrystal.h>
// #include <DHT.h>
#include <EEPROM.h>

// stty -F /dev/ttyACM0 115200 cs8 cread clocal -hupcl time 30 && тройник incubator.log </dev/ttyACM0

#define WDT_TIMEOUT WDTO_8S // если определено, включить аппаратный сторожевой таймер
#define DHTPIN 3 // вывод данных датчика DHT T/H
#define T_OFFSET 0.9 // смещение датчика температуры
#define FAN_PIN 2 // сигнальный контакт таховентилятора
#define FAN_THRES 500 // порог срабатывания сигнализации вентилятора
#define BEEPER A2 // контакт, к которому прикреплен пейджер
#define BRIGHTNESS 10 // вывод яркости дисплея
#define HEATER A1 // вывод MOSFET нагревателя
#define DELAY 2000 // задержка цикла в мс
#define TS_ADDR 0 // адрес EEPROM заданной температуры
#define HS_ADDR 4 // адрес EEPROM заданного значения влажности
#define HC_ADDR 8 // адрес режима управления влажностью EEPROM
#define TI_RESET 1 // порог сброса интеграла, устанавливает интеграл равным 0, когда ошибка T превышает это значение
#define HI_RESET 5 // порог сброса интеграла, устанавливает интеграл равным 0, когда ошибка H превышает это значение
#define ALARM_T 2 // порог срабатывания сигнализации по температуре, предупреждение, если ошибка T превышает это значение
#define ALARM_H 8 // порог срабатывания сигнализации влажности, предупреждение, если ошибка H превышает это значение
#define H_AUTO_THRES 3 // отключаем управление вентиляцией в автоматическом режиме, если ошибка H < этот
#define H_AUTO_COUNT 200 // отключить на n циклов
#define HWAT 0.25 // сохранение зимних параметров для сглаживания температуры
#define HWBT 0.2
#define HWAH 0.7 // сохранение зимних параметров для сглаживания влажности
#define HWBH 0.5
#define A 0.005 // параметр длинного среднего
#define VENTCLOSED 80 // считаем вентиляционное отверстие закрытым, если оно находится под этим углом
#define VENTOPENMS  480000L // открываем вентиляционное отверстие, если оно закрыто дольше
#define VENTRESETMS 600000L // сброс вентиляции по истечении этого времени (>VENTOPENMS!)

// Сервовентилятор;
// DHT dht(DHTPIN, DHT22);
// LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

#define RIGHT 16
#define UP 8
#define DOWN 4
#define LEFT 2
#define SELECT 1
#define NO_KEY 0

// добавлено определение для отображения сообщений на последовательном мониторе.
#define lcd Serial

byte getKey() {
// ключ int = AnalogRead(0);
// если (ключ < 50) {
// возвращаем ВПРАВО;
// } else if (ключ < 150) {
// возвращаем ВВЕРХ;
// } else if (ключ < 300) {
// возвращаем ВНИЗ;
// } else if (ключ < 500) {
// возвращаем ВЛЕВО;
// } else if (ключ < 800) {
// возвращаем ВЫБОР;
// } еще {
// возвращаем NO_KEY;
// }
  if (Serial.available() > 0) {
    int inChar = Serial.read();
    switch (inChar)
    {
      case 'w': return UP;
      case 'a': return LEFT;
      case 's': return DOWN;
      case 'd': return RIGHT;
      case ' ': return SELECT;
    }
  } else {
    return NO_KEY;
  }
}

void eeread(int address, int length, void* p) {
  byte* b = (byte*)p;
  for (int i = 0; i < length; i++) {
    *b++ = EEPROM.read(address + i);
  }
}

void eewrite(int address, int length, void* p) {
  byte* b = (byte*)p;
  for (int i = 0; i < length; i++) {
    EEPROM.write(address + i, *b++);
  }
}

void write_byte(int address, byte &value) {
  eewrite(address, sizeof(value), &value);
}

byte read_byte(int address) {
  byte value;
  eeread(address, sizeof(value), &value);
  return value;
}

void write_int(int address, int &value) {
  eewrite(address, sizeof(value), &value);
}

int read_int(int address) {
  int value;
  eeread(address, sizeof(value), &value);
  return value;
}

void write_float(int address, float &value) {
  eewrite(address, sizeof(value), &value);
}

float read_float(int address) {
  float value;
  eeread(address, sizeof(value), &value);
  return value;
}

void heater(boolean on) {
// digitalWrite(HEATER, !on ? LOW : HIGH);
}

boolean heater() {
// возвращаем digitalRead(HEATER) == HIGH;
  return true;
}

volatile int fancount;

void count() {
  ++fancount;
}

void beep(unsigned long f, unsigned long l) {
// pinMode(BEEPER, OUTPUT);
  byte v = 0;
  f = 500000 / f;
  l = (1000 * l) / f;
  for (int i = 0; i < l; ++i) {
// digitalWrite(BEEPER, v = !v);
// задержкаМикросекунды(f);
  }
// pinMode(BEEPER, INPUT);
}

float Ts, Hs; // устанавливаем точки
byte Hcontrol; // Режим управления H
byte Ts_changed, Hs_changed; // флаги изменения заданного значения
float ET, dETdt, IETdt; // условия prop/diff/integ для T
float EH, dEHdt, IEHdt; // условия prop/diff/integ для H
float T, Tavg = NAN, Tvar, Tstd;
float H, Havg = NAN, Hvar, Hstd;
float Hpower, Hduty; // текущая мощность нагревателя, средний рабочий цикл
unsigned long t0, Hon, talarm, tventclosed;
byte displayMode;
byte key, bri = 255, alarm;
boolean ventclosed;
int fanrpm;

void setup() {
#if defined(WDT_TIMEOUT)
// wdt_enable(WDT_TIMEOUT);
#endif
  Serial.begin(9600);
  Serial.println("Egg Incubator");
  Serial.println("Use wsad and space is select");

// pinMode(HEATER, OUTPUT);
// нагреватель(0);
// pinMode(ЯРКОСТЬ, ВЫХОД);
// AnalogWrite(BRIGHTNESS, bri = 255);
// lcd.begin(16, 2);
// lcd.noCursor();
  lcd.print("Incubator 0.7");
// lcd.setCursor(0, 1);
  Serial.println();
  lcd.print(__DATE__);
// dht.begin();
// vent.setMinimumPulse(800);
// vent.setMaximumPulse(2600);
// Vent.attach(11);
  // write_float(TS_ADDR, Ts=37.8); write_float(HS_ADDR, Hs=55);
  Ts = read_float(TS_ADDR);
  Hs = read_float(HS_ADDR);
  Hcontrol = read_byte(HC_ADDR);
// pinMode(FAN_PIN, INPUT_PULLUP);
// AttachInterrupt(0, count, FALLING);
// Сей();
// звуковой сигнал(800, 100);
// звуковой сигнал(1000, 100);
// звуковой сигнал(1200, 100);
// звуковой сигнал(1600, 100);
}

void loop() {
  unsigned long t1 = millis();
  int dt = t1 - t0;

  if (!key) {
    key = getKey();
  }

  if (key) {
// AnalogWrite(BRIGHTNESS, bri = 255);
  }

  if (t1 - Hon > Hpower * DELAY) {
// нагреватель(0);
  }

  if (Hcontrol && Hcontrol < H_AUTO_COUNT) {
//вент.обновить();
  }

  if (alarm && !(alarm & 8)) {
// звуковой сигнал(1000, 50);
// звуковой сигнал(1414, 50);
  }

  if (dt > DELAY || key) {

    if (!key) {
      // звуковой сигнал(2000, 50);
// T = dht.readTemperature() + T_OFFSET;
      T = 30.0 + T_OFFSET;             // устанавливаем фиксированное значение!
// H = dht.readHumidity();
      H = 60.0;                        // устанавливаем фиксированное значение!

      if ((isnan(T) || T < 10 || T > 60) || (Hcontrol && (isnan(H) || H < 5 || H > 95))) {
// нагреватель(0);
// ЖК.clear();
        lcd.print("SENSOR ERROR!");
// lcd.setCursor(0, 1);
        Serial.println();
        lcd.print("T=");
        lcd.print(T);
        lcd.print("C H=");
        lcd.print(H, 1);
        lcd.print("%");
        beep(2000, 1000);
        return;
      }

      float dts = dt * 1e-3;

      if (dt > DELAY) {
        fanrpm = fancount * 60 / dts;
        fancount = 0;
      }

      if (fanrpm < FAN_THRES) {
        alarm |= 4;
      } else {
        alarm &= ~4;
      }

      // сглаживание температуры по Холту-Винтерсу
      float E0 = ET;
      ET = HWAT * (T - Ts) + (1 - HWAT) * (ET + dETdt * dts); // сглаженная ошибка T (отклонение от заданного значения)
      dETdt = HWBT * (ET - E0) / dts + (1 - HWBT) * dETdt; // сглаженная производная
      IETdt += ET * dts; // интеграл ошибки
      if (abs(ET) > TI_RESET) // сбрасываем интеграл при большом отклонении
        IETdt = 0;
      float pidT = 1.1765 * (ET + 0.010526 * IETdt + 23.75 * dETdt); // Значение ПИД, корректировка коэффициентов для настройки
      Hpower = fanrpm > FAN_THRES ? max(0, min(1, -pidT)) : 0;
      heater(Hpower > 0.1);
      Hon = millis();

      if (abs(ET) > ALARM_T) {
        alarm |= 1;
// vent.write(ET < 0? 0: 180);
        if (Hcontrol > 1) {
          Hcontrol = 2;
        }
      } else {
        alarm &= ~1;
      }

      // сглаживание влажности по Холту-Винтерсу
      E0 = EH;
      EH = HWAH * (H - Hs) + (1 - HWAH) * (EH + dEHdt * dts); // сглаженная ошибка H (отклонение от заданного значения)
      dEHdt = HWBH * (EH - E0) / dts + (1 - HWBH) * dEHdt; // сглаженная производная
      IEHdt += EH * dts; // интеграл ошибки
      if (abs(EH) > HI_RESET) // сбрасываем интеграл при большом отклонении
        IEHdt = 0;
      float pidH = 0.1176 * (EH + 0.09091 * IEHdt + 2.75 * dEHdt); // Значение ПИД, корректировка коэффициентов для настройки
// vent.write(pidH * 180);

      if (Hcontrol && abs(EH) > ALARM_H) {
        alarm |= 2;
      } else {
        alarm &= ~2;
      }

      boolean ventclosed0 = ventclosed;
// вентиляция закрыта = vent.read() < ВЕНТИЛЯЦИЯ ЗАКРЫТА;
      ventclosed = VENTCLOSED;         

      if (ventclosed && ventclosed != ventclosed0) {
        tventclosed = millis();
      }

      boolean openvent = ventclosed && millis() - tventclosed > VENTOPENMS;
      if (openvent) {
// Vent.write(180);
        if (millis() - tventclosed > VENTRESETMS) {
          tventclosed = millis();
        }
      }

      if (Hcontrol > 1) {
        if (abs(EH) > H_AUTO_THRES || openvent) {
          Hcontrol = 2;
        } else {
          if (Hcontrol < H_AUTO_COUNT) {
            ++Hcontrol;
          } else {
            IEHdt = 0;
          }
        }
      }

      // долгосрочные средние значения
      Tavg = A * T + (1 - A) * (isnan(Tavg) ? T : Tavg);
      Tvar = A * pow(T - Tavg, 2) + (1 - A) * (isnan(Tvar) ? 0 : Tvar);
      Tstd = sqrt(Tvar);

      Havg = A * H + (1 - A) * (isnan(Havg) ? H : Havg);
      Hvar = A * pow(H - Havg, 2) + (1 - A) * (isnan(Hvar) ? 0 : Hvar);
      Hstd = sqrt(Hvar);

      Hduty = A * Hpower + (1 - A) * Hduty;

      if (Ts_changed) {
        if (Ts_changed-- == 1)
          write_float(TS_ADDR, Ts);
      }

      if (Hs_changed) {
        if (Hs_changed-- == 1)
          write_float(HS_ADDR, Hs);
      }
    }

    if (key & SELECT) {
      displayMode = ++displayMode % 8;
    }

// ЖК.clear();
    Serial.println();
    lcd.print("T=");
    lcd.print(Ts + ET);
    lcd.print("C H=");
    lcd.print(Hs + EH, 1);
    lcd.print("%");

// lcd.setCursor(0, 1);
    Serial.println();

    float uptime;
    char unit;
    switch (displayMode) {
      case 0: // необработанные значения
        lcd.print("T=");
        lcd.print(T);
        lcd.print("C H=");
        lcd.print(H, 1);
        lcd.print("%");
        break;
      case 1: // заданное значение температуры
        if (key & (UP | DOWN | LEFT | RIGHT)) {
          Ts = max(20, min(50, Ts + (key & (UP | RIGHT) ? +1 : -1) * (key & (UP | DOWN) ? 0.1 : 1)));
          Ts_changed = 10;
        }
        lcd.print("Ts=");
        lcd.print(Ts);
        lcd.print("C");
        break;
      case 2: // заданное значение влажности
        if (key & (UP | DOWN)) {
          Hs = max(10, min(90, Hs + (key & UP ? +1 : -1)));
          Hs_changed = 10;
        }
        if (key & RIGHT) {
          if (Hcontrol < 2) {
            Hcontrol = ++Hcontrol;
          } else {
            Hcontrol = 0;
          }
          IEHdt = 0;
          write_byte(HC_ADDR, Hcontrol);
        }
        lcd.print("Hs=");
        lcd.print(Hs);
        lcd.print("% ");
        lcd.print(Hcontrol == 1 ? "on" : (Hcontrol > 1 ? "auto" : "off"));
        break;
      case 3: // средняя температура
        lcd.print("Ta=");
        lcd.print(Tavg);
        lcd.print("C (");
        lcd.print(Tstd);
        lcd.print(")");
        break;
      case 4: // средняя влажность
        lcd.print("Ha=");
        lcd.print(Havg);
        lcd.print("% (");
        lcd.print(Hstd);
        lcd.print(")");
        break;
      case 5: // рабочий цикл нагревателя
        lcd.print("Hd=");
        lcd.print(Hduty);
        lcd.print(" Hp=");
        lcd.print(Hpower);
        break;
      case 6: // вентиляционное отверстие
        lcd.print("V=");
// lcd.print(vent.read() / 180.0);
        lcd.print(" F=");
        lcd.print(fanrpm);
        break;
      case 7: // средняя влажность
        uptime = t1 * 1e-3;
        unit = 's';
        if (uptime > 60) {
          uptime /= 60;
          unit = 'm';
          if (uptime > 60) {
            uptime /= 60;
            unit = 'h';
            if (uptime > 24) {
              uptime /= 24;
              unit = 'd';
            }
          }
        }
        lcd.print("Up=");
        lcd.print(uptime, 1);
        lcd.print(unit);
        break;
      default:;
    }

    Serial.println();

    if (alarm & 7) {
      if (!talarm) {
        talarm = millis();
      }
      // звук при постоянной тревоге и отказе вентилятора
      if (millis() - talarm > 300000L || alarm & 4) {
        alarm &= ~8;
      }
// AnalogWrite(BRIGHTNESS, bri = 255);
// lcd.setCursor(0, 0);
      if (alarm & 1)
        lcd.print("T ");
      if (alarm & 2)
        lcd.print("H ");
      if (alarm & 4)
        lcd.print("F ");
      lcd.print("ALARM!          ");
      if (!(alarm & 8) && key) {
        alarm |= 8; // тревога подтверждена
        talarm = millis();
      }
      if (!(alarm & 8)) {
// lcd.setCursor(0, 1);
        Serial.println();

        lcd.print("T=");
        lcd.print(T);
        lcd.print("C H=");
        lcd.print(H, 1);
        lcd.print("%");
      }
    } else {
      alarm = 0;
      talarm = 0;
    }

    if (key) {
      delay((key & SELECT) ? 500 : 200);
    }

    if (bri) {
// AnalogWrite(ЯРКОСТЬ, --bri);
    }
    key = 0;
    t0 = t1;
  }

#if defined(WDT_TIMEOUT)
  wdt_reset();
#endif
}

@Lefteristhebuilder, вы выбрали этот эскиз, но он может не очень хорошо справиться с проблемами.

Любой может написать код для Arduino и разместить его в Интернете.
По крайней мере, в Github другие могут написать о проблеме (как это сделали вы). Проект на Github имеет 9 звезд, и создатель показал проект на Arduino «Project Hub». Это все хорошо, но сам код меня не очень устраивает.

,

Привет! Во-первых... Я не сам писал код! Я скопировал у парня, который делал то же самое, и у него это сработало. На дисплее выше отображается значение NaN, когда я пытаюсь **выбрать собственную температуру/влажность**. Когда я вижу текущую температуру/влажность, все работает нормально. Датчик работает без проблем, хотя подтягивающий резистор я не подключал. Я попробую добавить один. Однако мне кажется, что проблема не в этом. Я получаю ошибки NaN при **попытке выбрать собственное значение**. Зуммер, сервопривод и вентилятор работают нормально. Зуммер, вентилятор и сервопривод работают нормально. Как было сказано выше, датчик DHT работает и отправляет значения., @Lefteris Garyfalakis

@Lefteristhebuilder, пожалуйста, обновите свой вопрос, добавив эту дополнительную информацию. Также добавьте к своему вопросу ссылку на вашу проблему на github. Добавьте к вопросу, какую библиотеку DHT вы используете. Вы действительно использовали библиотеку SoftwareServo?, @Jot

@Lefteristhebuilder Я запускаю симуляцию кода. Я не получаю числа «nan» при настройке значений вверх и вниз. Как работает меню в эскизе, понять сложно. Если бы мне пришлось решать эту проблему самостоятельно, я бы вывел множество переменных на последовательный монитор и, возможно, в конечном итоге переписал бы весь скетч., @Jot

Спасибо за ваш ответ! Какую симуляцию вы делали? Могу ли я сделать то же самое? Я не знаю, сложен ли код для понимания, поскольку, как упоминалось выше, у меня нет никакого опыта программирования. К сожалению, я не могу написать скетч, я никогда раньше не делал ничего подобного, и если бы вы попросили меня создать просто мигающий скетч, мне было бы очень трудно, или я бы просто скопировал что-нибудь, опубликованное в Интернете. Какие доступны варианты? Я потратил много денег на этот проект и не хочу его выбрасывать... Надеюсь на ваше понимание. Я использовал DHT.h и SoftwareServo.h., @Lefteris Garyfalakis

@Lefteristhebuilder Я добавил измененный эскиз в свой ответ. Существует множество библиотек с «DHT.h», и никто больше не использует SoftwareServo, потому что она стала обычной библиотекой Arduino Servo., @Jot

Большое спасибо за ваше время и усилия, которые вы прикладываете! Я последовал вашим шагам, загрузил код, но, к сожалению, все равно получаю ту же ошибку.... Я не знаю, что заставляет это делать, и поскольку вы сказали мне, что это сработало при моделировании, я думаю, что мы ничего не получится..... извините, что потратил ваше время, очень жаль...., @Lefteris Garyfalakis

Кроме того, есть ли способ сделать так, чтобы он отображался как на последовательном мониторе, так и на экране??, @Lefteris Garyfalakis

Это хорошая информация. Я удалил из эскиза все оборудование, кроме EEPROM. Вы сбросили значения в EEPROM? Можете ли вы раскомментировать строку с двумя «write_float» (удалить две косые черты // впереди). Эта строка: https://github.com/quantenschaum/egg-incubator/blob/master/incubator.ino#L164 Запустите скетч один раз, а затем верните две косые черты // обратно. Вы также можете добавить код для отправки данных на последовательный монитор., @Jot

@Lefteristhebuilder Ты сдался?, @Jot

Я не только не сдался, но и завершил сборку. Сейчас все работает нормально, без проблем и это все благодаря вам! Благодаря вам я избавился от значений NaN и закончил то, от чего собирался отказаться. Мне всего 14 лет, и я не имею никакого представления о программировании, поэтому ваш совет был очень полезен. Вы также можете проверить в самом низу этой темы, где я разместил обновление и упомянул тот факт, что вы мне помогли. Я даже не знаю, как вас отблагодарить! Это было невероятно!, @Lefteris Garyfalakis

@Lefteristhebuilder Молодец. Я рад, что смог помочь., @Jot