Skocz do zawartości

Sterowanie Przekaźnikami poprzez temperaturę


kryska016

Pomocna odpowiedź

Hej, Zabrałem się za stworzenie programu który polega na sterowaniu 4 przekaźnikami. Wysterowywanie tych przekaźników ma być zależne w jakich zakresach jest odczyt temperatury z dwóch czujników DS18B20. Po wgraniu programu do Arduino czujniki temperatury działają natomiast przekaźniki już nie. Przekaźnik Q10 niewysterowany (HIGH) natomiast przekaźniki Q11, Q12, Q13 wysterowane (LOW) (przekaźniki wysterowywane są poprzez podanie na pin sygnałowy masy). Taki stan przekaźników jest cały czas mimo że zmienia się temperatura. Bardzo proszę o pomoc gdyż mam odczucie że zrobiłem jakiś błąd w pisaniu programu a wszelkie próby zmiany programu nie przynosiły zamierzonego efektu. Z góry dziękuję za pomoc. Program :

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

// Numer pinu do którego podłaczasz czujnik
#define ONEWIRE_PIN1 3
#define ONEWIRE_PIN2 2
#define termostat 1
byte address1[8] = {0x28, 0x79, 0x13, 0x8, 0x0, 0x0, 0x80, 0xB2};
byte address2[8] = {0x28, 0xB7, 0x17, 0x8, 0x0, 0x0, 0x80, 0x21};

OneWire onewire1(ONEWIRE_PIN1),onewire2(ONEWIRE_PIN2);
DS18B20 sensors1(&onewire1),
sensors2(&onewire2);
void setup() {
 while(!Serial);
 Serial.begin(9600);

 sensors1.begin();
 sensors1.request(address1);

sensors2.begin();
 sensors2.request(address2);
 pinMode(10,OUTPUT);
 pinMode(11,OUTPUT);
 pinMode(12,OUTPUT);
 pinMode(13,OUTPUT);

}
void loop() {
 if (sensors1.available())
{
   float temperature1 = sensors1.readTemperature(address1);

   Serial.print(temperature1);
   Serial.println(F(" 'C"));

   sensors1.request(address1);


    (sensors2.available());

   float temperature2 = sensors2.readTemperature(address2);

   Serial.print(temperature2);
   Serial.println(F(" 'C"));

   sensors2.request(address2);

 if(temperature2 > 33)
 digitalWrite(termostat, HIGH);
 if(temperature2 < 32)
 digitalWrite(termostat, LOW);

 if(termostat == LOW && temperature1 < 30)
 digitalWrite(10,HIGH),(11,HIGH),(12,HIGH),(13,HIGH);
   if(termostat == LOW && temperature1 > 31)
   digitalWrite(10, LOW),(11, LOW),(12, LOW),(13,HIGH);

 if(termostat == HIGH)
 digitalWrite(10, HIGH),(11,HIGH),(12,LOW),(13,LOW);

}
}

__________

Komentarz dodany przez: Treker

Link do komentarza
Share on other sites

Po pierwsze, zrobiłeś błąd podłączając przekaźniki bezpośrednio do pinów. Dodaj tam po tranzystorze.

[ Dodano: 25-06-2016, 14:31 ]

Poza tym masz termostat podpięty na pinie 1, czyli na nóżce seriala?

Co ma znaczyć "if (termostat == LOW)"? Przecież sam napisałeś, "termostat = 1" na samym początku?

Co tam robi to gołe "(sensors2.available());"?

Mógłbyś dopisać do swojego programu komentarze, które objaśniają co według ciebie każda z linii robi, żebyśmy mogli zobaczyć ile rozumiesz i gdzie popełniasz błędy w rozumowaniu? Bo na razie to wygląda jakbyś po prostu skądś przekleił kod nawet na niego nie patrząc, a potem usuwał znaki aż się nie skompilował.

Link do komentarza
Share on other sites

Po pierwsze, zrobiłeś błąd podłączając przekaźniki bezpośrednio do pinów. Dodaj tam po tranzystorze.

[ Dodano: 25-06-2016, 14:31 ]

Poza tym masz termostat podpięty na pinie 1, czyli na nóżce seriala?

Co ma znaczyć "if (termostat == LOW)"? Przecież sam napisałeś, "termostat = 1" na samym początku?

Co tam robi to gołe "(sensors2.available());"?

Mógłbyś dopisać do swojego programu komentarze, które objaśniają co według ciebie każda z linii robi, żebyśmy mogli zobaczyć ile rozumiesz i gdzie popełniasz błędy w rozumowaniu? Bo na razie to wygląda jakbyś po prostu skądś przekleił kod nawet na niego nie patrząc, a potem usuwał znaki aż się nie skompilował.

Dzięki za odpowiedź. Zaczynając od początku to przekaźniki nie są podłączone bezpośrednio a jest to gotowa płytka z 4 przekaźnikami i pozostałą elektroniką. Co do programu to musze przyznać że nie mam z tym za dużego doświadczenia. Nie używam termostatu w projekcie. Słowo "termostat" jest jakby to ująć jakąś zmienną która zmienia się w zależności od temperatury2 i jest albo stanem wysokim albo stanem niskim(równie dobrze może to być zupełnie inne słowo). To że na początku umieściłem " termostat 1" miało wpływ przez to że niezbyt wiedziałem jak zrobić aby program zadziałał. Co do "(sensors2.available());" to sam do końca nie wiem co to robi. Program znalazłem jako przykład do odczytu z 1 czujnika temperatury. Jako że potrzebowałem 2 czujników powieliłem program dopisując do oznaczeń numer 1 lub 2 w zależności do któego czujnika miało się to odnosić. Po powieleniu odczytu temperatury dopisałem zależność kiedy jaki przekaźnik ma się załączać. Tak jak mówisz wklejam tu jeszcze raz mój kod z komentarzami jak ja rozumiem program:


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

// Numer pinu do którego podłaczasz czujnik
#define ONEWIRE_PIN1 3
#define ONEWIRE_PIN2 2
#define termostat 1
byte address1[8] = {0x28, 0x79, 0x13, 0x8, 0x0, 0x0, 0x80, 0xB2};
byte address2[8] = {0x28, 0xB7, 0x17, 0x8, 0x0, 0x0, 0x80, 0x21};
//Adresy czujników temperatury
OneWire onewire1(ONEWIRE_PIN1),onewire2(ONEWIRE_PIN2);
DS18B20 sensors1(&onewire1),
sensors2(&onewire2);
void setup() {
 while(!Serial);
 Serial.begin(9600);

 sensors1.begin();   
 sensors1.request(address1);  //łączenie się z czujnikiem o podanym adresie

sensors2.begin();
 sensors2.request(address2);
 pinMode(10,OUTPUT);
 pinMode(11,OUTPUT);
 pinMode(12,OUTPUT);
 pinMode(13,OUTPUT);

}
void loop() {
 if (sensors1.available())
{
   float temperature1 = sensors1.readTemperature(address1);

   Serial.print(temperature1); //wyświetlenie temperatury
   Serial.println(F(" 'C"));

   sensors1.request(address1);


    (sensors2.available());

   float temperature2 = sensors2.readTemperature(address2);

   Serial.print(temperature2);
   Serial.println(F(" 'C"));//wyświetlenie temperatury

   sensors2.request(address2);

 if(temperature2 > 33)
 digitalWrite(termostat, HIGH);//ustala stan słowa "termostat"
 if(temperature2 < 32)
 digitalWrite(termostat, LOW);

 if(termostat == LOW && temperature1 < 30)
 digitalWrite(10,HIGH),(11,HIGH),(12,HIGH),(13,HIGH);
   if(termostat == LOW && temperature1 > 31)
   digitalWrite(10, LOW),(11, LOW),(12, LOW),(13,HIGH);

 if(termostat == HIGH)
 digitalWrite(10, HIGH),(11,HIGH),(12,LOW),(13,LOW);

}
}

Wiem że może wychodzę teraz na antytalent w programowaniu no ale poświęciłem już temu dość sporo czasu i nie wiem jak to zrobić aby działało.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Spoko, wszyscy kiedyś zaczynaliśmy. Tylko teraz ważniejsze jest, żeby się nauczyć i zrozumieć, niż żeby działało. Jak w tym powiedzeniu o rybie i wędce -- więc się nie obraź, że będziemy cię teraz torturować, żebyś zrozumiał, a nie damy gotowego kodu.

Po pierwsze, "#define" definiuje makro -- w uproszczeniu, zanim się twój program skompiluje, robione jest "znajdź i zamień" i każde wystąpienie "termostat" jest zamieniane na "1". Zatem na przykład warunek "termostat == LOW" stanie "1 == LOW", a "digitalWrite(termostat, LOW)" zamieni się w "digitalWrite(1, LOW)".

Po drugie, "digitalWrite" nie ustala stanu słowa, tylko podłącza daną nóżkę ardunio albo do masy, albo do zasilania -- zatem w twoim przypadku włącza lub wyłącza przekaźnik. Z tym, że nóżka 1 jest używana do komunikacji z komputerem, więc takie jej przestawianie może nie być najlepszym pomysłem.

Po trzecie, zapis "digitalWrite(10, LOW),(11, LOW),(12, LOW),(13,HIGH);" nie robi tego, co by ci się wydawało. Po prostu rzeczy w nawiasach po przecinku są ignorowane. Musisz mieć osobne komendy "digitalWrite" dla każdego zestawu parametrów.

Po czwarte, "sensor.avalable()" zwraca True jeśli sensor ma gotowy odczyt do sprawdzenia. W twoim przypadku najprawdopodobniej chcesz w pierwszym warunku na początku sprawdzać oba sensory -- więc zrobić "||" (logiczne OR) pomiędzy nimi.

Jak czegoś z powyższego nie rozumiesz, to pytaj śmiało, będziemy tłumaczyć.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Zastosowałem się do powyższych rad i program działa 🙂 Po pierwsze całkowicie usunąłem "termostat" i po prostu bezpośrednio pod "if" napisałem co program ma robić. Po drugie pozmieniałem zapis "digitalWrite". Ostatnią rzeczą którą wykonałem to wprowadzenie OR pomiędzy dwa "sensor.avalable()" . Poniżej zamieszczam program który działa:


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

// Numer pinu do którego podłaczasz czujnik
#define ONEWIRE_PIN1 3
#define ONEWIRE_PIN2 2

byte address1[8] = {0x28, 0x79, 0x13, 0x8, 0x0, 0x0, 0x80, 0xB2};
byte address2[8] = {0x28, 0xB7, 0x17, 0x8, 0x0, 0x0, 0x80, 0x21};

OneWire onewire1(ONEWIRE_PIN1),onewire2(ONEWIRE_PIN2);
DS18B20 sensors1(&onewire1),
sensors2(&onewire2);
void setup() {
 while(!Serial);
 Serial.begin(9600);

 sensors1.begin();
 sensors1.request(address1);

sensors2.begin();
 sensors2.request(address2);
 pinMode(4,OUTPUT);
 pinMode(5,OUTPUT);
 pinMode(6,OUTPUT);
 pinMode(7,OUTPUT);

}
void loop() {
 if (sensors1.available() || sensors2.available());
{
   float temperature1 = sensors1.readTemperature(address1);

   Serial.print(temperature1);
   Serial.println(F(" 'C"));

   sensors1.request(address1);


  float temperature2 = sensors2.readTemperature(address2);

   Serial.print(temperature2);
   Serial.println(F(" 'C"));

   sensors2.request(address2);

 if(temperature2 > 29)
{digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,LOW);
digitalWrite(7,LOW);}

 if(temperature2 < 28)
 {
  if(temperature1 < 25)
 {digitalWrite(4,HIGH);
 digitalWrite(5,HIGH);
 digitalWrite(6,HIGH);
 digitalWrite(7,HIGH);}

 if( temperature1 > 26)
 {digitalWrite(4,LOW);
 digitalWrite(5,LOW);
 digitalWrite(6,LOW);
 digitalWrite(7,HIGH);
 }
 }

}
}

Wielkie dzięki za pomoc a w szczególności Tobie Deshipu

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.