Arduino Polska Forum
Sterownik ogrzewania wody w basenie. - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: "Projekt Arduino Polska" (https://forum.arduinopolska.pl/dzial-projekt-arduino-polska)
+--- Dział: Arduino dla domu (https://forum.arduinopolska.pl/dzial-arduino-dla-domu)
+--- Wątek: Sterownik ogrzewania wody w basenie. (/watek-sterownik-ogrzewania-wody-w-basenie)

Strony: 1 2


Sterownik ogrzewania wody w basenie. - kagiva - 13-06-2019

Witam.

Robię sterownik j.w. i mam problem z millis.
Proszę o radę jak zastąpić delay, które teraz do testów jest małe a docelowo musi być ok 2min ,funkcją millis.

Kod:
int POMPA = A1;
int FILTR = A2;
int TEMP_POMPY = 0;
int TB = 0;
int TD = 0;
int to = 0;

unsigned long ACZ = 0;
unsigned long PCZ = 0;
unsigned long RCZ = 0;


#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress TempBas = {0x28, 0xAA, 0xD3, 0x73, 0x18, 0x13, 0x2, 0xD7 };
DeviceAddress TempDach = {0x28, 0xAA, 0x2F, 0xB8, 0x1A, 0x13, 0x2, 0xB2 };

LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 20 chars and 4 line display



void setup()
{
 lcd.init();                      // initialize the lcd
 lcd.init();
 sensors.begin();
 // Print a message to the LCD.
 lcd.backlight();
 lcd.setCursor(0, 0);
 lcd.print("BASEN      |PH");
 lcd.setCursor(0, 1);
 lcd.print("DACH       |REDOX");
 lcd.setCursor(0, 2);
 lcd.print("DOMEK      |POMPA");
 lcd.setCursor(0, 3);
 lcd.print("ZEWN.      |FILTR -");
 pinMode(POMPA, OUTPUT);
 pinMode(FILTR, OUTPUT);
 digitalWrite(POMPA, HIGH);
 digitalWrite(FILTR, HIGH);
}


void loop()
{
 sensors.requestTemperatures();
 lcd.setCursor(6, 0);
 lcd.print(sensors.getTempC(TempBas), 1);
 int TB = sensors.getTempCByIndex(0);
 lcd.setCursor(6, 1);
 lcd.print(sensors.getTempC(TempDach), 1);

 int TD = sensors.getTempCByIndex(1);

 TEMP_POMPY = TD - TB;
 lcd.setCursor(16, 0);
 lcd.print(TEMP_POMPY);
 lcd.setCursor(16, 1);
 //lcd.print(TD),1;

 ACZ = millis();

 if (TEMP_POMPY >= 3) {
   digitalWrite(POMPA, LOW);
   lcd.setCursor(18, 2);
   lcd.print("*");
   RCZ = ACZ - 5000UL;
 }

 if (TEMP_POMPY <= 2) {
   digitalWrite(POMPA, HIGH);
   lcd.setCursor(18, 2);
   lcd.print("-");
 }

 if (TEMP_POMPY >= 3) {
   delay(5000);
   digitalWrite(FILTR, LOW);
   lcd.setCursor(18, 3);
   lcd.print("*");
   to = 1;
 }


 if ((TEMP_POMPY <= 2) && (to == 1)) {
   delay(5000);
   digitalWrite(FILTR, HIGH);
   lcd.setCursor(18, 3);
   lcd.print("-");
   to = 0;
 }
}



RE: Sterownik ogrzewania wody w basenie. - es2 - 13-06-2019

Kurs Arduino na Forbocie (którego osobiście nie lubię ale to nie znaczy, że jest zły) wszystko wyjaśni.
Nie licz, że na forum, ktoś (łoś) napisze soft za Ciebie. To się zdarza, ale i główna wygrania w Lotto też się zdarza (znasz kogoś co główna wygrana otrzymał?).


RE: Sterownik ogrzewania wody w basenie. - kagiva - 13-06-2019

Tak ja wygrałem.
Kurs na Forbocie o millis pisze tyle co nic, miganie diodami to nie to samo co opóźnienie z warunkami.


RE: Sterownik ogrzewania wody w basenie. - es2 - 13-06-2019

(13-06-2019, 20:43)kagiva napisał(a): Kurs na Forbocie o millis pisze tyle co nic, miganie diodami to nie to samo co opóźnienie z warunkami.
Jeśli tego nie rozumiesz, to zacznij "od przedszkola". Kurs C/C++, kurs Arduino. PO ok 3..6 miesięcy stwierdzisz, że pytanie, które zadajesz są po prostu śmieszne.


RE: Sterownik ogrzewania wody w basenie. - kagiva - 13-06-2019

Śmieszny to jesteś Ty i odgrywasz cwaniaka, trochę pokory kolego.
Ludzi oceniasz nie znając ich.


RE: Sterownik ogrzewania wody w basenie. - Jarewa0606 - 13-06-2019

(13-06-2019, 20:43)kagiva napisał(a): Tak ja wygrałem.
Kurs na Forbocie o millis pisze tyle co nic, miganie diodami to nie to samo co opóźnienie z warunkami.

Dobrze pisze, tylko trzeba zrozumieć Wink

A to tylko proste zadanie odejmowania...

if(A-B>C){
 B=A
}

A-millis
B-ostatni czas spełnionego warunku
C-nasz czas do spełnienia warunku


RE: Sterownik ogrzewania wody w basenie. - kagiva - 13-06-2019

Wszystko fajnie ,tylko ostatni czas spełnionego warunku jako zmienna z użyciem millis będzie też się zmieniał i warunek if nie zostanie spełniony.

Albo ja nie rozumię tego - też tak może być.

Założenie jest takie aby po osiągnięciu progu histerezy załączyła się pompa a po niej w zadeklarowanym odstępie czasu załączył się filtr.
Program nie może się zatrzymać, gdyż nie będzie zbierał informacji z czujników temperatury.

Jak mam rozumieć "czas spełnionego warunku" ?


RE: Sterownik ogrzewania wody w basenie. - Jarewa0606 - 13-06-2019

Ostatni czas spełnianego warunku zmienia się dokładnie o poprzedni mills+nasz czas do spełnienia warunku, czyli warunek sie spełnia co nasz czas do spełnienia warunku.

Czyli:

5-2>1.... spełniony warunek
8-6>1...spełniony warunek
11-9>1...spełniony warunek

Tak to wygląda w pętli..

Twoje załozenie jest dobre ale raczej tylko na funkci millis tego nie osiągniesz musisz użyć tez operatory logiczne..


RE: Sterownik ogrzewania wody w basenie. - kagiva - 13-06-2019

Cały czas brakuje mi jednej zmiennej, która była by stała do momentu kiedy millis przekroczy warunek millis+czas opóźnienia.

Kod:
if (TEMP_POMPY >= 3) {                        //włączenie pompy przy wzroście temperatury
   digitalWrite(POMPA, LOW);
   lcd.setCursor(18, 2);
   lcd.print("*");
   ACZ = millis(); // aktualny czas

if (TEMP_POMPY >= 3) {                       //włączenie filtra przy wzroście temperatury
//    delay(5000);                           // tu ma nastąpić zwłoka zamiast delay - millis
    digitalWrite(FILTR, LOW);      
    lcd.setCursor(18, 3);
    lcd.print("*");
    to = 1;



RE: Sterownik ogrzewania wody w basenie. - es2 - 13-06-2019

(13-06-2019, 21:42)kagiva napisał(a): Śmieszny to jesteś Ty i odgrywasz cwaniaka, trochę pokory kolego.
Ludzi oceniasz nie znając ich.
Kaszpirowski, Nowak, Rydzyk, Jarek.....długa lista... nie znają, oceniają i jest "git"?
Frajerów nie sieją, sami się rodzą!

Nie widzę sensu tłumaczyć "oczywistej oczywistości". Jak kolega dojrzeje (intelektualnie) to widzę sens dalszej dyskusji. Teraz, to....moja klawiatura nie przyjmuje tego, co chciałbym napisać.
Masz kolego problemy z "podstawowymi podstawami", szkoda czasu na uczenie kogoś, kto uważa, że wszystko wie lepiej. Może zapiszę się na kurs programowania u kolegi? Co np nadmiarowo daje każda funkcja irq w avr gdy jest kompilowana przez avr-gcc?
Jak zrobić pseudo-wielopoziomowy system przerwań w AVR mega/tiny?
Jak obsłużyć programowo emulacje 1-Wire w overdrive dla AVR mega/tiny?
Mało pytań? Dać więcej?

Nie sądzę aby w AVR coś mogło mnie zaskoczyć. To, że teraz pracuję na ARM wynika głównie z pieniędzy. Jak klient chce, mogę zrobić gorszy, droższy, mniej rozwojowy projekt na AVR, jego sprawa. Płaci i wymaga! Jak sie klient zaprze, to i w Arduino IDE to zrobię (typowo, kasa razy 4). Klient nasz pan!. Z8? Nie ma sprawy, robię! Gorszego uC nie nam, ale jak klient płaci razy 10, to i na tym badziewiu zrobię!