jayC Napisano Kwiecień 25, 2021 Udostępnij Napisano Kwiecień 25, 2021 (edytowany) 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 Kwiecień 25, 2021 przez jayC
Pomocna odpowiedź
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ę »