void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
/*
[19:41, 20.04.2025] Adam WITKOWSKI: // Definicje pinów sterujących sekcjami. Zmień na odpowiednie piny, do których podłączone są Twoje elektrozawory.
const int sekcja1Pin = 2;
const int sekcja2Pin = 3;
const int sekcja3Pin = 4;
const int sekcja4Pin = 5;
const int sekcja5Pin = 6;
const int sekcja6Pin = 7;
const int sekcja7Pin = 8;
// Czas trwania podlewania dla każdej sekcji (w milisekundach)
const unsigned long czasPodlewania = 10 * 60 * 1000; // 10 minut
// Czas rozpoczęcia następnej sekcji przed zakończeniem bieżącej (w milisekundach)
const unsigned long czasNakladania = 5 * 1000; // 5 sekund
// Tablica przechowująca piny sekcji
const int sekcje[] = {sekcja1Pin, sekcja2Pin, sekcja3Pin, sekc…
[19:45, 20.04.2025] Adam WITKOWSKI: Jasne, dodam 5-sekundową przerwę między zakończeniem jednego powtórzenia cyklu podlewania a rozpoczęciem następnego.
// Definicje pinów sterujących sekcjami. Zmień na odpowiednie piny, do których podłączone są Twoje elektrozawory.
const int sekcja1Pin = 2;
const int sekcja2Pin = 3;
const int sekcja3Pin = 4;
const int sekcja4Pin = 5;
const int sekcja5Pin = 6;
const int sekcja6Pin = 7;
const int sekcja7Pin = 8;
// Czas trwania podlewania dla każdej sekcji (w milisekundach)
const unsigned long czasPodlewania = 10 * 60 * 1000; // 10 minut
// Czas rozpoczęcia następnej sekcji przed zakończeniem bieżącej (w milisekundach)
const unsigned long czasNakladania = 5 * 1000; // 5 sekund
// Czas przerwy między powtórzeniami (w milisekundach)
const unsigned long czasPrzerwyMiedzyPowtorzeniami = 5 * 1000; // 5 sekund
// Tablica przechowująca piny sekcji
const int sekcje[] = {sekcja1Pin, sekcja2Pin, sekcja3Pin, sekcja4Pin, sekcja5Pin, sekcja6Pin, sekcja7Pin};
const int liczbaSekcji = sizeof(sekcje) / sizeof(sekcje[0]);
// Liczba powtórzeń całego cyklu
const int liczbaPowtorzen = 3;
int aktualnePowtorzenie = 1;
// Zmienna przechowująca indeks aktualnie podlewanej sekcji
int aktualnaSekcja = 0;
// Zmienna przechowująca czas rozpoczęcia podlewania aktualnej sekcji lub przerwy
unsigned long czasStartAkcji;
// Zmienna stanu, która mówi, czy trwa podlewanie, czy przerwa
enum StanPodlewania {
PODLEWANIE,
PRZERWA
};
StanPodlewania aktualnyStan = PODLEWANIE;
void setup() {
// Ustaw piny sekcji jako wyjścia
for (int i = 0; i < liczbaSekcji; i++) {
pinMode(sekcje[i], OUTPUT);
digitalWrite(sekcje[i], LOW); // Na początku wszystkie sekcje wyłączone
}
// Inicjalizacja pierwszego cyklu i pierwszej sekcji
czasStartAkcji = millis();
digitalWrite(sekcje[aktualnaSekcja], HIGH);
Serial.begin(9600);
Serial.println("Rozpoczęcie podlewania...");
Serial.print("Cykl: ");
Serial.print(aktualnePowtorzenie);
Serial.print("/");
Serial.println(liczbaPowtorzen);
Serial.print("Podlewanie sekcji: ");
Serial.println(aktualnaSekcja + 1);
}
void loop() {
if (aktualnyStan == PODLEWANIE) {
// Sprawdź, czy czas podlewania aktualnej sekcji minął
if (millis() - czasStartAkcji >= czasPodlewania) {
// Wyłącz aktualną sekcję
digitalWrite(sekcje[aktualnaSekcja], LOW);
Serial.print("Zakończono podlewanie sekcji: ");
Serial.println(aktualnaSekcja + 1);
// Przejdź do następnej sekcji
aktualnaSekcja++;
// Sprawdź, czy doszliśmy do ostatniej sekcji w bieżącym cyklu
if (aktualnaSekcja < liczbaSekcji) {
// Włącz następną sekcję
digitalWrite(sekcje[aktualnaSekcja], HIGH);
czasStartAkcji = millis();
Serial.print("Podlewanie sekcji: ");
Serial.println(aktualnaSekcja + 1);
} else {
// Koniec bieżącego cyklu - rozpocznij przerwę, jeśli to nie ostatnie powtórzenie
Serial.println("Koniec cyklu.");
aktualnePowtorzenie++;
if (aktualnePowtorzenie <= liczbaPowtorzen) {
aktualnyStan = PRZERWA;
czasStartAkcji = millis();
Serial.println("Rozpoczęcie przerwy przed kolejnym cyklem...");
// Wyłącz wszystkie sekcje na czas przerwy (dla pewności)
for (int i = 0; i < liczbaSekcji; i++) {
digitalWrite(sekcje[i], LOW);
}
} else {
// Wszystkie cykle podlewania zakończone
Serial.println("Wszystkie cykle podlewania zakończone.");
while (true) {
// Zatrzymaj program, czekając na reset lub inne działanie
}
}
}
} else {
// Sprawdź, czy należy uruchomić następną sekcję przed zakończeniem bieżącej
if (aktualnaSekcja < liczbaSekcji - 1 && (millis() - czasStartAkcji >= (czasPodlewania - czasNakladania))) {
// Włącz następną sekcję
digitalWrite(sekcje[aktualnaSekcja + 1], HIGH);
Serial.print("Rozpoczęcie nakładania się - włączono sekcję: ");
Serial.println(aktualnaSekcja + 2);
}
}
} else if (aktualnyStan == PRZERWA) {
// Sprawdź, czy czas przerwy minął
if (millis() - czasStartAkcji >= czasPrzerwyMiedzyPowtorzeniami) {
// Rozpocznij nowy cykl od pierwszej sekcji
aktualnyStan = PODLEWANIE;
aktualnaSekcja = 0;
czasStartAkcji = millis();
digitalWrite(sekcje[aktualnaSekcja], HIGH);
Serial.print("Rozpoczęcie cyklu: ");
Serial.print(aktualnePowtorzenie);
Serial.print("/");
Serial.println(liczbaPowtorzen);
Serial.print("Podlewanie sekcji: ");
Serial.println(aktualnaSekcja + 1);
}
}
// Dodaj tutaj inne zadania, które Twój Arduino ma wykonywać (jeśli są potrzebne)
}
Główne zmiany:
* czasPrzerwyMiedzyPowtorzeniami: Dodano stałą definiującą czas trwania przerwy (5 sekund).
* StanPodlewania enum: Wprowadzono typ wyliczeniowy StanPodlewania z dwoma stanami: PODLEWANIE i PRZERWA.
* aktualnyStan: Zmienna aktualnyStan śledzi, czy aktualnie trwa podlewanie, czy przerwa.
* Zmiana logiki w loop():
* Gdy zakończy się podlewanie ostatniej sekcji w cyklu, a nie jest to ostatnie powtórzenie, aktualnyStan jest ustawiany na PRZERWA, a czasStartAkcji jest aktualizowany. Wszystkie sekcje są wyłączane na czas przerwy.
* Gdy aktualnyStan to PRZERWA, program czeka, aż upłynie czasPrzerwyMiedzyPowtorzeniami. Po tym czasie aktualnyStan wraca do PODLEWANIE, aktualnaSekcja jest resetowana do 0, a podlewanie rozpoczyna się od pierwszej sekcji nowego cyklu.
Teraz po każdym zakończonym cyklu podlewania nastąpi 5-sekundowa przerwa przed rozpoczęciem kolejnego cyklu, aż do wykonania wszystkich trzech powtórzeń.
*/