Arduino Polska Forum

Pełna wersja: Pilna pomoc termostat+LCD shield (DHT11)
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam, mam problem z kodem. Potrzebuje zrobić termostat (wraz z kontrolowaniem wilgotności) na arduino z wykorzystaniem DHT11, dwóch przekaźników oraz LCD shield. Osobno działa mi LCD shield oraz czujnik DHT11, natomiast jeżeli je połączę i próbuje uruchomić program mam błąd (zdjęcie poniżej), przekaźniki będą dodane później jak już uporam się z tym kodem. Czujnik podłączony jest do pinu 2, przekaźniki do pinów A1 oraz A2, jeden przekaźnik ma sterować grzałką a drugi nawilżaczem powietrza. W zamyśle mam ustawić zadaną temperaturę oraz wilgotność, jeżeli ustawione parametry będą wyższe to załączy się przekaźnik, po dobiciu do zadanych parametrów wyłączy. Proszę o pomoc.
Przy takich problemach trzeba dołączać bibliotekę tego czujnika. I to tej której korzystasz bo ściągniecie innej i podanie tu będzie błędnym kołem.

Bo z tego co podałeś jedynie co można powiedzieć to używasz nieprawidłowej biblioteki, albo nie prawidłowo ją wykorzystujesz..
Tekstów z programu nie wklejaj jako obrazki, są do tego funkcje w edycji postu, znacznik "code".
Dobrze prawisz bo tak się przyglądałem i nie wiem czy czasem nie dał DHTll zamiast DHT11 tu na forum jest znacząca różnica a w IDE bardzo mała...
Tak, rzeczywiście była pobrana błędna biblioteka, udało mi się z tym uporać natomiast teraz mam inny problem. Gdy program się uruchamia i dochodzi do momentu gdzie  są wybrane I/O jako OUTPUT dla przekaźników automatycznie Arduino ustawia na tych pinach stan wysoki - pomimo tego. że jest w kodzie wpisane aby ustawił stan niski, czy jest możliwość aby tego uniknąć? Dołączam fragment kodu:



Kod:
void setup()
{
  pinMode(relay1, OUTPUT);    // <--- Tu arduino automatycznie wpisuje stan wysoki
  pinMode(relay2, OUTPUT);
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(4, 0);
  lcd.print("Sterownik");
  delay(2500);
  Serial.begin(9600);
  dht.begin();
  delay(1000);
  lcd.clear();

  keypad.setRate(10);
  digitalWrite(relay1, LOW);
  digitalWrite(relay2, LOW);

}

 
Szkoda że nie opisujesz co to dokładnie za arduino jaka płytka i które piny, niektóre są wykorzystane. Np. UNO ma diodę L na pinie 13 jak i TX/RX co może powodować błędne myślenie.
(27-08-2022, 17:32)Jarewa0606 napisał(a): [ -> ]Szkoda że nie opisujesz co to dokładnie za arduino jaka płytka i które piny, niektóre  są  wykorzystane. Np. UNO ma diodę L na pinie 13 jak i TX/RX co może powodować błędne myślenie.
Arduino UNO R3, piny przekaźników to A2 A3 a tu jest jeszcze pokazane:
Kod:
const int relay1 =  A2;
const int relay2 =  A3;
Łatwiej byłoby pomóc gdybyś zamieścił cały kod, a nie tylko urywki.

Możesz temat ustawienia w stan wysoki załatwić operując na rejestrach - najpierw ustawić rejestr stanu, a potem rejestr kierunku.

Zgodnie z informacjami na stronie Arduino po resecie powinno ustawić piny jako LOW, a ustawienie jako OUTPUT to niska impedancja. Podrzuć schemat układu.
Raczej nie wysoki, tylko niski, a przekaźniki mogą być aktywowane/sterowane stanem niskim tak samo jak wysokim (są oba typy w sprzedaży, czasami można to zamienić zworką na płytce).
Jeden ze sposobów opisał MadMrQ. Na wypadek gdy nawet wejście może wysterować przekaźnik powinny być rezystory pullUP lub pullDOWN. W Arduino też można wpisać 1 digitalWrite zanim ustawi się pin jako wyjście.
digitalWrite(relay1, HIGH);
pinMode(relay1, OUTPUT);
Dzięki temu przekaźnik nie będzie dzwonił przy każdym resecie Arduino, ale dodałbym jeszcze rezystor 10k między pin relay1 do VCC. Powinni dać taki na module przekaźników, ale po co zwiększać koszty.
Na pewno samo ustawienie jako OUTPUT nie robi stanu wysokiego, domyślnie jest stan niski.