Skocz do zawartości

Sterownik kolektora słonecznego


Pomocna odpowiedź

Witajcie,

 

To mój pierwszy post na forum więc chciałem się przywitać 😁

Nie jest to mój pierwszy projekt, acz wiedzę mam raczej skromną czego świadom jestem więc z góry przepraszam za popełniane gafy 😶

 

Od jakiegoś tygodnia próbuję stworzyć kod do sterowania uczynionym przeze mnie kolektorem słonecznym. Nie będę się może zagłębiał w szczegóły całości projektu a przejdę do sedna.

Sterownik ma za zadanie kontrolować temperaturę w 3 punktach z czego na podstawie dwóch pomiarów ma sterować dwoma siłownikami na zaworach i pompą obiegową w następujący sposób: po wykryciu określonej temperatury Kolektora włącza przekaźnik nr2. (pompę obiegową czynnika), włącza przekaźnik nr3 i nr4 sterujący siłownikami umieszczonymi na zaworach trójdrogowych powodując ich przestawienie w określoną pozycję po czym je wyłącza ( obrót siłownika w na zadaną pozycję trwa stały ustalony czas); w przypadku spadku temperatury wyłącza pompę obiegową, znowu włącza siłowniki (przekaźniki 5 i 6 ) w celu przestawienia ich na pozycję wyjściową na określony czas po czym je wyłącza; całość mechanizmu może zadziałać tylko w przypadku gdy temperatura z czujnika bezpieczeństwa jest poniżej zadanej wartości. Problem polega na ciągłym załączaniu i wyłączaniu jednego przekaźnika przy temperaturze ok. 20 stopni C ;/ Proszę serdecznie masterów programowania o podpowiedź co można z tym zrobić :(. Oto moje kodowe wypociny 😂

Całość chciał bym w przyszłości zmodyfikować dodając: możliwość ustawienia progu działania i zabezpieczenia enkoderem, sygnalizację buzzerem przekroczenie temperatury kolektora a także sygnalizację stanu przekaźników i wszystkich komunikatów na większym wyświetlaczu.

 

Pozdrawiam serdecznie i dziękuję z góry za zainteresowanie moimi wypocinami 🙄

 

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 8





OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LiquidCrystal_I2C lcd(0x27, 20, 4);

byte znak_stopnia[8] = {                     //tworzymy znak stopnia
  0b00111,
  0b00101,
  0b00111,
  0b00000,
  0b00000,
  0b00000,
  0b00000,
  0b00000
};

 unsigned long aktualnyCzas = 0;		
 unsigned long zapamietanyCzas = 0;
int stalaTemp = 30;
int prog = 40;



void setup()
{

                    //ustawiamy wyjścia przekaźnikowe
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);



                 // inicjalizacja LCD
sensors.begin();
lcd.createChar(0, znak_stopnia);

              // włączamy podświetlenie LCD i wyświetlamy stałe elementy
  lcd.backlight();
  lcd.setCursor(0, 0);   
  lcd.print("Temp. KOLEKTORA");   
  lcd.setCursor(0, 2);    
  lcd.print("Temp. CZYNNIKA");  
 


}


void loop(void)
{

aktualnyCzas = millis();
                      //włączamy odczyt z czujników i zapisujemy w zmiennych
sensors.requestTemperatures();
float zabezpieczenie = sensors.getTempCByIndex(2);
float tempKolektor = sensors.getTempCByIndex(1);
float tempCzynnik = sensors.getTempCByIndex(0);

                    //wyświetlamy odczyty
lcd.setCursor(0, 1);
lcd.print(tempKolektor);
lcd.print((char)0); //wyswietl znak stopnia
lcd.print("C");  
lcd.setCursor(0, 3);
lcd.print(tempCzynnik);
lcd.print((char)0); //wyswietl znak stopnia
lcd.print("C");  
lcd.print(zabezpieczenie);
 


						// ywłączenie wszyskich przekaźników

  digitalWrite(2,HIGH);   // zasilanie pompa
  digitalWrite(3,HIGH);   // obrót siłownika otwórz 'zasilanie'  solar
  digitalWrite(4,HIGH);   // obrót siłownika otwórz 'powrót' solar
  digitalWrite(5,HIGH);   // obrót siłownika  zamknij 'zasilanie' solar
  digitalWrite(6,HIGH);   // obrót siłownika zamknij 'powrót'  solar


 
if (zabezpieczenie<prog)
{

 if  ( tempKolektor>= stalaTemp )

    {
        digitalWrite(2,LOW); //włącz pompę
    
    digitalWrite(3,LOW);      //włącz siłownik zasilanie
    digitalWrite(4,LOW);      //włącz siłownik powrót

   if (aktualnyCzas - zapamietanyCzas >= 5000UL) //czekaj
{
  zapamietanyCzas = aktualnyCzas;
  
      digitalWrite(3,HIGH);   //włącz siłownik siłownika 'zasilanie' zamknij solar
      digitalWrite(4,HIGH);   //włącz siłownik siłownika 'zasilanie' zamknij solar*/

}
    }

if  ( tempKolektor<= stalaTemp )


  digitalWrite(2,HIGH);
  digitalWrite(5,LOW);    //włącz siłownik 'zasilanie' zamknij solar
  digitalWrite(6,LOW);    //włącz siłownik 'powrót' zamknij solar

        

if (aktualnyCzas - zapamietanyCzas >= 5000UL)
{
  zapamietanyCzas = aktualnyCzas;
  
digitalWrite(5,HIGH);   //wyącz siłownik zamknij 'zasilanie'  solar
digitalWrite(6,HIGH);   //wyącz siłownik zamknij 'powrót'  solar
}
}
}

 

 

Edytowano przez jayC
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.