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

Prosty termostat na DS18B20 i przekaźniku

Post autor: mateusz070893 » 1 maja 2016, 12:24

Witam :) Jest to mój pierwszy post na forum gdyż niedawno zacząłem zabawę z Arduino. Próbuję zrobić prosty termostat na czujniku DS18B20 i module 2 przekaźników. Napotkałem jednak na problem. Program działa tak jak bym chciał, jednak po osiągnięciu założonej temperatury i załączeniu przekaźnika, zamiast czekać aż temperatura spadnie i wyłączyć przekaźnik to on cyklicznie się załącza i wyłącza. Tak więc generalnie program działa jak powinien, tylko zamiast stałego załączenia przekaźnika działa on jak kierunkowskaz. Nie wiem jak obejść ten problem, gdyż z programowaniem miałem do czynienia tylko przez 1 semestr na studiach i teraz od kilku dni. Poniżej zamieszczam kod, który skleiłem z kilku innych, znalezionych w internetach:

Kod: Zaznacz cały

#include <LiquidCrystal.h>
#include <DS3231.h>

#include <OneWire.h>
#include <DS18B20.h>

#define ONEWIRE_PIN 13
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
DS3231 clock;
RTCDateTime dt;
// Adres czujnika
byte address[8] = {0x28, 0xFF, 0xC, 0x77, 0xC2, 0x15, 0x1, 0x16};

OneWire onewire(ONEWIRE_PIN);
DS18B20 sensors(&onewire);

void setup() {
  while(!Serial);
  Serial.begin(250000);
  Serial.println("Initialize DS3231");;
  clock.begin();
  pinMode(12, OUTPUT);

  sensors.begin();
  sensors.request(address);
}

void loop() {
  if (sensors.available())
  {
  
    float temperature = sensors.readTemperature(address);

    Serial.print(temperature);
    Serial.println(F(" 'C"));
    lcd.begin(16,2);
    lcd.setCursor(0,0);
    lcd.print("Temperatura:");
 lcd.setCursor(0,1);
 lcd.print(temperature);
 lcd.setCursor(11,1);
 lcd.print(F(" *C"));

    sensors.request(address);
 
  

 lcd.setCursor(7,1);
  lcd.print(clock.readTemperature()); 
  delay(1000);

if (temperature > 25)
digitalWrite(12, LOW);
delay(1000);
if (temperature < 30);
digitalWrite(12, HIGH);
delay(500);
  
}
}

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


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

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: mateusz070893 » 1 maja 2016, 14:07

Generalnie nie myślałem o przedziałach. Założenie było takie że przekaźnik jest wyłączony aż do zadanej w programie temperatury. Po jej osiągnięciu się załącza aż do ponownego spadku temperatury. Po obniżeniu temperatury ma się wyłączać. Takie sterowanie wentylatorem chłodzącym np wzmacniacz. A tak właściwie to część dużo większego projektu a mianowicie termostatu elektronicznego z wyświetlaczem i z temperaturą ustawianą klawiaturą numeryczną (póki co ustawiona na sztywno w programie). Ale chciałem zacząć od czegoś prostszego, żeby później sukcesywnie zwiększać możliwości projektu :) Dziękuję za pomoc, teraz wszystko działa jak należy i mogę brać się za integrację klawiatury. Tylko szczerze powiedziawszy nie mam pojęcia jak się za to zabrać :D
trolodk
Majsterkowicz
Posty: 71
Rejestracja: 1 sty 2015, 17:49

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: trolodk » 1 maja 2016, 21:36

Klawiatura generalnie jest prosta. Ale zapoznaj się z kilkoma poradnikami, bo możesz ją sterować przez jeden pin wejściowy analogowy, albo prościej - każdy klawisz podpiąć pod jakieś wejście procesora i jak pojawi się na nim stan niski/wysoki* to znaczy że wciśnięty został dany klawisz.

-----------------
* - niepotrzebne skreślić.
mateusz070893
Młodszy majsterkowicz
Posty: 24
Rejestracja: 1 maja 2016, 12:14

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: mateusz070893 » 2 maja 2016, 13:12

Odnośnie klawiatury to mam dwie wizje. Jedna to taka że użyję guzików na shieldzie wyświetlacza (nie wiem niestety jak one są podłączone i jak je uruchomić) albo klawiatury membranowej, tylko najpierw muszę zrobić przejściówkę na ekspanderze pod I2C. wolałbym sterować klawiszami wyświetlacza, tylko kompletnie nie mam pojęcia jak je uruchomić i jak napisać program który będzie mi zwiększał ustawioną na sztywno w programie temperaturę po naciśnięciu danego przycisku. Aktualnie jestem na etapie działającego termostatu z sygnalizacją stanu przekaźnika na wyświetlaczu. I stoję bo nie ogarniam klawiatury. Mógłby ktoś mnie naprowadzić jak to ogarnąć? Kod mojego programu:

Kod: Zaznacz cały

#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DS18B20.h>
// Numer pinu do którego podłaczasz czujnik
#define ONEWIRE_PIN 13
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// Adres czujnika
byte address[8] = {0x28, 0xFF, 0xC, 0x77, 0xC2, 0x15, 0x1, 0x16};

OneWire onewire(ONEWIRE_PIN);
DS18B20 sensors(&onewire);

void setup() {
pinMode(12, OUTPUT);

  sensors.begin();
  sensors.request(address);
}

void loop() {
  if (sensors.available())
  {
  float temperature = sensors.readTemperature(address);
lcd.begin(16,2);
lcd.setCursor(0,0);
lcd.print("Temperatura:");
lcd.setCursor(0,1);
lcd.print(temperature);
lcd.setCursor(5,1);
lcd.print("*C");
sensors.request(address);
 

if(temperature >= 25) {
  digitalWrite(12, LOW);
  lcd.setCursor(10,1);
  lcd.print("ON");
}
else {
  digitalWrite(12, HIGH);
  lcd.setCursor(10,1);
  lcd.print("OFF");
}
if (temperature > 30) {
   lcd.setCursor(14,1);
  lcd.print("!!");
  
}
if (temperature > 40)
{
  lcd.clear();
  lcd.setCursor(3,0);
lcd.print("Temperatura");
lcd.setCursor(2,1);
lcd.print("zbyt wysoka!");
}
  // tu umieść resztę twojego programu
  // Będzie działał bez blokowania
}
}
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: stiven » 2 maja 2016, 16:04

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

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: mateusz070893 » 3 maja 2016, 01:57

Coś jest nie tak z tym linkiem bo wyświetla mi się coś w stylu "nie odnaleziono strony" :(

edit:
A powiedzcie mi jak zapisać program który realizuje coś takiego:
jeśli wcisnę guzik (stan wysoki na pinie arduino) to żeby dodawało 0,5 do wartości temperatury ustawionej jako próg zadziałania przekaźnika (czyli zadanej)

Zapewne będzie trzeba zadeklarować zmienną która będzie naszą temperaturą zadaną i napisać kawałek programu powiązujący naciśnięcie guzika ze zmienną, tylko mam problem w postaci umiejętności programowania na poziomie przedszkolaka. Jeśli ktoś planuje się teraz oburzyć i powiedzieć że nic nie umiem tylko liczę na gotowca to zrozumiem. Tylko niech oprócz oburzania się naprowadzi mnie w jakiś sposób na rozwiązanie mojego problemu. A tym którzy będą mieli cierpliwość pokazać być może setny raz jak to ogarnąć bardzo dziękuję :)
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: stiven » 3 maja 2016, 10:51

http://www.dfrobot.com/wiki/index.php?t ... :_DFR0009)

Wcześniej nie dałem znaczników url i wycięło na końcu nawias ) z linka.
Awatar użytkownika
Marhef
Złota rączka
Posty: 1095
Rejestracja: 18 lis 2011, 02:18

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: Marhef » 3 maja 2016, 11:01

mateusz070893 pisze:Coś jest nie tak z tym linkiem bo wyświetla mi się coś w stylu "nie odnaleziono strony" :(

edit:
A powiedzcie mi jak zapisać program który realizuje coś takiego:
jeśli wcisnę guzik (stan wysoki na pinie arduino) to żeby dodawało 0,5 do wartości temperatury ustawionej jako próg zadziałania przekaźnika (czyli zadanej)

Zapewne będzie trzeba zadeklarować zmienną która będzie naszą temperaturą zadaną i napisać kawałek programu powiązujący naciśnięcie guzika ze zmienną, tylko mam problem w postaci umiejętności programowania na poziomie przedszkolaka. Jeśli ktoś planuje się teraz oburzyć i powiedzieć że nic nie umiem tylko liczę na gotowca to zrozumiem. Tylko niech oprócz oburzania się naprowadzi mnie w jakiś sposób na rozwiązanie mojego problemu. A tym którzy będą mieli cierpliwość pokazać być może setny raz jak to ogarnąć bardzo dziękuję :)
Zmieniłbym założenia. Podłącz przycisk w ten sposób, żeby zwierał do masy (GND). Wtedy w setup() deklarujesz pin, do którego podłączysz przycisk jako INPUT_PULLUP. A wciśnięcie przycisku sprawdzasz funkcją if(). W Twoim przypadku będzie to:

Kod: Zaznacz cały

if(digitalRead(przycisk) == 0)
  zmienna = zmienna + 0.5;
A jeśli chcesz, żeby koniecznie po naciśnięciu przycisku był podawany stan wysoki, to deklarujesz w setup taki pin jako INPUT, w warunku zmieniasz "== 0" na "!= 0". Tylko wtedy musisz przycisk podłączyć przez rezystor (np. 10k) do GND.
W każdym przypadku musisz zwrócić uwagę na coś, co nazywa się "drganiem styków"

Moja rada: zanim zaczniesz robić coś zaawansowanego, przerób wszystkie przykłady z arduino IDE
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: stiven » 3 maja 2016, 11:13

Jak chce korzystać z przycisków z lcd schielda, to nie zrobi ani tak jak chce, ani z INPUT_PULLUP, bo tam przyciski są na zrobione na drabince rezystorowej i połączone z pinem A0.
http://majsterkowo.pl/drabinka-rezystor ... go-zlacza/
mateusz070893
Młodszy majsterkowicz
Posty: 24
Rejestracja: 1 maja 2016, 12:14

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: mateusz070893 » 3 maja 2016, 12:30

Guziki shielda ogarnąłem, odczytałem rezystancje każdego przycisku. Chcę zagospodarować 2 z nich (góra i dół) których wciskanie będzie zwiększało lub zmniejszało ustawioną temperaturę o 1 stopień. Tylko nie wiem jak zapisać formułę "jeśli przycisk do góry, dodaj 1 do temperatury ustawionej, jeśli przycisk w dół, odejmij 1 od temperatury ustawionej"
Aktualny kod programu:

Kod: Zaznacz cały

#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DS18B20.h>
// Numer pinu do którego podłaczasz czujnik
#define ONEWIRE_PIN 13
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// Adres czujnika
byte address[8] = {0x28, 0xFF, 0xC, 0x77, 0xC2, 0x15, 0x1, 0x16};

OneWire onewire(ONEWIRE_PIN);
DS18B20 sensors(&onewire);
int buttonPin = 0;
int buttonValue;
int ile;

void setup() {
pinMode(12, OUTPUT);

  sensors.begin();
  sensors.request(address);
}

void loop() {
  if (sensors.available())
  {
  float temperature = sensors.readTemperature(address);
  float set = 30;
lcd.begin(16,2);
lcd.setCursor(0,0);
lcd.print("Akt:");
lcd.setCursor(4,0);
lcd.print(temperature);
lcd.setCursor(10,0);
lcd.print("*C");
lcd.setCursor(0,1);
lcd.print("Ust:");
lcd.setCursor(4,1);
lcd.print(set);
lcd.setCursor(10,1);
lcd.print("*C");
sensors.request(address);
 

if(temperature >= set) {
  digitalWrite(12, LOW);
  
}
else {
  digitalWrite(12, HIGH);
  
}
if (buttonValue > 125 && buttonValue <135)
{
  ile = 1;
}
else if (buttonValue > 300 && buttonValue < 310)
{
  ile = -1;
}
else
{
  ile = 0;
}

  // tu umieść resztę twojego programu
  // Będzie działał bez blokowania
}
}
Przy okazji dziękuję za pomoc w uruchomieniu guzików na shieldzie :)
Awatar użytkownika
Marhef
Złota rączka
Posty: 1095
Rejestracja: 18 lis 2011, 02:18

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: Marhef » 3 maja 2016, 12:48

Zmodyfikuję w Twoim kodzie. Zmiany na czerwono. BTW, nie wie ktoś, dlaczego nie mogę modyfikować czcionki w znacznikach code?


#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DS18B20.h>
#define ONEWIRE_PIN 13 // Numer pinu do którego podłaczasz czujnik
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // piny do których podłączasz LCD
byte address[8] = {0x28, 0xFF, 0xC, 0x77, 0xC2, 0x15, 0x1, 0x16}; // Adres czujnika
OneWire onewire(ONEWIRE_PIN);
DS18B20 sensors(&onewire);
int buttonPin = A0;
int buttonValue;
int ile;
int temperatura = 30;

void setup()
{
pinMode(12, OUTPUT);
sensors.begin();
sensors.request(address);
}

void loop()
{
if (sensors.available())
{
float temperature = sensors.readTemperature(address);
float set = 30;
lcd.begin(16,2);
lcd.setCursor(0,0);
lcd.print("Akt:");
lcd.setCursor(4,0);
lcd.print(temperature);
lcd.setCursor(10,0);
lcd.print("*C");
lcd.setCursor(0,1);
lcd.print("Ust:");
lcd.setCursor(4,1);
lcd.print(set);
lcd.setCursor(10,1);
lcd.print("*C");
sensors.request(address);

if(temperature >= set) {
digitalWrite(12, LOW);
}
else {
digitalWrite(12, HIGH);
}

buttonValue = analogRead(buttonPin)
if (buttonValue > 125 && buttonValue <135)
{
ile = 1;
}
else if (buttonValue > 300 && buttonValue < 310)
{
ile = -1;
}
else
{
ile = 0;
}

temperatura += ile;
}
}
mateusz070893
Młodszy majsterkowicz
Posty: 24
Rejestracja: 1 maja 2016, 12:14

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: mateusz070893 » 3 maja 2016, 13:15

Dzięki za pomoc, ale wciskanie guzików nadal nie zmienia wartości temperatury ustawionej
Awatar użytkownika
Marhef
Złota rączka
Posty: 1095
Rejestracja: 18 lis 2011, 02:18

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: Marhef » 3 maja 2016, 13:19

eee, mój błąd. W linii:
"temperatura += ile;"
zamień temperatura na set. Pomyliłem zmienne. I usuń na początku int temperatura = 30;
mateusz070893
Młodszy majsterkowicz
Posty: 24
Rejestracja: 1 maja 2016, 12:14

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: mateusz070893 » 3 maja 2016, 13:29

Dalej nic. Jak było 30 stopni ustawione tak pomimo wciskania przycisków jest nadal
Awatar użytkownika
Marhef
Złota rączka
Posty: 1095
Rejestracja: 18 lis 2011, 02:18

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: Marhef » 3 maja 2016, 13:45

Masz możliwość sprawdzić, co jest wciśnięte?
Jesteś pewien, że dobrze dobrałeś wartości dla przycisku?
mateusz070893
Młodszy majsterkowicz
Posty: 24
Rejestracja: 1 maja 2016, 12:14

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: mateusz070893 » 3 maja 2016, 13:49

Wartości odczytałem za pomocą małego programiku w serial monitorze. Jak nie jest wciśnięty żaden to jest 1023, reszta to:
SELECT - 720
LEFT - 477
RIGHT - 0
UP - 130
DOWN - 304
mateusz070893
Młodszy majsterkowicz
Posty: 24
Rejestracja: 1 maja 2016, 12:14

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: mateusz070893 » 12 maja 2016, 00:51

Porzuciłem wizję ustawiania temperatury za pomocą shielda i przycisków na nim. Stwierdziłem że (chyba) najprostszym rozwiązaniem będzie zagospodarowanie 2 pinów jako wejścia i podłączenie do nich przełączników. Po wciśnięciu przełącznika na wejście arduino będzie podawane +5V a program to odczyta i zwiększy bądź zmniejszy zadaną temperaturę. Tak miało być... O ile ze zrobieniem dwuprzyciskowego minipilota nie miałem problemu, to strona programowa niestety kuleje. Zadeklarowałem piny jako wejścia, napisałem funkcje if dla obu przycisków ale niestety temperatura zadana jest niewzruszona pomimo wciskania przycisków. Funkcja była mniej więcej taka:
if(digitalRead(8) == HIGH)
{set =+1;}
if(digitalRead(9) == HIGH)
{set =-1;}
Co może być nie tak? Dlaczego mój program nie chce współpracować z żadnymi klawiszami? A może jest jakiś inny sposób na zmienianie tej temperatury? Enkoder? Wszelkie pomysły mile widziane
Awatar użytkownika
Marhef
Złota rączka
Posty: 1095
Rejestracja: 18 lis 2011, 02:18

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: Marhef » 12 maja 2016, 08:37

A zrobiłeś podciągnięcie przez rezystor do GND?
Spróbuj zrobić tak: podłącz przycisk do pinu arduino i do GND, w setup() zadeklaruj ten pin jako INPUT_PULLUP, a w funkcji wykrywaj wciśnięcie jako stan niski. I po wciśnięciu odczekaj kilka(naście) milisekund (delay(50); myślę, że wystarczy).

A w ogóle, to masz błąd w składni. Zamiast =+ powinno być +=. Taka mała literówka.
mateusz070893
Młodszy majsterkowicz
Posty: 24
Rejestracja: 1 maja 2016, 12:14

Re: Prosty termostat na DS18B20 i przekaźniku

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

Oba sposoby nie działają. Ustawianie temperatury ani drgnie, na wyświetlaczu nic się nie zmienia. Jeśli dobrze zrozumiałem to kod powinien wyglądać tak:

Kod: Zaznacz cały

#include <OneWire.h>
#include <DS18B20.h>
#include <LiquidCrystal_I2C.h>
#define ONEWIRE_PIN 13 // Numer pinu do którego podłaczasz czujnik

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);

void setup() 
{
pinMode(12, OUTPUT);
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
sensors.begin();
sensors.request(address);
lcd.begin(20,4);
}

void loop() 
{
if (sensors.available())
{
float temperature = sensors.readTemperature(address);
float set;

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("Przekaznik 1:");
lcd.setCursor(0,3);
lcd.print("Przekaznik 2:");
sensors.request(address);
if(digitalRead(2) == LOW)
delay(50);{
set++;
}
if(digitalRead(3) == LOW)
delay(50);{
set--;
}

if(temperature >= set) 
{
  digitalWrite(12, LOW);
  digitalWrite(11, LOW);
  lcd.setCursor(14,2);
  lcd.print("   ");
  lcd.setCursor(14,2);
  lcd.print("ON");
  lcd.setCursor(14,3);
  lcd.print("OFF");
}
else 
{
  digitalWrite(12, HIGH);
  digitalWrite(11, LOW);
  lcd.setCursor(14,2);
  lcd.print("   ");
  lcd.setCursor(14,2);
  lcd.print("OFF");
  lcd.setCursor(14,3);
  lcd.print("OFF");
 
}
}
}
Natomiast jeśli źle zrozumiałem to nie ma prawa działać. W każdym bądź razie już naste podejście robię, zmieniam piny arduino, zmieniam system z guzików na pinach analogowych na guziki na pinach cyfrowych, z 10 switchy podłączałem z myślą że jakiś jest uszkodzony no i nadal nic.
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: stiven » 13 maja 2016, 02:34

Krapi pisze:

Kod: Zaznacz cały

float set;
ustal wartosć początkową dla pewności
Tą deklaracje trzeba wywalić z loop, bo tak to ta zmienna jest inicjowana za każdym wykonaniem pętli, czyli zawsze zerowana, a nie może być. Tak samo bez sensu byłoby ustalenie wartości początkowej pozostawiając deklaracje w loop.
Zmienna temperature też dla bezpieczeństwa powinna być zadeklarowana globalnie.
Krapi pisze:

Kod: Zaznacz cały

if(digitalRead(2) == LOW)
delay(50);{
set++;
}
if(digitalRead(3) == LOW)
delay(50);{
set--;
}
co to są za klamry po delay?
Z tymi klamrami to jest namieszane, już od początku, w pierwszym ifie w loop powinien być sam odczyt temperatury. No i te klamerki w tych dwóch ifach tutaj trzeba poprawić, bo set++ i set-- są wykonywane niezależnie od ifów (czyli przycisków), czyli zmienna set za każdym wykonaniem loop byłaby zwiększona o 1, potem zmniejszona o 1, czyli zawsze miałaby tą samą wartość.

Jeśli nie ma klamry otwierającej bezpośrenio po ifie, to do ifa należy tylko to, co jest do najbliższego średnika (czyli tutaj tylko delay(50)). A klamry jak są w ten sposób, to tak jakby ich wcale nie było, wtedy to co jest w klamrach jest wykonywane zawsze.
Spoiler:
mateusz070893
Młodszy majsterkowicz
Posty: 24
Rejestracja: 1 maja 2016, 12:14

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: mateusz070893 » 13 maja 2016, 10:01

Przyciski oczywiście podłączam teraz do masy. A tak naprawdę to kabelek z goldpinem wpinam w płytkę stykową i wyciągam (na czas prób, żeby nie bawić się z przełączaniem przycisków). Jeśli przeniosę float set i float temperature do setup'a to przy kompilacji wyskakuje błąd: error: 'set' was not declared in this scope i taki sam tylko że 'temperature' zamiast 'set'. Czy usunięcie klamr po ifie coś zmienia już nie sprawdzę bo program się nie kompiluje
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: stiven » 13 maja 2016, 10:03

Masz program poprawiony na końcu w spoilerze. Klamerek miałeś nie usuwać, tylko przenieść tak żeby rzeczywiście były przy ifie. I deklaracja zmiennych nie w setup, tylko poza setup i loop. Zmienna zadeklarowana w setup (w danej funkcji) może być używana tylko w setup (w danej funkcji), jest to wtedy zmienna lokalna. Zmienna zadeklarowana poza loop i setup i poza innymi funkcjami jest zmienną globalną i może być używana wszędzie. Zmienna globalna jest inicjowana tylko raz, w momencie uruchomienia programu, a zmienna lokalna przy każdym wykonaniu funkcji albo pętli.
mateusz070893
Młodszy majsterkowicz
Posty: 24
Rejestracja: 1 maja 2016, 12:14

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: mateusz070893 » 13 maja 2016, 12:19

Wybaczcie, nie zauważyłem spoilera i schowanego tam programu. Wrócę z uczelni i sprawdzę czy wszystko działa
mateusz070893
Młodszy majsterkowicz
Posty: 24
Rejestracja: 1 maja 2016, 12:14

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: mateusz070893 » 13 maja 2016, 18:20

Program w podanej przez Was postaci nie działał. Po drobnych przeróbkach działa (prawie). Nie odczytuje temperatury z czujnika na bieżąco. Odczytuje ją raz, przy starcie po wgraniu programu i taka wartość widnieje na wyświetlaczu. Czujnik mogę grzać i mrozić, temperatura ani drgnie. Ale za to guziczki działają perfekcyjnie. Kod po mojej ingerencji, z błędem opisanym wyżej:

Kod: Zaznacz cały

#include <OneWire.h>
#include <DS18B20.h>
#include <LiquidCrystal_I2C.h>
#define ONEWIRE_PIN 13 // Numer pinu do którego podłaczasz czujnik

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;


void setup() 
{
pinMode(12, OUTPUT);
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
sensors.begin();
lcd.begin(20,4);
sensors.request(address);
}

void loop() 
{
if (sensors.available())
{
float temperature = sensors.readTemperature(address);



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("Przekaznik 1:");
lcd.setCursor(0,3);
lcd.print("Przekaznik 2:");

if(digitalRead(2) == LOW)
{
  delay(50);
  set++;
}
if(digitalRead(3) == LOW)
{
  delay(50);
  set--;
}

if(temperature >= set) 
{
  digitalWrite(12, LOW);
  digitalWrite(11, LOW);
  lcd.setCursor(14,2);
  lcd.print("   ");
  lcd.setCursor(14,2);
  lcd.print("ON");
  lcd.setCursor(14,3);
  lcd.print("OFF");
}
else 
{
  digitalWrite(12, HIGH);
  digitalWrite(11, LOW);
  lcd.setCursor(14,2);
  lcd.print("   ");
  lcd.setCursor(14,2);
  lcd.print("OFF");
  lcd.setCursor(14,3);
  lcd.print("OFF");
 
}
}
}
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Prosty termostat na DS18B20 i przekaźniku

Post autor: stiven » 13 maja 2016, 18:29

sensors.request(address); musisz dać do loop.
ODPOWIEDZ

Strony partnerskie: