#include <Wire.h> // Подключаем библиотеку для работы с шиной I2C
#include <LiquidCrystal_I2C.h> // Подключаем библиотеку для работы с LCD дисплеем по шине I2C
LiquidCrystal_I2C lcd(0x27,16,2); // Объявляем объект библиотеки, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2) Если дисплей не отвечает, то измените адрес на 0x3F
uint8_t symbol[8] = {31,31,31,31,31,31,31,31}; // Определяем массив который содержит полностью закрашенный символ
const uint8_t pinSensor = A0; // Определяем константу для хранения номера аналогового входа с которого будут браться данные
uint16_t valSensor; // Объявляем переменную для хранения данных с аналогового входа pinSensor
//
void setup(){ //
lcd.init(); // Инициируем работу с LCD дисплеем
lcd.backlight(); // Включаем подсветку LCD дисплея
lcd.createChar(1, symbol); // Загружаем символ из массива symbol в первую ячейку ОЗУ дисплея
} // Так как символ был загружен в 1 ячейку, то для его отображения на дисплее нужно вывести символ с кодом 1
// Если бы мы загрузили символ во 2 ячейку, то для его отображения на дисплее нужно было бы вывести символ с кодом 2
void loop(){ //
valSensor = analogRead(pinSensor); // Читаем данные с аналогового входа pinSensor в переменную valSensor
lcd.setCursor(6, 1); lcd.print(" "); // Устанавливаем курсор дисплея на 6 символ 1 строки и выводим 4 пробела начиная с той позиции, куда ранее был установлен курсор.
lcd.setCursor(6, 1); lcd.print(valSensor); // Устанавливаем курсор дисплея на 6 символ 1 строки и выводим значение переменной valSensor на дисплей (начиная с той позиции, куда ранее был установлен курсор)
lcd.setCursor(0, 0); // Устанавливаем курсор дисплея на 0 символ 0 строки для вывода шкалы, дальнейший вывод символов начнётся именно с этой позиции
uint8_t j=map(valSensor,0,1023,0,17); // Определяем переменную j которой присваиваем значение valSensor преобразованное от диапазона 0...1023 к диапазону 0...17
for(uint8_t i=0; i<16; i++){ // Выполняем цикл 16 раз для вывода шкалы из 16 символов начиная с позиции в которую ранее был установлен курсор
lcd.write(j>i? 1:32); // Выводим на дисплей символ по его коду, либо 1 (символ из 1 ячейки ОЗУ дисплея), либо 32 (символ пробела)
} // После вывода каждого символа, курсор дисплея сдвигается автоматически
}