Skocz do zawartości

Arduino - nie potrafię sterować pinMode


Romann

Pomocna odpowiedź

Cześć

Tło: mam nikłe pojęcie o programowaniu, ale postanowiłem spróbować wykonać specyficzny termostat sterujący grzałką. Temperatura ma się zmieniać codziennie w zależności od tego czy dzień jest parzysty czy nieparzysty.  Przy braku umiejętności chciałem sobie poradzić idąc krok po kroku i rozszerzać program o kolejne dodatki gdy poprzedni kod będzie działać. W poniższym tylko kawałek z odczytem zegara jest kradziony z http://www.jarzebski.pl/arduino/komponenty/zegar-czasu-rzeczywistego-rtc-ds3231.html bo nie mogłem sobie poradzić samodzielnie... okazało się że płytka z zegarkiem była uszkodzona i na innej ruszyło bez kłopotu.

Urządzenia: UNO, DS3231, LCD Shield, przekaźnik podpięty pod D0.

Historia: Program z jakiegoś powodu nie zmienia stanu pinu przelaznik1, pomimo że wykonuje kod z danego case (czyli zmieniają się liczby 20 na 30  na 20) ale przekaźnik się nie załącza. Gdzieś zrobiłem błąd i nie mogę go znaleźć, co ciekawe jeśli wstawię delay(500); digitalWrite(przekaznik1, HIGH);delay(500);digitalWrite(przekaznik1,LOW); jako pierwszą linię w pętli to przekaźnik pstryka zgodnie z oczekiwaniem. Ale jeśli ten sam kod wkleję powyżej switch to się nie uruchamia.

Będę wdzięczny za jakiekolwiek wskazówki :)

#include <DallasTemperature.h> // Konieczne do działania termometru DS18b20
#include <LiquidCrystal.h> // Wyświetlacz
#include <DS3231.h> // zegar czasu rzeczywistego
#include <Wire.h>
#define przekaznik1 0

LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // LCD Shield
OneWire OneWire(A1); // podpinamy termometr DS18b20 pod A1
DallasTemperature sensors(&OneWire);
DS3231 rtc;
RTCDateTime dt;
int DM; //dzień miesiąca
int tpar = 30; // temperatura dzień parzysty
int tnpar = 20; // temperatura dzień nieparzysty
int tset = 66;
int parz;

void setup() {

  pinMode(przekaznik1, OUTPUT); // ustawiamy pin D0 jako wyjściowy

  sensors.begin(); // Inicjalizacja czujnika.
  lcd.begin(16, 2); // Inicjalizacja wyświetlacza LCD
  Serial.begin(57600);
  rtc.begin();

}

void loop() {


  sensors.requestTemperatures(); //pobieramy temperaturę z czujnika
  lcd.setCursor(0, 0); //ustawia kursor w górnej linii na pierwszym znaku
  lcd.print("CUR:"); // wyświetla napis CUR:
  lcd.setCursor(4, 0); // Ustawiamy kursor w górnej linii na piątym znaku
  lcd.print(sensors.getTempCByIndex(0)); // piszemy aktualną temp w górnej linijce wyświetlacza
  lcd.setCursor(10, 0); // ustawia kursor na 11 znaku górnej linii
  lcd.print("SET:"); // wyświetla napis SET:
  lcd.setCursor(0, 1); // ustawia kursor na pierwszym znaku dolnej linii
  
  
  dt = rtc.getDateTime(); // ustawia zmienną dt na wartość pobraną z zegara
  lcd.print(dt.day); // wyświetla dzień miesiąca
  lcd.print("-");    // wyświetla -
  lcd.print(dt.month); // wyświetla cyfrę miesiąca
  lcd.print(" "); // wyświetla pusty znak
  lcd.print(dt.hour);   lcd.print(":"); //wyświetla godziny i znak :
  lcd.print(dt.minute); lcd.print(":"); //wyświetla minuty i znak :
  lcd.print(dt.second);  //wyświetla godzinę

  DM = dt.second; // ustawia zmienną DM (dzień miesiąca) - tymczasowo włączone sekundy żeby dało się szybko testować nie czekając dni na zmianę stanu pin
  parz = (DM%2); //sprawdzenie czy dzień miesiąca jest liczbą parzystą





  switch (parz) {    // wstawiam parzystość do funkcji switch

    case 0: // jeśli parz jest liczbą parzystą (zwraca 0) to wykonuje ten przypadek

      tset = tpar; // temperaturę tset wstawiam dla dnia parzystego
      lcd.setCursor(14, 0); //ustawia kursor w 15 znaku górnej linii
      lcd.print(tset); //wyświetla na ekranie ustawioną temperaturę
      digitalWrite(przekaznik1, LOW); //wyłącza przekaźnik grzałki
      break;

    default: //jeśli parz jest inne niż "0" wykonuje domyślną sekwencję

      tset = tnpar; // ustawia temperaturę dla dnia nieparzystego
      lcd.setCursor(14, 0); //ustawia kursor w 15 znaku górnej linii
      lcd.print(tset); //wyświetla ustawioną temperaturę
      digitalWrite(przekaznik1, HIGH); //włącza przekaźnik grzałki
      break;

  }


}

Pozdrawiam

Roman

Link do komentarza
Share on other sites

Co wyście się tak uparli podłączać przekaźnik do UART-a? Nic dziwnego że nie działa.

Zasada numer jeden: nie używać pinów 0 i 1 bo są zarezerwowane dla seriala. Taj samo jeśli używasz Wire (inaczej I2C) nie używasz w programie A4 i A5 bol to to samo co SCL i SDA.

 

Link do komentarza
Share on other sites

(edytowany)

O ja głupa pipa! Zapomniałam! 😉

Serdecznie dziękuję za pomoc, nie mogłem ogarnąć czemu działa w jednym, a nie działa w drugim. W sumie dalej nie rozumiem tego że działa "trochę" na pinie D0 (w zależności od miejsca umieszczenia w skrypcie), ale to póki co nie spędza mi snu z powiek 😉

O A4/A5 sobie doczytałem 🙂

 

Edytowano przez Romann
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

20 minut temu, Romann napisał:

W sumie dalej nie rozumiem tego że działa "trochę" na pinie D0 (w zależności od miejsca umieszczenia w skrypcie)

Ależ to elementarne, drogi Watsonie 🙂

Po prostu wykonujesz pinMode(0, OUTPUT) i od tej chwili pin jest normalnym wyjściem. Ale jeśli gdzieś po drodze będziesz miał Serial.cośtam() - pin przestanie być wyjściem i zostanie przypięty do UART-a.

Cytując znany dowcip:

Cytat

Jednocześnie do Krakowa i Bytomia wyjechać nie idzie.

 

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.