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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.