Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Ответить

Помогите с заковыкой (конечно же метеостанция)

Вс май 23, 2021 05:21:54

Спойлер// 8.868 Kb, без СО2

#include <Wire.h>

#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme; // I2C


#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);


#include "RTClib.h"


RTC_DS3231 rtc;

char daysOfTheWeek[7] [12] = {
"Boc\272pece\275\270e",
"\250o\275e\343e\273\304\275\270\272",
"B\277op\275\270\272 ",
"Cpe\343a ",
"\253e\277\263ep\264 ",
"\250\307\277\275\270\345a ",
"Cy\262\262o\277a ",
};


void setup() {
Wire.begin();
lcd.begin(20,4);
lcd.init(); // Сброс экрана
lcd.clear(); // Очистка экрана
lcd.backlight(); // Включение подсветки
}


void loop() {

//DS3231S
DateTime now = rtc.now(); // читаем дату-время

lcd.setCursor(0, 0); // Выводим время
if (now.hour() < 10) lcd.print("0");
lcd.print(now.hour(), DEC);
lcd.print(":");
if (now.minute() < 10) lcd.print("0");
lcd.print(now.minute(), DEC);
lcd.print(":");
if (now.second() < 10) lcd.print("0");
lcd.print(now.second(), DEC);

lcd.setCursor(0, 1); // Выводим дату
if (now.day() < 10) lcd.print("0");
lcd.print(now.day(), DEC);
lcd.print(".");
if (now.month() < 10) lcd.print("0");
lcd.print(now.month(), DEC);
lcd.print(".");
lcd.print(now.year() - 2000); // Год в двузначном формате???

lcd.setCursor(0, 2); // Выводим день недели на псевдорусском
lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);

// BME280 *************************************************
lcd.setCursor(13, 0);
//lcd.print(bme.readTemperature()); // Выводит температуру с датчика
lcd.print(rtc.getTemperature()); // Это просто экран оживить. Врёт аж на градус, иногда на 2.
lcd.print('\337');
lcd.print("C");

lcd.setCursor(11, 1);
//lcd.print(bme.readPressure() / 100.0F);
//lcd.print("kP");
//----------
//lcd.print(bme.readPressure() * 0.000750061683F);
lcd.print("mm");

lcd.setCursor(13, 2);
//lcd.print(bme.readHumidity());
lcd.print(" %");

// Пока мусор
lcd.setCursor(13, 3);
lcd.print("1400 CO");


}


Что имею: Nano-168 (пока мучаю её и Нану 328), DS3231, BME280 и датчик CO2
До СО2 пока не добрался - застрял на 280-й.

Всё, что закомментировано под кучей звёздочек и ставит меня в тупик.
Стоит раскомментировать хоть одно обращение к BME280 и Нано уходит в циклический перезагруз.
Сегодня ночью эксперименты довели до того, что сбилось время на 3231 и Нано перестала принимать код. Делает вид (светодиодами) что принимает, потом сверяет и ... возвращается к старому. Автоматическая коррекция времени с компом перестала работать. Я уж грешным делом режил, что спалил что-нибудь, т.к. и 168-я и 320-я - одни и теже симптомы. 3 штуки 3238 и ни одна не синхронизирует время при прошивке с компом.
Единственное, что помогло - откат Винды на 4 дня назад - заработала прошивка.
Я, конечно, буду комп перебирать и апгрейдит и Винду переустанавливать, но не сегодня.
Ведь сам код проги с Виндой не связан!

Подскажите, что я упустил, ведь вчера вечером тах хорошо всё шло и ВДРУГ баз и перезагруз по кругу.

П.С. за образец исходника к BME280 брал пример из встроенного архива.
П.П.С. Вроде (не уверен) я какую то библиотеку подключил, когда дописывал что то и после этого началось. Ну это совсем предположение - не компилится без любой, а раньше работало...

Re: Помогите с заковыкой (конечно же метеостанция)

Вс май 23, 2021 22:31:56

Попробовал тот пример, из которого использовал код - всё отлично выводится в терминал. after 1 hour 22 minutes 13 seconds:[/color][/size]
Сейчас провожу эксперимент "наоборот" - взял пример и модернизирую его под мои нужды.
Есть у меня большое подозрение, что конфликтуют библиотеки "родные" и Adafruit или виснет BME280 при столь частом и быстром обращении...

Добавлено after 4 hours 9 minutes 44 seconds:
Всё, разобрался.
Я случайно выкинул инициализацию bme280. Да и опрашивал её слишком часто - по паспорту влажность измеряется около 1 сек, хотя реально быстрее - у меня около 0,3с вышло.
Да и весть код переписал и отформатировал.

Теперь хочу разбить программу на 3 части по расширениям: bme280, ds3231 и MH-Z19, что бы раз в секунду или по желанию их "дёргать" из основной программы.

Вот исправленный код:
Спойлер#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
Adafruit_BME280 bme; // I2C


#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);


#include "RTClib.h"
RTC_DS3231 rtc;

char daysOfTheWeek[7] [12] = {
"Boc\272pece\275\270e",
"\250o\275e\343e\273\304\275\270\272",
"B\277op\275\270\272 ",
"Cpe\343a ",
"\253e\277\263ep\264 ",
"\250\307\277\275\270\345a ",
"Cy\262\262o\277a ",
};

int x; // Промежуточная целяа Х для сокращения обращений к датчикам


void setup() {
lcd.begin(20,4);
lcd.init(); // Сброс экрана
lcd.clear(); // Очистка экрана
lcd.backlight(); // Включение подсветки

bool status;
// default settings bme280
status = bme.begin();
if (!status) {
lcd.setCursor(13, 0);
lcd.println("BME280 error!");
while (1);}
}

void loop() {

// DS3231S
DateTime now = rtc.now(); // читаем дату-время
// Выводим время
lcd.setCursor(0, 0);
x = now.hour();
if (x < 10) lcd.print("0");
lcd.print(x);
lcd.print(":");
x = now.minute();
if (x < 10) lcd.print("0");
lcd.print(x);
lcd.print(":");
x = now.second();
if (x < 10) lcd.print("0");
lcd.print(x);
// Выводим дату
lcd.setCursor(0, 1);
x = now.day();
if (x < 10) lcd.print("0");
lcd.print(x);
lcd.print(".");
x = now.month();
if (x < 10) lcd.print("0");
lcd.print(x);
lcd.print(".");
lcd.print(now.year() - 2000); // Год в двузначном формате???
// Выводим день недели на псевдорусском
lcd.setCursor(0, 2);
lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);

delay(333);

// BME280S
// Выводим температуру
lcd.setCursor(13, 0);
lcd.print(bme.readTemperature());
lcd.print('\337');
lcd.print("C");
// Выводим давление
lcd.setCursor(15, 1);
x = bme.readPressure() * 0.00750061683;
lcd.print(x);
lcd.print("mm");
// Выводим влажность
lcd.setCursor(16, 2);
x = bme.readHumidity();
lcd.print(x);
lcd.print("%");


// MH-Z19
// Здесь будет СО2
lcd.setCursor(12, 3);
lcd.print("CO2:1400");

}


И фотка во вложении.
Вложения
0-02-05-8bacecd0bc557ddedd8e4abab4289250eba21e3bf90de13a45f67317d8ec8e89_19c454d5.jpg
Фотка
(84.5 KiB) Скачиваний: 122
Ответить