Arduino Polska Forum
Problem ze sterowaniem przekaźnikiem w termostacie - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Instalacja i rozwiązywanie problemów (https://forum.arduinopolska.pl/dzial-instalacja-i-rozwi%C4%85zywanie-problem%C3%B3w)
+--- Wątek: Problem ze sterowaniem przekaźnikiem w termostacie (/watek-problem-ze-sterowaniem-przeka%C5%BAnikiem-w-termostacie)



Problem ze sterowaniem przekaźnikiem w termostacie - mlamla - 31-12-2017

Witam
Na początku chcę się przyznać że niedawno rozpocząłem przygodę z Arnuino i dlatego może dla niektórych moje pytanie wyda się błahe Shy ale ja z tym już trzeci dzień siedzę i nie mogę dalej ruszyć. Dlatego proszę pomocy. Sad
Urządzenie ma działać w następujący sposób :
po podaniu masy na piny A0,A1,A3 i temperatura musi mieć mniej niż 10 stopni powinna zaświecić się dioda i załączyć przekaźnik 
Kod:
float temperatura; //Utworzenie zmiennej przechowującej temperaturę
int LM35 = A2;     //Czujnik podłączony do analogowego pinu 2
int reading = 0;
int pin_drzwi1 = A0;
int pin_drzwi2 = A1;
int pin_czujka = A3;
int pin_przekaznik = 13;
int pin_dioda = 12;
int pin_wolny = 10;
int pin_celsjusz = 11;
int nastaw = 10; // ustaw temperature

void setup()
{
 Serial.begin(9600);
 pinMode(pin_drzwi1, INPUT);
 digitalWrite(pin_drzwi1, HIGH);
 pinMode(pin_drzwi2, INPUT);
 digitalWrite(pin_drzwi2, HIGH);
 pinMode(pin_czujka, INPUT);
 digitalWrite(pin_czujka, HIGH);
 pinMode(pin_wolny, INPUT);
 digitalWrite(pin_wolny, HIGH);
 pinMode(pin_przekaznik, OUTPUT);
 digitalWrite(pin_przekaznik, HIGH);
 pinMode(pin_dioda, OUTPUT);
 digitalWrite(pin_dioda, HIGH);
 pinMode(pin_dioda, OUTPUT);
 digitalWrite(pin_dioda, HIGH);
 pinMode(pin_celsjusz, OUTPUT);
 digitalWrite(pin_celsjusz, HIGH);



}
void loop()
{
 reading = analogRead(LM35);
 temperatura = analogRead(LM35); //Odczytanie napięcia z czujnika temperatury
 temperatura = temperatura * 0.38828125; //Wyznaczenie temperatury

 Serial.print("Temperatura: ");
 Serial.println(temperatura);


 if (LM35 > (nastaw))
 {
   digitalWrite(pin_celsjusz, LOW);



   int drzwi1 = digitalRead(pin_drzwi1); //odczytujemy stan przycisku
   if (drzwi1 == LOW) { //jesli przycisk nie jest wcisniety

     int drzwi2 = digitalRead(pin_drzwi2); //odczytujemy stan przycisku
     if (drzwi2 == LOW) { //jesli przycisk nie jest wcisniety


       int czujka = digitalRead(pin_czujka); //odczytujemy stan przycisku
       if (czujka == LOW) { //jesli przycisk nie jest wcisniety



         digitalWrite(pin_przekaznik, LOW); //dioda ma byc zgaszona
         digitalWrite(pin_dioda, LOW); //dioda ma byc zgaszona



         int wolny = digitalRead(pin_wolny); //odczytujemy stan przycisku
         if (wolny == HIGH) { //jesli przycisk nie jest wcisniety

           digitalWrite(pin_przekaznik, HIGH); //dioda ma byc zgaszona
           digitalWrite(pin_dioda, HIGH); //dioda ma byc zgaszona
         }



       }
     }
   }
 }

}

Proszę pomocy Huh


RE: Problem ze sterowaniem przekaźnikiem w termostacie - krn78 - 02-01-2018

Ech... błędów co najmniej kilka.
Przede wszystkim, sprzętowo. Przyciski podpina się raczej pod piny cyfrowe, natomiast drugi zacisk przycisku łączy się z masą. Wtedy wciśnięcie przycisku to podanie masy na dany pin, np.
Kod:
int przycisk=7;

void setup(){
pinMode(przycisk, INPUT_PULLUP);
}

void loop(){
if (digitalRead(przycisk)==LOW){
//tutaj kod, który ma się wykonać, kiedy przycisk jest wciśnięty.
 }
}

Do czego Ci zmienna reading? W kodzie masz:
Kod:
reading = analogRead(LM35);
temperatura = analogRead(LM35); //Odczytanie napięcia z czujnika temperatury
Zapisujesz odczyt z czujnika do zmiennej reading, a zaraz potem robisz to samo i zapisujesz do zmiennej temperatura. Później, w kodzie, zmienna reading już nie występuje. Przy okazji, można to, co zrobiłeś, zapisać w jednej linii:
Kod:
temperatura = analogRead(LM35) * 0.38828125; //Wyznaczenie temperatury

Dalej... zamień:
Kod:
if (LM35 > (nastaw))
na:
Kod:
if (temperatura > nastaw)

Kolejna rzecz, że chyba niepotrzebnie zagnieżdżasz ify. Robisz coś takiego:
jeśli (temperatura>nastaw), to: {
 jeśli (drzwi1_zamknięte), to: {
   jeśli (drzwi2_zamknięte), to: {
      i tak dalej

}}}

A powinno być chyba:
jeśli (temperatura>nastaw), to: {
tutaj kod
}
jeśli (drzwi1_zamknięte), to: {
tutaj kod
}
jeśli (drzwi2_zamknięte), to: {
tutaj kod
}

Musisz na to uważać. Postawienie nawiasu klamrowego w nieodpowiednim miejscu może drastycznie zmienić działanie kodu.
Zagnieżdżenie ifów, w Twoim przypadku, będzie przydatne imho w jednej rzeczy:

jeśli (temperatura<10), to: {
jeśli (drzwi1_otwarte), to: {
tutaj kod
}
jeśli (drzwi2_otwarte), to: {
tutaj kod
}
}

Jeszcze jedna uwaga: jak widzę, wykorzystałeś serial monitor. Możesz, za jego pomocą, wyświetlać sobie stany pinów, wartości zmiennych, zobaczyć podgląd drzwi (otwarte/zamknięte) podobnie jak wyświetliłeś temperaturę. itp. Jeśli coś w kodzie Ci nie działa, możesz dzięki temu narzędziu sprawdzić, dlaczego jest tak, a nie inaczej. Wtedy o wiele łatwiej jest zdiagnozować usterkę.


RE: Problem ze sterowaniem przekaźnikiem w termostacie - mlamla - 02-01-2018

(02-01-2018, 09:48)krn78 napisał(a): Ech... błędów co najmniej kilka.
Przede wszystkim, sprzętowo. Przyciski podpina się raczej pod piny cyfrowe, natomiast drugi zacisk przycisku łączy się z masą. Wtedy wciśnięcie przycisku to podanie masy na dany pin, np.
Kod:
int przycisk=7;

void setup(){
pinMode(przycisk, INPUT_PULLUP);
}

void loop(){
if (digitalRead(przycisk)==LOW){
//tutaj kod, który ma się wykonać, kiedy przycisk jest wciśnięty.
 }
}

Do czego Ci zmienna reading? W kodzie masz:
Kod:
reading = analogRead(LM35);
temperatura = analogRead(LM35); //Odczytanie napięcia z czujnika temperatury
Zapisujesz odczyt z czujnika do zmiennej reading, a zaraz potem robisz to samo i zapisujesz do zmiennej temperatura. Później, w kodzie, zmienna reading już nie występuje. Przy okazji, można to, co zrobiłeś, zapisać w jednej linii:
Kod:
temperatura = analogRead(LM35) * 0.38828125; //Wyznaczenie temperatury

Dalej... zamień:
Kod:
if (LM35 > (nastaw))
na:
Kod:
if (temperatura > nastaw)

Kolejna rzecz, że chyba niepotrzebnie zagnieżdżasz ify. Robisz coś takiego:
jeśli (temperatura>nastaw), to: {
 jeśli (drzwi1_zamknięte), to: {
   jeśli (drzwi2_zamknięte), to: {
      i tak dalej

}}}

A powinno być chyba:
jeśli (temperatura>nastaw), to: {
tutaj kod
}
jeśli (drzwi1_zamknięte), to: {
tutaj kod
}
jeśli (drzwi2_zamknięte), to: {
tutaj kod
}

Musisz na to uważać. Postawienie nawiasu klamrowego w nieodpowiednim miejscu może drastycznie zmienić działanie kodu.
Zagnieżdżenie ifów, w Twoim przypadku, będzie przydatne imho w jednej rzeczy:

jeśli (temperatura<10), to: {
 jeśli (drzwi1_otwarte), to: {
   tutaj kod
}
 jeśli (drzwi2_otwarte), to: {
   tutaj kod
}
}

Jeszcze jedna uwaga: jak widzę, wykorzystałeś serial monitor. Możesz, za jego pomocą, wyświetlać sobie stany pinów, wartości zmiennych, zobaczyć podgląd drzwi (otwarte/zamknięte) podobnie jak wyświetliłeś temperaturę. itp. Jeśli coś w kodzie Ci nie działa, możesz dzięki temu narzędziu sprawdzić, dlaczego jest tak, a nie inaczej. Wtedy o wiele łatwiej jest zdiagnozować usterkę.

Wielkie dzięki za podpowiedź i fajne podejście do sprawy .
Mi właśnie o to chodziło żeby dioda i przekaźnik działały kiedy drzwi 1 i drzwi 2  i czujka są zwarte do masy oraz temperatura poniżej 10 stopni.
Jeżeli jeden z tych warunków nie spełniony mają nie działać