• 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
Sterownik ogrzewania wody w basenie.
#1
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;
 }
}
 
Odpowiedź
#2
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ł?).
- Kod z Delay i/lub bez WDT (WDG) to nie kod, to DEMO!
- Wielowątkowość to najczęściej konieczność w dobrym programie.

Dlaczego TFT kolor działa wolno z ArduinoUNO/Mega?
http://er-mik.prv.pl/projekty_avt.php




 
Odpowiedź
#3
Tak ja wygrałem.
Kurs na Forbocie o millis pisze tyle co nic, miganie diodami to nie to samo co opóźnienie z warunkami.
 
Odpowiedź
#4
(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.
- Kod z Delay i/lub bez WDT (WDG) to nie kod, to DEMO!
- Wielowątkowość to najczęściej konieczność w dobrym programie.

Dlaczego TFT kolor działa wolno z ArduinoUNO/Mega?
http://er-mik.prv.pl/projekty_avt.php




 
Odpowiedź
#5
Śmieszny to jesteś Ty i odgrywasz cwaniaka, trochę pokory kolego.
Ludzi oceniasz nie znając ich.
 
Odpowiedź
#6
(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
 
Odpowiedź
#7
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" ?
 
Odpowiedź
#8
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..
 
Odpowiedź
#9
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;
 
Odpowiedź
#10
(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ę!
- Kod z Delay i/lub bez WDT (WDG) to nie kod, to DEMO!
- Wielowątkowość to najczęściej konieczność w dobrym programie.

Dlaczego TFT kolor działa wolno z ArduinoUNO/Mega?
http://er-mik.prv.pl/projekty_avt.php




 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości