#include <LiquidCrystal_I2C.h>
const bool cursor_blink_enabled = true;
const uint8_t potentiometer_pin = A6;
const uint8_t lcd_columns = 16;
const uint8_t lcd_lines = 2;
LiquidCrystal_I2C lcd( 0x27, lcd_columns, lcd_lines );
void setup()
{
lcd.init();
lcd.backlight();
lcd.setCursor( 4, 0 );
lcd.print( "POSITION" );
lcd.setCursor( 0, 1 );
lcd.print( '<' );
lcd.setCursor( lcd_columns - 1, 1 );
lcd.print( '>' );
}
void loop()
{
const uint32_t now = millis();
static uint32_t cursor_blink_timer = 0;
static bool cursor_blink_state = false;
const uint8_t cursor_position = map( analogRead( potentiometer_pin ), 0, 1024, 1, lcd_columns - 1 );
static uint8_t previous_cursor_position = UINT8_MAX;
if ( cursor_position != previous_cursor_position )
{
if ( previous_cursor_position != UINT8_MAX )
{
lcd.setCursor( previous_cursor_position, 1 );
lcd.write( ' ' );
}
previous_cursor_position = cursor_position;
if ( cursor_blink_enabled == true )
{
cursor_blink_timer = 0;
cursor_blink_state = false;
}
else
{
lcd.setCursor( cursor_position, 1 );
lcd.write( 255 );
}
}
if ( cursor_blink_enabled == true && ( cursor_blink_timer == 0 || now - cursor_blink_timer >= 500 ) )
{
lcd.setCursor( cursor_position, 1 );
lcd.write( cursor_blink_state == false ? 255 : ' ' );
cursor_blink_timer = now;
cursor_blink_state = !cursor_blink_state;
}
}