Хочется автоматизировать горелку

Тема в разделе "Посоветуйте детальки", создана пользователем andrixxx, 4 фев 2016.

  1. andrixxx

    andrixxx Нуб

    Здравствуйте, сделал горелку на отработке, решил прилепить автоматизацию, нашел инфу про ардуино купил мегу, два датчика ds18b20, ик датчик пламени и блок на 4 реле, полистав инет, решил попробовать написать прогу, с этим дело имею впервые... написал скетч, но ничего не работает, при включении питания все лампы на реле загораются и ни на датчик пламени, ни на нагрев датчиков темп не реагирует... может толкнете в нужное русло, что упустил, где почитать...

    вот т.н. "скетч"

    Код (C++):
    #include <OneWire.h>

    #include <DallasTemperature.h>
    //DS18b20
    #define ONE_WIRE_BUS  10  // датчики температуры на 10 пине

    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);
    DeviceAddress sensor1 = {0x28, 0xFF, 0xE0, 0x9F, 0x83, 0x15, 0x02, 0xC0}; // адреса датчиков
    DeviceAddress sensor2 = {0x28, 0xFF, 0x46, 0x9D, 0x83, 0x15, 0x02, 0x68};

    // Температура
    float temp1 = 0; // текущая температура первого датчика
    float temp2 = 0; // второй датчик

    //

    // настраиваем выводы
    #define RELAY_PIN1    22  // выходы на реле
    #define RELAY_PIN2    23
    #define RELAY_PIN3    24
    #define RELAY_PIN4    25
    #define IR_PIN        26   // вход датчика ИК пламени






    void setup()
    {

      sensors.begin();
       sensors.setResolution(sensor1, 10);
      sensors.setResolution(sensor2, 10);
      pinMode(IR_PIN, INPUT);                       // пин ик датчика выход
      pinMode(RELAY_PIN1, OUTPUT);                   // пины реле выходы
      pinMode(RELAY_PIN2, OUTPUT);
      pinMode(RELAY_PIN3, OUTPUT);
      pinMode(RELAY_PIN4, OUTPUT);

    }

    void loop()
    {
     



      sensors.requestTemperatures();
      // Температура
    temp1 = sensors.getTempC(sensor1); // получаем температуру

      temp2 = sensors.getTempC(sensor2);
      digitalRead (IR_PIN);      // проверка пламени
      delay (1000);

      if (temp1 >= 34 && temp2 <= 34 && IR_PIN == 0) {
       digitalWrite(RELAY_PIN1, HIGH);
      digitalWrite(RELAY_PIN2, LOW);
      digitalWrite(RELAY_PIN3, LOW);
      digitalWrite(RELAY_PIN4, LOW);
      } else   if (temp1 >= 34 && temp2 <= 34 && IR_PIN == 1){
      digitalWrite(RELAY_PIN1, LOW);
      digitalWrite(RELAY_PIN2, HIGH);
      digitalWrite(RELAY_PIN3, LOW);
      digitalWrite(RELAY_PIN4, LOW);
       }else   if (temp1 >= 34 && temp2 > 34 && IR_PIN == 0){
        digitalWrite(RELAY_PIN1, LOW);
      digitalWrite(RELAY_PIN2, LOW);
      digitalWrite(RELAY_PIN3, HIGH);
      digitalWrite(RELAY_PIN4, LOW);
       } else    if (temp1 >= 34 && temp2 > 34 && IR_PIN == 1){
        digitalWrite(RELAY_PIN1, LOW);
      digitalWrite(RELAY_PIN2, LOW);
      digitalWrite(RELAY_PIN3, LOW);
      digitalWrite(RELAY_PIN4, HIGH);
       }
       else
       { digitalWrite(RELAY_PIN1, LOW);
      digitalWrite(RELAY_PIN2, LOW);
      digitalWrite(RELAY_PIN3, LOW);
      digitalWrite(RELAY_PIN4, LOW);
       }
    }
    помогите пожалуйста советом, что не так делаю, что почитать..
     
  2. remotesp

    remotesp Нерд

    У вас значение, которое получается в строке "digitalRead (IR_PIN); // проверка пламени" не записывается ни в какую переменную, а в сравнениях получается, что вы сравниваете номер пина IR_PIN с 0 и 1. Поскольку IR_PIN всегда равен 26, то не выполняется ни одно из условий. Вам нужно либо сделать перменную, в которой будет записано состояние датчик пламени (как вариант irSensorState= digitalRead(IR_PIN); ) и в сравнениях смотреть, что в ней записано:
    if (temp1 >= 34 && temp2 <= 34 && irSensorState == 0) {...
    Либо сделать без нее:
    if (temp1 >= 34 && temp2 <= 34 && digitalRead(IR_PIN) == 0) {...
     
  3. andrixxx

    andrixxx Нуб

    Спасибо большое за ответ, правда я пару дней назад сам допетрил ... Но все равно спасибо, вы единственный кто указал на ошибку, хотя я на двух форумах спрашивал.
    Если не против, я потом тут ещё поспрашиваю, когда совершенствовать код буду.
     
  4. remotesp

    remotesp Нерд

    Да без проблем! Только учитывайте тот факт, что первую плату Arduino я себе приобрел полтора месяца назад и опыта пока особого нет:)
     
  5. andrixxx

    andrixxx Нуб

    Только Ир датчик походу даёт 0 когда пламя есть и 1 когда нет... Поэтому сделал flame =! digitalRead(IR_PIN)
    Дальше в условиях if flame==0
     
  6. andrixxx

    andrixxx Нуб

    Ну тогда вместе разбираться будем, я в программировании ноль, в школе не было, в институте не ходил
     
  7. remotesp

    remotesp Нерд

    Насчет показаний датчика - надо в его описании смотреть, там обычно все достаточно просто. А насчет программирования - да, без проблем. Я в этом немного понимаю.
     
  8. andrixxx

    andrixxx Нуб

    Описание прочитать это слишком просто, я методом научного тыка выяснил