1 2 3 4 5 6 7 8 9 10 0/10 0,00оценок: 0

Управление солнечным обогревом на ардуино. Нужна помощь

Тема в разделе "Умный дом", создана пользователем plymba, 20.04.16.

  1. plymba
    Регистрация:
    28.10.13
    Сообщения:
    114
    Благодарности:
    38

    plymba

    Живу здесь

    plymba

    Живу здесь

    Регистрация:
    28.10.13
    Сообщения:
    114
    Благодарности:
    38
    Адрес:
    Уфа
    Управление солнечным обогревом на ардуино. Нужна помощь
    Приветствую всех! Есть задача перекачивать горячий воздух с чердака в пространство под полом с целью увеличить температуру полов и комнатную температуру ночью за счёт аккумуляции тепла в подполе. В летнее время.

    За основу взял скетч для термостата с управлением 5 нагрузками с 5 датчиков.

    У меня так:
    Датчик DS18B20 на чердаке (sensor0)
    Датчик DS18B20 в комнате (sensor2)
    Датчик DS18B20 в подполе (sensor1)

    Управлять нужно только одной нагрузкой - вентилятором: просто подавать 5В с любого пина на реле.

    На данный момент переделал индикацию на дисплей, осталось только сделать так, чтобы на первом экране отображалось то, что уже есть, а на втором настройки времени и интервалы работы вентилятора (это ещё не готово).

    Проблема в следующем:

    Нужно определить работу только одного определённого пина для управления нагрузкой. Условия включения нагрузки: Т (sensor0) > Т (sensor1).

    При нынешнем коде не могу понять какой пин будет включаться при выполнении заданного условия.

    Помогите привести в порядок, пожалуйста)

    Скетч: https://yadi.sk/d/VsbnMyaDr8z7J

    / Термостат, до пяти датчиков DS18B20.
    /

    / v 0.2.1 beta

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

    OneWire oneWire (15); / A1 вход датчиков 18b20
    DallasTemperature ds(&oneWire);
    LiquidCrystal lcd (8, 9, 4, 5, 6, 7);

    const byte OUT[5] = {2, 12, 11, 13, 3}; / номера выходов

    byte pos;
    byte tempOUTon[5]; / массив с температурой включения выхода
    float tempSensor[5]; / массив куда читается температура

    byte qty; / количество градусников на шине.

    / адреса градусников.
    DeviceAddress sensor1 = {0x28, 0x18, 0xC0, 0xB4, 0x06, 0x00, 0x00, 0x88};
    DeviceAddress sensor2 = {0x28, 0xB4, 0x61, 0x88, 0x06, 0x00, 0x00, 0x0D};
    DeviceAddress sensor3 = {0x28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
    DeviceAddress sensor4 = {0x28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
    DeviceAddress sensor5 = {0x28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};

    byte gradus[8] = {
    0b00110,
    0b01001,
    0b01001,
    0b00110,
    0b00000,
    0b00000,
    0b00000,
    0b00000
    };
    byte on[8] = {
    0b00110,
    0b01111,
    0b11111,
    0b11111,
    0b11111,
    0b11111,
    0b11110,
    0b01100
    };

    void readSet(){
    for (byte i = 0; i < qty; i+) tempOUTon = EEPROM. read (i);
    }

    void outOff(){ / выключает выходы
    for (byte i = 0; i < qty; i+) digitalWrite (OUT, LOW);
    }

    void erorr(){ / останавливает работу программы и сигнализирует ошибку
    outOff(); / выключаем выходы
    lcd. clear();
    lcd. print("sensor error");
    while (1){ / крутим бесконечный цикл
    analogWrite (10, 100);
    delay (500);
    analogWrite (10, 255);
    delay (500);
    }
    }
    /

    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){ / установка температуры
    outOff();
    lcd. clear();

    while (1){ / крутим бесконечный цикл
    byte KEY = key(); / читаем состояние кнопок

    lcd. setCursor (2, 0); / выводим на экран
    lcd. print("Out:");
    lcd. print (pos+1);
    lcd. setCursor (9, 0);
    lcd. print("Pin:");
    lcd. print (OUT[pos]);
    lcd. print(" ");

    lcd. setCursor (0, 1);
    lcd. print(" PinON: ");
    lcd. print (tempOUTon[pos]);
    lcd. write (1);
    lcd. print("C <>");

    if (KEY = 2) { / если нажата кнопка
    tempOUTon[pos]-; / изменяем значение
    if (tempOUTon[pos] > 125) tempOUTon[pos] = 0;
    EEPROM. write (pos, tempOUTon[pos]); / сохраняем в еепром
    }
    else if (KEY = 5){
    tempOUTon[pos]+;
    if (tempOUTon[pos] > 125) tempOUTon[pos] = 0;
    EEPROM. write (pos, tempOUTon[pos]);
    }

    delay (200);
    }/
    }/

    void getTemp(){ / читаем температуру и заполняем массив
    ds. requestTemperatures();

    tempSensor[0] = ds. getTempC (sensor1); / немного китайского кода
    tempSensor[1] = ds. getTempC (sensor2);
    tempSensor[2] = ds. getTempC (sensor3);
    tempSensor[3] = ds. getTempC (sensor4);
    tempSensor[4] = ds. getTempC (sensor5);
    }

    void sensorTest(){ / ищим датчики на шине, если количество изменилось, останавливаем работу
    ds. begin();
    if (ds.getDeviceCount() != qty) erorr();
    }

    void setup() {
    / Serial. begin (9600);
    ds. begin();
    qty = ds. getDeviceCount(); / при включении, сохраняем количество градусников,
    / можно и лучше количество указать руками.

    for (int i = 0; i < qty; i+) pinMode (OUT, OUTPUT);
    for (int i = 0; i < qty; i+) digitalWrite (OUT, LOW);

    lcd. createChar (1, gradus);
    lcd. createChar (2, on);
    lcd. begin (16, 2);
    lcd. clear();

    readSet(); / читаем настройки из еепром
    }

    void loop() {
    if (key() = 1) setMenu (pos); / если нажата селект, уходим в настройки

    else if (key() = 4 && pos < qty-1) pos+; / крутим позицию
    else if (key() = 3 && pos != 0) pos-;

    sensorTest(); / тест наличия градусников на шине
    getTemp(); / читаем температуру с датчиков

    / сверяем температуру и управляем выходами
    for (int i = 0; i < qty; i+) {
    if (tempSensor[0] > tempSensor[1]) digitalWrite (OUT, HIGH);
    else digitalWrite (OUT, LOW);
    }

    / вывод инфы на экран
    lcd. setCursor (0, 0);
    lcd. print("1");
    lcd. print(":");
    lcd. print (tempSensor[0], 1); / показываем температуру с датчика 0
    lcd. write (1);
    lcd. print(" 2");
    lcd. print(":");
    lcd. print (tempSensor[1], 1); / показываем температуру с датчика 1
    lcd. write (1);

    lcd. setCursor (0, 1);
    lcd. print("3");
    lcd. print(":");
    lcd. print (tempSensor[2], 1); / показываем температуру с датчика 2
    lcd. write (1);

    lcd. setCursor (10, 1);
    lcd. print("Fan:");

    lcd. setCursor (15, 1); / рисуем статус выхода
    {
    if (digitalRead (3) lcd. write (2);
    else lcd. print(" ");
    }

    }
     
    plymba , 20.04.16
    #1 + Цитировать
  2. wind1wind
    Регистрация:
    21.11.11
    Сообщения:
    23.568
    Благодарности:
    33.198

    wind1wind

    Супер-Модератор

    wind1wind

    Супер-Модератор

    Регистрация:
    21.11.11
    Сообщения:
    23.568
    Благодарности:
    33.198
    Адрес:
    Сахалинская область, остров Кунашир
    @plymba,
    для того, чтобы пост стал компактнее, убрал код под спойлер.
    Кому нужно, тот всегда сможет его посмотреть, нажав на соответствующую кнопку.
     
    wind1wind , 20.04.16
    #2 + Цитировать
  3. ОлегМ
    Регистрация:
    07.12.11
    Сообщения:
    81
    Благодарности:
    22

    ОлегМ

    Живу здесь

    ОлегМ

    Живу здесь

    Регистрация:
    07.12.11
    Сообщения:
    81
    Благодарности:
    22
    Адрес:
    Красноярск
    У Вас в цикле loop -
    / сверяем температуру и управляем выходами
    for (int i = 0; i < qty; i+) {
    if (tempSensor[0] > tempSensor[1]) digitalWrite (OUT, HIGH);
    else digitalWrite (OUT, LOW);
    }
    В этом месте выполняется условие, а OUT - это массив с выходами (const byte OUT[5] = {2, 12, 11, 13, 3}; / номера выходов - определён в начале программы) и инициализированы они в Setup
    for (int i = 0; i < qty; i+) pinMode (OUT, OUTPUT);
    for (int i = 0; i < qty; i+) digitalWrite (OUT, LOW);

    т. е. эти пины - выходы и начальное состояние их низкий уровень.
    Если Вам надо оставить только один выход, то в начале вместо массива определить только один пин. Например: const int OUT=2;
    В Setup -
    pinMode (OUT, OUTPUT);
    digitalWrite (OUT, LOW);
    В цикле loop -
    / сверяем температуру и управляем выходами
    for (int i = 0; i < qty; i+) {
    if (tempSensor[0] > tempSensor[1]) digitalWrite (OUT, HIGH);
    else digitalWrite (OUT, LOW);
    }
     
    ОлегМ , 21.04.16
    #3 + Цитировать
  4. plymba
    Регистрация:
    28.10.13
    Сообщения:
    114
    Благодарности:
    38

    plymba

    Живу здесь

    plymba

    Живу здесь

    Регистрация:
    28.10.13
    Сообщения:
    114
    Благодарности:
    38
    Адрес:
    Уфа
    Спасибо, разобрался!
     
    plymba , 21.04.16
    #4 + Цитировать

Смотрите также