// Библиотека для работы с текстовым дисплеем по шине I²C #include // Даём понятное имя пину, который подключен // к батарейному отсеку через резистивный делитель constexpr int VOLTAGE_PIN = A3; // Создаём объект для работы с дисплеем // В параметрах передаём I²C-адрес дисплея, кол-во строк и символов LiquidCrystal_I2C lcd(0x38, 16, 2); // Создаём константы резисторного делителя: // номиналы резисторов и коэффициент делителя constexpr float R1 = 10; constexpr float R2 = 1; constexpr float k = R2/(R2+R1); // Создаём константы с адресами иконок заряда батареи из таблицы знакогенератора constexpr int LCD_ICON_BATTERY_1 = 0x9B; constexpr int LCD_ICON_BATTERY_2 = 0x9C; constexpr int LCD_ICON_BATTERY_3 = 0x9D; constexpr int LCD_ICON_BATTERY_4 = 0x9E; constexpr int LCD_ICON_BATTERY_5 = 0x9F; void setup() { // Инициализируем дисплей lcd.init(); // Включаем подсветку lcd.backlight(); // Устанавливаем курсор на первом знакоместе в первой строке lcd.setCursor(0, 0); // Выводим строку на дисплей lcd.print("Charge indicator"); } void loop() { // Измеряем напряжение на батарейном отсеке float batVoltage = readVoltage(); // Устанавливаем курсор на первом знакоместе в второй строке lcd.setCursor(0, 1); // Выводим напряжение на батарейном отсеке lcd.print(batVoltage); lcd.print(" V / "); // Выводим иконку, которая соответствует остаточному уровню заряда батареи if (batVoltage >= 9) { lcd.write(LCD_ICON_BATTERY_1); } else if (batVoltage >= 8) { lcd.write(LCD_ICON_BATTERY_2); } else if (batVoltage >= 7) { lcd.write(LCD_ICON_BATTERY_3); } else if (batVoltage >= 6) { lcd.write(LCD_ICON_BATTERY_4); } else { lcd.write(LCD_ICON_BATTERY_5); } delay(1000); } // Функция для считывания напряжения c батарейного отсека float readVoltage() { // Считываем аналоговый сигнал с резисторного делителя int batADC = analogRead(VOLTAGE_PIN); // Преобразуем отсчёты АЦП в напряжение с учётом коэффициента делителя float batVoltage = ((batADC * 5.0) / 1024.0) / k; return batVoltage; }