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

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.