Arduino Uno + LCD16/2 + PCF8574

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:

Dodaj komentarz