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.
Termostat - ograniczenie liczby jednoczesnie grzanych HVAC
-
veeroos
- Posts: 1081
- Joined: Sun Mar 20, 2022 9:30 am
- Location: Głogów
- Has thanked: 1 time
- Been thanked: 9 times
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
https://github.com/v33r005
Otóż to.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.
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--;
}
}
}
