W tym poście pokazuję jak połączyć wyświetlacz LCD z Arduino korzystając z magistrali I2C. Dzięki temu do komunikacji użyte są tylko dwa piny plus zasilanie.
Pomaga nam w tym ekspander PCF8574P.
Oto schemat połączeń dla Arduino Uno R3:
Uwaga! Ja korzystam z Arduino Uno R3 i ma on wyprowadzone dodatkowo piny magistrali I2C tak jak na rysunku powyżej. Równie dobrze można z ekspandera wyjść na piny A4 i A5, jak w tabelce.
Łączenie z innymi platformami:
Arduino boards | I2C / TWI pins |
Uno, Ethernet | A4 (SDA), A5 (SCL) |
Mega2560 | 20 (SDA), 21 (SCL) |
Leonardo | 2 (SDA), 3 (SCL) |
Due | 20 (SDA), 21 (SCL), SDA1, SCL1 |
Potrzebne części:
Potencjometr 10k.
Expander PCF8574P
Arduino Uno R3
Biblioteki do instalacji:
https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library.git
Kod 1:
#include //Standardowa biblioteka Arduino #include LiquidCrystal_I2C lcd(0x16,16,2); void setup() { lcd.init(); lcd.print("Hello, world!"); } void loop() { }
Kod 2:
#include #include LiquidCrystal_I2C lcd(0x16,16,2); void setup() { lcd.init(); lcd.backlight(); Serial.begin(9600); } void loop() { if (Serial.available()) { delay(100); lcd.clear(); while (Serial.available() > 0) { lcd.write(Serial.read()); } } }
Kod 3:
#include #include LiquidCrystal_I2C lcd(0x20,16,2); // set the LCD address to 0x20 for a 16 chars and 2 line display int time = 0; void setup() { lcd.init(); lcd.backlight(); lcd.setCursor(0, 0); lcd.print("3w.yarogniew.net"); } void loop(){ //Przejście kursora do pierwszej kolumny drugiego wiersza lcd.setCursor(2, 1); //Odczyt oraz wyświetlenie czasu jaki upłynął od ostatniego resetu w sekundach time = millis()/1000; lcd.print("time:"); lcd.print(time); ///lcd.print("---"); /*if (time==10){ lcd.noDisplay(); lcd.setCursor(5, 1); lcd.print("czas=20"); delay(3000); // czekaj lcd.display(); lcd.setCursor(5, 1); lcd.print(" "); } */ }
Kod 4:
/* DS3231_test.pde Eric Ayars 4/11 Test/demo of read routines for a DS3231 RTC. Turn on the serial monitor after loading this to check if things are working as they should. */ #include #include #include LiquidCrystal_I2C lcd(0x20,16,2); // set the LCD address to 0x20 for a 16 chars and 2 line display int time = 0; DS3231 Clock; bool Century=false; bool h12; bool PM; byte ADay, AHour, AMinute, ASecond, ABits; bool ADy, A12h, Apm; byte year, month, date, DoW, hour, minute, second; void setup() { // Start the I2C interface Wire.begin(); //Clock.setSecond(50);//Set the second //Clock.setMinute(59);//Set the minute //Clock.setHour(11); //Set the hour //Clock.setDoW(5); //Set the day of the week //Clock.setDate(31); //Set the date of the month //Clock.setMonth(5); //Set the month of the year //Clock.setYear(13); //Set the year (Last two digits of the year) // Start the serial interface Serial.begin(115200); lcd.init(); // initialize the lcd //lcd.clear(); // Print a message to the LCD. lcd.backlight(); lcd.setCursor(0, 0); lcd.print("3w.yarogniew.net"); } void ReadDS3231() { int second,minute,hour,date,month,year,temperature; second=Clock.getSecond(); minute=Clock.getMinute(); hour=Clock.getHour(h12, PM); date=Clock.getDate(); month=Clock.getMonth(Century); year=Clock.getYear(); temperature=Clock.getTemperature(); lcd.setCursor(2, 1); lcd.print("20"); lcd.print(year,DEC); lcd.print('-'); lcd.print(month,DEC); lcd.print('-'); lcd.print(date,DEC); lcd.print(' '); lcd.print(hour,DEC); lcd.print(':'); lcd.print(minute,DEC); lcd.print(':'); lcd.print(second,DEC); //lcd.print('\n'); //lcd.print("Temperature="); //lcd.print(temperature); //lcd.print('\n'); Serial.print("20"); Serial.print(year,DEC); Serial.print('-'); Serial.print(month,DEC); Serial.print('-'); Serial.print(date,DEC); Serial.print(' '); Serial.print(hour,DEC); Serial.print(':'); Serial.print(minute,DEC); Serial.print(':'); Serial.print(second,DEC); Serial.print('\n'); Serial.print("Temperature="); Serial.print(temperature); Serial.print('\n'); } void loop() {ReadDS3231();delay(1000); //Przejście kursora do pierwszej kolumny drugiego wiersza //lcd.setCursor(2, 1); //Odczyt oraz wyświetlenie czasu jaki upłynął od ostatniego resetu w sekundach //time = millis()/1000; //lcd.print("time:"); //lcd.print(time); // send what's going on to the serial monitor. // Start with the year /* Serial.print("2"); if (Century) { // Won't need this for 89 years. Serial.print("1"); } else { Serial.print("0"); } Serial.print(Clock.getYear(), DEC); Serial.print('-'); // then the month Serial.print(Clock.getMonth(Century), DEC); Serial.print('-'); // then the date Serial.print(Clock.getDate(), DEC); Serial.print(' ');*/ // and the day of the week /*Serial.print(Clock.getDoW(), DEC); Serial.print(' ');*/ // Finally the hour, minute, and second /*Serial.print(Clock.getHour(h12, PM), DEC); Serial.print(':'); Serial.print(Clock.getMinute(), DEC); Serial.print(':'); Serial.print(Clock.getSecond(), DEC); // Add AM/PM indicator if (h12) { if (PM) { Serial.print(" PM "); } else { Serial.print(" AM "); } } else { Serial.print(" 24h "); } // Display the temperature Serial.print("T="); Serial.print(Clock.getTemperature(), 2); // Tell whether the time is (likely to be) valid if (Clock.oscillatorCheck()) { Serial.print(" O+"); } else { Serial.print(" O-"); }*/ // Indicate whether an alarm went off /*if (Clock.checkIfAlarm(1)) { Serial.print(" A1!"); } if (Clock.checkIfAlarm(2)) { Serial.print(" A2!"); }*/ // New line on display //Serial.print('\n'); // delay(1000); // Display Alarm 1 information /* Serial.print("Alarm 1: "); Clock.getA1Time(ADay, AHour, AMinute, ASecond, ABits, ADy, A12h, Apm); Serial.print(ADay, DEC); if (ADy) { Serial.print(" DoW"); } else { Serial.print(" Date"); } Serial.print(' '); Serial.print(AHour, DEC); Serial.print(' '); Serial.print(AMinute, DEC); Serial.print(' '); Serial.print(ASecond, DEC); Serial.print(' '); if (A12h) { if (Apm) { Serial.print('pm '); } else { Serial.print('am '); } } if (Clock.checkAlarmEnabled(1)) { Serial.print("enabled"); } Serial.print('\n'); // Display Alarm 2 information Serial.print("Alarm 2: "); Clock.getA2Time(ADay, AHour, AMinute, ABits, ADy, A12h, Apm); Serial.print(ADay, DEC); if (ADy) { Serial.print(" DoW"); } else { Serial.print(" Date"); } Serial.print(' '); Serial.print(AHour, DEC); Serial.print(' '); Serial.print(AMinute, DEC); Serial.print(' '); if (A12h) { if (Apm) { Serial.print('pm'); } else { Serial.print('am'); } } if (Clock.checkAlarmEnabled(2)) { Serial.print("enabled"); }*/ /* display alarm bits Serial.print('\n'); Serial.print('Alarm bits: '); Serial.print(ABits, DEC); */ /* Serial.print('\n'); Serial.print('\n'); delay(1000); // Display the time once more as a test of the getTime() function Clock.getTime(year, month, date, DoW, hour, minute, second); Serial.print(year, DEC); Serial.print("/"); Serial.print(month, DEC); Serial.print("/"); Serial.print(date, DEC); Serial.print("day of the week :"); Serial.println(DoW, DEC); Serial.print(hour, DEC); Serial.print(":"); Serial.print(minute, DEC); Serial.print(":"); Serial.println(second, DEC);*/ }
Linki: