Popularny post Julek Napisano Styczeń 29, 2019 Popularny post Udostępnij Napisano Styczeń 29, 2019 Witam! Na wstępie chcę zaznaczyć, że mam 13 lat. Chciał bym zaprezentować mój projekt. Jest nim zegar, który oprócz czasu pokazuje temperaturę z dwóch czujników oraz sterownie podczerwienią przekaźnik. Potrzebne części: Płytka Arduino (ja użyłem nano ale inne też się sprawdzą) Zegar czasu rzeczywistego DS3231 RTC Dwa czujnik temperatury DS18B20 Przekaźnik 1-kanałowy Czujnik podczerwieni z serii TSOP (używałem TSOP2238) Przycisk (np. tact swich) Wyświetlacz 16x2 z konwerterem I2C Potencjometr 10k Rezystor 4,7k Niestety nie mam możliwości dodać schematu.🙁 Podłączenie elementów do Arduino: Wszystkie GND i VCC należy podłączyć do GND i +5V SCL (Zegar + wyświetlacz) - A5 SDA (Zegar + wyświetlacz)-A4 Pin sygnałowy przekaźnika - 10 Przycisk - GND i 6 Dwa sygnały z czujników temperatury - A0 Sygnał czujnika podczerwieni - 11 Potencjometr należy przyczepić na konwerterze I2C ekranu zamiast zworki( dwa piny połączone zworką) Uwaga! Należy wstawić rezystor 4,7k pomiędzy pin sygnałowy a VCC czujników temperatury. Jego brak może uniemożliwić pomiar temperatury. Wystarczy umieścić jeden na oba czujniki. Kod zegara: #include <RTClib.h>//Dodawanie bibliotek #include <OneWire.h> #include <DallasTemperature.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> #include <IRremote.h> #define irPin 11 IRrecv irrecv(irPin); decode_results results; #define prz 10 int przStatus = LOW; OneWire oneWire(A0); //Podłączenie do A0 DallasTemperature sensors(&oneWire); //Przekazania informacji do biblioteki DateTime now;//Now to jest data i czas char daysOfTheWeek[7][12] = {"Ndz", "Pon", "Wt", "Sr", "Czw", "Pt", "Sob"}; RTC_DS3231 rtc; LiquidCrystal_I2C lcd(0x3F, 16, 2); //Ustawianie wyswietlacza lcd void showDate(void);//Ustawianie dayt czasu i dnia void showTime(void); void showDay(void); int przycisk = 6;//Przycisk do wyswietlania temperatury void setup () { Serial.begin(9600);// Ustawianie transmisji UART pinMode(przycisk, INPUT_PULLUP);//Ustawianie przycisku jako wejscie lcd.begin();//Wloczenie lcd lcd.backlight();//Wloczenie podswietlenia lcd sensors.begin();//Wloczenie czujnikow irrecv.enableIRIn(); pinMode(prz, OUTPUT);//Ustawienie if (! rtc.begin()) //Jesli nie moze znalesc RTC wyswietl { Serial.println("Nie moge znalesc RTC"); while (1); } if (rtc.lostPower()) //Jesli RTC nie ma zasilania to wyswietl { Serial.println("RTc nie ma zasilania ustaw godzine!"); rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); } rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); } void loop () { if (irrecv.decode(&results)) { //Jesli czujnik odbirze sygnał switch (results.value) { case 0xFF21DE: przStatus = ~przStatus; digitalWrite(prz, przStatus); delay(250); break; } irrecv.resume(); } if(digitalRead(przycisk)== LOW)//Jesli przycisk jest wcisniety { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Temp(W)"); lcd.setCursor(9, 0); lcd.print("Temp(Z)"); sensors.requestTemperatures(); lcd.setCursor(1, 1); lcd.print(sensors.getTempCByIndex(0)); lcd.setCursor(10, 1); lcd.print(sensors.getTempCByIndex(1)); delay(4000); lcd.clear(); } now = rtc.now();//Ustawianie pętli showDate(); showDay(); showTime(); } void showDate()//Kod petli showDate { lcd.setCursor(0,0); lcd.print(now.day()); lcd.print('-'); lcd.print(now.month()); lcd.print('-'); lcd.print(now.year()); } void showDay()//Kod petli showDay { lcd.setCursor(11,0); lcd.print(daysOfTheWeek[now.dayOfTheWeek()]); } void showTime()//Kod petli showTime { lcd.setCursor(4,1); lcd.print(now.hour()); lcd.print(':'); lcd.print(now.minute()); lcd.print(':'); lcd.print(now.second()); lcd.print(" "); } Po kliknięciu przycisku na wyświetlaczu pojawia się temperatura wewnątrz i zewnątrz. Czujnik najlepiej dobrać do własnych potrzeb. Ja wybrałem DS18B20 ponieważ jest on dokładny oraz występuje w wygodnej wodoodpornej osłonce oraz bez niej . Jeśli wszystko działa to przy pomocy potencjometru powinna zmieniać się jasność wyświetlacza. Ja użyłem zegara czasu rzeczywistego DS3231 RTC ale jeśli macie możliwość zakupu DS1307 RTC albo RTC PCF8563 to kupcie jeden z tych dwóch. Ja z mojego nie jestem zadowolony ,ponieważ przysporzył mi wiele problemów. W 65 linijce kodu jest zawarty numer przycisku na pilocie "0xFF21DE". Każdy przycisk na pilocie ma swój indywidualny numer. Program sprawdzający takowy jest taki: #include <IRremote.h> #define irPin 11 IRrecv irrecv(irPin); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); } void loop() { if (irrecv.decode(&results)) { Serial.print("0x"); Serial.println(results.value, HEX); delay(250); irrecv.resume(); } } Po kliknięciu przycisku na pilocie przekaźnik zmieni swój stan. Jest wiele dobrych pilotów. Lecz jest jedna ważna sprawa. Mianowicie używamy tu czujnika działającego na częstotliwości 38kHz więc pilot tego typu działa świetnie ,ponieważ działa na tej samej częstotliwości. Lecz jeśli z jakiegokolwiek powodu nie macie pilota albo czujnika działającego na 38kHz to nie ma się czym przejmować. Sam używam innego pilota i wszystko działa. Wyświetlacz można dobrać dowolnej wielkości. Trzeba tylko zmienić ustawienia wyświetlacza. Pozdrawiam!😀 6 Link do komentarza Share on other sites More sharing options...
lukaszd82 Luty 4, 2019 Udostępnij Luty 4, 2019 Jak na twòj wiek to gratuluję 🙂 Na razie arduino, za parę lat stm albo arm. 1 Link do komentarza Share on other sites More sharing options...
Julek Luty 4, 2019 Autor tematu Udostępnij Luty 4, 2019 @lukaszd82 Dzięki😀 Link do komentarza Share on other sites More sharing options...
Belferek Luty 5, 2019 Udostępnij Luty 5, 2019 Super projekt, a co do DS3231 to porównaj jego dokładność z np. DS1307. Układ DS3231 jest moim zdaniem lepszy. 2 Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
Treker (Damian Szymański) Luty 5, 2019 Udostępnij Luty 5, 2019 Również gratuluję projektu, szczególnie jak na młody wiek autora - oby tak dalej 🙂 2 Link do komentarza Share on other sites More sharing options...
Julek Luty 10, 2019 Autor tematu Udostępnij Luty 10, 2019 Dziękuje🙂 @Belferek masz rację jest dokładniejszy ale na wiele różnych sposobów próbowałem zrobić możliwość ustawiania czasu ale nie mogłem. Pracowałem długo nad tym modułem i nic nie wykombinowałem. Pozdrawiam! Link do komentarza Share on other sites More sharing options...
Belferek Luty 10, 2019 Udostępnij Luty 10, 2019 (edytowany) Ja do obsługi DS3231 używam biblioteki Rtc_by_Makuna (dostepna z menadżera bibliotek). Biblioteka dokładnie przedstawiona przez autora - tutaj Ustawienie czasu tego zegara realizuję tak: Rtc.SetDateTime(RtcDateTime(_rok,_mc,_dzien,_godz,_min,_sek)); //w _rok, _mc itd. data i czas do ustawienia) Oczywiście to wszystko po wcześniejszym zaimportowaniu bibliotek, uruchomieniu i2c, sprawdzeniu obecności DS3231. Zegar "reprezentowany" jest przez wcześniej zadeklarowany obiekt Rtc, a deklaruję go tak: RtcDS3231<TwoWire> Rtc(Wire); i ... wszystko działa jak należy. Autor dokładnie opisuje w podanym WIKI sposób korzystania ze swoich bibliotek. Edytowano Luty 10, 2019 przez Belferek 2 Link do komentarza Share on other sites More sharing options...
hashpl Luty 3, 2021 Udostępnij Luty 3, 2021 Super projekt. Możesz napisać do czego używasz przekaźnika. Do czego jest przycisk tact switcha oraz przycisk pilota ? Możesz narysować schemat ? 1 Link do komentarza Share on other sites More sharing options...
H1M4W4R1 Luty 3, 2021 Udostępnij Luty 3, 2021 (edytowany) Kiedy 5 minut zastanawiasz się po co dwuwymiarowa tablica przy daysOfWeek i dopiero zauważasz, że tam nie ma wskaźnika... 🙂 Jak na taki młody wiek, to gratuluję pasji i projektu. Jak zawsze muszę mieć swoje "ale" - proponuję poprawić, by nie było pojedynczych cyfr 🙂 char n[3] = {'0', '0', '\0'}; void numToText(char number) { n[0] = '0' + (number / 10); n[1] = '0' + (number % 10); } Tutaj masz przykładowe rozwiązanie. Da się to zrobić lepiej, ale na początek powinno wystarczyć 😉 Funkcja przetwarza liczbę (0-99) na dwa znaki. Dla liczb < 10 pierwszy znak to '0'. Edytowano Luty 3, 2021 przez H1M4W4R1 poprawka kodu 1 Link do komentarza Share on other sites More sharing options...
ethanak Luty 3, 2021 Udostępnij Luty 3, 2021 A po co tam ten if? Przecież '0' i '0'+0 to jakby to samo... 1 1 Link do komentarza Share on other sites More sharing options...
Elvis Luty 3, 2021 Udostępnij Luty 3, 2021 Jak już komuś doradzamy, to ja radziłbym uważać na oszczędności w wykorzystaniu pamięci: 10 minut temu, H1M4W4R1 napisał: char n[2]; Napisy w języku C mają najczęściej \0 na końcu, a w tej tablicy brakuje dla końcowego zera miejsca, więc wbrew nazwie numToText wynikiem nie jest typowy string. Kod może i działa, ale łatwo zrobić błąd i mieć piękne przepełnienie bufora. 2 Link do komentarza Share on other sites More sharing options...
H1M4W4R1 Luty 3, 2021 Udostępnij Luty 3, 2021 (edytowany) 5 minut temu, Elvis napisał: Napisy w języku C mają najczęściej \0 na końcu To akurat odruch - mój kompilator automatycznie to poprawia 😄 Ale zaraz się poprawię 😛 EDIT: Znaczy podświetla przepełnienia bufora... 12 minut temu, ethanak napisał: Przecież '0' i '0'+0 to jakby to samo... Nie zawsze... czasem można się nieźle zdziwić np. w C# istniał bug z listami, który potrafił zwrócić, że 1 > 12 😄 O ile pamiętam to było coś z System.Collections.Generics.List`1:Capacity Jak coś poprawiłem 😛 Edytowano Luty 3, 2021 przez H1M4W4R1 1 Link do komentarza Share on other sites More sharing options...
ethanak Luty 3, 2021 Udostępnij Luty 3, 2021 19 minut temu, H1M4W4R1 napisał: w C# istniał bug z listami Nieśmiało przypominam, że to C a nie C#. 1 Link do komentarza Share on other sites More sharing options...
Julek Luty 3, 2021 Autor tematu Udostępnij Luty 3, 2021 6 godzin temu, hashpl napisał: Super projekt. Możesz napisać do czego używasz przekaźnika. Do czego jest przycisk tact switcha oraz przycisk pilota ? Możesz narysować schemat ? Dzięki, przekaźnika używałem do sterowania ledami podświetlającymi półkę, po wciśnięciu tact switcha wyświetlały się temperatury tak samo jak przy pomocy pilota. Schematu niestety nie jestem w stanie zrobić, ponieważ nie używam projektu od około roku. Jeśli uda mi się go znaleźć to rozrysuję ale nie chcę nic obiecywać.😉 Widzę ile błędów miał ten projekt ale tak naprawdę robiłem go z kilku innych projektów, które tylko sklejałem w jeden. Teraz pewnie napisał bym ten program inaczej i nie było by w nim tyle błędów🙂 1 Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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ę »