Termostat - ograniczenie liczby jednoczesnie grzanych HVAC

User avatar
Duch__
Posts: 2199
Joined: Wed Aug 24, 2016 7:26 pm
Location: Opole
Been thanked: 6 times

Post

Hej.

Termostat na ESP32 (5 x hvac + 5 x virtual binary do blokowania).

Ma ktoś pomysł jak zmusić programowo że zawsze grzeją tylko 2 kanały, pozostałe grzecznie czekają.

Chodzi o to by zawsze modły grzać maksymalnie 2.

Odpowiadając na pytanie czemu, chodzi mi o to by maksymalnie zwiększyć czas pracy pieca i nie doprowadzać do gaszenia płomienia.
User avatar
veeroos
Posts: 1081
Joined: Sun Mar 20, 2022 9:30 am
Location: Głogów
Has thanked: 1 time
Been thanked: 9 times

Post

Wydaje mi się,.że najlepiej by było zrobić kolejkowanie, każdy z termostatów w momencie gdyby miał grzać (załączał przekaźnik) ustawiał by się w kolejce, na raz by grzały tylko 2, jeżeli jeden z tych aktywnych termostatów wyłączył by się to następny, który byłby w kolejce by zaczął grzać. Najlepiej wtedy by było ustawić wyjście termostatu jako virtual relay, a fizyczne wyjścia załączały by się już z programu gdy przyjdzie ich "kolej", no ja bym osobiście tak zrobił, no chyba że koledzy mają jakiś inny pomysł na to.
Zamel Mew-01, Zamel PEW-01, Zamel SBW-01, Zamel THW-01, Zamel SRW-01, Zamel mSLW-02, Auraton BOX + Indor Sensor, Airly Gate By Veeroos, Zigbee to Supla Gateway + sensors, Zamel SGW-01 and more

https://github.com/v33r005
Maciek663
Posts: 217
Joined: Thu Jan 11, 2024 6:33 am
Has thanked: 1 time
Been thanked: 1 time

Post

veeroos wrote: Fri Dec 27, 2024 9:30 pm Wydaje mi się,.że najlepiej by było zrobić kolejkowanie, każdy z termostatów w momencie gdyby miał grzać (załączał przekaźnik) ustawiał by się w kolejce, na raz by grzały tylko 2, jeżeli jeden z tych aktywnych termostatów wyłączył by się to następny, który byłby w kolejce by zaczął grzać. Najlepiej wtedy by było ustawić wyjście termostatu jako virtual relay, a fizyczne wyjścia załączały by się już z programu gdy przyjdzie ich "kolej", no ja bym osobiście tak zrobił, no chyba że koledzy mają jakiś inny pomysł na to.
Otóż to.

Z chat gpt:

Code: Select all


#define MAX_ACTIVE_OUTPUTS 2  // Maksymalna liczba aktywnych wyjść

// Definiowanie pinów dla wyjść (np. diod LED)
int outputs[5] = {3, 4, 5, 6, 7};  // 5 pinów wyjściowych

// Zmienna do trzymania statusu wyjść
bool outputsStatus[5] = {false, false, false, false, false};  // Wszystkie wyjścia na początku wyłączone

// Kolejka wyjść, które czekają na aktywację
int outputQueue[5];
int queueIndex = 0;

void setup() {
  Serial.begin(9600);

  // Inicjalizacja wyjść
  for (int i = 0; i < 5; i++) {
    pinMode(outputs[i], OUTPUT);
    digitalWrite(outputs[i], LOW);  // Na początku wszystkie wyjścia wyłączone
  }

  // Inicjalizacja czujników temperatury
  sensors.begin();
}

void loop() {
  sensors.requestTemperatures();  // Odczyt temperatury z wszystkich czujników

  // Sprawdzanie temperatury każdego czujnika i podejmowanie decyzji o włączeniu/wyłączeniu wyjść
  for (int i = 0; i < 5; i++) {
    float temperature = sensors.getTempCByIndex(i);  // Odczyt temperatury czujnika i

    // Aktywowanie wyjścia, jeśli temperatura przekroczy wartość progową
    if (temperature > 25 && !outputsStatus[i] && countActiveOutputs() < MAX_ACTIVE_OUTPUTS) {
      activateOutput(i);
    } else if (temperature <= 25 && outputsStatus[i]) {
      deactivateOutput(i);
    }
  }

  // Czekaj 1 sekundę przed kolejnym cyklem
  delay(1000);
}

// Funkcja licząca aktywne wyjścia
int countActiveOutputs() {
  int activeCount = 0;
  for (int i = 0; i < 5; i++) {
    if (outputsStatus[i]) {
      activeCount++;
    }
  }
  return activeCount;
}

// Funkcja aktywująca wyjście
void activateOutput(int index) {
  if (countActiveOutputs() < MAX_ACTIVE_OUTPUTS) {
    outputsStatus[index] = true;
    digitalWrite(outputs[index], HIGH);
  } else {
    // Jeśli nie możemy aktywować, dodajemy do kolejki
    if (queueIndex < 5) {
      outputQueue[queueIndex++] = index;
    }
  }
}

// Funkcja dezaktywująca wyjście
void deactivateOutput(int index) {
  if (outputsStatus[index]) {
    outputsStatus[index] = false;
    digitalWrite(outputs[index], LOW);

    // Sprawdzamy, czy jest coś w kolejce, aby aktywować
    if (queueIndex > 0) {
      int nextOutput = outputQueue[0];  // Pierwsze wyjście w kolejce
      activateOutput(nextOutput);  // Aktywujemy to wyjście
      // Przesuwamy pozostałe elementy w kolejce
      for (int i = 0; i < queueIndex - 1; i++) {
        outputQueue[i] = outputQueue[i + 1];
      }
      queueIndex--;
    }
  }
}

Nie sprawdzałem czy działa ;)

Return to “Pomoc”