// vi:ts=4 // ---------------------------------------------------------------------------- // ReadWrite - simple demonstration reading data from LCD // Created by Bill Perry 2016-08-19 // bperrybap@opensource.billsworld.billandterrie.com // // This example code is unlicensed and is released into the public domain // ---------------------------------------------------------------------------- // // This sketch is for LCDs with PCF8574 or MCP23008 chip based backpacks // WARNING: // Use caution when using 3v only processors like arm and ESP8266 processors // when interfacing with 5v modules as not doing proper level shifting or // incorrectly hooking things up can damage the processor. // // The purpose of the sketch is to demonstrate the ability to read data from // the LCD. // // Sketch will print the amount of time since the Arduino has been reset // on the top row and then read the data from the LCD to print it on the // second row // // If there are errors and the arduino supports a built in LED, // an error status code will blink on the built in LED. // Error codes: // (1) lcd device initalization failed // (2) lcd device does not support reads // (3) error reading data from lcd device // (4) error writing data to lcd device // (5) read data mismatch // #include #include #include hd44780_I2Cexp lcd; // declare lcd object: auto locate & config exapander chip // LCD geometry const int LCD_ROWS = 2; const int LCD_COLS = 16; void setup() { // initialize LCD with number of columns and rows: if( lcd.begin(LCD_COLS, LCD_ROWS)) { // begin() failed so blink the onboard LED if possible fatalError(1); } // check to see if device can read by attempting to read // the lcd status register. If it fails then assume it was // because the lcd device does not support reads. if(lcd.status() < 0) { lcd.print("No Read Support"); fatalError(2); } } void loop() { static unsigned long lastsecs = -1; // pre-initialize with non zero value unsigned long secs; secs = millis() / 1000; // see if 1 second has passed // so the display is only updated once per second if(secs != lastsecs) { lastsecs = secs; // keep track of last seconds // set the cursor position to top line: column 0, row 0 lcd.setCursor(0, 0); // print uptime on lcd device: (time since last reset) PrintUpTime(lcd, secs); // Now copy the characters from the top line to the 2nd line // This is done character by character by: // - setting the character position to read // - reading a character // - setting the character position to write // - writing the charcter read for(int col = 0; col < LCD_COLS; col++) { int c; lcd.setCursor(col, 0); if((c = lcd.read()) < 0) // if a read error, bomb out fatalError(3); // check for ':' characters in col 2 and 5 // if not there, consider it a fatal read error if((col == 2 || col == 5) && c != ':') fatalError(5); lcd.setCursor(col, 1); if(lcd.write((uint8_t) c) != 1) fatalError(4); } } } // PrintUpTime(outdev, secs) - print uptime in HH:MM:SS format // outdev - the device to send output // secs - the total number of seconds uptime void PrintUpTime(Print &outdev, unsigned long secs) { unsigned int hr, mins, sec; // convert total seconds to hours, mins, seconds mins = secs / 60; // how many total minutes hr = mins / 60; // how many total hours mins = mins % 60; // how many minutes within the hour sec = secs % 60; // how many seconds within the minute // print uptime in HH:MM:SS format // Print class does not support fixed width formatting // so insert a zero if number smaller than 10 if(hr < 10) outdev.write('0'); outdev.print((int)hr); outdev.write(':'); if(mins < 10) outdev.write('0'); outdev.print((int)mins); outdev.write(':'); if(sec < 10) outdev.write('0'); outdev.print((int)sec); } // fatalError() - loop & blink and error code void fatalError(int ecode) { hd44780::fatalError(ecode); // does not return }