Оформи код соответствующим тэгом, см. Правила
#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 += "¤t=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();
}
#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 += "¤t=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();
}
Вложения
-
5.3 KB Просмотры: 1