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 ale ja z tym już trzeci dzień siedzę i nie mogę dalej ruszyć. Dlatego proszę pomocy.
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
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ń:
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ń:
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ć
|