Prosty termostat na DS18B20 i przekaźniku
-
- Młodszy majsterkowicz
- Posty: 24
- Rejestracja: 1 maja 2016, 12:14
Re: Prosty termostat na DS18B20 i przekaźniku
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.
Re: Prosty termostat na DS18B20 i przekaźniku
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.
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.
-
- Młodszy majsterkowicz
- Posty: 24
- Rejestracja: 1 maja 2016, 12:14
Re: Prosty termostat na DS18B20 i przekaźniku
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?
Re: Prosty termostat na DS18B20 i przekaźniku
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
Pozdr
-
- Młodszy majsterkowicz
- Posty: 24
- Rejestracja: 1 maja 2016, 12:14
Re: Prosty termostat na DS18B20 i przekaźniku
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 :)
-
- Młodszy majsterkowicz
- Posty: 24
- Rejestracja: 1 maja 2016, 12:14
Re: Prosty termostat na DS18B20 i przekaźniku
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ć?
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ć?
Re: Prosty termostat na DS18B20 i przekaźniku
Jeżeli w oderwaniu od czasu rzeczywistego jako licznik to bez problemu, millis().
Pozery
Pozery
-
- Młodszy majsterkowicz
- Posty: 24
- Rejestracja: 1 maja 2016, 12:14
Re: Prosty termostat na DS18B20 i przekaźniku
A mógłbyś w łopatologicznym skrócie napisać jak to napisać?
Re: Prosty termostat na DS18B20 i przekaźniku
Zazwyczaj pisze to jakoś tak. Oryginał jest w samym Arduino IDE -> przykłady -> blink without delay
Polecam szukać tam rozwiązań często :)
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!
*/
Re: Prosty termostat na DS18B20 i przekaźniku
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ść!
To jest ewidentna bezczelność!
-
- Młodszy majsterkowicz
- Posty: 24
- Rejestracja: 1 maja 2016, 12:14
Re: Prosty termostat na DS18B20 i przekaźniku
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.
Re: Prosty termostat na DS18B20 i przekaźniku
Pokaż, co już zrobiłeś. Wtedy będzie można pomóc.
-
- Młodszy majsterkowicz
- Posty: 24
- Rejestracja: 1 maja 2016, 12:14
Re: Prosty termostat na DS18B20 i przekaźniku
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");
}
}