Помогите с кодом для терморегулятора

Тема в разделе "Arduino & Shields", создана пользователем Алексей_Д, 26 июл 2016.

  1. Есть такой код:
    Код (C++):
    #include <OneWire.h>
    #include <DallasTemperature.h>

    #define ONE_WIRE_BUS_1 2
    #define ONE_WIRE_BUS_2 4
    #define Rel_truba 5
    #define Rel_filtr 6

    OneWire oneWire_1(ONE_WIRE_BUS_1);
    OneWire oneWire_2(ONE_WIRE_BUS_2);

    DallasTemperature sensor_truba(&oneWire_1);
    DallasTemperature sensor_filtr(&oneWire_2);

    void setup(void)
    {
        Serial.begin(9600);
        pinMode(Rel_truba, OUTPUT);
        pinMode(Rel_filtr, OUTPUT);
        sensor_truba.begin();
        sensor_filtr.begin();
       // sensor_truba.setResolution(Thermometer1, 1);
       // sensors_filtr.setResolution(Thermometer2, 1);
    }

    void loop(void)
    {
       
        sensor_truba.requestTemperatures();
        sensor_filtr.requestTemperatures();

        float temperature1 = (sensor_truba.getTempCByIndex(0));
        float temperature2 = (sensor_filtr.getTempCByIndex(0));
       
        boolean tooCold_t=(temperature1>30.0);
        boolean tooCold_f=(temperature2<25.0);
       
     
      Serial.print("temp truba: ");
      Serial.print( temperature1);//Выводим  температуру
      Serial.print(" C");
      Serial.println();
      Serial.print("temp filtr: ");
      Serial.print( temperature2);//Выводим  температуру
      Serial.print(" C ");
      Serial.println();
     

     
        if(tooCold_t){
          digitalWrite(Rel_truba,HIGH);
        }else {
          digitalWrite(Rel_truba,LOW);
        }
         if(tooCold_f){
          digitalWrite(Rel_filtr,HIGH);
        }else {
          digitalWrite(Rel_filtr,LOW);
        }
        }
     

    или такой:
    Код (C++):
    #include <OneWire.h>
    #include <DallasTemperature.h>

    #define ONE_WIRE_BUS_1 2
    #define ONE_WIRE_BUS_2 4
    #define Rel_truba 5
    #define Rel_filtr 6

    OneWire oneWire_1(ONE_WIRE_BUS_1);
    OneWire oneWire_2(ONE_WIRE_BUS_2);

    DallasTemperature sensor_truba(&oneWire_1);
    DallasTemperature sensor_filtr(&oneWire_2);

    void setup(void)
    {
        Serial.begin(9600);
        pinMode(Rel_truba, OUTPUT);
        pinMode(Rel_filtr, OUTPUT);  
        sensor_truba.begin();
        sensor_filtr.begin();
       // sensor_truba.setResolution(Thermometer1, 1);
       // sensors_filtr.setResolution(Thermometer2, 1);
    }

    void loop(void)
    {
       
        sensor_truba.requestTemperatures();
        sensor_filtr.requestTemperatures();

        float temperature1 = (sensor_truba.getTempCByIndex(0));
        float temperature2 = (sensor_filtr.getTempCByIndex(0));
      //--------------------------------
      if(temperature1 > 30)  { //перегрели, надо выключить реле трубы
        digitalWrite(Rel_truba,HIGH);
      }
      else {                      //труба остыла, надо включить реле рубы
        digitalWrite(Rel_truba,LOW);
      }
    //--------------------------------
      if(temperature2 > 25)   //перегрели, надо выключить реле фильтра
        digitalWrite(Rel_filtr,LOW);
      else                       //труба остыла, надо включить реле фильтра
        digitalWrite(Rel_filtr,HIGH);
    //--------------------------------  
      Serial.print("temp truba: ");
      Serial.print( temperature1);//Выводим  температуру
      Serial.print(" C");
      Serial.println();
      Serial.print("temp filtr: ");
      Serial.print( temperature2);//Выводим  температуру
      Serial.print(" C ");
      Serial.println();
     
    }
     
    Вопрос такой: с помощью какой программной конструкции заставить терморегулятор работать следующим образом
    - температура опустилась ниже 5 градусов, включаем реле. Поднялась выше 10 градусов, выключаем.
    Языками не владею, поэтому сам сообразить не могу...
     
  2. За Вас уже все написано было, надо было только убрать второй датчик, и править условие.
    Код не проверял...
    Код (C++):
    #include <OneWire.h>
    #include <DallasTemperature.h>

    #define ONE_WIRE_BUS_1 2
    #define Rel_truba 5


    OneWire oneWire_1(ONE_WIRE_BUS_1);
    DallasTemperature sensor_truba(&oneWire_1);

    void setup(void)
    {
        Serial.begin(9600);
        pinMode(Rel_truba, OUTPUT);
        sensor_truba.begin();

       // sensor_truba.setResolution(Thermometer1, 1);
       // sensors_filtr.setResolution(Thermometer2, 1);
    }

    void loop(void)
    {
     
        sensor_truba.requestTemperatures();

        float temperature1 = (sensor_truba.getTempCByIndex(0));
      //--------------------------------
      if(temperature1 < 5)
      { //перегрели, надо выключить реле трубы
        digitalWrite(Rel_truba,HIGH);
      }
      else if(temperature1 > 10 )
      {                      //труба остыла, надо включить реле рубы
        digitalWrite(Rel_truba,LOW);
      }

      Serial.print("temp truba: ");
      Serial.print( temperature1);//Выводим  температуру
      Serial.print(" C");
      Serial.println();

    }
     
     
  3.  
  4. Написал вот так, чтобы проверить при комнатной температуре:
    Код (C++):
     sensor_truba.requestTemperatures();
        sensor_filtr.requestTemperatures();

        float temperature1 = (sensor_truba.getTempCByIndex(0));
        float temperature2 = (sensor_filtr.getTempCByIndex(0));
      //--------------------------------
      if(temperature1 < 28)  { //остыло нужно включить подогрев
        digitalWrite(Rel_truba,HIGH);
      }
      else if(temperature1 > 32) {     //Нагрелось выключаем
        digitalWrite(Rel_truba,LOW);
      }
    всё равно не работает. То есть температуру поднимаешь до 30 градусов, реле включается, опустишь ниже 30 выключается. И при загрузке программы пишет:
    Global variables use 302 bytes (14%) of dynamic memory, leaving 1 746 bytes for local variables. Maximum is 2 048 bytes.
    avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00
    avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0xe0
    avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0xe0
    avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0xe0
    avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0xe0
    avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x00
    avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0xe0
    avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0xe0
    avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0xe0
    avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0xe0

    Что это значит? подскажите.
     
  5. uvarofff

    uvarofff Нуб

    спасибо, Ваш код подкинул мне идею, как исправить свой проект.

    Собственно, задача у меня схожая. Включать\выключать реле (пока диод) в зависимости от температуры.
    Может мой код тоже кому-то поможет.

    Код (C++):
    #include <TroykaDHT11.h>  //добавляем библиотеку для считывания показаний датчика
    DHT11 dht(11); //устанавливаем датчик на 11 пин
    int led_pin = 8; // на 8 сидит диод (позже - реле)
    int humMax = 35; //максимальное значение влажности


    void setup()
    {
      pinMode(led_pin, OUTPUT);
      Serial.begin(96000);
      dht.begin();
    }

    void loop()
    {
    float hum = dht.getHumidity();
      int check;
      check = dht.read();
      switch (check) {
        case DHT_OK:
          Serial.print("Temperature = ");
          Serial.print(dht.getTemperatureC());
          Serial.print("C \t");
          Serial.print("Humidity = ");
          Serial.print(dht.getHumidity());
          Serial.println("%");
          break;
          case DHT_ERROR_CHECKSUM:
          Serial.println("Checksum error");
          break;
        // превышение времени ожидания
        case DHT_ERROR_TIMEOUT:
          Serial.println("Time out error");
          break;
        // неизвестная ошибка
        default:
          Serial.println("Unknown error");
          break;
           }
          if (hum > humMax)
          {
            digitalWrite(led_pin, HIGH);
          }
          else {
            digitalWrite(led_pin, LOW);
          }
       
          delay(2000);

      }
     
     
  6. MDV

    MDV Гик

    первое что приходит на ум это сравнение разных типов переменных (float и ini) приведи все к одному типу
     
  7. А как это сделать, пример можно?
     
  8. Vetrinus

    Vetrinus Гик

    Я так и не понял, а в чем, собственно, проблема-то? То, что не загружается скетч? Зачем вообще приведение типов делать?
     
  9. Ещё вопрос: допустима ли следующая запись?
    Код (C++):
    boolean tooCold_t=(28<temperature1<32.0);
     
  10. \Скетч загружается и работает, но не так как мне надо. Выше я описал что нужно...
     
  11. Vetrinus

    Vetrinus Гик

    Ни в коем случае.
    А вообще, вы в последовательный порт результат выводили? Надо же понимать, что именно происходит-то.
    Вообще не понимаю, как можно без этого делать какие-то выводы о том, как программа работает.
     
  12. Вы имеете ввиду "монитор порта"? так в нём пишет температуру и всё?
     
  13. Vetrinus

    Vetrinus Гик

    Ну да. В условия добавляете вывод в порт и смотрите, что происходит.
     
  14. А можно пример кода и куда его надо добавить?
     
  15. Vetrinus

    Vetrinus Гик

    Код (C++):
    Serial.begin(9600);
    В сетап, и:
    Код (C++):
    sensor_truba.requestTemperatures();
        sensor_filtr.requestTemperatures();

        float temperature1 = (sensor_truba.getTempCByIndex(0));
        float temperature2 = (sensor_filtr.getTempCByIndex(0));
      //--------------------------------
      if(temperature1 < 28)  { //остыло нужно включить подогрев
        digitalWrite(Rel_truba,HIGH);
        Serial.print("Temp is ");
        Serial.print(temperature);
        Serial.println(" Set relay on");
      }
      else if(temperature1 > 32) {     //Нагрелось выключаем
        digitalWrite(Rel_truba,LOW);
        Serial.print("Temp is ");
        Serial.print(temperature);
        Serial.println("Set relay off");
      }
     
    Последнее редактирование: 28 июл 2016
  16. Сегодня попробую, но что это мне даст? Покажет момент влючения реле? Я и так его вижу и слышу и включается и выключается оно не так как мне надо. То есть не реагирует, почему то на это условие:
    Код (C++):
     if(temperature1 < 28)  { //остыло нужно включить подогрев
        digitalWrite(Rel_truba,HIGH);
      }
      else if(temperature1 > 32) {     //Нагрелось выключаем
        digitalWrite(Rel_truba,LOW);
     
  17. Vetrinus

    Vetrinus Гик

    Вот и поймете, по какому из ветвлений идет код, и какую температуру при этом показывает датчик
     
  18. Vetrinus

    Vetrinus Гик

    Только поправьте код, Serial.print(temperature); на Serial.print(temperature1);
    А то не скомпилируется из-за того, что temperature не объявлено
     
  19. Хорошо сегодня попробую и отпишусь. Спасибо.
     
  20. Вот код полностью
    Код (C++):
    #include <OneWire.h>
    #include <DallasTemperature.h>

    #define ONE_WIRE_BUS_1 2
    #define ONE_WIRE_BUS_2 4
    #define Rel_truba 5
    #define Rel_filtr 6

    OneWire oneWire_1(ONE_WIRE_BUS_1);
    OneWire oneWire_2(ONE_WIRE_BUS_2);

    DallasTemperature sensor_truba(&oneWire_1);
    DallasTemperature sensor_filtr(&oneWire_2);

    void setup(void)
    {
        Serial.begin(9600);
        pinMode(Rel_truba, OUTPUT);
        pinMode(Rel_filtr, OUTPUT);
        sensor_truba.begin();
        sensor_filtr.begin();
       // sensor_truba.setResolution(Thermometer1, 1);
       // sensors_filtr.setResolution(Thermometer2, 1);
    }

    void loop(void)
    {
     
        sensor_truba.requestTemperatures();
        sensor_filtr.requestTemperatures();

        float temperature1 = (sensor_truba.getTempCByIndex(0));
        float temperature2 = (sensor_filtr.getTempCByIndex(0));
      //--------------------------------
      if(temperature1 <28)  { //перегрели, надо выключить реле трубы
        digitalWrite(Rel_truba,HIGH);
         Serial.print("Temp is ");
        Serial.print(temperature1);
        Serial.println(" Set relay on");
      }
      else if(temperature1 > 32) {     //Нагрелось выключаем
        digitalWrite(Rel_truba,LOW);
        Serial.print("Temp is ");
        Serial.print(temperature1);
        Serial.println("Set relay off");
      }
    //--------------------------------
      if(temperature2 > 25)   //перегрели, надо выключить реле фильтра
        digitalWrite(Rel_filtr,LOW);
      else                       //труба остыла, надо включить реле фильтра
        digitalWrite(Rel_filtr,HIGH);
    //--------------------------------
    // Serial.print("temp truba: ");
      //Serial.print( temperature1);//Выводим  температуру
      //Serial.print(" C");
      //Serial.println();
      //Serial.print("temp filtr: ");
      //Serial.print( temperature2);//Выводим  температуру
      //Serial.print(" C ");
      //Serial.println();
    }
    Работает как и раньше так: когда температура поднимается до 30 включается реле, опускается ниже 30, выключается. В монитор порта пишет всё то же ... на снимке.
    Согласно прописанным условиям , в момент когда устройство стартует должно включиться реле, так как температура в помещении 26 градусов, но оно не включается. Включается оно только после того как нагревая датчик я увеличиваю темп до 30. Почему?
     

    Вложения: