Форум РадиоКот https://radiokot.ru/forum/ |
|
Помогите с заковыкой (конечно же метеостанция) https://radiokot.ru/forum/viewtopic.php?f=66&t=177180 |
Страница 1 из 1 |
Автор: | Artur-K [ Вс май 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 брал пример из встроенного архива. П.П.С. Вроде (не уверен) я какую то библиотеку подключил, когда дописывал что то и после этого началось. Ну это совсем предположение - не компилится без любой, а раньше работало... |
Автор: | Artur-K [ Вс май 23, 2021 22:31:56 ] | ||
Заголовок сообщения: | Re: Помогите с заковыкой (конечно же метеостанция) | ||
Попробовал тот пример, из которого использовал код - всё отлично выводится в терминал. 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"); } И фотка во вложении.
|
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |