• 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
Regulacja wilgotności
#1
Witam ,
Czy pomoże mi ktoś w kodzie arduino? Chodzi o to że program miałby działać na takie zasadzie że: mam wilgotność zmierzoną czujnikiem DHT . Na wyświetlaczu wyświetla się ta informacja oraz informacja o wilgotności zadanej która " zadaje" potencjometrem. Teraz pytanie - jak napisać kod programu który miałby za zadanie: aktualna wilgotność jest mierzona czujnikiem DHT gdy wartość zadana potencjometrem zostanie ustalona powyżej wartości aktualnej wilgotności( zmierzonej czujnikiem)  np.wskazanie czujnika wskazuje 40%  a potencjometrem ustawiłem wartość 60% , to powinien załączyć się generator pary ( który jest podłączony do przekaźnika nr 1 ) i działać do momentu osiągnięcia wartości ustalonej potencjometrem. Jeżeli osiągnie te wartość automatycznie wyłącza się. Natomiast gdy wartość zadana potencjometrem będzie mniejsza od wartości wskazywanej obecnie wilgotności przez czujnik DHT np. czujnik wskazuję 30% a potencjometrem ustawiłem wartość na np. 20% to powinna załączyć się grzałka ( podłączona do przekaźnika nr 2) która będzie działać do momentu osiągnięcia wartości zadanej potencjometrem. Wiem że na Internecie są podobne kody jednak żaden nie pasuje do mojej koncepcji. Czy mógłby mi ktoś pomóc? Smile
 
Odpowiedź
#2
Żaden kod nie będzie pasował idealnie do tego co wykluło się w Twojej głowie. Zacznij od poradników jeśli chcesz się nauczyć programować lub  zmień dział na dam pracę. Na pewno wrzucałem gdzieś to:
Kod:
// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
 

//Piny przekaźników
const int PPIN1= LED_BUILTIN; //Tu definiujesz do jakiego pinu podlaczas przelacznik1 LED_BUILTIN=13 w UNO
const int PPIN2 = 3; //Tu definiujesz do jakiego pinu podlaczas przelacznik2
const int PPIN3 = 4; //Tu definiujesz do jakiego pinu podlaczas przelacznik3
const int PPIN4 = 5; //Tu definiujesz do jakiego pinu podlaczas przelacznik4

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

//Zmienne
float temp1, temp2, temp3, temp4; //zmienne dla DS18B20 jako liczby float
uint8_t ntemp1=22, ntemp2=24, ntemp3=25, ntemp4=30, htemp1=1,htemp2=2,htemp3=1,htemp4=2;// nastawy termperatur i zmienne histerezy dla temperatur jako liczby calkowite 8bit
unsigned long previousMillis; // zmienna do przechowywania liczby ms
uint8_t liczbaDS,setkims,sekundy,minuty,godziny, dni,flaga100ms, flaga1m,flaga1s, flaga1h, flaga1d;//zmienne 8bit do przechowywania czasu
uint16_t interwal=1000UL; //najmniejsza rozdzielczość zdarzeń wymagana w programie, tu przyjęto 1000ms, im mniejsza tym większy błąd czasu przy zliczaniu mintu/godzin itp.
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature DS18B20(&oneWire);


//FUNCJE
// Mamy 4 przekaźniki, więc napiszy do nich funkcje by było krócej w kodzie. Jak argumenty podamy nr przekaźnika, nastawa i histerezę temperatury oczekiwanej,  temperatura odczytana
bool  wlacz(uint8_t przekaznik, uint8_t ntemp, uint8_t hist, float temp) //funkcja zwraca 1 lub 0 do ustawienia przekaznika
{
 uint8_t grzanie=1; //przekaznik wlacza grzanie dla 1, wlacza chlodzenie dla 0
if( digitalRead(przekaznik)&&grzanie) // sprawdzamy czy przekaźnik był włączony i w jakim trybie pracuje
{
  if(temp>(ntemp+hist))  return 0;
  else return 1;
}
else //jeśli przekaźnik był wyłączony
{
    if(temp<(ntemp-hist))  return 1;
  else return 0;
}
}

//  ustawianie czasu dla każdego komponentu
void obslugaczasu(void)
{
 unsigned long currentMillis = millis(); //zmienna systemowa zliczajaca milisekundy od uruchomienia?
 if ((currentMillis - previousMillis) >= interwal) //jeśli minelo interwal ms czasu
 {
previousMillis=currentMillis; //Reset licznika ms

flaga1s=1;
   
 }
 /*{
  previousMillis=currentMillis; //Reset licznika ms
flaga100ms=1;
setkims++;
 if (setkims>=9)
 {
    flaga1s=1;
    setkims=0;
 }
 }*/
if(flaga1s) //gdy minęła sekunda
{
 sekundy++;
 if (sekundy>=60)
 {
   flaga1m=1;
   sekundy=0;
 }
 
}

if(flaga1m) //gdy minęła minuta
{
 minuty++;
 if (minuty>=60)
 {
   flaga1h=1;
   minuty=0;
 }
}

if(flaga1h) //gdy minęła minuta
{
godziny++;
if (godziny>=24)
 {
   flaga1d=1;
   godziny=0;
 }
}

if(flaga1d) //gdy minęła minuta
{
dni++;

}
}
 
String czas(void) //do testów można sobie skalibrować o ile czas się rozjeżdża na 1h czy dobę i zmodyfikować
{
 String wydruk="";
if(dni<10) wydruk=wydruk+"0";
wydruk=wydruk+String(dni)+"d:";
if(godziny<10) wydruk=wydruk+"0";
wydruk=wydruk+String(godziny)+"g:";
if(minuty<10) wydruk=wydruk+"0";
wydruk=wydruk+String(minuty)+"m:";
if(sekundy<10) wydruk=wydruk+"0";
wydruk=wydruk+String(sekundy)+"s";  
return wydruk;
}
/*
* The setup function. We only start the sensors here
*/
void setup(void)
{
 
 //ustawiamy piny wyjsc:
   pinMode(PPIN1, OUTPUT);
   pinMode(PPIN2, OUTPUT);
   pinMode(PPIN3, OUTPUT);
   pinMode(PPIN4, OUTPUT);
 // start serial port
 Serial.begin(115200);
 Serial.println("Dallas Temperature IC Control Library Demo");
//setWaitForConversion(0);//no wait for conversion, wait itsalve
 // Start up the library
 DS18B20.begin();
liczbaDS=DS18B20.getDeviceCount();
DS18B20.setWaitForConversion(0); //wylaczamy oczekiwanie na przeliczenie temperatury przez DS, odczytamy w innej sekundzie
DS18B20.requestTemperatures();
}

/*
* Main function, get and show the temperature
*/
void loop(void)
{
obslugaczasu();


if (flaga1s) //coś co zrobimy gdy piknie sekunda
{
Serial.println(czas());
 
if(sekundy%2==0) //coś co zrobimy co druga pełną sekunde
 {
temp1=DS18B20.getTempCByIndex(0);
temp2=DS18B20.getTempCByIndex(1);
temp3=DS18B20.getTempCByIndex(2);
temp4=DS18B20.getTempCByIndex(3);

digitalWrite(PPIN1,wlacz(PPIN1, ntemp1, htemp1, temp1)) ;
digitalWrite(PPIN2,wlacz(PPIN2, ntemp2, htemp2, temp2)) ;
digitalWrite(PPIN3,wlacz(PPIN3, ntemp3, htemp3, temp3)) ;
digitalWrite(PPIN4,wlacz(PPIN4, ntemp4, htemp4, temp4)) ;

 // call sensors.requestTemperatures() to issue a global temperature
 // request to all devices on the bus
Serial.print("Requesting temperatures...");    
//należy używać funkcji bez delay itp. opóźnień
DS18B20.requestTemperatures();
Serial.println("DONE");

 }

 
if(sekundy%3==0) //coś co zrobimy co trzecią pełną sekunde
 {
 // After we got the temperatures, we can print them here.
 // We use the function ByIndex, and as an example get the temperature from the first sensor only.
 Serial.print("Temperature for the device 1 (index 0) is: ");
 Serial.println( temp1);
 Serial.print("Temperature for the device 2 (index 1) is: ");
 Serial.println(temp2);
 Serial.print("Temperature for the device 3 (index 2) is: ");
 Serial.println(temp3);
 Serial.print("Temperature for the device 4 (index 3) is: ");
 Serial.println(temp4);    
 }



 if(sekundy%5==0) //coś co zrobimy co piątą pełną sekunde
 {
 // After we got the temperatures, we can print them here.
 // We use the function ByIndex, and as an example get the temperature from the first sensor only.
 Serial.print("stan przekaznika 1:  ");
 Serial.println( digitalRead(PPIN1));
   Serial.print("stan przekaznika 2:  ");
 Serial.println( digitalRead(PPIN2));
   Serial.print("stan przekaznika 3:  ");
 Serial.println( digitalRead(PPIN3));
   Serial.print("stan przekaznika 4:  ");
 Serial.println( digitalRead(PPIN4));
   
 
}
}



if (flaga1m) //coś co zrobimy gdy piknie minuta
{
 
}

 

  //zerujemy flagi
flaga1s=0;
 flaga1m=0;
  flaga1h=0;
   flaga1d=0;    
}
Obsługę wilgotności robi się analogicznie. 
Jest kurs na Forbot i tysiące filmów na Youtube.
 
Odpowiedź
#3
Uczyłem sie programowania C++ trochę. W Twoim kodzie brak tego co opisałem, gdzie tam jest wg Ciebie mowa o ustawianiu czegoś potencjometrem albo jakaś Histereza? Smile nie oczekuję pełnego kodu ale nakierowania w jaki sposób napisać te regulację Smile
 
Odpowiedź
#4
Przeczytaj to: https://forbot.pl/blog/kurs-arduino-srod...owac-id936. Wszystko jest w przykładach Arduino i w tym kursie. W załączonym przykładzie powyżej jest przecież histereza, zamień sobie stałą/zmienną na wartość odczytaną z analoga.
 
Odpowiedź
#5
Mam taki kod , czy jest on dobrze napisany? Co zrobić żeby wyłączyć działanie promiennika jak wiglotność osiągnie wartość zadaną potencjometrem?
Kod PHP:
void loop() // pętla
{
 
pomiar(); //odwolanie do funckji wyswietlania pomiaru

//Regulacja wilgotności
 
if(wilgotnosc_zadana>=wilgotnosc)
 {
 
 digitalWrite(jonizerLOW); //Załączenie generatora
 
 digitalWrite(led_info_jonizerHIGH); //Załączenie diody od generatora
 
}

 if(
wilgotnosc_zadana+5<=wilgotnosc//Histereza 5% wilgotnosci 
 //Taki zapis zapobiega nadmiernemu zalączania/wyłączaniu przekaźnika
 
{
 
 digitalWrite(jonizerHIGH); //Wyłączenie generatora
 
digitalWrite(led_info_jonizerLOW); //Wyłączenie diody od generatora
 
digitalWrite(promiennik,LOW); // zalaczenie promiennika
}

 
Odpowiedź
#6
W przykładzie masz wykorzystane funkcje millis() do zarządzania czasem. Możesz to zrobić po swojemu, ale jakoś zrób, kiedy robisz pomiar, kiedy sprawdzasz wyniki, kiedy informujesz użytkownika.
Po drugie jeśli to ma być jakieś terrarium to usmażysz zwierzątko, dodajesz wilgoci, obniżasz RH podgrzewaniem, dodajesz pary, znowu podgrzewasz, itd. Cały czas rosnąca temperatura obniża RH (wilgotność bezwzględna stale rośnie).
Po trzecie gdzie masz pomiar, domyślam się, że wynikiem pomiaru jest napełnienie zmiennej wilgotność. Histereza powinna być tak ustawiona, że jak jest za niska wilgotność to załącza się generator, potem wyłącza generator i jest też wyłączona grzałka, potem ewentualnie włącza się grzałka, ale u Ciebie od razu po wyłączeniu się generatora załącza się osuszanie grzałką, więc zaraz znowu załączy się generator pary, zwierzątko pożyje w nawiązaniu do p2 jeszcze krócej.
 
Odpowiedź
#7
Tzn to ma być zwykła makieta , bez zwierzątka żadnego - Pan mi właśnie już pomagał dobierać elementy do tej makiety w innym temacie Smile Dodatkowo będą ciągle chodzić dwa wiatraki w celu właśnie dobrej cyrkulacji powietrza. Dlatego tu nie chodzi o zwierzątko , tylko po prostu o pomoc w kodzie programu - jak to ująć w "ifach" aby działało tak jak należy. Nie potrafię właśnie zgrać ze sobą wyłączenia/włączenia promiennika/generatora pary w odpowiednim momencie :/ Problemem w zasadzie jest dla mnie ta wartość zadawana potencjometrem jak się do niej "zabrać" w kodzie, jak ją ustosunkować do wartości mierzonej przez czujnik i jak to zgrać ze sobą w kodzie :/
 
Odpowiedź
#8
Pamiętam, ale przeszedłeś do realizacji bez znajomości programowania, nie zaliczyłeś żadnych podstaw na kursie, nie wiesz, że to o co pytasz jest w przykładach w sekcji ANALOG. Nie nauczę Cię programować na indywidualnym kursie. Dałem Ci przykład z termostatem, sprawdzonym i działającym, doskonale rozumiem, że nie umiesz z tego skorzystać. Zajrzałeś do tego co Ci powiedziałem?, tam są funkcje map i constrain w Analog, przykład Calibration. OK, teraz tam zajrzysz, zrobisz krok dalej, może dwa. Poucz się programować, każdy kolejny krok wykonany z taką pomocą prowadzi Cię obok coraz większej przepaści.
 
Odpowiedź
#9
Tak, już swego czasu czytałem całą pierwszą część kursu z fotbot'a o arduino. Tak jak wspomniałem pisałem " co nieco" w C++( przeczytałem kurs " Od zera do gier kodera") jednak np. napisanie takiego programu w arduino paradoksalnie sprawia mi problem. Niewiem czym on jest wywołany bo przecież arduino, można powiedzieć, że opiera się na C++.
 
Odpowiedź
#10
Nie ma w tym nic dziwnego. Siadając do C++ wiedziałeś czym jest monitor, system operacyjny, katalog, plik. Komputer obsługiwałeś pewnie doskonale. O budowie Atmegi/UNO i czego tam używasz powinieneś wiedzieć co najmniej tyle samo. Dzięki Arduino właściwie można wiedzieć nieco mniej, nie trzeba znać budowy osobno Atmegi, ESP, innych. Chcesz używać led - musisz wiedzieć o led tyle ile możliwe. LED to od razu rezystory, prawo Ohma - od czego zależy moc, napięcie, prąd, rezystancja. Coś pominiesz, czegoś nie wiesz, widzisz dym nad układem. Proste programy robi się tak samo. Jak jednak chcesz połączyć 2 biblioteki w większy projekt, trzeba już wiedzieć, że jak obie wykorzystują ten sam np. timer, to już działać nie będzie. Albo jedna drugiej wyłącza timer lub przerwania. Lekcja z kursu może być uznana za zaliczoną, jeśli umiesz z palca wpisać podobny program, a nie wgrać przykład do Arduino. Wilozadaniowość to ostatnia lekcja drugiej części. Przeczytać wystarczy jak jesteś geniuszem lub zrobiłeś już wszystkie podobne projekty/przykłady, a tylko chcesz uporządkować widzę.
Poza tym wybrałeś naprawdę ambitny temat. Znam osoby po studiach kierunkowych, które tego nie ogarniają, jak bawić się wykresem Moliera. Urządzenia do precyzyjnej regulacji wilgotności w przemyśle farmaceutycznym, serwerowniach kosztują absurdalne pieniądze.
Jednak forum to nie kurs. Jak siedzisz nad projektem sam, nie widzisz rzeczy oczywistych, głupich literówek. Ktoś z boku ze świeżym spojrzeniem dziecka takie rzeczy od razu wyłapie. Przy okazji dzielisz się pomysłami, pomagający też zdobywa doświadczenie. Można czegoś nie wiedzieć, ale jak nie wiesz prawie nic, a w szczególności czego nie wiesz, to daleka droga przed Tobą.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości