Помогите разобраться со скетчем поддержания чего либо

Тема в разделе "Arduino & Shields", создана пользователем SDV, 18 ноя 2018.

  1. SDV

    SDV Нерд

    Помогите разобраться со скетчем поддержания чего либо

    Суть такая, хочу контролировать и поддерживать температуру почвы рассады.

    Собрал схему: Нано + нагревательный элемент через мосфит.

    Но скетч не работает почему-то. Хочу, что бы подогрев включался при температуре почвы меньше 25 С *0.85. И выключался при температуре больше 25 С.

    Подскажите пожалуйста.

    Код (C++):

    #include <OneWire.h>
    #include <DallasTemperature.h>
    OneWire oneWire(10); // вход датчиков 18b20
    DallasTemperature ds(&oneWire);

    DeviceAddress sensor1 = {0x28, 0xFC, 0x19, 0x43, 0x98, 0x22, 0x0, 0xAB};

    int soil_temperature = 25; // переменная температуры почвы
    int soil_temperature_management = 8;
    void setup() {
      pinMode(soil_temperature_management,OUTPUT);
      Serial.begin(9600);
      ds.begin();
    }

    void loop() {
      soil_heating();

    }

    void soil_heating (){ // функция подогрева почвы
      int soil_temperature85;
      soil_temperature85 = soil_temperature * 0.85;
        ds.requestTemperatures(); // считываем температуру с датчиков
    /////////////////////////////////////////////////////////////////////////////
        Serial.print("Sensor 1: ");
        Serial.print(ds.getTempC(sensor1)); // отправляем температуру
        Serial.println("C");
    /////////////////////////////////////////////////////////////////////////////
        if (sensor1 < soil_temperature){
          digitalWrite (soil_temperature_management,HIGH);
        }
         if (sensor1 < soil_temperature && sensor1 > soil_temperature85){
           digitalWrite (soil_temperature_management,HIGH);
           if (sensor1 < soil_temperature85);{
            digitalWrite (soil_temperature_management,HIGH);
         }
        }else{
          digitalWrite (soil_temperature_management,LOW);
        }
         delay(1000);
    }

     
     
  2. У вас не правильно отрабатываются условия регулирования или ошибка в коде?
     
  3. SDV

    SDV Нерд

    Условия регулирования не работают.
     
  4. Видимо у вас достаточно инерционный нагреватель. Почитайте про ПИД регулирование

    Что у вас за нагревательный элемент, спираль?
     
  5. SDV

    SDV Нерд

    А со скетчем все в порядке? Просто я его тестирую на обычном светодиоде, условие все равно не отрабатывается.
     
  6. Я раньше сам это изучал. Вам к теме будет знать про гистерезис терморегулятора.
    Скетч внимательно гляну подождите
     
  7. Не думаете что снимать температуру каждую секунду это слишком долго, я бы поменял задержку на 100 мс то есть delay(100)

    Вообще ваш скетч далеко не идеален, я начинал с таких же. Его минус в том что температура может плавать на 1-2 а может и даже 5 градусов

    Буду дома отправлю вам то что у меня сохранилось. Буквально через час
     
  8. ZAZ-965

    ZAZ-965 Гуру

    @SDV, вы считываете температуру и выводите ее в сериал нигде не сохранив ее значение
    Код (C++):
    Serial.print(ds.getTempC(sensor1));
    , а затем затем сравниваете адрес устройства с желаемой температурой
    Код (C++):
    if (sensor1 < soil_temperature)
     
  9. Скачайте книгу "Мейкерство. Arduino и Raspberry Pi. Управление движением, светом и звуком" , там начиная со стр 225 найдете полезные примеры
     
  10. SDV

    SDV Нерд

    Все одно, скетч не работает. Код компилируется но пишет: warning: invalid conversion from 'uint8_t* {aka unsigned char*}' to 'int' [-fpermissive]
    Где ошибка подскажите?
    Код (C++):

    #include <OneWire.h>
    #include <DallasTemperature.h>
    OneWire oneWire(10); // вход датчиков 18b20
    DallasTemperature ds(&oneWire);

    DeviceAddress sensor1 = {0x28, 0xFC, 0x19, 0x43, 0x98, 0x22, 0x0, 0xAB};
    DeviceAddress sensor2 = {0x28, 0x72, 0x12, 0x43, 0x98, 0x25, 0x0, 0x4C};

    #define soil_temperature_management 9
    int soil_temperature = 25; // переменная температуры почвы

    void setup() {
      Serial.begin(9600);
      pinMode(soil_temperature_management,OUTPUT);
      ds.begin();
    }

    void loop() {
      soil_heating();

    }

    void soil_heating (){ // функция подогрева почвы
      int soil_temperature85;
      int sensor_soil;
      soil_temperature85 = soil_temperature * 0.85;
        ds.requestTemperatures(); // считываем температуру с датчиков
    /////////////////////////////////////////////////////////////////////////////
        Serial.print("Sensor 1: ");
        Serial.print(ds.getTempC(sensor1)); // отправляем температуру
        Serial.println("C");
    /////////////////////////////////////////////////////////////////////////////
      sensor_soil = sensor1;
        if (sensor_soil < soil_temperature){
          digitalWrite (soil_temperature_management,HIGH);
        }
        if (sensor_soil < soil_temperature && sensor_soil > soil_temperature85){
          digitalWrite (soil_temperature_management,HIGH);
          if (sensor_soil < soil_temperature85);{
          digitalWrite (soil_temperature_management,HIGH);
         }
        }else{
          digitalWrite (soil_temperature_management,LOW);
        }
         delay(1000);
    }

     
     
  11. Belkin

    Belkin Гик

    Элементарнейшая задача по управлению чем-либо в зависимости от температуры (влажности, освещенности...)... Разницы нет.
    Тем про это здесь уже море...
    Листали или - сразу вопрос в лоб ?
     
  12. SDV

    SDV Нерд

    В лоб.
     
  13. Belkin

    Belkin Гик

    А полистать форум для начала ?
    Хотя, да, тырнет стерпит... ;)

    А то, гдядишь, можно было бы ответ найти, даже не задавая вопроса...
     
  14. b707

    b707 Гуру

    SDV - у вас путанный код с кучей ошибок. Совершенно не удивительно, что он не работает.
    В сообщении #8 Вам ZAZ уже указал на две, самые грубые - и в новой редакции кода вы их даже не попытались исправить. Какой смысл вам отвечать. если вы ответы не слушаете?