Управление камином с водяным контуром + вопрос

Тема в разделе "Глядите, что я сделал", создана пользователем &Anton, 8 ноя 2014.

  1. &Anton

    &Anton Нерд

    Всем привет , недавно я купил камин съ водяным контуром и стал вопрос как им управлять , а именно водяным насосом . Я начал искать термостат и наткнулся на статью http://arrduinolab.blogspot.ru/2014/09/arduino.html#more . Сразу скажу что ардуино и программирование для меня новинка .
    После чего я заказал ардуино и шильды .

    Программа работает так :
    при включении включается вентилятор который вдувает теплый воздух из комнаты в камин чтоб прогреть дымоход .
    после того как температура воды нагревается до заданной температуры включается водяной насос
    Если нужно включить вентилятор нужно нажать кнопку 2 , вентилятор включится на 3 минуты.

    [​IMG]
    [​IMG]

    Конечно выглядит все не очень , но это только начало .В будущем хочу переделать и добавить web , пищалку для ошибки , co2 сенсор.
    Поставить экран на четыре строки и добавить температуру с улицы .
    Ну както так , жду критики .

    PS. Вопрос почему чтоб включить реле мне нужно написать LOW a ne HIGH
     
    Пушной звер нравится это.
  2. ANV

    ANV Гуру

    Давайте на схему вашу посмотрим, тогда про реле все станет ясно
     
  3. &Anton

    &Anton Нерд

  4. ANV

    ANV Гуру

    Смотрим на схему справа налево.
    Чтобы реле сработало надо чтобы через транзистор Q1 пошел ток. От пойдет когда откроется фототранзистор в оптроне U1. Светодиод в оптроне анодом подключен к плюсу питания, значит будет светиться (и откроет фототранзистор) тогда, когда на катоде будет минус, поэтому:
    - когда на входе high, те 5 вольт, то разница в напряжении между анодом и катодом ноль вольт и светиться он не будет
    - когда low, то в Ардуино он подсоединен к земле (ноль вольт) и уже через всю цепочку из двух светодиодов и резистора течет ток
     
  5. &Anton

    &Anton Нерд

    Спасибо за толковое разъяснение.
     
  6. &Anton

    &Anton Нерд

    Я столкнулся с проблемой , а именно раз ( иногда больше ) в день на экране появляются каракули, фото и скетч внизу .
    Код (Text):

    #include <EEPROM.h>
    #include <OneWire.h>
    #include <LiquidCrystal.h>
    #include <DallasTemperature.h>



    DeviceAddress sensor1 = {0x28, 0xFF, 0xE6, 0x25, 0x2E, 0x04, 0x00, 0xA4};
    DeviceAddress sensor2 = {0x28, 0xFF, 0x37, 0x1F, 0x4B, 0x04, 0x00, 0xF4};
    #define OUT1 2 // uitgang relay
    #define OUT2 3

    byte tempOUT1, tempOUT2;

    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
    OneWire oneWire(11); // 11 ingang  18b20 dallas sensor
    DallasTemperature ds(&oneWire);

    byte gradus[8] = {
      0b00110,
      0b01001,
      0b01001,
      0b00110,
      0b00000,
      0b00000,
      0b00000,
      0b00000
    };

    byte pech[8] = {
      0b00100,
      0b00100,
      0b01110,
      0b01110,
      0b11111,
      0b11111,
      0b11111,
      0b01110
    };

    byte dom[8] = {
      0b00100,
      0b01110,
      0b01110,
      0b11111,
      0b11111,
      0b11111,
      0b11111,
      0b11111
    };


    void erorr(){ // останавливает работу программы и сигнализирует ошибку
      digitalWrite(OUT1, HIGH); // выключаем реле
      digitalWrite(OUT2, LOW);
        while(1){ // крутим бесконечный цикл
          digitalWrite(13, !digitalRead(13));
          delay(500);
          loop();
         
        }
       
    }

    void ventilyator(){
     
      ds.requestTemperatures();
      double temperature1 = (ds.getTempC(sensor1)); // читаем температуру
      double temperature2 = (ds.getTempC(sensor2)); // читаем температуру
     
     
      digitalWrite(OUT1, LOW); // включает реле
      digitalWrite(OUT2, LOW); // включает реле
     
         
      lcd.begin(16,2);
      lcd.clear();
      lcd.setCursor(0, 0); /// вывод инфы на экран
      lcd.print("PMP:");
      lcd.print(tempOUT1);
      lcd.write(1);
      lcd.print("C");
        if (digitalRead(OUT1)) lcd.print(" - "); // показываем состояние выхода
        else lcd.print(" + ");
      lcd.setCursor(0, 1);
      lcd.print("FAN:");
      lcd.print(tempOUT2);
      lcd.write(1);
        if (digitalRead(OUT2)) lcd.print(" - ");
        else lcd.print(" + ");  
       
      lcd.setCursor(9, 0); // показываем температуру с датчика
      lcd.write(2);
      lcd.print(temperature1, 1);
      lcd.write(1);
      lcd.print("C");
      lcd.setCursor(9, 1);  
      lcd.write(3);
      lcd.print ( temperature2, 1);
      lcd.write(1);
      lcd.print("C");
          delay(300000);
          loop();
         
        }
       


     
    ////

    byte key(){ //// для кнопок ЛСДшилда
      int val = analogRead(0);
        if (val < 50) return 5;
        else if (val < 150) return 3;
        else if (val < 350) return 4;
        else if (val < 500) return 2;
        else if (val < 800) return 1;
        else return 0;
    }
    ////

    void setMenu(){ // установка температуры
      byte pos;  
      digitalWrite(OUT1, LOW); // выключаем реле
      digitalWrite(OUT2, HIGH);

      lcd.clear();
      lcd.setCursor(0, 0); // что нужно отрисовать один раз
      lcd.print("OUT1: ");
      lcd.setCursor(0, 1);
      lcd.print("OUT2: ");
      lcd.blink();
     
      while(1){ // крутим бесконечный цикл    
        byte KEY = key(); // читаем состояние кнопок
       
        lcd.setCursor(6, 0); // выводим на экран
        lcd.print(tempOUT1);
        lcd.write(1);
        lcd.print("C  ");
        lcd.setCursor(6, 1);
        lcd.print(tempOUT2);  
        lcd.write(1);
        lcd.print("C  ");
       
        ////// обработка кнопок
        if (pos == 0){  // если в первой позиции
          lcd.setCursor(5, 0); // устанавливаем курсор
          if (KEY == 2) { // если нажата кнопка
            tempOUT1--;  // изменяем значение
            EEPROM.write(1, tempOUT1); // сохраняем в еепром
          }
          else if (KEY == 5){
            tempOUT1++;
            EEPROM.write(1, tempOUT1);  
          }  
        }
        if (pos == 1){
          lcd.setCursor(5, 1);
          if (KEY == 2) {
            tempOUT2--;
            EEPROM.write(2, tempOUT2);
          }
          else if (KEY == 5){
            tempOUT2++;
            EEPROM.write(2, tempOUT2);  
          }  
        }
       
        if (KEY == 3) pos--; // крутим позицию
        else if (KEY == 4) pos++;  
        if (pos > 1) pos = 0;
      delay(200);
      }
    }


    void setup() {
     
      {
        ds.begin();
     
      pinMode(13, OUTPUT);
      pinMode(OUT1, OUTPUT);
      pinMode(OUT2, OUTPUT);
     
     
      lcd.begin(16,2);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("KACHEL BEDIENING");
      delay(3000);
      lcd.setCursor(0, 0);
      lcd.print("  VERWARMING  ");
      lcd.setCursor(0, 1);
      lcd.print("  ROOKKANAAL  ");
     
      digitalWrite(OUT2, LOW);    //produvaem trubu teplim vozduhom
      digitalWrite(OUT1, HIGH);    //vikluchaem pompu
     
      delay (20000);
    }
     

     
      lcd.createChar(1, gradus);
      lcd.createChar(2, pech);
      lcd.createChar(3, dom);
      lcd.begin(16, 2);
      lcd.clear();
     

     
      tempOUT1 = EEPROM.read(1); // читаем настройки
      tempOUT2 = EEPROM.read(2); // из еепром
    }

    void loop() {
      ds.requestTemperatures();
      byte KEY = key();
      if (KEY == 1) setMenu(); // если нажата селект, уходим в меню
      else if (KEY == 4) analogWrite(10, 20); // если вниз, глушим подсветку
      else if (KEY == 3) digitalWrite(10, HIGH);
      else if (KEY == 2) ventilyator();;
     
      double temperature1 = (ds.getTempC(sensor1)); // читаем температуру
      double temperature2 = (ds.getTempC(sensor2)); // читаем температуру
     
        if (temperature1>=90) {
        lcd.clear();
        lcd.print(" OVERVERHITTING ");
        lcd.setCursor(0, 1);
        lcd.print(" DRUK  OP RESET ");
        erorr();
      }
     
     
     
     
      if (temperature1 > tempOUT1) digitalWrite(OUT1, LOW); // сверяем температуру
      else digitalWrite(OUT1, HIGH);                        // и управляем выходами
      if (temperature1 > tempOUT2) digitalWrite(OUT2, LOW);
      else digitalWrite(OUT2, HIGH);
     
     
      lcd.clear();
      lcd.setCursor(0, 0); /// вывод инфы на экран
      lcd.print("PMP:");
      lcd.print(tempOUT1);
      lcd.write(1);
    //  lcd.print("C");
        if (digitalRead(OUT1)) lcd.print(" - "); // показываем состояние выхода
        else lcd.print(" + ");
      lcd.setCursor(0, 1);
      lcd.print("FAN:");
      lcd.print(tempOUT2);
      lcd.write(1);
        if (digitalRead(OUT2)) lcd.print(" - ");
        else lcd.print(" + ");  
       
      lcd.setCursor(9, 0); // показываем температуру с датчика
      lcd.write(2);
      lcd.print(temperature1, 1);
      lcd.write(1);
      lcd.print("C");
      lcd.setCursor(9, 1);  
      lcd.write(3);
      lcd.print ( temperature2, 1);
      lcd.write(1);
      lcd.print("C");
     
    }

     
     
     
     
    У кого какие идеи ?
     

    Вложения:

  7. а ардуина продолжает работать?
     
  8. &Anton

    &Anton Нерд

    Да , если я нажимаю кнопку включения вентилятора , экран возвращается в нормальное состояние
     
    Последнее редактирование: 12 ноя 2014
  9. наверно фиговый контакт у шилда.

    микроэлектроника это наука о контактах..