Prosty termostat na DS18B20 i przekaźniku

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
mateusz070893
Młodszy majsterkowicz
Posty: 24
Rejestracja: 1 maja 2016, 12:14

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: mateusz070893 » 14 maja 2016, 01:21

Generalnie wszystko działa, ale... Gdy zastosowałem wskazówkę stivena i wgrałem program wszystko działało bajecznie. Później wyłączyłem arduino a po ponownym włączeniu guziki od regulacji temperatury zaczęły działać bardzo "ociężale". Na 5 wciśnięć załapuje jedno. Dopiero przy ciągłym trzymaniu przycisku przez kilkanaście sekund można bez nerwicy ustawić temperaturę. Pozmieniałem piny z myślą że to coś da i że będzie działało jak za pierwszym razem, ale efektu brak.

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


stiven
Złota rączka
Posty: 1582
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: stiven » 14 maja 2016, 01:54

W Twoim programie cały kod w loop jest wrzucony do ifa, który sprawdza czy jest połączenie z czujnikiem. Jeśli nie będzie połączenia, to nie będzie odczytu temperatury i wpłynie to również na wyświetlanie i przyciski (skoro raz na jakiś czas przechodzi, to jedynie widać to po problemie z przyciskami). Chyba coś przestało stykać przy czujniku skoro już było dobrze a teraz już nie jest. Wróć do tego kodu, który ja dałem wcześniej. On się niczym nie różni od Twojego, oprócz tego, że wyświetlanie i obsługa przycisku jest niezależna od odczytu temperatury.

Jeśli jednak nie rozwiążesz problemu, to możesz też spróbować zmienić bibliotekę. Do tego czujnika DS18B20 najlepsza jest DallasTemperature.h. Z doświadczenia z forum wiem, że z innymi bibliotekami czasami są problemy, a z tą nie ma.
mateusz070893
Młodszy majsterkowicz
Posty: 24
Rejestracja: 1 maja 2016, 12:14

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: mateusz070893 » 14 maja 2016, 13:28

Wszystko działa :) Pytanie tylko czy cały program jest napisany poprawnie? Czy może zrobiłem coś "okrężną drogą" a dało się zrobić to lepiej?
Awatar użytkownika
Slawek
Starszy majsterkowicz
Posty: 448
Rejestracja: 29 mar 2015, 15:05

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: Slawek » 14 maja 2016, 14:19

Niewiele bo program jest bardzo prosty. Jedynie zamiast delay() należało by użyć funkcji opartej na millis() gdyż w trakcie delay cały program jest zatrzymywany, w tym również odczyt temperatury i ew. zadziałanie przekaźnika, co prawda to niby tylko 50ms ale przy krotności robi się już dłuższa przerwa, pytanie jest czy działanie termostatu jest newralgiczne z punktu widzenia wrażliwości na zmianę temperatury, jeżeli nie, to może zostać :)

Pozdr
mateusz070893
Młodszy majsterkowicz
Posty: 24
Rejestracja: 1 maja 2016, 12:14

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: mateusz070893 » 14 maja 2016, 16:34

Generalnie miał to być termostat z przeznaczeniem na chłodnię/lodówkę. Wydaje mi się że te 50ms nikogo nie zbawi i może być tak jak jest. Jedyne co zauważam w całym moim układzie to to że znaki na wyświetlaczu pulsują. I że arduino nie wyrabia z zasileniem wszystkiego, bo jak załączą się oba przekaźniki to napisy na wyświetlaczu bardzo bledną. Ale widocznie ten typ tak ma. Program planuję jeszcze rozbudować, wsadzić alarm pozostawionych otwartych drzwi poprzez zaaplikowanie krańcówki, i funkcję automatycznego rozmrażania, czyli dezaktywacji programu po wciśnięciu przycisku. Szczerze powiedziawszy nie mam pojęcia jak to zrobić, ale czasu na myślenie niedługo będzie bardzo dużo :)
mateusz070893
Młodszy majsterkowicz
Posty: 24
Rejestracja: 1 maja 2016, 12:14

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: mateusz070893 » 14 maja 2016, 23:00

Wpadłem na pomysł kolejnego featuresa :D Czy da się bez użycia modułu RTC zrealizować odliczanie czasu przez mniej więcej 10-15 sekund? Chciałbym sterować oświetleniem i zrobić prostą funkcję:

if lcd.setBacklight(HIGH)
{
poczekaj 10 sekund;
lcd.setBacklight(LOW);

Jak napisać funkcję czekania, nie blokując przy tym programu? Delay() odpada z wiadomych względów, czym można (jeśli można) go zastąpić?
Awatar użytkownika
Slawek
Starszy majsterkowicz
Posty: 448
Rejestracja: 29 mar 2015, 15:05

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: Slawek » 15 maja 2016, 07:17

Jeżeli w oderwaniu od czasu rzeczywistego jako licznik to bez problemu, millis().

Pozery
mateusz070893
Młodszy majsterkowicz
Posty: 24
Rejestracja: 1 maja 2016, 12:14

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: mateusz070893 » 15 maja 2016, 11:55

A mógłbyś w łopatologicznym skrócie napisać jak to napisać?
piop
Młodszy majsterkowicz
Posty: 1
Rejestracja: 13 lis 2016, 03:07

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: piop » 13 lis 2016, 16:16

Zazwyczaj pisze to jakoś tak. Oryginał jest w samym Arduino IDE -> przykłady -> blink without delay
Polecam szukać tam rozwiązań często :)

Kod: Zaznacz cały

int start = millis(); //zaczynamy naliczanie czasu
  int led = LOW; //na początku dioda była wyłączona
void setup() {
digitalWrite(13, LOW); //na wszelki wypadek wyłączmy diodę
}

void loop() {

//tu można wpisać program

  int cykl = 10000; //zmienna - co ile ms chcemy zmienic status LED
  int teraz = millis(); // po wykonaniu kodu wyżej, mamy już tyle na liczniku
  int czas = teraz - start; //a to jest różnica, tyle czasu upłynęło
  if (czas > cykl)  //sprawdźmy, czy minęło tyle miliskeund co chcieliśmy
  {
    led = digitalRead(13);
    if (led == LOW) {
      digitalWrite(13, HIGH); //zapalamy, jesli było zgaszone
    }
    else {
      digitalWrite(13, LOW); //gasimy zapalone
    }
    start = teraz; //aktualizujemy licznik, tak zeby odliczac nowy cykl
  }

}
/* trzeba pamiętać, że zarówno rejestr millis() jak i zmienna int mogą się przepełnić. Jak wtedy zachowa się program?
 *Dobre ćwiczenie!
 */
Awatar użytkownika
ethanak
Złota rączka
Posty: 764
Rejestracja: 21 lis 2015, 14:41
Kontakt:

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: ethanak » 13 lis 2016, 16:52

No i trzeba pamiętać, że radośnie podstawiając wartość uint32_t do zmiennej typu int16_t możemy otrzymać wyniki mające niewiele wspólnego z rzeczywistością, ale o tym pewnie wiesz ;)
Pisze człowiek ambitnie, a tu przychodzi prostak i wszystko rozumie.
To jest ewidentna bezczelność!
mateusz070893
Młodszy majsterkowicz
Posty: 24
Rejestracja: 1 maja 2016, 12:14

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: mateusz070893 » 21 sty 2019, 21:52

Na początku witam po dłuższej przerwie. Postanowiłem reaktywować nieco temat, gdyż mam problemy z moim układem. Układ sam w sobie działa prawidłowo, termostat załącza i wyłącza z histerezą 0.4 stopnia. Potrzebuję jednak dodać dwie funkcje i nie wiem jak to rozegrać. Jedną z nich ma być krańcówka, która po wciśnięciu ma wyświetlać tekst na wyświetlaczu i załączać buzzer, nie blokując przy tym pracy programu głównego. Druga to po wciśnięciu przycisku ma dezaktywować program, uruchomić przekaźnik i wyświetlić tekst na wyświetlaczu. próbowałem już różnych rozwiązań, za każdym razem kompilator wywalał błędy. Jako że już nie mam siły do tego, proszę o pomoc.
Awatar użytkownika
Marhef
Złota rączka
Posty: 1168
Rejestracja: 18 lis 2011, 02:18

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: Marhef » 22 sty 2019, 09:57

Pokaż, co już zrobiłeś. Wtedy będzie można pomóc.
mateusz070893
Młodszy majsterkowicz
Posty: 24
Rejestracja: 1 maja 2016, 12:14

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: mateusz070893 » 22 sty 2019, 16:19

Kod: Zaznacz cały

#include <OneWire.h>
#include <DS18B20.h>
#include <LiquidCrystal_I2C.h>
#define ONEWIRE_PIN 8 // Numer pinu do którego podłaczasz czujnik
#define BACKLIGHT_PIN 3
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Adres wyświetlacza
byte address[8] = {0x28, 0xFF, 0xC, 0x77, 0xC2, 0x15, 0x1, 0x16}; // Adres czujnika
OneWire onewire(ONEWIRE_PIN);
DS18B20 sensors(&onewire);

float set;
float temperature;

void setup() 
{
pinMode(13, INPUT_PULLUP); //przycisk rozmrażania
pinMode(12, INPUT_PULLUP); //przycisk temp +
pinMode(11, INPUT_PULLUP); //przycisk temp -
pinMode(10, INPUT_PULLUP); //przycisk krańcówka do drzwi
pinMode(9, OUTPUT); //buzzer
pinMode(7, OUTPUT); //przekaźnik 1
pinMode(6, OUTPUT); //przekaźnik 2
pinMode(5, OUTPUT); //przekaźnik 3
pinMode(4, OUTPUT); //przekażnik 4
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, HIGH);
digitalWrite(4, HIGH);
set=4;


sensors.begin();
lcd.begin(20,4);
lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
lcd.setBacklight(HIGH); //włączanie podświetlenia
}

void loop() 
{

if (sensors.available())
{
sensors.request(address);
temperature = sensors.readTemperature(address);
}
//Wyświetlenie tekstu na wyświetlaczu
lcd.setCursor(0,0);
lcd.print("Akt:");
lcd.setCursor(0,1);
lcd.print(temperature);
lcd.print(F("*C    "));
lcd.setCursor(10,0);
lcd.print("Ust:");
lcd.setCursor(10,1);
lcd.print(set);
lcd.print(F("*C    "));
lcd.setCursor(0,2);
lcd.print("Sprezarka:");
lcd.setCursor(0,3);
lcd.print("Oswietlenie: ");
digitalWrite(9, HIGH);

//przycisk a temperatura

if(digitalRead(12) == LOW)
{
  delay(50);
  set++;
}

if(digitalRead(11) == LOW)
{
  delay(50);
  set--;
}

//porównanie temp zadanej z ustawioną
if(temperature >= set+0.2) 
{
  digitalWrite(7, LOW);
  lcd.setCursor(13,2);
  lcd.print("   ");
  lcd.setCursor(13,2);
  lcd.print("ON");
  lcd.setCursor(13,3);
  lcd.print("   ");
  lcd.setCursor(13,3);
  lcd.print("OFF");
}

if(temperature <= set-0.2) 
{
  digitalWrite(7, HIGH);
  lcd.setCursor(13,2);
  lcd.print("   ");
  lcd.setCursor(13,2);
  lcd.print("OFF");
  lcd.setCursor(13,3);
  lcd.print("   ");
  lcd.setCursor(13,3);
  lcd.print("OFF");
}
}
Program aktualnie realizuje termostat, załączanie i wyłączanie przekaźnika przy przekraczaniu ustawionej temperatury.
ODPOWIEDZ

Strony partnerskie: