• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
regulator temperatury co, cwu
#1
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ć  )
 
Odpowiedź
#2
A co stoi na przeszkodzie abyś wpisał w dowolną wyszukiwarkę hasło "arduino menu" i przejrzał to co szukajka wypluje?
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#3
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");

}
 
Odpowiedź
#4
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.
 
Odpowiedź
#5
dzięki kolego. cenne sugestie.
Jak coś mi się uda podziałać to odezwie się.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości