Помогите пожалуйста разобраться почему не правильно выводит кастомные значки(0,1)

Lucifer24D

✩✩✩✩✩✩✩
9 Апр 2025
1
0
Оформи код соответствующим тэгом, см. Правила
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Adafruit_BME280.h>
#include <RTClib.h>
#include <WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>

// Настройки Wi-Fi
const char* ssid = "nnnnnnnn";
const char* password = "nnnnnnnn";

// Координаты для погоды
const float LATITUDE = nn.nnnn;
const float LONGITUDE = nn.nnnn;

// Инициализация компонентов
LiquidCrystal_I2C lcd(0x27, 16, 2); // Адрес LCD
Adafruit_BME280 bme; // Датчик BME280
RTC_DS3231 rtc; // Модуль времени
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 10800, 86400000); // GMT+3

// Кастомные символы (8 штук)
byte thermometerIcon[8] = { // Значок температуры (0)
B00100, B01010, B01010, B01010, B01110, B11111, B11111, B01110
};

byte dropletIcon[8] = { // Значок влажности (1)
B00100, B00100, B01010, B01010, B10001, B10001, B01110, B00000
};

byte hotIcon[8] = {
B01010, B11111, B11111, B11111, B01110, B01010, B00100, B00000
};

byte coldIcon[8] = {
B10101, B01110, B10101, B01110, B10101, B01110, B00000, B00000
};

byte comfortIcon[8] = {
B00000, B01010, B11111, B11111, B01110, B00100, B00000, B00000
};

byte sunIcon[8] = {
B00000, B10101, B01110, B11011, B01110, B10101, B00000, B00000
};

byte rainIcon[8] = {
B00100, B00100, B01110, B11111, B10101, B00100, B01110, B00000
};

byte snowIcon[8] = {
B00100, B10101, B01110, B11111, B01110, B10101, B00100, B00000
};

// Глобальные переменные
float outdoorTemp = 0;
String weatherSymbol = "";
unsigned long lastUpdate = 0;

void setup() {
Serial.begin(115200);

// Инициализация I2C с новыми пинами
Wire.begin(4, 5); // SDA=GPIO4, SCL=GPIO5

// Инициализация дисплея
lcd.init();
lcd.backlight();
lcd.createChar(0, thermometerIcon);
lcd.createChar(1, dropletIcon);
lcd.createChar(2, hotIcon);
lcd.createChar(3, coldIcon);
lcd.createChar(4, comfortIcon);
lcd.createChar(5, sunIcon);
lcd.createChar(6, rainIcon);
lcd.createChar(7, snowIcon);

// Инициализация датчиков
if(!bme.begin(0x76)) {
lcd.print("BME280 Error!");
while(1);
}

if(!rtc.begin()) {
lcd.print("RTC Error!");
while(1);
}

// Подключение к Wi-Fi
WiFi.begin(ssid, password);
lcd.print("Connecting...");
while(WiFi.status() != WL_CONNECTED) {
delay(500);
lcd.print(".");
}
lcd.clear();

// Первая синхронизация
timeClient.begin();
updateTime();
getWeather();
}

void loop() {
// Обновление данных каждые 30 минут
if(millis() - lastUpdate > 1800000) {
updateTime();
getWeather();
lastUpdate = millis();
}

// Основной вывод данных
printIndoorData();
printOutdoorData();
delay(1000);
}

void printIndoorData() {
float temp = bme.readTemperature();
float hum = bme.readHumidity();

lcd.setCursor(0, 0);
lcd.write(0); // Термометр
lcd.print(temp, 1); // Температура
lcd.write(0xDF); // Градус
lcd.print(" ");
lcd.write(getCondition(temp, hum)); // Статус
lcd.print(" ");
lcd.write(1); // Капля
lcd.print((int)hum); // Влажность
lcd.print("%");
}

void printOutdoorData() {
DateTime now = rtc.now();
float pressure = bme.readPressure() * 0.00750062;

lcd.setCursor(0, 1);
lcd.print((int)pressure); // Давление
lcd.print("mm ");
lcd.print(outdoorTemp, 0); // Уличная темп.
lcd.write(0xDF); // Градус
lcd.print(weatherSymbol); // Иконка погоды
printTime(now); // Время
}

byte getCondition(float temp, float hum) {
if(temp > 28) return 2; // Жарко
if(temp < 15) return 3; // Холодно
if(hum > 70) return 6; // Дождь
return 4; // Комфорт
}

void printTime(DateTime t) {
lcd.setCursor(10, 1);
if(t.hour() < 10) lcd.print("0");
lcd.print(t.hour());
lcd.print(":");
if(t.minute() < 10) lcd.print("0");
lcd.print(t.minute());
}

void updateTime() {
timeClient.forceUpdate();
rtc.adjust(DateTime(timeClient.getEpochTime()));
}

void getWeather() {
if(WiFi.status() != WL_CONNECTED) return;

HTTPClient http;
String url = "https://api.open-meteo.com/v1/forecast?";
url += "latitude=" + String(LATITUDE, 4);
url += "&longitude=" + String(LONGITUDE, 4);
url += "&current=temperature_2m,precipitation";

http.begin(url);
if(http.GET() == 200) {
DynamicJsonDocument doc(1024);
deserializeJson(doc, http.getString());

outdoorTemp = doc["current"]["temperature_2m"];
float precip = doc["current"]["precipitation"];

if(precip > 2) weatherSymbol = "\7"; // Снег
else if(precip > 0) weatherSymbol = "\6"; // Дождь
else weatherSymbol = "\5"; // Солнце
}
http.end();
}
 

Вложения

Mirv

✩✩✩✩✩✩✩
5 Фев 2020
1
0
Заменить в строке 191 на вот это:
C++:
    if (precip > 2) weatherSymbol = "7";       // Снег
    else if (precip > 0) weatherSymbol = "6";  // Дождь
    else weatherSymbol = "5";                  // Солнце
и в строке 149:

C++:
lcd.print(atoi(weatherSymbol.c_str()));   // Иконка погоды