INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
LCD I2C druckt falsch
08.02.2021, 19:37
Beitrag #1
Question LCD I2C druckt falsch
Hi, meine LCD Display mit 4x20 Zeichen ist per I2C an einen Arduino Nano angeschlossen. Leider druckt das Display alles, was in der 4. Zeile sein soll, in die 2. obwohl in der 2. schon etwas steht. Das ist dann natürlich unleserlich.

Hier mein Code:
Code:
#include <SD.h>               // include Arduino SD library
#include <LiquidCrystal.h>    // include Arduino LCD library
#include <RTClib.h>           // include Adafruit RTC library
#include <Adafruit_BME280.h>  // include Adafruit BME280 sensor library
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);


// initialize RTC library
RTC_DS3231 rtc;
DateTime   now;

// buttons definition
#define button1    A1   // button B1 is connected to Arduino pin A1
#define button2    A2   // button B2 is connected to Arduino pin A2

// define BME280 sensor I2C address: 0x76 or 0x77 (0x77 is library default address)
#define BME280_I2C_ADDRESS  0x76
// initialize Adafruit BME280 library
Adafruit_BME280  bme280;

boolean sd_ok = 0, sensor_ok = 0;

void setup()
{
  lcd.init();          // Initiate the LCD module
  lcd.backlight();     // Turn on the backlight
  pinMode(button1, INPUT_PULLUP);
  pinMode(button2, INPUT_PULLUP);

  rtc.begin();          // initialize RTC chip
  lcd.setCursor(0,  0);  lcd.print("TIME:");
  lcd.setCursor(0,  1);  lcd.print("DATE:");

  // open serial communications and wait for port to open:
  Serial.begin(9600);
  Serial.print("Initializing SD card...");

  // initialize the SD card
  if ( !SD.begin() )
    Serial.println("failed!");  // initialization error

  else {   // initialization OK
    sd_ok = true;
    Serial.println("OK.");
    if( SD.exists("Log.txt") == 0 )   // test if file with name 'Log.txt' already exists
    {  // create a text file named 'Log.txt'
      Serial.print("\r\nCreate 'Log.txt' file...");
      File dataLog;
      dataLog = SD.open("Log.txt", FILE_WRITE);   // create (&open) file Log.txt
      if(dataLog) {                               // if the file opened okay, write to it:
        Serial.println("OK");
        // write some texts to 'Log.txt' file
        dataLog.println("   DATE    |   TIME   | TEMPERATURE | HUMIDITY | PRESSURE");
        dataLog.close();   // close the file
      }
      else
        Serial.println("failed!");
    }
  }

  // initialize the BME280 sensor
  Serial.print("\r\nInitializing BME280 sensor...");
  if( bme280.begin(BME280_I2C_ADDRESS) )
  {
    Serial.println("done.");
    lcd.setCursor(0,  2);  lcd.print("T:");
    lcd.setCursor(10, 2);  lcd.print("|H:");
    lcd.setCursor(0,  3);  lcd.print("P:");
    lcd.setCursor(8, 2);
    lcd.write(223);      // print degree symbol (°)
    lcd.write('C');
    sensor_ok = true;
  }
  else
  {  // connection error or device address wrong!
    Serial.println("failed!");
    lcd.setCursor(0, 3);
    lcd.print("BME280 Sensor Error!");
  }

  Serial.println("\r\n   DATE    |   TIME   | TEMPERATURE | HUMIDITY | PRESSURE");
}

// main loop
void loop()
{
  now = rtc.now();  // read current time and date from the RTC chip
  RTC_display();    // diaplay time & calendar

  if( !digitalRead(button1) )  // if B1 is pressed
  if( debounce() )             // call debounce function (make sure B1 is pressed)
  {
    while( debounce() );  // call debounce function (wait for B1 to be released)

    byte hour   = edit( now.hour() );         // edit hours
    byte minute = edit( now.minute() );       // edit minutes
    byte day    = edit( now.day() );          // edit date
    byte month  = edit( now.month() );        // edit month
    byte year   = edit( now.year() - 2000 );  // edit year

    // write time & date data to the RTC chip
    rtc.adjust(DateTime(2000 + year, month, day, hour, minute, 0));

    while(debounce());  // call debounce function (wait for button B1 to be released)
  }

  static byte p_second;
  if( p_second != now.second() )
  {   // read & print sensor data every 1 second
    char temp_a[7], humi_a[7], pres_a[12];
    char buffer1[22];
    p_second = now.second();
    if( sensor_ok )
    {
      // read temperature, humidity and pressure from the BME280 sensor
      float temp = bme280.readTemperature();    // get temperature in °C
      float humi = bme280.readHumidity();       // get humidity in rH%
      float pres = bme280.readPressure();       // get pressure in Pa
      // save all data to arrays
      // 1: temperature
      if(temp < 0)   // if temperature is negative
        sprintf( temp_a, "-%02u.%02u", (int)abs(temp), (int)(abs(temp) * 100) % 100 );
      else
        sprintf( temp_a, " %02u.%02u", (int)temp, (int)(temp * 100) % 100 );
      // 2: humidity
      sprintf( humi_a, "%02u.%02u%%", (int)humi, (int)(humi * 100) % 100 );
      // 3: pressure
      sprintf( pres_a, "%04u.%02u hPa", (int)(pres/100), (int)((uint32_t)pres % 100) );
      // print sensor data on the LCD
      lcd.setCursor(2,  2);  lcd.print(temp_a);   // print temperature
      lcd.setCursor(14, 2);  lcd.print(humi_a);   // print humidity
      lcd.setCursor(3,  3);  lcd.print(pres_a);   // print pressure

    }

    sprintf( buffer1, "%02u-%02u-%04u | %02u:%02u:%02u", now.day(), now.month(), now.year(),
                       now.hour(), now.minute(), now.second() );

    Serial.print(buffer1);
    Serial.print(" |  ");
    if(sensor_ok) {
      Serial.print(temp_a);
      Serial.print("°C   |  ");
      Serial.print(humi_a);
      Serial.print("  | ");
      Serial.println(pres_a);
    }
    else
      Serial.println("  Error    |  Error   |  Error");

    // write data to SD card
    if(sd_ok)
    {  // if the SD card was successfully initialized
      // open Log.txt file with write permission
      File dataLog;
      dataLog = SD.open("Log.txt", FILE_WRITE);
      dataLog.print(buffer1);
      dataLog.print(" |  ");
      if(sensor_ok) {
        dataLog.print(temp_a);
        dataLog.print("°C   |  ");
        dataLog.print(humi_a);
        dataLog.print("  | ");
        dataLog.println(pres_a);
      }
      else
        dataLog.println("  Error    |  Error   |  Error");
      dataLog.close();   // close the file
    }

  }

  delay(100);   // wait 100ms
}

//////////////////////////////////////// RTC functions ////////////////////////////////////////
void RTC_display()
{
  char _buffer[12];
  char dow_matrix[7][4] = {"SUN", "MON", "TUE", "WED",
                             "THU", "FRI", "SAT"};
  lcd.setCursor(6, 1);
  lcd.print( dow_matrix[now.dayOfTheWeek()] );

  // print time
  sprintf( _buffer, "%02u:%02u:%02u", now.hour(), now.minute(), now.second() );
  lcd.setCursor(10, 0);
  lcd.print(_buffer);
  // print date
  sprintf( _buffer, "-%02u-%02u-%04u", now.day(), now.month(), now.year() );
  lcd.setCursor(9, 1);
  lcd.print(_buffer);
}

byte edit(byte parameter)
{
  static byte i = 0, y_pos,
              x_pos[5] = {10, 13, 10, 13, 18};
  char text[3];
  sprintf(text,"%02u", parameter);

  if(i < 2)
    y_pos = 0;
  else
    y_pos = 1;

  while( debounce() );   // call debounce function (wait for B1 to be released)

  while(true) {
    while( !digitalRead(button2) ) {  // while B2 is pressed
      parameter++;
      if(i == 0 && parameter > 23)    // if hours > 23 ==> hours = 0
        parameter = 0;
      if(i == 1 && parameter > 59)    // if minutes > 59 ==> minutes = 0
        parameter = 0;
      if(i == 2 && parameter > 31)    // if day > 31 ==> day = 1
        parameter = 1;
      if(i == 3 && parameter > 12)    // If month > 12 ==> month = 1
        parameter = 1;
      if(i == 4 && parameter > 99)    // If year > 99 ==> year = 0
        parameter = 0;

      sprintf(text,"%02u", parameter);
      lcd.setCursor(x_pos[i], y_pos);
      lcd.print(text);
      delay(200);       // wait 200ms
    }

    lcd.setCursor(x_pos[i], y_pos);
    lcd.print("  ");
    unsigned long previous_m = millis();
    while( (millis() - previous_m < 250) && digitalRead(button1) && digitalRead(button2) ) ;
    lcd.setCursor(x_pos[i], y_pos);
    lcd.print(text);
    previous_m = millis();
    while( (millis() - previous_m < 250) && digitalRead(button1) && digitalRead(button2) ) ;

    if(!digitalRead(button1))
    {                     // if button B1 is pressed
      i = (i + 1) % 5;    // increment 'i' for the next parameter
      return parameter;   // return parameter value and exit
    }
  }
}

// a small function for button1 (B1) debounce
bool debounce ()
{
  byte count = 0;
  for(byte i = 0; i < 5; i++)
  {
    if ( !digitalRead(button1) )
      count++;
    delay(10);
  }

  if(count > 2)  return 1;
  else           return 0;
}
////////////////////////////////////// end RTC functions //////////////////////////////////////

// end of code.


Habt ihr eine Idee, woran das liegen könnte?
Vielen Dank.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.02.2021, 19:43
Beitrag #2
RE: LCD I2C druckt falsch
Rate mal, wofür diese Initialisierung steht?
Code:
LiquidCrystal_I2C lcd(0x27, 16, 2);

Wenn Du Dein Display als 16 Zeichen x2 Zeilen ansprichst, wird das wohl nicht so richtig funktionieren bei einem 20x4.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.02.2021, 19:45
Beitrag #3
Question RE: LCD I2C druckt falsch
(08.02.2021 19:43)Tommy56 schrieb:  Rate mal, wofür diese Initialisierung steht?
Code:
LiquidCrystal_I2C lcd(0x27, 16, 2);

Wenn Du Dein Display als 16 Zeichen x2 Zeilen ansprichst, wird das wohl nicht so richtig funktionieren bei einem 20x4.

Gruß Tommy

Oh... Mist. Vielen Dank nochmal.

Aber kann mir jemand erklären, wiese ich trotzdem 3 Zeilen sehe?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.02.2021, 20:59
Beitrag #4
RE: LCD I2C druckt falsch
(08.02.2021 19:45)LK2567 schrieb:  Aber kann mir jemand erklären, wiese ich trotzdem 3 Zeilen sehe?

Weil die Elektronik im Display das so verwaltet und aufgrund der fehlenden Zeile das in die vorhandene Zeile schreibt. Das 4-Zeilen Display ist quasi ein doppeltes 2-Zeilen-Display, welches über die Zeilennummer erst weiß, wo es die Daten hinschreiben soll. Da hier zwei Zeilen fehlen, fängt es wieder von vorn an.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  char return Werte sind komplett falsch flowmotion 8 795 12.02.2021 22:27
Letzter Beitrag: Tommy56
  Arduino reagiert umgekehrt (also falsch) nimbus-high 3 577 09.11.2020 14:42
Letzter Beitrag: hotsystems
  [gelöst; Reihenfolgeproblem bei der Programmierung]Position falsch von Text ManniP 3 564 27.09.2020 14:29
Letzter Beitrag: ManniP
  Nano: CRC-Berechnung mit PROGMEM falsch miq19 3 809 22.07.2020 13:56
Letzter Beitrag: MicroBahner
  Den Wert eines PWM Pins auslesen - was mache ich falsch? Gelegenheitsbastler 8 2.225 25.11.2019 10:49
Letzter Beitrag: MicroBahner
  delay Zeit falsch golex 9 3.087 24.05.2019 21:18
Letzter Beitrag: GuaAck
  Multiple Serielle Bytes mit Startmarke synchronisieren, was mache ich falsch Mosi 8 2.613 20.12.2018 18:33
Letzter Beitrag: Mosi
  was ist falsch? (c++) uweq 36 7.973 18.07.2018 15:55
Letzter Beitrag: Mathias
  AnalogRead zwischendurch falsch Mathias 5 2.354 18.03.2018 17:07
Letzter Beitrag: Mathias
  Ausgabe druckt immer 2 Werte anstatt nur einen. Finde den Fehler nicht TimeMen 24 6.242 02.07.2016 14:18
Letzter Beitrag: hotsystems

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste