Skocz do zawartości

Potrzebna pomoc w napisaniu kodu dla UNO z obsługą przekaźników, RTC i czujników temp i DHT


massivenrg

Pomocna odpowiedź

Witajcie.

Zapewne czeka mnie lincz na dzień dobry 😋

Sprawa jest taka - zbudowalem terrarium dla gekonów, postanowiłem róznież, jako że jestem elektronikiem, stworze do tego sterownik. Faktem jest ze sterownik taki mozna kupić ale stwierdzilem ze ogarnę to sam z pomocą kolegi, ktory z arduino jest za pan brat... ALE... kolega ten wyjechal na dłuższy kontrakt służbowy, wraca w moje okolice tylko co drugi weekend wtedy to zycie rodzinne itp itd.

Ja sam zaś z programowaniem mialem dotychczas tyle wspólnego co z budową statków kosmicznych...

Zakupiłem nie tak dawno wszystkie (prawie) podzespoły które bede potrzebował do projektu ale brakuje mi wiedzy z programowania. Bawilem sie troszke z tutorialami i o dziwo wyglada to wszystko nie az tak trudne jak myslalem na początku bo o ile udało mi sie poszczególne elementy odpalić i przetestować to skompilowanie kodu w całość na moje potrzeby to jakaś czarna magia jak narazie dla mnia. Bardzo sie cieszylem ze kumpel pomoże mi stworzyc kod i przy okazji wytlumaczy i nauczy mnie nowych skillsów... no cóż... Jedyne miejsce gdzie przyszło mi na myśl w szukaniu o pomoc to tutaj własnie - jakieś forum ze znawcami - maniakami Arduino.

Bede tutaj bardzo bezpośredni - jeśli bedzie tutaj ktoś kto zechciałby pomóc - oferuje wynagrodzenie za poświęcony czas.

Problem w tym że żyjątka do terrarium pojawią się za około 3 tygodnie - a to niewiele czasu na stworzenie i testowanie, wiec na chwile obecna całe sterowanie mam podlączone na szybko - część na zegarach, część ręcznie.

Krótki opis elementów:

- Arduino UNO

- RTC DS3231 - ale chyba bede musial zmienic na inny ale o tym pozniej wyjasnie jesli wogole bedzie jakies zainteresowanie pomocą

- DHT11

- DHT22

- 4x DS18B20

- 2x 4 relay module

Założenia działania:

- 2 strefy czasowe - dzień / noc

- wyzwalanie przekazników w zależności od zadanej temperatury w strefie czasowej (różna dla dzień / noc) - 2 lub trzy przekazniki z osobnymi ustawieniami

- wyzwalanie przekaźnika w zależności do zadanej wilgotności

- wyzwalanie przekaźnika w ustalonych interwałach - np xx sekund co xxx minut

- 3 przekazniki załączane/ wyłączane w określonych godzinach

w załączeniu wstepny diagram logiki - nie wiem czy bedzie to w miare czytelne i zrozumiale.

Aha jest w jezyku angielskim - mieszkam w jukeju i zeby latwiej mi bylo wytlumaczyc koledze - zrobilem to po angielsku

pozniej musze to podłączyć w sieć lan (jeszcze nie mam modułu - bo nie wiem jaki uzyc) bedzie on sie komuniowal z jakims serwerem, potem ma byc apka na androida - ale to nie jest priortetem.

Na poczatek musze zautomatyzowac sterowanie i parametry - temperatura i wilgotnosc w terrarium.

Mam nadzieję że znajdzie się jakaś dobra duszyczka skora do zdalnej pomocy.

Pozdrawiam, Mariusz

__________

Komentarz dodany przez: Treker

Link do komentarza
Share on other sites

Hm, to raczej oferta pracy, bo przecież w dwa tygodnie nie napiszesz - nawet z pomocą programisty - kodu robiącego to wszystko i jeszcze przygotowanego na przyszłą współpracę z siecią. A tydzień trzeba sobie zostawić na ostateczne testowanie w warunkach bojowych. Z drugiej strony dla osoby piszącej na co dzień programy, ten Twój wygląda raczej prosto. Niestety tego typu rzeczy nie buduje się poprzez klejenie całości z przykładów obsługi poszczególnych elementów - to pewnie już wiesz. Jeśli naprawdę wierzysz, że to napiszesz samodzielnie z ew. zdalną pomocą, będziesz musiał ogarnąć wiele nowych rzeczy. Napisz jak taką pomoc i wspólne pisanie kodu sobie wyobrażasz.

Nie ma tu żadnego "interfejsu użytkownika". Coś przewidujesz? Standardowy wyświetlacz + klawiaturka? Może jakiś mały graficzny? Może zamiast przycisków odbiornik IR i tani pilot? Przynajmniej tyle otworów nie trzeba wiercić w obudowie i bawić się z opisami klawiszków..

BTW: Naprawdę nie ma w Polsce forów poświęconych stricte programowaniu Arduino? Tutaj z założenia są roboty i okolice. Może zapytaj u Atnela? Tam są sami zapaleńcy AVRów.

Link do komentarza
Share on other sites

No moze i brzmi jak oferta pracy, ale bardziej jak płatnej pomocy. Założenia nie są jakoś specjalnie skomplikowane i wydawalo mi sie że napisanie takiego kodu nie bedzie sprawiało wielu kłopotów i nie bedzie aż tak czasochłonne dla kogoś to robi to na codzień.

Szczerze mówiąc, bez owijania w bawełne, myślałem ze ktoś zrobi robote za/dla mnie.

Narazie nie ma interfejsu i nie musi byc - arduino bedzie podłączone non stop do jakiegos kompa robiacego za serwer, wszystkie ustawienia moge sobie zmieniac zdalnie przez VNC albo TeamViewera w samym kodzie. do zmiany beda tylko wartosci graniczne oraz czasy weic mysle że to nie bedzie problemem to odszukac w kodzie i tam robic zmiany. Jak narazie myslalem zeby ominac interfejs żeby przyśpieszyc prace i zeby sterownik jako tako zaczął działać. W późniejszym czasie bedzie możliwośc zabawy i rozbudowy.

Taki sam post wstawiłem na forum arduino polska ale bez odzewu wiec sprobowałem tutaj.

Jesli nie uda się podjąć z nikim współpracy, nic straconego. Mam trzy wyjścia - albo zostane przy dziadowskim sterowaniu na zegarach i przełącznikach albo kupie gotowy sterownik na aledrogo albo powoli bede sam sie edukował, ćwiczył na próbach i błędach i za kilka miesięcy/lat sam dojde co do czego.

Link do komentarza
Share on other sites

Większość tego co chcesz zrealizować można zrobić na timerze, wiem że to mało pomocne ale jeżeli chcesz się pomału czegoś uczyć i pobawić to sprawdź ten post:

https://majsterkowo.pl/forum/tutoriale-f38/gotowiec-4-obsluga-watkow-koniec-z-uciazliwym-delay-t1974.html (wiem, konkurencyjne forum 😋 ).

Mi osobiście ciężko było zrozumieć opis i szybciej z kodu rozgryzłem o co chodzi i wydaje się że można było by w łatwy sposób całość przenieść na twój projekt.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

A ja Ci odradzam tamto "przyjazne" forum, o którym wspomniał @massivenrg. Posty o Arduino są ledwo tolerowane, a z użyciem ESP8266 zamykane, za wylewanie żali o to ban dla autora. Taka sytuacja. A jak widać z założeń tu by się przydał taki moduł zamiast UNO lub przynajmniej jako komunikacja z WIFI, można zrezygnować z RTC, czas byłby synchronizowany z NTP, a dzienny błąd timerów nie jest jakiś dramatyczny (można skalibrować w zależności ile kodu będzie w pętli). Z tym modułem zabawa to po prostu bajka - polecam bibliotekę FSBrowserNG. Cały interfejs robisz przez WWW (trzeba trochę liznąć HTML, JS, CSS - polecam poradniki Mirosław Zelend), jedną komendą można wysłać dane na serwer Thinkspeak i oglądać sobie wykresy w dowolnym miejscu z Internetem, wszystkie pliki konfiguracyjne/WWW są zapisane na wydzielonej części pamięci robiącej za dysk (1-3MB), na kod programu masz 512kB (jak nie wymagasz aktualizacji ONLINE przez WIFI to 1024kB), co przy UNO32kB może być problem, bo biblioteki w Arduino czasami są baardzo rozbudowane i szybko zjadają flash. A aktualizację kodu/zawartości dysku robisz online przez WIFI. Prosty interfejs HTML można też wrzucić bezpośrednio do kodu programu. Cena kilka $.

Jeśli chcesz to zrobić na UNO i wgrywać po prostu nowy setting też nie ma problemu by tak wystartować. Skoro każdy moduł odpaliłeś i działa, to kwestia poukładania sobie tego w pętli głównej.

Zaczynasz od najprostszego elementu i dokonujesz rozdziału czasu na start poszczególnych czynności.

Mogą to być biblioteki typu tickers, timers lub po prostu wykorzystanie wbudowanego licznika milisekund w Arduino. Startujesz np. tylko z DS, zbierasz dane wejściowe, sprawdzasz warunki, ustawiasz flagi i ewentualnie wykonujesz działania na wyjściach.

Kod Arduino na UNO albo ESP (oczywiście funkcje WIFI i specyficzne dla ESP nieujęte):

// 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=1000; //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;   
}

Wiem, masakra, ale ja jestem hydraulikiem bardziej. Nie mniej jednak termostat działa - można wykorzystać do migania ledami na PPIN1-4, a higrostat robi się analogicznie.

Jak przetestujesz i to działa to otwierasz przykład z DHT 11. Uzupełniasz odpowiednie sekcje kodu do już napisanego - załączanie bibliotek, ustawienia globalne do ustawień globalnych (nad setup), pilnujesz by nie pomieszać pinów (np. by nie ładować DS i DHT na pin 2), dodajesz wymagane flagi, zmienne, setup DHT 11 dodajesz do już pracującego kodu w setup, cześć z loop do loop itd. Oglądasz kolejne przykłady i starasz się nie zamotać. W jednej sekundzie bawisz się DS, w kolejnej DHT. Nigdzie nie dajesz opóźnień "delay()", po prostu wybierasz sobie warunkiem dzielenia modulo %, w której sekundzie/minucie/godzinie coś ma się zadziać. Dzień/NOC? wystarczy część bloku loop wrzucić w procedurę i dodać kolejnego if, po którym nadasz nowe wartości zmiennym i wywołasz tę procedurę - tak funkcja jak ta w przykładzie czas(void).

Jak mało pinów cyfrowych to po prostu wykorzystujesz analogowe tak samo jak cyfrowe.

Terrarium najlepiej zabezpieczyć jakimś mechanicznym termostatem, tak by przy testach albo przy jakimś zawieszeniu programu nie usmażyć zawartości (nawet jeśli już ogarniesz Watchdog Arduino). W przykładzie powyżej jak zniknie czujnik DS to pozostałe przesuwają się w tablicy i zawsze nie ma czwartego (ostatniego), a ten pokazuje -127oC, co może mieć nieciekawe konsekwencje dla zawartości terrarium - to jest do oprogramowania. Lepiej byłoby je wołać po ID. Jak czujnik się uszkodzi może też stale pokazywać 85oC (nie dokonuje przeliczenia temperatury). Wymiana czujnika też może spowodować zmianę kolejności w tablicy. Pewnie może się jeszcze ileś tam rzeczy wydarzyć, także testów przed Tobą dużo.

Ale się napisałem - mam pilny projekt do zrobienia 😃.

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dzieki za pomoc. Czytajac kod zaczyba sie to rozjasniac. Dzisiaj bede eksperymentowal. Terrarium jest zabezpieczone swoim termostatem wlasnie w celu zabezpieczenia gdy cos z arduino poszlo nie tak.

Jeszcze raz bardzo dziekuje. Jak cos uda mi sie stowrzyc i utkne to sie zglosze 😉

Pozdro

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.