Arduino Polska Forum
regulator temperatury co, cwu - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Programowanie w Arduino (https://forum.arduinopolska.pl/dzial-programowanie-w-arduino)
+--- Wątek: regulator temperatury co, cwu (/watek-regulator-temperatury-co-cwu)



regulator temperatury co, cwu - miodzik - 23-04-2017

Witam wszystkich. Jestem tu nowy.
 Od jakiegoś czasu bawię się w programowanie mikro kontrolerów na arduino uno. Skomponowałem dość ciekawy program do sterownika grzania wody w centralnym ogrzewaniu.
do projektu użyłem:
-Arduino uno 
-Wyświetlacz LCD z konwerterem I2C
-dwukanałowy moduł przekaźnikowy
-dwa czujniki temperatury ds18b20 w obudowie+ rezystory 4,7kohm
Wszystko ładnie działa Big Grin Ale... brakuje mi opcji zmiany zadanej temperatury za pomocą trzech przycisków.
Dobrze by było skomponować jakieś małe menu, którym można by zmienić temperaturę załączenia przekaźnika nr 1 ale nie mam żadnej koncepcji jak by można to zrobić:/
Wszelkie pomysły miło widziane. Pozdrawiam
-----------------------------------------------------------------------------------------
KOD:
----------------------------------------------------------------------------
Kod:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>


#define ONE_WIRE_BUS 2         //czujnik 1 podpięty do pinu 2
#define ONE_WIRE_BUS2 3         //czujnik 2 podpięty do pinu 3

OneWire oneWire(ONE_WIRE_BUS);    //czujnik 1
OneWire oneWire2(ONE_WIRE_BUS2);   //czujnik 2



DallasTemperature sensors(&oneWire);
DallasTemperature bojler(&oneWire2);

// Definicja wejść wyświetlacza ciekłokrystalicznego

 LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Ustawienie adresu ukladu na 0x27
int przekaznik=5;          //przekaznik 1 do pinu 5
int przekaznik2=6;          //przekaznik 2 do pinu 6

void setup(void)
{
   Serial.begin(9600);
 
  sensors.begin();   // Inicjacja czujnika
 
  lcd.begin(16, 2);  // Inicjacja wyświetlacza
  lcd.clear();
pinMode(przekaznik,OUTPUT); // ustawienie pinu jako wyjście PRZEKAŹNIKA 1
digitalWrite(przekaznik,LOW); // ustawienie na nim stanu niskiego
pinMode(przekaznik2,OUTPUT); // ustawienie pinu jako wyjście PRZEKAŻNIKA 2
digitalWrite(przekaznik2,LOW); // ustawienie na nim stanu niskiego
}

void loop(void)
{
  if (sensors.getTempCByIndex(0)>38) // wywołanie funkcji warunkowej
{                                       //funkcja pompy co 
                                         // 38 - TEMP ZAŁĄCZANIA POMPY
digitalWrite(przekaznik,HIGH); // włączenie przekaźnika 1
    lcd.setCursor(0,0); // Ustawienie kursora w pozycji 0,0 (pierwszy wiersz, pierwsza kolumna)
 lcd.print("T.K:");    // wyświetl T.K: -temperatura kotła
  sensors.requestTemperatures(); 
 lcd.print(sensors.getTempCByIndex(0));
 lcd.print("*C/38*C");   //wyświetl *C/38 czyli jednostka i zadana temperatura
 
}
else
  {
      if (sensors.getTempCByIndex(0)<35) // wywołanie funkcji warunkowej
{                                               //funkcja pompy co
                                                 // 35- temperatura wyłączenie pompy
      digitalWrite(przekaznik,LOW); // wyłączenie przekaźnika 
    lcd.setCursor(0,0); // Ustawienie kursora w pozycji 0,0 (pierwszy wiersz, pierwsza kolumna)
 lcd.print("T.K:");
 sensors.requestTemperatures(); 
 lcd.print(sensors.getTempCByIndex(0));
 lcd.print("*C/38*C"); 
 
}
else
  {
     lcd.setCursor(0,0); // Ustawienie kursora w pozycji 0,0 (pierwszy wiersz, pierwsza kolumna)
 lcd.print("T.K:");
  sensors.requestTemperatures(); 
 lcd.print(sensors.getTempCByIndex(0));
 lcd.print("*C/38*C");
  }
  }
  
if (sensors.getTempCByIndex(0)-7>bojler.getTempCByIndex(0)) // wywołanie funkcji warunkowej
{                                                             //funkcja popmy CWU,  CO większe o 7 niż cCWU
digitalWrite(przekaznik2,HIGH); // włączenie przekaźnika 2
       lcd.setCursor(0,1); // Ustawienie kursora
 lcd.print("T.B:");
  bojler.requestTemperatures(); 
 lcd.print(bojler.getTempCByIndex(0));
 lcd.print("*C/38*C");
 }
else
{
   if (sensors.getTempCByIndex(0)-2<bojler.getTempCByIndex(0)) // wywołanie funkcji warunkowej
{                                                              //funkcja popmy CWU, CO mniejsze o +2 od CWU
digitalWrite(przekaznik2,LOW); // wyłączenie przekaźnika 2
       lcd.setCursor(0,1); // Ustawienie kursora
 lcd.print("T.B:");    wyświetl T.B: czuli temperatur bojlera
  bojler.requestTemperatures(); 
 lcd.print(bojler.getTempCByIndex(0));
 lcd.print("*C");   /Wyświetl *C czyli  jednostkę
 }
else
  {
   lcd.setCursor(0,1); // Ustawienie kursora 
   lcd.print("T.B:");      
  bojler.requestTemperatures(); 
 lcd.print(bojler.getTempCByIndex(0));
 lcd.print("*C);
  }
}
 
}
------------------------------------------------

Kolega miodzik proszony o używanie znaczników kodzik Wink ( wybacz nie mogłem się powstrzymać  )


RE: regulator temperatury co, cwu - namok - 23-04-2017

A co stoi na przeszkodzie abyś wpisał w dowolną wyszukiwarkę hasło "arduino menu" i przejrzał to co szukajka wypluje?


RE: regulator temperatury co, cwu - miodzik - 24-04-2017

kolega "nomak" wyobrazi sobie że prubowałem coś w tym kierunku zdziałać,  ale nic mi nie wychodzi.
nie liczę na gotowca, lecz jakąś podpowiedz. Chyba po to te całe forum
znalazłem co nie co  i zacząłem coś działać w tym kierunku, ale lipa.... nawet nie ma czym się chwalić,  no ale żeby nie było że czekam z założonymi rękami  aż ktoś mnie wyręczy. Kod poniżej.
Odczyt z czujnika jest w momencie gdy zmieniam wartość  zadaną,
Wrażenie mam tak jak by "void loop()" nie działał jak należy.  
---------------------------------------
kod
----------------------------------------
Kod:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>


#define ONE_WIRE_BUS 2         //czujnik 1 podpięty do pinu 2
#define ONE_WIRE_BUS2 3         //czujnik 2 podpięty do pinu 3

OneWire oneWire(ONE_WIRE_BUS);    //czujnik 1
OneWire oneWire2(ONE_WIRE_BUS2);   //czujnik 2


// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
DallasTemperature bojler(&oneWire2);
// Definicja wejść wyświetlacza ciekłokrystalicznego

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Ustawienie adresu ukladu na 0x27
int przekaznik=5;          //przekaznik 1 do pinu 5
int przekaznik2=6;          //przekaznik 2 do pinu 6
char *k0="T.K:";
char *k1=" <> Temp. = ";
char *k2=" *C                ";
char *k3=" Ustawiono!=";
int temp=50;
// --------------------------------------------------------------------------------
void setup()
{
 pinMode(9,INPUT_PULLUP);
 pinMode(10,INPUT_PULLUP);
 pinMode(11,INPUT_PULLUP);
Serial.begin(9600);
 // Inicjacja czujnika
 sensors.begin();
 // Inicjacja wyświetlacza
 lcd.begin(16, 2);
 lcd.clear();
pinMode(przekaznik,OUTPUT); // ustawienie pinu jako wyjście
digitalWrite(przekaznik,LOW); // ustawienie na nim stanu niskiego
pinMode(przekaznik2,OUTPUT); // ustawienie pinu jako wyjście
digitalWrite(przekaznik2,LOW); // ustawienie na nim stanu niskiego

}
// ---------------------------------------------------------------------------------
int getButton(int bG, int bD, int oK)
{
 if(digitalRead(bG)==LOW){delay(30);if(digitalRead(bG)==LOW)return 1;}
 if(digitalRead(bD)==LOW){delay(30);if(digitalRead(bD)==LOW)return 2;}
 if(digitalRead(oK)==LOW){delay(30);if(digitalRead(oK)==LOW)return 3;}
 return -1;
}
// ---------------------------------------------------------------------------------
void ekran(char *kL, int v ,char *kP="",int wiersz=0)
{
  if(wiersz>=0)
   {
   lcd.setCursor(14,wiersz);lcd.print(" ");
   lcd.setCursor(14,wiersz);lcd.print(kL);lcd.print(v);lcd.print(kP);
   
  lcd.setCursor(0,0); // Ustawienie kursora w pozycji 0,0 (pierwszy wiersz, pierwsza kolumna)
lcd.print("T.K:");    //temperatura kotła
 sensors.requestTemperatures();
lcd.print(sensors.getTempCByIndex(0));

}
   else {Serial.print(kL);Serial.print(v);Serial.println(kP);}
}
// ---------------------------------------------------------------------------------
void ekran(char *kK,int wiersz=0)
{
 if(wiersz>=0)
   {
   lcd.setCursor(0,wiersz);lcd.print(" ");
   lcd.setCursor(0,wiersz);lcd.print(kK);
   }
   else Serial.print(kK);
}    
// ---------------------------------------------------------------------------------
int nastawy(int v, int vmin, int vmax)
{
 ekran(k0,v,k2);
 int zm=-1;
 int x=-1;
 while(x!=5)
   {
   x=getButton(9,10,11);
   if(x!=zm)
     {
     switch(x)
       {
       case 1: v++;if(v>vmax)v=vmax;ekran(k1,v,k2);break;
       case 2: v--;if(v<vmin)v=vmin;ekran(k1,v,k2);break;
       case 3: ekran(k3);delay(2000);ekran("");return v;break;
       }
     }
    zm=x;
   }
}
// ---------------------------------------------------------------------------------
void loop()
{
lcd.setCursor(0,0);
        //funkcja pompy co
digitalWrite(przekaznik,HIGH); // włączenie przekaźnika 1
   lcd.setCursor(0,0); // Ustawienie kursora w pozycji 0,0 (pierwszy wiersz, pierwsza kolumna)
lcd.print("T.K:");    //temperatura kotła
 sensors.requestTemperatures();
lcd.print(sensors.getTempCByIndex(0));

temp=nastawy(temp,10,80);
lcd.print("*C");

}



RE: regulator temperatury co, cwu - Smaczek - 25-04-2017

Witam,
Sugestie:
- jeśli chcesz mieć MENU to w pętli loop() powinna być obsługa przycisku digitalRead() umożliwiająca wejście w to MENU. Dodatkowe dwa przyciski do zwiększania/zmniejszania temperatury, czyli wciskając dwa przyciski jednocześnie następuje wejście do menu i zmiana temperatury (o ile MENU ma jedynie realizować tę funkcję),
- w pętli loop() nie trzeba co iterację wpisywać na przekaźnik stanu. Daj dodatkową zmienną typu boolean, która przechowuje obecny stan przekaźnika. Poza tym dlaczego co iterację bezwarunkowo wpisujesz stan HIGH na przekaźnik?,
- co prawda sam odczyt temperatury z czujnika trochę trwa, co powoduje spowolnienie wykonania pętli loop(), ale z uwagi na dużą bezwładność temperaturową układu, można do wnętrza loop() wrzucić jakiegoś delay-a,
- skoro używasz wewnątrz loop() funkcji to dlaczego za pomocą funkcji nie wyświetlasz temp. kotła? Kod będzie czytelniejszy.
Pozdrawiam.


RE: regulator temperatury co, cwu - miodzik - 04-05-2017

dzięki kolego. cenne sugestie.
Jak coś mi się uda podziałać to odezwie się.