DZWON

Są tacy, którzy czytają tę wiadomość przed tobą.
Zapisz się, aby otrzymywać najnowsze artykuły.
E-mail
Nazwa
Nazwisko
Jak chcesz czytać dzwonek?
Bez spamu

W tym artykule przyjrzymy się, jak zrobić precyzyjny zegarek oparty na mikrokontrolerze Arduino lub AVR układu zegara czasu rzeczywistego DS1307. Czas zostanie wyświetlony na wyświetlaczu LCD.

Co jest konieczne

  • komputer z zainstalowanym Arduino IDE;
  • oparty na nim mikroukład DS1307 lub moduł RTC;
  • komponenty z listy elementów.

Możesz wymienić Płytka Arduino do kontrolera Atmel, ale upewnij się, że ma wystarczającą liczbę pinów wejściowych i wyjściowych oraz ma sprzętową implementację interfejsu I2C. Używam ATMega168A-PU. Jeśli będziesz używać oddzielnego mikrokontrolera, będziesz potrzebować programatora, takiego jak AVR MKII ISP.

Zakłada się, że czytelnik jest zaznajomiony z prototypowaniem, programowaniem w Arduino IDE oraz pewną znajomością języka programowania C. Oba poniższe programy nie wymagają dalszych wyjaśnień.

Wstęp

Jak mikrokontrolery śledzą czas i datę? Zwykły mikrokontroler ma funkcję timera, która zaczyna od zera po podaniu napięcia zasilającego, a następnie rozpoczyna odliczanie. W świecie Arduino możemy użyć funkcji milis(), aby dowiedzieć się, ile milisekund minęło od podania napięcia zasilającego. Kiedy usuniesz i ponownie włączysz moc, zacznie ona liczyć od początku. Nie jest to zbyt przydatne, jeśli chodzi o pracę z godzinami i datami.

Tutaj przydaje się chip RTC (zegar czasu rzeczywistego). Ten układ scalony z baterią 3 V lub innym źródłem zasilania śledzi godzinę i datę. Zegar/kalendarz dostarcza informacji o sekundach, minutach, godzinach, dniu tygodnia, dacie, miesiącu i roku. Mikroukład działa poprawnie w miesiącach 30/31 dni i latach przestępnych. Komunikacja odbywa się za pośrednictwem magistrali I2C (szyna I2C nie jest omawiana w tym artykule).

Jeśli główna szyna zasilająca Vcc spadnie poniżej napięcia akumulatora Vbat, RTC automatycznie przełączy się w tryb niskiego poboru mocy z akumulatora zapasowego. Bateria zapasowa to zwykle miniaturowa bateria (moneta, tablet) o napięciu 3 V, podłączona między stykiem 3 a obudową. W ten sposób mikroukład będzie nadal śledził godzinę i datę, a po podłączeniu zasilania do obwodu głównego mikrokontroler otrzyma aktualną godzinę i datę.

W tym projekcie będziemy używać DS1307. W tym mikroukładzie pin 7 to pin SQW / OUT (wyjście fali kwadratowej). Możesz użyć tego pinu do migania diody LED i ostrzegania mikrokontrolera o przekroczeniu limitu czasu. Zrobimy jedno i drugie. Poniżej znajduje się wyjaśnienie, jak działa terminal SQW / OUT.

Rejestr kontrolny DS1307 służy do sterowania pracą pinu SQW/OUT.

Bit 7: Sterowanie wyjściem (OUT) Ten bit steruje poziomem wyjściowym pinu SQW/OUT, gdy wyjście fali prostokątnej jest wyłączone. Jeśli SQWE = 0, poziom logiczny na pinie SQW / OUT wynosi 1, jeśli OUT = 1, i 0, jeśli OUT = 0. Początkowo ten bit jest zwykle równy 0. Bit 4: Włączenie fali prostokątnej (SQWE) Ten bit, gdy jest ustawiony do logiki 1 włącza generator wyjściowy. Częstotliwość fali prostokątnej zależy od wartości bitów RS0 i RS1. Gdy częstotliwość fali prostokątnej jest ustawiona na 1 Hz, rejestry zegara są aktualizowane podczas opadania fali prostokątnej. Początkowo bit ten ma zwykle wartość 0. Bity 1 i 0: Wybór częstotliwości (RS) Bity te kontrolują częstotliwość wyjścia fali prostokątnej, gdy wyjście fali prostokątnej jest włączone. W poniższej tabeli wymieniono częstotliwości fali prostokątnej, które można wybrać za pomocą tych bitów. Początkowo te bity to zwykle 1.

Ten stół pomoże Ci z częstotliwością:

Wybór częstotliwości fali prostokątnej DS1307
Częstotliwość impulsówBit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
1 Hz0 0 0 1 0 0 0 0
4,096 kHz0 0 0 1 0 0 0 1
8,192 kHz0 0 0 1 0 0 1 0
32,768 kHz0 0 0 1 0 0 1 1

Jeśli podłączyłeś diodę LED i rezystor do pinu 7 i chcesz, aby dioda LED migała z częstotliwością 1 Hz, musisz wpisać 0b00010000 do rejestru kontrolnego. Jeśli potrzebujesz impulsów 4096 kHz, musisz wpisać 0b000100001. W takim przypadku będziesz potrzebować oscyloskopu, aby zobaczyć impulsy, ponieważ dioda LED będzie migać tak szybko, że wydaje się, że świeci ciągle. Użyjemy impulsów 1 Hz.

Część sprzętowa

Pokazane poniżej schemat strukturalny Czego potrzebujemy.

Potrzebujemy:

  • Złącze ISP (In System Programming) do oprogramowania układowego mikrokontrolera;
  • przyciski do ustawiania czasu i daty;
  • mikrokontroler do komunikacji z RTC poprzez magistralę I2C;
  • wyświetlacz do wyświetlania daty i godziny.

Schemat:


Lista rzeczy

Poniżej zrzut ekranu z Eagle:


Oprogramowanie

W tym samouczku użyjemy dwóch różnych szkiców: jednego, który zapisuje godzinę i datę w RTC, a drugiego, który odczytuje czas i datę z RTC. Zrobiliśmy to, ponieważ daje to lepsze wyobrażenie o tym, co się dzieje. Użyjemy tego samego schematu dla obu programów.

Najpierw zapiszemy czas i datę do zegara czasu rzeczywistego, co jest podobne do ustawiania czasu na zegarze.

Używamy dwóch przycisków. Jeden, aby zwiększyć godziny, minuty, datę, miesiąc, rok i dzień tygodnia, a drugi, aby wybrać między nimi. Aplikacja nie odczytuje stanów żadnych krytycznych czujników, dlatego użyjemy przerwań, aby sprawdzić, czy przycisk jest wciśnięty i obsługiwać odbicia kontaktów.

Poniższy kod ustawia wartości i zapisuje je do RTC:

#włączać // Zdefiniuj piny LCD #define RS 9 #define E 10 #define D4 8 #define D5 7 #define D6 6 #define D7 5 LiquidCrystal lcd (RS, E, D4, D5, D6, D7); // Przerwanie 0 to pin 4 mikrokontrolera (cyfrowy pin 2 Arduino) int btnSet = 0; // Przerwanie 1 to pin 5 mikrokontrolera (cyfrowy pin 3 Arduino) int btnSel = 1; // flagi przerwań volatile int togBtnSet = false; volatile int togBtnSel = false; volatile int counterVal = 0; // Zmienne do śledzenia położenia w „menu” volatile int menuCounter = 0; // Tablica wartości ulotnych int menuValues; // 0 = godziny, 1 = minuty, 2 = dzień miesiąca, 3 = miesiąc, 4 = rok, 5 = dzień tygodnia // Tytuły menu char * menuTitles = ("Ustaw godzinę.", "Ustaw minutę. ", "Ustaw datę. "," Ustaw miesiąc. "," Ustaw rok. "," Ustaw dzień (1 = pon.). "); // Tablica dni tygodnia char * days = ("ND", "Pon", "Wt", "Śr", "Czw", "Fre", "Sob", "Nd"); void setup() (// deklarowanie przerwań, wykonywanie funkcji IncreaseValue / nextItem // na krawędzi natarcia w btnXXX attachInterrupt (btnSet, IncreaseValue, RISING); attachInterrupt (btnSel, nextItem, RISING); Wire.begin (); lcd.begin (16,2); showWelcome ();) // funkcja przerwania void IncreaseValue () (// Zmienne statyczne unsigned long lastInterruptTime = 0; // Utwórz znacznik czasu unsigned long interruptTime = millis (); // Jeśli znacznik czasu - lastInterruptTime jest większy , niż 200 if (interruptTime - lastInterruptTime> 200) (togBtnSet = true; // Zwiększ licznikVal o 1 counterVal ++;) // Ustawienie lastInterruptTime równe datownikowi // więc wiemy, że poszliśmy dalej lastInterruptTime = interruptTime;) // Funkcja przerwania dla następnego elementu menu void nextItem() (static unsigned long lastInterruptTime = 0; unsigned long interruptTime = millis (); if (interruptTime - lastInterruptTime> 200) (togBtnSel = true; // Zwiększamy licznik menu, więc możemy iść do następna pozycja menu menuCounter ++; jeśli (menuLicznik>6) menuLicznik = 0; // Umieść counterVal w tablicy liczników pozycji menu menuValues ​​= counterVal; // Zresetuj counterVal, teraz zaczynamy od 0 dla następnej pozycji menu counterVal = 0; ) lastInterruptTime = przerwanie; ) // Funkcja konwersji liczb dziesiętnych na kod binarno-dziesiętny byte decToBCD (byte val) (return ((val/10 * 16) + (val% 10));) // Funkcja sprawdzająca, czy przyciski menu zostały naciśnięte, / / i aktualizuje tytuł na wyświetlaczu. void checkCurrentMenuItem () (if (togBtnSel) (togBtnSel = false; lcd.setCursor (0,0); lcd.print (menuTitles);)) // Funkcja sprawdzania, czy naciśnięto przycisk w celu zwiększenia wartości, // i zaktualizuj zmienną w odpowiednim element tablicy, // plus wyjście nowej wartości na wyświetlacz. void checkAndUpdateValue() (// Sprawdź, czy przerwanie jest wyzwalane = przycisk jest naciśnięty if (togBtnSet) (// Zaktualizuj wartość elementu tablicy za pomocą counterVal menuValues ​​= counterVal; // Zresetuj flagę przerwania togBtnSet = false; lcd.setCursor (7,1); // Wydrukuj nową wartość lcd.print (menuValues); lcd.print ("");)) // Krótka wiadomość powitalna, teraz wiemy, że wszystko jest w porządku void showWelcome () ( lcd.setCursor (2,0); lcd .print ("Witaj świecie."); lcd.setCursor (3,1); lcd.print ("Ja" jestem żywy. "); delay (500); lcd.clear ();) // zapis danych do RTC void writeRTC () (Wire.beginTransmission (0x68); Wire.write (0); // adres startowy Wire.write (0x00); // sekundy Wire.write (decToBCD (menuValues) )); // konwersja minut na kod BCD i zapis Wire.write (decToBCD (menuValues)); // konwersja zegara na kod BCD i zapis Wire.write (decToBCD (menuValues)); // konwersja dnia tygodnia na BCD kod i zapis Wire.write (decToBCD ( menuValues)); // konwertuj dzień miesiąca na BCD i napisz Wire.write (decToBCD (menuValues)); // przekonwertuj miesiąc na BCD i zapisz Wire.write (decToBCD (menuValues)); // przekonwertuj rok na BCD i napisz Wire.write (0b00010000); // włącz impulsy fali prostokątnej 1 Hz na pinie 7 Wire.endTransmission (); // zamknięcie transmisji) // Pokaż czas // Aby zobaczyć, że RTC działa, musisz spojrzeć na inny program void showTime() (lcd.setCursor (0,0); lcd.print (""); lcd.print (menuValues ​​); lcd.print (":"); // godziny lcd.print (menuValues); lcd.print (":"); lcd.print ("00"); // minuty lcd.setCursor (3, 1) ; lcd.print (dni); lcd.print (""); // dzień tygodnia lcd.print (menuValues); lcd.print ("."); // data lcd.print (menuValues); lcd.print ( "."); // miesiąc lcd.print (menuValues); lcd.print (""); // rok // wywołanie funkcji writeRTC writeRTC ();) void loop () (if (menuCounter< 6) { checkCurrentMenuItem(); checkAndUpdateValue(); } else { showTime(); } }

Ten program rozpoczyna się krótką wiadomością powitalną. Ten komunikat informuje nas, że zasilanie jest włączone, wyświetlacz LCD działa i program został uruchomiony. Ponieważ szkic służy jedynie do pokazania, jak zapisać dane z Arduino do RTC DS1307, nie ma w nim żadnej funkcji pomocniczej (sprawdzanie, czy wartości mieszczą się w dopuszczalnych zakresach; zapętlenie przy wciskaniu przycisku zwiększania wartości, jest reset do 0, gdy wartość np. minut przekroczy 60 itd.)

// Dołącz pliki nagłówkowe #include #włączać // Zdefiniuj piny LCD #define RS 9 #define E 10 #define D4 8 #define D5 7 #define D6 6 #define D7 5 LiquidCrystal lcd (RS, E, D4, D5, D6, D7); // Pin, który będzie odbierał impulsy z zegara RTC volatile int clockPin = 0; // Zmienne czasu i daty bajt sekunda; bajt minuta; bajt godzina; bajt dzień; data w bajtach; bajt miesiąc; bajt rok; // Tablica dni tygodnia char * days = ("ND", "Pon", "Wt", "Śr", "Czw", "Fre", "Sob", "Nd"); // Funkcja wykonywana tylko przy starcie void setup() (pinMode (clockPin, INPUT); pinMode (clockPin, LOW); Wire.begin (); lcd.begin (16,2); showWelcome ();) // Krótka wiadomość powitalna, teraz wiemy, że wszystko jest w porządku void showWelcome() (lcd.setCursor (2,0); lcd.print ("Witaj świecie."); Lcd.setCursor (3,1); lcd.print (" „Żyję”.); Opóźnienie (500); lcd.clear ();) byte bcdToDec (byte val) (return ((val / 16 * 10) + (val% 16));) // Zrobione cały czas void loop (// Jeśli poziom na pinie clockPin jest wysoki if (digitalRead (clockPin)) (// Rozpocznij transfer I2C, adres 0x68 Wire.beginTransmission (0x68); // Rozpocznij pod adresem 0 Wire. write (0); // Zamknij transmisję Wire.endTransmission (); // Rozpocznij odczytywanie 7 danych binarnych z 0x68 Wire.requestFrom (0x68, 7); sekunda = bcdToDec (Wire.read ()); minuta = bcdToDec (Wire. odczyt ()); godzina = bcdToDec (Wire.read ()); dzień = bcdToDec (Wire.read ()); data = bcdToDec (Wire.read ()); miesiąc = bcdToDec (Wire.read ()); rok = bcdDoDec (Wir e.czytaj ()); // Formatowanie i wyświetlanie czasu lcd.setCursor (4,0); jeśli (godzina< 10) lcd.print("0"); lcd.print(hour); lcd.print(":"); if (minute < 10) lcd.print("0"); lcd.print(minute); lcd.print(":"); if (second < 10) lcd.print("0"); lcd.print(second); lcd.setCursor(2,1); // Форматирование и отображение даты lcd.print(days); lcd.print(" "); if (date < 10) lcd.print("0"); lcd.print(date); lcd.print("."); if (month < 10) lcd.print("0"); lcd.print(month); lcd.print("."); lcd.print(year); } }

Wniosek

W tym artykule przyjrzeliśmy się chipowi DS1307 firmy Maxim Integrated i napisaliśmy dwa programy demonstracyjne: jeden do ustawiania godziny i daty, a drugi do odczytu godziny i daty. Do testowania naciśnięć przycisków wykorzystaliśmy przerwania, w których pozbyliśmy się również wpływu odbicia kontaktu.

Zdjęcia i wideo

Ustawienie czasu

Czytanie czasu

wyświetlacz LCD- częsty gość w projektach arduino. Ale w złożone schematy możemy mieć problem braku portów Arduino ze względu na konieczność podłączenia nakładki, która ma dużo pinów. Wyjściem w tej sytuacji może być: I2C / IIC adapter łączący ekran 1602, prawie standardowy dla Arduino, z płytkami Uno, Nano lub Mega za pomocą zaledwie 4 pinów. W tym artykule zobaczymy, jak podłączyć ekran LCD z interfejsem I2C, jakich bibliotek można użyć, napiszemy krótki przykładowy szkic i przeanalizujemy typowe błędy.

Wyświetlacz ciekłokrystaliczny LCD 1602 jest dobry wybór do wyświetlania ciągów znaków w różnych projektach. Jest niedrogi, są różne modyfikacje z różnymi kolorami oświetlenia, bez problemu można pobrać gotowe biblioteki do szkiców Arduino. Jednak główną wadą tego ekranu jest to, że wyświetlacz ma 16 cyfrowych pinów, z czego co najmniej 6. Dlatego korzystanie z tego ekranu LCD bez i2c nakłada poważne ograniczenia na płytki Arduino Uno lub Nano. Jeśli nie ma wystarczającej liczby kontaktów, będziesz musiał kupić płytkę Arduino Mega lub zapisać kontakty, w tym podłączając wyświetlacz przez i2c.

Krótki opis pinów LCD 1602

Przyjrzyjmy się bliżej pinom LCD1602:

Każdy z wniosków ma swój cel:

  1. uziemienie GND;
  2. Zasilanie 5 V;
  3. Ustawienie kontrastu monitora;
  4. Zespół, dane;
  5. Zapisywanie i odczytywanie danych;
  6. Włączyć;

7-14. Linie danych;

  1. Plus podświetlenie;
  2. Podświetlenie minus.

Specyfikacje wyświetlacza:

  • Symboliczny typ wyświetlania, możliwe jest ładowanie symboli;
  • Światła ledowe;
  • kontroler HD44780;
  • Napięcie zasilania 5V;
  • Formatuj 16x2 znaki;
  • Zakres temperatur pracy od -20C do +70C, zakres temperatur przechowywania od -30C do +80C;
  • Kąt widzenia 180 stopni.

Schemat podłączenia LCD do płytki Arduino bez i2C

Standardowy schemat podłączenia monitora bezpośrednio do mikrokontrolera Arduino bez I2C jest następujący.

Ze względu na dużą liczbę podłączonych styków może nie wystarczyć miejsca na połączenie wymaganych elementów. Zastosowanie I2C zmniejsza liczbę przewodów do 4, a liczbę zajętych pinów do 2.

Gdzie kupić ekrany LCD i osłony dla Arduino

Ekran LCD 1602 (i wersja z 2004 roku) jest dość popularny, więc bez problemu można go znaleźć zarówno w krajowych sklepach internetowych, jak i na zagranicznych serwisach. Oto kilka linków do najbardziej dostępnych opcji:

LCD1602 + moduł niebieskiego ekranu I2C, kompatybilny z Arduino Prosty wyświetlacz LCD 1602 (zielone podświetlenie) taniej niż 80 rubli Duży ekran LCD2004 z I2C HD44780 dla arduino (niebieskie i zielone podświetlenie)
Wyświetlacz 1602 z adapterem IIC i niebieskim podświetleniem Kolejny wariant LCD1602 z wlutowanym modułem I2C Moduł adaptera Port IIC / I2C / TWI / SPI dla ekranu 1602, kompatybilny z Arduino
Podświetlany wyświetlacz RGB! LCD 16 × 2 + klawiatura + Buzzer Shield dla Arduino Nakładka do Arduino z przyciskami i ekranem LCD1602 LCD 1602 Wyświetlacz LCD do drukarki 3D (Smart Controller for RAMPS 1.4, Text LCD 20×4), moduł czytnika kart SD i MicroSD-

Opis protokołu I2C

Zanim omówimy podłączenie wyświetlacza do arduino za pomocą adaptera i2c, porozmawiajmy krótko o samym protokole i2C.

I2C / IIC(Inter-Integrated Circuit) to protokół pierwotnie stworzony do komunikacji układów scalonych wewnątrz urządzenie elektroniczne... Rozwój należy do Philips... Protokół i2c opiera się na wykorzystaniu szyny 8-bitowej, która jest potrzebna do łączenia bloków w elektronice sterującej oraz systemu adresowania, dzięki któremu można komunikować się tymi samymi przewodami z kilkoma urządzeniami. Po prostu przesyłamy dane do jednego lub drugiego urządzenia, dodając identyfikator wymaganego elementu do pakietów danych.

Najbardziej prosty obwód I2C może zawierać jedno urządzenie nadrzędne (najczęściej jest to mikrokontroler Arduino) oraz kilka podrzędnych (np. wyświetlacz LCD). Każde urządzenie ma adres z zakresu od 7 do 127. W jednym obwodzie nie powinny znajdować się dwa urządzenia o tym samym adresie.

Płyta Arduino obsługuje sprzętowo i2c. Możesz użyć pinów A4 i A5 do podłączenia urządzeń korzystających z tego protokołu.

Istnieje kilka zalet w działaniu I2C:

  • Do działania potrzebne są tylko 2 linie - SDA (linia danych) i SCL (linia synchronizacji).
  • Podłączanie dużej liczby wiodących urządzeń.
  • Skrócony czas rozwoju.
  • Do sterowania całym zestawem urządzeń potrzebny jest tylko jeden mikrokontroler.
  • Możliwa liczba mikroukładów podłączonych do jednej magistrali jest ograniczona jedynie maksymalną wydajnością.
  • Wysoki stopień bezpieczeństwa danych dzięki specjalnemu filtrowi przeciwprzepięciowemu wbudowanemu w obwody.
  • Prosta procedura diagnozowania pojawiających się awarii, szybkie rozwiązywanie problemów.
  • Magistrala jest już zintegrowana z samym Arduino, więc nie ma potrzeby opracowywania dodatkowego interfejsu magistrali.

Wady:

  • Istnieje ograniczenie pojemnościowe linii do 400 pF.
  • Trudne programowanie kontrolera I2C, jeśli na magistrali jest kilka różnych urządzeń.
  • Na duża liczba urządzeń, trudno jest wyizolować awarię, jeśli jedno z nich błędnie ustawi stan niskiego poziomu.

Moduł I2c dla Arduino LCD 1602

Najszybszy i wygodnym sposobem użycie wyświetlacza i2c w arduino to zakup gotowego ekranu z wbudowaną obsługą protokołów. Ale takich ekranów jest niewiele i nie są tanie. Ale różne standardowe ekrany ogromna ilość została już wydana. Dlatego obecnie najbardziej przystępną i popularną opcją jest zakup i zastosowanie osobnego modułu I2C - adaptera, który wygląda tak:

Z jednej strony modułu widzimy piny i2c - uziemienie, zasilanie i 2 do przesyłania danych. Na drugim adapterze widzimy zewnętrzne złącza zasilania. No i oczywiście na płytce jest wiele pinów, za pomocą których moduł jest przylutowany do standardowych pinów ekranu.


Do połączenia z płytką arduino wykorzystywane są wyjścia i2c. W razie potrzeby podłączamy zewnętrzny zasilacz do oświetlenia. Dzięki wbudowanemu trymerowi możemy regulować regulowane wartości kontrastu J

Na rynku można znaleźć moduły LCD 1602 z już wlutowanymi adapterami, ich użytkowanie jest maksymalnie uproszczone. Jeśli kupiłeś osobny adapter, musisz go najpierw przylutować do modułu.

Podłączanie ekranu LCD do Arduino przez I2C

Do połączenia potrzebna jest sama płytka Arduino, wyświetlacz, płytka stykowa, przewody łączące i potencjometr.

Jeśli używasz specjalnego oddzielnego adaptera i2c, musisz najpierw przylutować go do modułu ekranu. Trudno się tam pomylić, można kierować się takim schematem.


Monitor LCD z obsługą i2c łączy się z płytą za pomocą czterech przewodów - dwóch do transmisji danych, dwóch do zasilania.

  • Pin GND łączy się z GND na płycie.
  • Pin VCC jest na 5V.
  • SCL jest podłączony do pinu A5.
  • SDA łączy się z pinem A.

I to wszystko! Żadnych pajęczyn z drutów, w które bardzo łatwo się zaplątać. Jednocześnie możemy po prostu powierzyć bibliotekom całą złożoność implementacji protokołu i2C.

Biblioteki do pracy z wyświetlaczem LCD i2c

Do interakcji z Arduino LCD 1602 za pośrednictwem magistrali I2C potrzebne są co najmniej dwie biblioteki:

  • Biblioteka Wire.h do pracy z I2C jest już dostępna w program standardowy IDE Arduino.
  • Biblioteka LiquidCrystal_I2C.h, która zawiera szeroką gamę poleceń do sterowania monitorem za pośrednictwem magistrali I2C i sprawia, że ​​szkicowanie jest łatwiejsze i krótsze. Należy dodatkowo zainstalować bibliotekę Po podłączeniu wyświetlacza należy dodatkowo zainstalować bibliotekę LiquidCrystal_I2C.h

Po podłączeniu do szkicu wszystkich potrzebnych bibliotek tworzymy obiekt i możemy korzystać ze wszystkich jego funkcji. Do celów testowych pobierzmy następujący standardowy szkic z przykładu.

#włączać #włączać // Podłączanie biblioteki // # include // Podłączanie alternatywnej biblioteki LiquidCrystal_I2C lcd (0x27,16,2); // Określ adres I2C (najczęstsza wartość), a także parametry ekranu (w przypadku LCD 1602 - 2 linie po 16 znaków // LiquidCrystal_PCF8574 lcd (0x27); // Opcja dla biblioteki PCF8574 void setup () (lcd.init (); // Inicjalizacja wyświetlacza lcd.backlight (); // Podłączanie podświetlenia lcd.setCursor (0,0); // Ustawienie kursora na początek pierwszej linii lcd.print ( "Hello"); // Wpisanie w pierwszym wierszu lcd.setCursor (0,1); // Umieszczenie kursora na początku drugiego wiersza lcd.print ("ArduinoMaster"); // Wpisanie w drugim wierszu) pusta pętla () ()

Opis funkcji i metod biblioteki LiquidCrystal_I2C:

  • home () i clear () - pierwsza funkcja pozwala cofnąć kursor na początek ekranu, druga też, ale jednocześnie usuwa wszystko, co było wcześniej na monitorze.
  • write (ch) - pozwala na wydrukowanie na ekranie pojedynczego znaku ch.
  • kursor () i noCursor () - pokazuje/ukrywa kursor na ekranie.
  • miga () i noBlink () - kursor miga / nie miga (jeśli był wcześniej wyświetlany).
  • display() i noDisplay() - umożliwia podłączenie/odłączenie wyświetlacza.
  • scrollDisplayLeft () i scrollDisplayRight () - przewija ekran o jeden znak w lewo/w prawo.
  • autoscroll () i noAutoscroll () - pozwala włączyć/wyłączyć tryb autoscroll. W tym trybie wszyscy nowy symbol jest napisane w jednym i tym samym miejscu, zastępując to, co wcześniej było napisane na ekranie.
  • leftToRight () i rightToLeft () - Ustawia kierunek wyświetlanego tekstu - od lewej do prawej lub od prawej do lewej.
  • createChar (ch, bitmap) — tworzy znak z kodem ch (0–7) używając tablicy bitmap do tworzenia punktów czerni i bieli.

Alternatywna biblioteka do pracy z wyświetlaczem i2c

W niektórych przypadkach podczas korzystania z określonej biblioteki z urządzeniami wyposażonymi w kontrolery PCF8574 mogą wystąpić błędy. W takim przypadku biblioteka LiquidCrystal_PCF8574.h może być oferowana jako alternatywa. Rozszerza LiquidCrystal_I2C, więc nie powinno być żadnych problemów z jego używaniem.

Problemy z połączeniem wyświetlacza lcd I2c

Jeśli po przesłaniu szkicu nie widzisz żadnego tekstu na wyświetlaczu, spróbuj wykonać następujące czynności.

Po pierwsze, możesz zwiększyć lub zmniejszyć kontrast monitora. Często znaki są po prostu niewidoczne ze względu na tryb kontrastu i podświetlenie.

Jeśli to nie pomoże, sprawdź poprawność podłączenia styków, czy jest podłączone zasilanie podświetlenia. Jeśli użyłeś osobnego adaptera i2c, sprawdź ponownie jakość lutowania styków.

Innym częstym powodem braku tekstu na ekranie może być nieprawidłowy adres i2c. Najpierw spróbuj zmienić adres urządzenia z 0x27 0x20 lub 0x3F w szkicu. Różni producenci mogą mieć różne adresy domyślne. Jeśli to nie pomoże, możesz uruchomić szkic skanera i2c, który skanuje wszystkie podłączone urządzenia i określa ich adres metodą brute-force. Przykładowy szkic skanera i2c.

Jeśli ekran nadal nie działa, spróbuj odlutować adapter i podłączyć wyświetlacz LCD w zwykły sposób.

Wniosek

W tym artykule omówiliśmy podstawowe zagadnienia korzystania z ekranu LCD w złożonych projektach arduino, gdy potrzebujemy zapisać wolne piny na płytce. Prosty i niedrogi adapter i2c umożliwia podłączenie ekranu LCD 1602 za pomocą tylko 2 pinów analogowych. Może to być bardzo ważne w wielu sytuacjach. Płać za wygodę - konieczność korzystania z dodatkowego modułu - konwertera i biblioteki. Naszym zdaniem cena za wygodę wcale nie jest wysoka i gorąco polecamy korzystanie z tej funkcji w projektach.

Moduł zegara czasu rzeczywistego DS1307
Mały moduł RTC I2C 24C32 pamięć DS1307 zegar

Niewielki moduł pełniący funkcje zegara czasu rzeczywistego. Oparty jest na mikroukładzie DS1307ZN +. Ciągłość czasowa wynika z autonomicznego zasilania z akumulatora zainstalowanego w module. Moduł zawiera również 32 KB pamięci EEPROM, która zachowuje informacje po wyłączeniu wszystkich rodzajów zasilania. Pamięć i zegar są połączone wspólną magistralą interfejsu I2C. Sygnały magistrali I2C są wyprowadzane na styki modułu. Po podłączeniu zewnętrznego źródła zasilania bateria jest ładowana przez prymitywny obwód ładowania. Na płytce przewidziano miejsce na montaż cyfrowego czujnika temperatury DS18B20. Nie jest zawarty w pakiecie.
Zastosowanie tego urządzenia ma miejsce przy pomiarach odstępów czasu powyżej tygodnia za pomocą urządzeń opartych na mikrokontrolerze. Wykorzystanie w tym celu środków własnych MK jest nieuzasadnione i często niemożliwe. Zapewnienie nieprzerwanego zasilania przez długi czas jest drogie, nie ma możliwości zainstalowania baterii do zasilania MK ze względu na znaczny pobór prądu. Tu z pomocą przychodzi moduł zegara czasu rzeczywistego DS1307.
Również moduł zegara czasu rzeczywistego DS1307, dzięki własnej pamięci, pozwala na rejestrację danych ze zdarzeń występujących kilka razy dziennie, np. pomiarów temperatury. Dziennik zdarzeń jest wtedy odczytywany z pamięci modułu. Możliwości te pozwalają na wykorzystanie modułu w ramach autonomicznej automatycznej stacji pogodowej lub do badań klimatu w trudno dostępnych miejscach: jaskinie, szczyty skalne. Możliwa staje się rejestracja parametrów tenso konstrukcji architektonicznych, np. podpór mostowych i innych. Wyposażając urządzenie w łączność radiową wystarczy zainstalować je na badanym terenie.

Specyfikacje

Napięcie zasilania 5 V
Wymiary 27x28x8,4mm

Schemat elektryczny

Urządzenie komunikuje się z elektroniką urządzenia za pomocą sygnałów SCL i SDA. IC2 to zegar czasu rzeczywistego. Kondensatory C1 i C2 redukują szumy na linii zasilającej VCC. Rezystory R2 i R3 zapewniają, że sygnały SCL i SDA są na odpowiednim poziomie. Pin 7 IC2 wyprowadza sygnał prostokątny o częstotliwości 1 Hz SQ. Służy do testowania funkcjonalności MS IC2. Komponenty R4, R5, R6, VD1 zapewniają ładowanie akumulatora BAT1. Do przechowywania danych moduł zegara czasu rzeczywistego DS1307 zawiera pamięć nieulotną IC1. US1 - czujnik temperatury. Sygnały modułu oraz linii zasilających wyprowadzone są do złącz JP1 i P1.

Magistrala danych

I2C to standardowy interfejs szeregowy z dwiema liniami sygnałowymi SCL, SDA i wspólnym przewodem. Linie interfejsu tworzą magistralę. Do linii interfejsu I2C można podłączyć kilka mikroukładów, a nie tylko mikroukłady modułu. Aby zidentyfikować mikroukład w magistrali, a mianowicie zapisywać dane do wymaganego MS i określać, z którego MS pochodzą dane. Każdy mikroukład ma unikalny adres dla ułożonej magistrali. DS1307 ma adres 0x68. Jest rejestrowany w fabryce. Układ pamięci ma adres 0x50. V oprogramowanie W zestawie Arduino biblioteka oprogramowania zapewnienie wsparcia I2C.

Mikroukład zegara czasu rzeczywistego

DS1307 charakteryzuje się niskim poborem mocy, komunikuje się z innymi urządzeniami poprzez interfejs I2C i zawiera 56 bajtów pamięci. Zawiera zegar i kalendarz do 2100. Mikroukład zegara czasu rzeczywistego dostarcza innym urządzeniom informacje o chwili obecnej: sekundy, minuty, godziny, dzień tygodnia, datę. Liczba dni w każdym miesiącu jest liczona automatycznie. Istnieje funkcja kompensacji dla lat przestępnych. Dostępna jest flaga określająca, czy zegar pracuje w trybie 24-godzinnym czy 12-godzinnym. Aby działać w trybie 12-godzinnym, mikroukład ma bit, z którego odczytywane są dane do transmisji przez pewien okres: przed lub po obiedzie.

Układ pamięci długotrwałej

Ilustracja modułu zegara czasu rzeczywistego DS1307 od strony baterii z zainstalowanym czujnikiem temperatury U1.

Bateria

W uchwycie z tyłu deski znajduje się bateria litowa CR2032. Jest dostępny u wielu producentów, np. firmy GP, która zapewnia prąd rozładowania 3,6 V i 210 mAh. Akumulator jest ładowany podczas włączania, przy czym w tym trybie pracy baterii litowej napotykamy na płyta główna komputer.

Ładowanie baterii

Oprogramowanie

Aby moduł działał jako część Arduino, całkiem odpowiednia jest przestarzała biblioteka ze strony Adafruit o nazwie RTCLib. Szkic nazywa się DS1307.pde. Dostępna jest zaktualizowana wersja. Pobierz archiwum, rozpakuj je, zmień nazwę i skopiuj bibliotekę do katalogu bibliotek Arduino.

Łączenie z Arduino Mega

Aby to zrobić, użyj szkiców.
SetRTC ustawia czas w godzinach zgodnie z czasem pokazanym na szkicu.
GetRTC wyświetla czas.
Oba szkice wymagają biblioteki Wire i definiują adres I2C. Aby ustawić adres zegara na magistrali I2C, użyj tego skanera I2C.

Połączenie Arduino Mega.

Podłącz SCL i SDA do odpowiednich pinów 21 i 20 w Arduino Mega 2560. Podłącz zasilanie.

Połączenie Arduino Uno


Ustaw czas w szkicu SetRTC i prześlij do Arduino. Następnie naciśnij przycisk resetowania, aby ustawić zegar. Teraz pobierz szkic GetRTC. Otwórz monitor szeregowy i obserwuj. Istnieje specjalna biblioteka czasu. Ona ma dużo różne funkcje co może być pomocne w zależności od sytuacji. Aby ustawić czas korzystając z biblioteki należy pobrać. Korzystając ze szkicu, możesz zsynchronizować zegar czasu rzeczywistego z zegarem komputera osobistego.

A więc zegar czasu rzeczywistego. Ten przydatny drobiazg rozwiązuje większość przydatnych zadań związanych z czasem. Powiedzmy, że kontrola nawadniania o godzinie 5 rano na wsi. Lub włączanie i wyłączanie światła w pewien moment... Do dnia możesz rozpocząć ogrzewanie w dowolnym domu. Rzecz jest dość interesująca i użyteczna. A dokładniej? Przyjrzymy się zegarowi czasu rzeczywistego DS1302 dla popularnej platformy Arduino.

W tym artykule dowiesz się:

Dzień dobry, drodzy czytelnicy bloku kip-world! Jak się masz? Napisz w komentarzach, lubisz robotykę? Co oznacza dla Ciebie ten temat?

Myśl o tym nie opuszcza mnie ani na minutę. Śpię i widzę, kiedy w końcu dochodzimy do tego, że każdego stać na zakup osobistego robota – asystenta. Nieważne, co robi, sprząta śmieci, kosi trawniki, myje samochód.

Wyobrażam sobie tylko, jak złożone algorytmy muszą zawierać w swoich „mózgach”.

W końcu dojdziemy do tego, że będziemy sflashować oprogramowanie w taki sam sposób jak on komputery osobiste... Pobierz również programy użytkowe... Przyszywamy ręce, nogi, pazury na zmianę, manipulatory.

Obejrzyj filmy „Jestem robotem”, ” Sztuczna inteligencja"," Gwiezdne Wojownicy ".

Japończycy od dawna wprowadzają swoje rozwiązania. Dlaczego jesteśmy gorsi? Mamy bardzo małą popularność. Znam kilku programistów. Licz na palcach. Robimy coś innego. Jesteśmy sprzedawcami. Kupujemy po prostu gotowe zestawy, roboty - zabawki i wszelakie śmieci.

Dlaczego nie rozwijamy tego:

Albo to:

Skończyłem swoje rozmyślania na głos. Porozmawiajmy o podłączeniu zegara czasu rzeczywistego DS1302 do Arduino.

Zegar czasu rzeczywistego DS1302

Kontroler Arduino nie posiada własnego zegara. Dlatego, jeśli to konieczne, musisz uzupełnić o specjalny mikroukład DS1302.

Do zasilania te płytki mogą korzystać z własnej baterii lub być zasilane bezpośrednio z płytki Arduino.

Tabela pinout:

Schemat połączenia z Arduino UNO:


Metoda programowania Arduino do współpracy z DS1302

Konieczne jest pobranie prawidłowej biblioteki z zaufanych źródeł.

Biblioteka umożliwia odczytywanie i zapisywanie parametrów w czasie rzeczywistym. Mały opis Cytuję poniżej:

#włączać // Połącz bibliotekę.
iarduino_RTC OBIEKT ( NAZWA [, WYJŚCIE_RST [, WYJŚCIE_CLK [, WYJŚCIE_DAT]]] ); // Utwórz obiekt.

Funkcjonować zaczynać ();// Inicjalizacja działania modułu RTC.

Funkcjonować ustalony czas ( SEK [, MIN [, GODZINA [, DZIEŃ [, MIESIĄC [, ROK [, DZIEŃ]]]]]] ); // Ustaw czas.

Funkcjonować uzyskać czas ([ LINIA ] ); // Czas czytania.

funkcjonować czas mrugania ( PARAMETR [CZĘSTOTLIWOŚĆ] ); // Powoduje, że funkcja gettime miga określony parametr czasu.

funkcjonować Kropka ( MINUTY ); // Wskazuje minimalny okres dostępu do modułu w minutach.

Zmienny sekundy// Zwraca sekundy od 0 do 59.

Zmienny minuty// Zwraca minuty od 0 do 59.

Zmienny godziny// Zwraca godziny od 1 do 12.

Zmienny godziny// Zwraca godziny od 0 do 23.

Zmienny południe// Zwraca południe 0 lub 1 (0-am, 13:00).

Zmienny dzień// Zwraca dzień miesiąca od 1 do 31.

Zmienny dzień powszedni// Zwraca dzień tygodnia od 0 do 6 (0 to niedziela, 6 to sobota).

Zmienny miesiąc// Zwraca miesiąc od 1 do 12.

Zmienny rok// Zwraca rok od 0 do 99.

Piszemy prosty program. Ustawienie aktualnego czasu w module RTC (DS1302):

Arduino

#włączać iarduino_RTC czas (RTC_DS1302,6,7,8); void setup () (opóźnienie (300); Serial.begin (9600); time.begin (); time.settime (0,51,21,27,10,15,2); // 0 sek, 51 min, 21 godzin, 27 października 2015, wtorek) void loop () (if (millis ()% 1000 == 0) (// if 1 sekunda minęła Serial.println (time.gettime ("dmY, H: i: s) , D ")); // wyświetl opóźnienie czasowe (1); // wstrzymaj na 1 ms, aby nie wyświetlać czasu kilka razy w ciągu 1 ms))

#włączać

iarduino _ RTCtime (RTC_DS1302, 6, 7, 8);

pusta konfiguracja () (

opóźnienie (300);

Seryjny. początek (9600);

czas. zaczynać ();

czas. czas wiązania (0, 51, 21, 27, 10, 15, 2); // 0 sek, 51 min, 21 godzin, 27 października 2015, wtorek

pusta pętla () (

jeśli (mili ()% 1000 == 0) ( // jeśli minęła 1 sekunda

Seryjny. println (czas. gettime ("d-m-Y, H: i: s, D")); // wyświetl godzinę

opóźnienie (1); // pauza na 1ms, żeby nie wyświetlać czasu kilka razy w ciągu 1ms

Czytać Obecny czas z zegara czasu rzeczywistego modułu (DS1302) i wyjście do „Portu szeregowego”:

#włączać iarduino_RTC czas (RTC_DS1302,6,7,8); void setup () (opóźnienie (300); Serial.begin (9600); time.begin ();) void loop () (if (millis ()% 1000 == 0) (// jeśli Serial minął 1 sekunda). println (time.gettime ("dmY, H: i: s, D")); // wyświetl opóźnienie czasowe (1); // pauza na 1 ms, aby nie wyświetlać czasu kilka razy w ciągu 1 ms))

Moduł zegara czasu rzeczywistego DS1307
Mały moduł RTC I2C 24C32 pamięć DS1307 zegar

Niewielki moduł pełniący funkcje zegara czasu rzeczywistego. Oparty jest na mikroukładzie DS1307ZN +. Ciągłość czasowa wynika z autonomicznego zasilania z akumulatora zainstalowanego w module. Moduł zawiera również 32 KB pamięci EEPROM, która zachowuje informacje po wyłączeniu wszystkich rodzajów zasilania. Pamięć i zegar są połączone wspólną magistralą interfejsu I2C. Sygnały magistrali I2C są wyprowadzane na styki modułu. Po podłączeniu zewnętrznego źródła zasilania bateria jest ładowana przez prymitywny obwód ładowania. Na płytce przewidziano miejsce na montaż cyfrowego czujnika temperatury DS18B20. Nie jest zawarty w pakiecie.
Zastosowanie tego urządzenia ma miejsce przy pomiarach odstępów czasu powyżej tygodnia za pomocą urządzeń opartych na mikrokontrolerze. Wykorzystanie w tym celu środków własnych MK jest nieuzasadnione i często niemożliwe. Zapewnienie nieprzerwanego zasilania przez długi czas jest drogie, nie ma możliwości zainstalowania baterii do zasilania MK ze względu na znaczny pobór prądu. Tu z pomocą przychodzi moduł zegara czasu rzeczywistego DS1307.
Również moduł zegara czasu rzeczywistego DS1307, dzięki własnej pamięci, pozwala na rejestrację danych ze zdarzeń występujących kilka razy dziennie, np. pomiarów temperatury. Dziennik zdarzeń jest wtedy odczytywany z pamięci modułu. Możliwości te pozwalają na wykorzystanie modułu w ramach autonomicznej automatycznej stacji pogodowej lub do badań klimatu w trudno dostępnych miejscach: jaskinie, szczyty skalne. Możliwa staje się rejestracja parametrów tenso konstrukcji architektonicznych, np. podpór mostowych i innych. Wyposażając urządzenie w łączność radiową wystarczy zainstalować je na badanym terenie.

Specyfikacje

Napięcie zasilania 5 V
Wymiary 27x28x8,4mm

Schemat elektryczny

Urządzenie komunikuje się z elektroniką urządzenia za pomocą sygnałów SCL i SDA. IC2 to zegar czasu rzeczywistego. Kondensatory C1 i C2 redukują szumy na linii zasilającej VCC. Rezystory R2 i R3 zapewniają, że sygnały SCL i SDA są na odpowiednim poziomie. Pin 7 IC2 wyprowadza sygnał prostokątny o częstotliwości 1 Hz SQ. Służy do testowania funkcjonalności MS IC2. Komponenty R4, R5, R6, VD1 zapewniają ładowanie akumulatora BAT1. Do przechowywania danych moduł zegara czasu rzeczywistego DS1307 zawiera pamięć nieulotną IC1. US1 - czujnik temperatury. Sygnały modułu oraz linii zasilających wyprowadzone są do złącz JP1 i P1.

Magistrala danych

I2C to standardowy interfejs szeregowy z dwiema liniami sygnałowymi SCL, SDA i wspólnym przewodem. Linie interfejsu tworzą magistralę. Do linii interfejsu I2C można podłączyć kilka mikroukładów, a nie tylko mikroukłady modułu. Aby zidentyfikować mikroukład w magistrali, a mianowicie zapisywać dane do wymaganego MS i określać, z którego MS pochodzą dane. Każdy mikroukład ma unikalny adres dla ułożonej magistrali. DS1307 ma adres 0x68. Jest rejestrowany w fabryce. Układ pamięci ma adres 0x50. Oprogramowanie Arduino zawiera bibliotekę oprogramowania, która zapewnia obsługę I2C.

Mikroukład zegara czasu rzeczywistego

DS1307 charakteryzuje się niskim poborem mocy, komunikuje się z innymi urządzeniami poprzez interfejs I2C i zawiera 56 bajtów pamięci. Zawiera zegar i kalendarz do 2100. Mikroukład zegara czasu rzeczywistego dostarcza innym urządzeniom informacje o chwili obecnej: sekundy, minuty, godziny, dzień tygodnia, datę. Liczba dni w każdym miesiącu jest liczona automatycznie. Istnieje funkcja kompensacji dla lat przestępnych. Dostępna jest flaga określająca, czy zegar pracuje w trybie 24-godzinnym czy 12-godzinnym. Aby działać w trybie 12-godzinnym, mikroukład ma bit, z którego odczytywane są dane do transmisji przez pewien okres: przed lub po obiedzie.

Układ pamięci długotrwałej

Ilustracja modułu zegara czasu rzeczywistego DS1307 od strony baterii z zainstalowanym czujnikiem temperatury U1.

Bateria

W uchwycie z tyłu deski znajduje się bateria litowa CR2032. Jest dostępny u wielu producentów, np. firmy GP, która zapewnia prąd rozładowania 3,6 V i 210 mAh. Akumulator jest ładowany po włączeniu zasilania, jest to tryb działania baterii litowej, który spotykamy na płycie głównej komputera.

Ładowanie baterii

Oprogramowanie

Aby moduł działał jako część Arduino, całkiem odpowiednia jest przestarzała biblioteka ze strony Adafruit o nazwie RTCLib. Szkic nazywa się DS1307.pde. Dostępna jest zaktualizowana wersja. Pobierz archiwum, rozpakuj je, zmień nazwę i skopiuj bibliotekę do katalogu bibliotek Arduino.

Łączenie z Arduino Mega

Aby to zrobić, użyj szkiców.
SetRTC ustawia czas w godzinach zgodnie z czasem pokazanym na szkicu.
GetRTC wyświetla czas.
Oba szkice wymagają biblioteki Wire i definiują adres I2C. Aby ustawić adres zegara na magistrali I2C, użyj tego skanera I2C.

Połączenie Arduino Mega.

Podłącz SCL i SDA do odpowiednich pinów 21 i 20 w Arduino Mega 2560. Podłącz zasilanie.

Połączenie Arduino Uno


Ustaw czas w szkicu SetRTC i prześlij do Arduino. Następnie naciśnij przycisk resetowania, aby ustawić zegar. Teraz pobierz szkic GetRTC. Otwórz monitor szeregowy i obserwuj. Istnieje specjalna biblioteka czasu. Posiada wiele różnych funkcji, które mogą być przydatne w zależności od sytuacji. Aby ustawić czas korzystając z biblioteki należy pobrać. Korzystając ze szkicu, możesz zsynchronizować zegar czasu rzeczywistego z zegarem komputera osobistego.

DZWON

Są tacy, którzy czytają tę wiadomość przed tobą.
Zapisz się, aby otrzymywać najnowsze artykuły.
E-mail
Nazwa
Nazwisko
Jak chcesz czytać dzwonek?
Bez spamu