Проблема с BMP-280?

Петрович
Offline
Зарегистрирован: 17.03.2016

Приветствую всех!

Я недавно только начал осваивать Ардуино, так, что сильно не пинайте новичка.

Суть вопроса такова. Приобрел на Ali датчик BMP-280. Подключаю к Мини, заливаю скетч с библиотекой на ВМР-180 (как везде пишут, что она поодходит) и пробую проверить его работу, но в монитор порта идут сообщения, что датчик не подключен или идут данные о давлении 1,76 мм ртутного столба, а температура и высота показывает 0,00. Как правильно работать с данным датчиком, может кто уже делал проекты с использованием данного аппарата? Буду очень признателен за помощь.

Сильно не ругайтесь, если тема не в той ветке, но поиском и Гуглом ничего вразумительного не нашел.

trembo
trembo аватар
Онлайн
Зарегистрирован: 08.04.2011
Петрович
Offline
Зарегистрирован: 17.03.2016

Нет, выдает сообщение    "ВМР280 test. Could not find a valid BMP280 sensor, check wiring!" (это при подключении через шину SPI). А через I2C подключить не могу, т.к. ругается при компиляции скетча.

Да, забыл сказать в первом сообщении, что датчик вот такой: 

http://www.ebay.com/itm/BMP280-Pressure-Sensor-Module-High-Precision-Atm...

В  схеме нет стабилизатора питания, а только резисторы на + питания и пара конденсаторов в обвязке. Подключил по питанию от отдельного стабилизатора 3,3 вольта. Согласуюстся ли уровни если Ардуино 5-и вольтовая а датчик 3,3В

Петрович
Offline
Зарегистрирован: 17.03.2016

Так, что, никто не пробовал использовать такой датчик в своих проектах?

Genri5
Offline
Зарегистрирован: 31.05.2016

Обратите внимание на то, как подключаете датчик. Если SPI, то адресс 077, если I2C, то 076. Опять же, обратите согласование уровней SDA и SCL.

Петрович
Offline
Зарегистрирован: 17.03.2016

Подключаю по I2C, но вот в скетче, вернее в примере из библиотеки, не вижу где указать адрес датчика. В этом причина? Вот скетч, подскажите пожалуйста где указать этот адрес.

[code]
/***************************************************************************
  This is a library for the BMP280 humidity, temperature & pressure sensor

  Designed specifically to work with the Adafruit BMEP280 Breakout 
  ----> http://www.adafruit.com/products/2651

  These sensors use I2C or SPI to communicate, 2 or 4 pins are required 
  to interface.

  Adafruit invests time and resources providing this open source code,
  please support Adafruit andopen-source hardware by purchasing products
  from Adafruit!

  Written by Limor Fried & Kevin Townsend for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution
 ***************************************************************************/

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>

#define BMP_SCK 13
#define BMP_MISO 12
#define BMP_MOSI 11 
#define BMP_CS 10

Adafruit_BMP280 bme; // I2C
//Adafruit_BMP280 bme(BMP_CS); // hardware SPI
//Adafruit_BMP280 bme(BMP_CS, BMP_MOSI, BMP_MISO,  BMP_SCK);
  
void setup() {
  Serial.begin(9600);
  Serial.println(F("BMP280 test"));
  
  if (!bme.begin()) {  
    Serial.println("Could not find a valid BMP280 sensor, check wiring!");
    while (1);
  }
}
  
void loop() {
    Serial.print("Temperature = ");
    Serial.print(bme.readTemperature());
    Serial.println(" *C");
    
    Serial.print("Pressure = ");
    Serial.print(bme.readPressure());
    Serial.println(" Pa");

   // Serial.print("Approx altitude = ");
   // Serial.print(bme.readAltitude(1013.25)); // this should be adjusted to your local forcase
   // Serial.println(" m");
    
    Serial.println();
    delay(2000);
}
Genri5
Offline
Зарегистрирован: 31.05.2016

По позже посмотрю саму библиотеку. Я тестировал BME280 библиотека "SparkFunBME280.h" там все работает и выкладывал здесь тему по этому датчику и рабочий скетч: http://arduino.ru/forum/programmirovanie/bme280. Попробуйте Спарковскую библиотеку и примеры от туда. Датчики совершенно одинаковые только у BMP280 нет гигрометра. 

Genri5
Offline
Зарегистрирован: 31.05.2016

Я посмотрел библиотеку там стоит адрес 077 - значит подключать нужно по ISP. Либо, если подключаете  по I2C,  зайдите по пути: С:\ programFiles86\arduino\libraries\ Adafruit_BMP280_Library-master   -ткройте в библиотеке текстовым  редактором "Adafruit_BMP280.h "и в строке "#define BMP280_ADDRESS (0x77)" в место   (0x77) вставте   (0x76) и сохраните. Но на вашей плате я не вижу транзисторов для согласования уровней входов как сдесь например: https://raspberry.com.ua/data/uploads/2016/04/Adafruit_BMP280_I2C_or_SPI_Barometric_Pressure_Altitude_Sensor.jpg

 

Петрович
Offline
Зарегистрирован: 17.03.2016

Огромное спасибо, попробую изменить адрес в библиотеке. Да, согласующих транзисторов нет, только 4 резистора, подтягивающие выходы датчика к + питания. Посему вопрос: - будет ли в таком виде он работать с пятивольтовой Ардуиной, если его запитать от 3,3 вольт, а Ардуино от 5 вольт? Или для этого датчика нужна Ардуино 3-х вольтовая? (использую Arduino Pro Mini 5V, 16 MHz).

Как соотнести названия ног на плате данного шилда с названиями сигналов для Ардуино? На плате выводы обозначены как VCC, GND, SCL, SDA, CSB и SD0. Два следующих за GND - это понятно I2C, а вот как быть с MOSI, MISO, SCK и CS?

Петрович
Offline
Зарегистрирован: 17.03.2016

Да, адрес в библиотеке поменял - пошли показания в монитор порта (подключение по И2С). Раскомментировал в примере строки с выводом данных альтиметра, тоже работает. Благодарю за помощь!

Но вопросы, заданные в предыдущем посте остаются. И потом еще бует несколько вопросов, если не возражаете.

Genri5
Offline
Зарегистрирован: 31.05.2016

Для Вашей платы необходимо подключить вывод CSB на плюс(3.3в), SDA ->A4, SCL->A5. А вот по согласованию уровней SCL и SDA нужно по гуглить. Что бы не вывести из строя датчик. Я бы, все-таки, ставил адаптер. В моем BME280 стоят два полевика для согласования уровней: http://ardu.net/ru/datchiki-i-sensory/197-modul-bme280-datchik-davleniya.... Хотя, может быть достаточно , что выходы подтянуты резисторами.

Петрович
Offline
Зарегистрирован: 17.03.2016

Может тогда проще перепрошить Ардуино загрузчиком для Pro Mini 3,3V 8 MHz и питать ее от 3-х вольт? 

Вообще хочу сделать такой портативный вариант погодной станции (охотничье-рыбацкий), которая будет состоять из BMP280, DHT22, ну и соответсвенно - часов DS3231. Вывод данных на LCD от Nokia-3310, питание от Li-Ion аккумулятора. Должны быть показания температуры, влажности. давления, возможно высоты над уровнем моря и часов с датой. В дальнейшем, если получится можно туда будет еще приспособить GPS-приемник для отображения координат, но это все в планах. А как я говорил ранее, прогулял я тот урок, на котором Бог раздавал знания по программированию микроконтроллеров, сейчас уже поздно наверстывать упущенное.

Хотел бы к Вам обратиться за практической помощью в написании программы для описанного мною девайса. Из навыков в электронике присутствуют практически все, а вот с программированием "болт".  Если не сложно и не отнимет много времени - помогите пожалуйста.

Genri5
Offline
Зарегистрирован: 31.05.2016

Тогда Вы поторопились с BMP280, взяли бы BME280 не нужен был бы DHT22. Для того, что бы помочь нужно тоже иметь и Pro Mini и LCD, и время.

Петрович
Offline
Зарегистрирован: 17.03.2016

Понял я уже о том, что поторопился с приобретением датчиков, просто не знал о существовании BME280, только от Вас про него узнал, что он и влажность меряет.

Так а как быть с Ардуиной, может ее действительно переделать в трехвольтовую? Насчет просьбы я понял - нет, так нет, ничего страшного, что-либо придумаю.

Может еще кто нибудь на этом форуме поможет?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Петрович пишет:

Может тогда проще перепрошить Ардуино загрузчиком для Pro Mini 3,3V 8 MHz и питать ее от 3-х вольт? 

Просто подайте на Vcc 3,3 вольта. Не нужно ничего переделывать.

Genri5
Offline
Зарегистрирован: 31.05.2016

dimax пишет:

Петрович пишет:

Может тогда проще перепрошить Ардуино загрузчиком для Pro Mini 3,3V 8 MHz и питать ее от 3-х вольт? 

Просто подайте на Vcc 3,3 вольта. Не нужно ничего переделывать.

 

Кстати, это вполне логично. Я чего-то об этом не подумал.

Genri5
Offline
Зарегистрирован: 31.05.2016

Вот похожий проект: https://geektimes.ru/post/258844/

Петрович
Offline
Зарегистрирован: 17.03.2016

Genri5 пишет:

Вот похожий проект: https://geektimes.ru/post/258844/

За ссылку благодарю. Кстати это в "самую дырочку", то что нужно!

А насчет подачи 3-х вольт на Ардуину, уже пробовал, но в таком варианте появляется небольшая погрешность в показаниях 280-го, температуру завышает на пару градусов, давление занижает немного. Еще и не пробовал подключить часы DS3231, как они будут себя вести, когда Ардуина будет работать в заниженным напряжением питания. А так вообще Ардуино работает от 3 вольт, светодиодами моргает, правда разницы в частоте мигания на глаз не видно, а прибором не тыкал. На LCD от Nokia тесты шрифтов от Адафрута выдает.

Петрович
Offline
Зарегистрирован: 17.03.2016

Всем откликнувшимся спасибо, датчик проверен, работает, хотя последняя ссылка на готовый проект компелироваться не хочет. Придется искать, где "собака порылась".

Тему можно считать исчерпанной.

Genri5
Offline
Зарегистрирован: 31.05.2016

Петрович пишет:

Всем откликнувшимся спасибо, датчик проверен, работает, хотя последняя ссылка на готовый проект компелироваться не хочет. Придется искать, где "собака порылась".

Тему можно считать исчерпанной.

Возможно другая версия Ардуино IDE, возможно не все библиотеки установлены и т. д.. 

Петрович
Offline
Зарегистрирован: 17.03.2016

Да вроде все библиотеки установил, которые в той теме выложил автор. И IDE пробовал 1.0.5 и последнюю 1.6.9, все равно не хочет компилиоваться, выдает ошибки.

Arduino: 1.6.9 Hourly Build 2016/04/07 12:33 (Windows XP), Плата:"Arduino Pro or Pro Mini, ATmega328 (5V, 16 MHz)"
sketch_jun06a:11: error: 'DHT' does not name a type
 DHT dht(DHTPIN, DHTTYPE);
 ^
C:\WINDOWS\Temp\arduino_modified_sketch_639644\sketch_jun06a.ino: In function 'void setup()':
sketch_jun06a:32: error: 'dht' was not declared in this scope
   dht.begin();
   ^
C:\WINDOWS\Temp\arduino_modified_sketch_639644\sketch_jun06a.ino: In function 'void loop()':
sketch_jun06a:48: error: 'dht' was not declared in this scope
   float h = dht.readHumidity();
             ^
Несколько библиотек найдено для "DHT.h"
 Используется: E:\Мои документы\Arduino NEW\libraries\DHT
Не используется: E:\Мои документы\Arduino NEW\libraries\DHT_sensor_library_master
Не используется: E:\Мои документы\Arduino NEW\libraries\DHT_sensor_library
exit status 1
'DHT' does not name a type
 
А т.к. в аглицком я не силен, не понимаю в чем причина ошибок
 
Genri5
Offline
Зарегистрирован: 31.05.2016

Петрович пишет:

Да вроде все библиотеки установил, которые в той теме выложил автор. И IDE пробовал 1.0.5 и последнюю 1.6.9, все равно не хочет компилиоваться, выдает ошибки.

Arduino: 1.6.9 Hourly Build 2016/04/07 12:33 (Windows XP), Плата:"Arduino Pro or Pro Mini, ATmega328 (5V, 16 MHz)"
sketch_jun06a:11: error: 'DHT' does not name a type
 DHT dht(DHTPIN, DHTTYPE);
 ^
C:\WINDOWS\Temp\arduino_modified_sketch_639644\sketch_jun06a.ino: In function 'void setup()':
sketch_jun06a:32: error: 'dht' was not declared in this scope
   dht.begin();
   ^
C:\WINDOWS\Temp\arduino_modified_sketch_639644\sketch_jun06a.ino: In function 'void loop()':
sketch_jun06a:48: error: 'dht' was not declared in this scope
   float h = dht.readHumidity();
             ^
Несколько библиотек найдено для "DHT.h"
 Используется: E:\Мои документы\Arduino NEW\libraries\DHT
Не используется: E:\Мои документы\Arduino NEW\libraries\DHT_sensor_library_master
Не используется: E:\Мои документы\Arduino NEW\libraries\DHT_sensor_library
exit status 1
'DHT' does not name a type
 
А т.к. в аглицком я не силен, не понимаю в чем причина ошибок
 

В приведенной, выше ошибке, говорится о том, что не указан тип DHT. 

 

Петрович
Offline
Зарегистрирован: 17.03.2016

А в отрывке кода указан:

[code]
#include <LCD5110_Graph.h>
#include "DHT.h"
#include <Wire.h>
#include <BMP085.h>
#include "RTClib.h"
#define DHTPIN 10     // 10 pin для датчика DHT22
#define DHTTYPE DHT22
 
RTC_DS1307 RTC;
BMP085 dps = BMP085();
DHT dht(DHTPIN, DHTTYPE);
 
[/code]

Может здесь, в последней строке?

Mifos
Offline
Зарегистрирован: 07.06.2016
 
 
 
 
 
У меня скомпилировалась...правда ругалась на стринги и чары какие-то...))
Код не менял...попробуй заного весь код скопировать и по новой скомпилировать.
 
 
ВНИМАНИЕ: Ложная папка .github в библиотеке 'Adafruit BMP280 Library'
ВНИМАНИЕ: Ложная папка .github в библиотеке 'RTClib'
C:\Users\Алексей\Documents\Arduino\sketch_jun07a\sketch_jun07a.ino: In function 'void loop()':
 
C:\Users\Алексей\Documents\Arduino\sketch_jun07a\sketch_jun07a.ino:56:32: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
 
C:\Users\Алексей\Documents\Arduino\sketch_jun07a\sketch_jun07a.ino:58:26: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
 
C:\Users\Алексей\Documents\Arduino\sketch_jun07a\sketch_jun07a.ino:60:26: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
 
C:\Users\Алексей\Documents\Arduino\sketch_jun07a\sketch_jun07a.ino:63:33: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
 
C:\Users\Алексей\Documents\Arduino\sketch_jun07a\sketch_jun07a.ino:65:27: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
 
C:\Users\Алексей\Documents\Arduino\sketch_jun07a\sketch_jun07a.ino:67:27: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
 
C:\Users\Алексей\Documents\Arduino\sketch_jun07a\sketch_jun07a.ino:70:30: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
 
C:\Users\Алексей\Documents\Arduino\sketch_jun07a\sketch_jun07a.ino:72:27: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
 
C:\Users\Алексей\Documents\Arduino\sketch_jun07a\sketch_jun07a.ino:75:32: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
 
C:\Users\Алексей\Documents\Arduino\sketch_jun07a\sketch_jun07a.ino:77:27: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
 
C:\Users\Алексей\Documents\Arduino\sketch_jun07a\sketch_jun07a.ino:79:33: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
 
C:\Users\Алексей\Documents\Arduino\sketch_jun07a\sketch_jun07a.ino:81:28: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
 
 
Скетч использует 15 042 байт (46%) памяти устройства. Всего доступно 32 256 байт.
Глобальные переменные используют 1 054 байт (51%) динамической памяти, оставляя 994 байт для локальных переменных. Максимум: 2 048 байт.
 
Mifos
Offline
Зарегистрирован: 07.06.2016

Если не получится попробуй другие библиотеки DHT использовать - те, которые пишет, что не используются

Петрович
Offline
Зарегистрирован: 17.03.2016

Получилось скомпилировать только после того, как удалил из папки Ардуино библиотек всего, что там было и установки новых библиотек через Ардуино ИДЕ.

Загрузил в Дуину - время коряво показывает. Если скажем сейчас 9 часов утра 00 минут - показывает 9 -0 -0. С данными датчиков пока не разобрался, но показывает влажность 1177 %, температуру 82.70 и давление 603135 мм.

Буду разбираться...

Разобрался. Библиотека ВМР085, которая подключена к данному скетчу, не работает с датчиком ВМР280. Программа не видит датчика, поэтому такие данные температуры и давления. Пробовал даже загрузить пример "ВМР085", но в монитор порта пишет, что датчик не подключен, хотя в библиотеке стоит адрес датчика 0х76.

Помогите пожалуйста, если не сложно, прикрутить в данный скетч (https://geektimes.ru/post/258844/) библиотеку Adafruit_BMP280_Library из стандартного набора Arduino IDE 1.6.9 по шине I2C. Буду очень признателен!

Mifos
Offline
Зарегистрирован: 07.06.2016

Я попробовал заменить на BME280...

#include <LCD5110_Graph.h>
//#include "DHT.h" - убираем если не будем использовать отдельный датчик влажности
//#include <Wire.h>
//#include <BMP085.h>
#include "RTClib.h"
#define DHTPIN 10     // 10 pin для датчика DHT22
//#define DHTTYPE DHT22 - убираем если не будем использовать отдельный датчик влажности

//Библиотеки Адафруйт
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SEALEVELPRESSURE_HPA (1013.25) // давление на момент измерений над уровнем моря в гектопаскалях

RTC_DS1307 RTC;
//BMP085 dps = BMP085();

Adafruit_BME280 dps; // I2C для BME280

//DHT dht(DHTPIN, DHTTYPE); - убираем если не будем использовать отдельный датчик влажности

long temp3 = 0, Pressure = 0, Altitude = 0, Humidity =0; //добавляем датчик влажности беме280

// pin 3 - Serial clock out (SCLK)
// pin 4 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 7 - LCD chip select (CS)
// pin 6 - LCD reset (RST)

LCD5110 myGLCD(3, 4, 5, 6, 7);

extern unsigned char SmallFont[];

void setup() {

  myGLCD.InitLCD();
  myGLCD.setFont(SmallFont);

  Wire.begin();
  RTC.begin();
  // dht.begin(); - убираем если не будем использовать отдельный датчик влажности
  delay(2000);

 // dps.init(MODE_ULTRA_HIGHRES, 3200, true); 
  // 3200 это 32 метра над уровнем моря (Питер на такой высоте располагается+ надо добавить несколько метров в зависимости от этажа на котором живете)
  
dps.begin(); //запуск BME280
}
void loop() {

  Pressure = dps.readPressure();
 Altitude = dps.readAltitude(SEALEVELPRESSURE_HPA);
  temp3 = dps.readTemperature();
 Humidity = dps.readHumidity(); //датчик встроенный в бме280
  DateTime now = RTC.now();


  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
//  float h = dht.readHumidity(); - убираем если не будем использовать отдельный датчик влажности
  // Read temperature as Celsius
 // float t = dht.readTemperature(); - убираем если не будем использовать отдельный датчик влажности


  myGLCD.setFont(SmallFont); // задаем маленький размер шрифта на экране
  myGLCD.clrScr(); // Очистка экрана

  myGLCD.print("Time=", LEFT, 0);  //задаем время
  myGLCD.printNumI(int(now.hour()), 32, 0); // 32,0 означет 32=номер пропуска в строке, те откуда будем печатать. 0=номер строки
  myGLCD.print(":", 45, 0);
  myGLCD.printNumI(int(now.minute()), 50, 0);
  myGLCD.print(":", 62, 0);
  myGLCD.printNumI(int(now.second()), 67, 0);

  myGLCD.print("Date=", LEFT, 10);       //задаем дату
  myGLCD.printNumI(int(now.day()), 32, 10);
  myGLCD.print("/", 44, 10);
  myGLCD.printNumI(int(now.month()), 50, 10);
  myGLCD.print("/", 62, 10);
  myGLCD.printNumI(int(now.year() - 2000), 68, 10);

  myGLCD.print("T=", LEFT, 20); //отображаем температуру
  //myGLCD.printNumF(t, 2, 13, 20);  //Это температура с DHT22
  myGLCD.print("/", 45, 20);
  myGLCD.printNumF(temp3 * 0.1, 2, 53, 20); //Это температура с барометра

  myGLCD.print("Hum=", LEFT, 30); // отображаем влажность 
  //myGLCD.printNumF(h, 2, 28, 30); //- убираем если не будем использовать отдельный датчик влажности
  myGLCD.printNumF(Humidity, 2, 28, 30); // используем встроенный в беме датчик влажности
  myGLCD.print("%", 63, 30);

  myGLCD.print("Pres=", LEFT, 40); // задаем атмосферное давление
  myGLCD.printNumF(Pressure / 133.3, 2, 31, 40); //рассчет атмосферного давления
  myGLCD.print("mm", 68, 40);

  // Serial.print("  Alt(m):");          кому надо, это текущая высота над уровнем моря
  // Serial.print(Altitude / 100);

  myGLCD.update(); // Вывод вместимого буфера на дисплей
  delay (1000); // Задержка 1 с

 

}
Но протестировать пока не на чем
 
Mifos
Offline
Зарегистрирован: 07.06.2016
Переделал для bmp280, 
#include <LCD5110_Graph.h>
#include "DHT.h" //- убираем если не будем использовать отдельный датчик влажности
//#include <Wire.h>
//#include <BMP085.h>
#include "RTClib.h"
#define DHTPIN 10     // 10 pin для датчика DHT22
#define DHTTYPE DHT22 //- убираем если не будем использовать отдельный датчик влажности

//Библиотеки Адафруйт
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#define SEALEVELPRESSURE_HPA (1013.25) // давление на момент измерений над уровнем моря в гектопаскалях

RTC_DS1307 RTC;
//BMP085 dps = BMP085();

Adafruit_BMP280 dps; // I2C для BME280

DHT dht(DHTPIN, DHTTYPE); //- убираем если не будем использовать отдельный датчик влажности

long temp3 = 0, Pressure = 0, Altitude = 0, Humidity = 0; //добавляем датчик влажности беме280

// pin 3 - Serial clock out (SCLK)
// pin 4 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 7 - LCD chip select (CS)
// pin 6 - LCD reset (RST)

LCD5110 myGLCD(3, 4, 5, 6, 7);

extern unsigned char SmallFont[];

void setup() {

  myGLCD.InitLCD();
  myGLCD.setFont(SmallFont);

  Wire.begin();
  RTC.begin();
   dht.begin(); //- убираем если не будем использовать отдельный датчик влажности
  delay(2000);

 // dps.init(MODE_ULTRA_HIGHRES, 3200, true); 
  // 3200 это 32 метра над уровнем моря (Питер на такой высоте располагается+ надо добавить несколько метров в зависимости от этажа на котором живете)
  
dps.begin(); //запуск BME280
}
void loop() {

  Pressure = dps.readPressure();
 Altitude = dps.readAltitude(SEALEVELPRESSURE_HPA);
  temp3 = dps.readTemperature();
// Humidity = dps.readHumidity(); //датчик встроенный в бме280
  DateTime now = RTC.now();


  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity(); //убираем если не будем использовать отдельный датчик влажности
  // Read temperature as Celsius
  float t = dht.readTemperature();
  //- убираем если не будем использовать отдельный датчик влажности


  myGLCD.setFont(SmallFont); // задаем маленький размер шрифта на экране
  myGLCD.clrScr(); // Очистка экрана

  myGLCD.print("Time=", LEFT, 0);  //задаем время
  myGLCD.printNumI(int(now.hour()), 32, 0); // 32,0 означет 32=номер пропуска в строке, те откуда будем печатать. 0=номер строки
  myGLCD.print(":", 45, 0);
  myGLCD.printNumI(int(now.minute()), 50, 0);
  myGLCD.print(":", 62, 0);
  myGLCD.printNumI(int(now.second()), 67, 0);

  myGLCD.print("Date=", LEFT, 10);       //задаем дату
  myGLCD.printNumI(int(now.day()), 32, 10);
  myGLCD.print("/", 44, 10);
  myGLCD.printNumI(int(now.month()), 50, 10);
  myGLCD.print("/", 62, 10);
  myGLCD.printNumI(int(now.year() - 2000), 68, 10);

  myGLCD.print("T=", LEFT, 20); //отображаем температуру
  myGLCD.printNumF(t, 2, 13, 20);  //Это температура с DHT22
  myGLCD.print("/", 45, 20);
  myGLCD.printNumF(temp3 * 0.1, 2, 53, 20); //Это температура с барометра

  myGLCD.print("Hum=", LEFT, 30); // отображаем влажность 
  myGLCD.printNumF(h, 2, 28, 30); //- убираем если не будем использовать отдельный датчик влажности
 // myGLCD.printNumF(Humidity, 2, 28, 30); // используем встроенный в беме датчик влажности
  myGLCD.print("%", 63, 30);

  myGLCD.print("Pres=", LEFT, 40); // задаем атмосферное давление
  myGLCD.printNumF(Pressure / 133.3, 2, 31, 40); //рассчет атмосферного давления
  myGLCD.print("mm", 68, 40);

  // Serial.print("  Alt(m):");          кому надо, это текущая высота над уровнем моря
  // Serial.print(Altitude / 100);

  myGLCD.update(); // Вывод вместимого буфера на дисплей
  delay (1000); // Задержка 1 с

}
#include "RTClib.h"
#define DHTPIN 10     // 10 pin для датчика DHT22
#define DHTTYPE DHT22 //- убираем если не будем использовать отдельный датчик влажности

//Библиотеки Адафруйт
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#define SEALEVELPRESSURE_HPA (1013.25) // давление на момент измерений над уровнем моря в гектопаскалях

RTC_DS1307 RTC;
//BMP085 dps = BMP085();

Adafruit_BMP280 dps; // I2C для BME280

DHT dht(DHTPIN, DHTTYPE); //- убираем если не будем использовать отдельный датчик влажности

long temp3 = 0, Pressure = 0, Altitude = 0, Humidity = 0; //добавляем датчик влажности беме280

// pin 3 - Serial clock out (SCLK)
// pin 4 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 7 - LCD chip select (CS)
// pin 6 - LCD reset (RST)

LCD5110 myGLCD(3, 4, 5, 6, 7);

extern unsigned char SmallFont[];

void setup() {

  myGLCD.InitLCD();
  myGLCD.setFont(SmallFont);

  Wire.begin();
  RTC.begin();
   dht.begin(); //- убираем если не будем использовать отдельный датчик влажности
  delay(2000);

 // dps.init(MODE_ULTRA_HIGHRES, 3200, true); 
  // 3200 это 32 метра над уровнем моря (Питер на такой высоте располагается+ надо добавить несколько метров в зависимости от этажа на котором живете)
  
dps.begin(); //запуск BME280
}
void loop() {

  Pressure = dps.readPressure();
 Altitude = dps.readAltitude(SEALEVELPRESSURE_HPA);
  temp3 = dps.readTemperature();
// Humidity = dps.readHumidity(); //датчик встроенный в бме280
  DateTime now = RTC.now();


  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity(); - //убираем если не будем использовать отдельный датчик влажности
  // Read temperature as Celsius
  float t = dht.readTemperature(); //- убираем если не будем использовать отдельный датчик влажности


  myGLCD.setFont(SmallFont); // задаем маленький размер шрифта на экране
  myGLCD.clrScr(); // Очистка экрана

  myGLCD.print("Time=", LEFT, 0);  //задаем время
  myGLCD.printNumI(int(now.hour()), 32, 0); // 32,0 означет 32=номер пропуска в строке, те откуда будем печатать. 0=номер строки
  myGLCD.print(":", 45, 0);
  myGLCD.printNumI(int(now.minute()), 50, 0);
  myGLCD.print(":", 62, 0);
  myGLCD.printNumI(int(now.second()), 67, 0);

  myGLCD.print("Date=", LEFT, 10);       //задаем дату
  myGLCD.printNumI(int(now.day()), 32, 10);
  myGLCD.print("/", 44, 10);
  myGLCD.printNumI(int(now.month()), 50, 10);
  myGLCD.print("/", 62, 10);
  myGLCD.printNumI(int(now.year() - 2000), 68, 10);

  myGLCD.print("T=", LEFT, 20); //отображаем температуру
  myGLCD.printNumF(t, 2, 13, 20);  //Это температура с DHT22
  myGLCD.print("/", 45, 20);
  myGLCD.printNumF(temp3 * 0.1, 2, 53, 20); //Это температура с барометра

  myGLCD.print("Hum=", LEFT, 30); // отображаем влажность 
  myGLCD.printNumF(h, 2, 28, 30); //- убираем если не будем использовать отдельный датчик влажности
 // myGLCD.printNumF(Humidity, 2, 28, 30); // используем встроенный в беме датчик влажности
  myGLCD.print("%", 63, 30);

  myGLCD.print("Pres=", LEFT, 40); // задаем атмосферное давление
  myGLCD.printNumF(Pressure / 133.3, 2, 31, 40); //рассчет атмосферного давления
  myGLCD.print("mm", 68, 40);

  // Serial.print("  Alt(m):");          кому надо, это текущая высота над уровнем моря
  // Serial.print(Altitude / 100);

  myGLCD.update(); // Вывод вместимого буфера на дисплей
  delay (1000); // Задержка 1 с

}

 

Но как говорил выше протестировать не могу.
Петрович
Offline
Зарегистрирован: 17.03.2016

Проверил, не компилируется. Выложу на всякий случай вышеприведенный код с убранными коментариями, которые касаются  датчика DHT22 (в моем устройстве DS3231, BMP280 и DHT22)

[code]
#include <LCD5110_Graph.h>
#include "DHT.h" //- убираем если не будем использовать отдельный датчик влажности
//#include <Wire.h>
//#include <BMP085.h>
#include "RTClib.h"
#define DHTPIN 7     // 10 pin для датчика DHT22
#define DHTTYPE DHT11 //- убираем если не будем использовать отдельный датчик влажности
 
//Библиотеки Адафруйт
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SEALEVELPRESSURE_HPA (1013.25) // давление на момент измерений над уровнем моря в гектопаскалях
 
RTC_DS1307 RTC;
//BMP085 dps = BMP085();
 
Adafruit_BME280 dps; // I2C для BME280
 
DHT dht(DHTPIN, DHTTYPE); //- убираем если не будем использовать отдельный датчик влажности
 
long temp3 = 0, Pressure = 0, Altitude = 0, Humidity =0; //добавляем датчик влажности беме280
 
// pin 3 - Serial clock out (SCLK)
// pin 4 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 7 - LCD chip select (CS)
// pin 6 - LCD reset (RST)
 
LCD5110 myGLCD(2, 3, 4, 6, 5);
 
extern unsigned char SmallFont[];
 
void setup() {
 
  myGLCD.InitLCD();
  myGLCD.setFont(SmallFont);
 
  Wire.begin();
  RTC.begin();
  dht.begin(); //- убираем если не будем использовать отдельный датчик влажности
  delay(2000);
 
  dps.init(MODE_ULTRA_HIGHRES, 3200, true); 
  // 3200 это 32 метра над уровнем моря (Питер на такой высоте располагается+ надо добавить несколько метров в зависимости от этажа на котором живете)
  
dps.begin(); //запуск BME280
}
void loop() {
 
  Pressure = dps.readPressure();
 Altitude = dps.readAltitude(SEALEVELPRESSURE_HPA);
  temp3 = dps.readTemperature();
 Humidity = dps.readHumidity(); //датчик встроенный в бме280
  DateTime now = RTC.now();
 
 
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity(); //- убираем если не будем использовать отдельный датчик влажности
  // Read temperature as Celsius
 // float t = dht.readTemperature(); - убираем если не будем использовать отдельный датчик влажности
 
 
  myGLCD.setFont(SmallFont); // задаем маленький размер шрифта на экране
  myGLCD.clrScr(); // Очистка экрана
 
  //myGLCD.print("Time=", LEFT, 0);  //задаем время
  //myGLCD.printNumI(int(now.hour()), 32, 0); // 32,0 означет 32=номер пропуска в строке, те откуда будем печатать. 0=номер строки
  //myGLCD.print(":", 45, 0);
  //myGLCD.printNumI(int(now.minute()), 50, 0);
  //myGLCD.print(":", 62, 0);
  //myGLCD.printNumI(int(now.second()), 67, 0);
 
  myGLCD.print("Date=", LEFT, 10);       //задаем дату
  myGLCD.printNumI(int(now.day()), 32, 10);
  myGLCD.print("/", 44, 10);
  myGLCD.printNumI(int(now.month()), 50, 10);
  myGLCD.print("/", 62, 10);
  myGLCD.printNumI(int(now.year() - 2000), 68, 10);
 
  myGLCD.print("T=", LEFT, 20); //отображаем температуру
  //myGLCD.printNumF(t, 2, 13, 20);  //Это температура с DHT22
  myGLCD.print("/", 45, 20);
  myGLCD.printNumF(temp3 * 0.1, 2, 53, 20); //Это температура с барометра
 
  myGLCD.print("Hum=", LEFT, 30); // отображаем влажность 
  myGLCD.printNumF(h, 2, 28, 30); //- убираем если не будем использовать отдельный датчик влажности
  myGLCD.printNumF(Humidity, 2, 28, 30); // используем встроенный в беме датчик влажности
  myGLCD.print("%", 63, 30);
 
  myGLCD.print("Pres=", LEFT, 40); // задаем атмосферное давление
  myGLCD.printNumF(Pressure / 133.3, 2, 31, 40); //рассчет атмосферного давления
  myGLCD.print("mm", 68, 40);
 
  // Serial.print("  Alt(m):");          кому надо, это текущая высота над уровнем моря
  // Serial.print(Altitude / 100);
 
  myGLCD.update(); // Вывод вместимого буфера на дисплей
  delay (1000); // Задержка 1 с
 
}
[/code]

Теперь ошибки при компиляции:

Arduino: 1.6.9 Hourly Build 2016/04/07 12:33 (Windows XP), Плата:"Arduino Pro or Pro Mini, ATmega328 (5V, 16 MHz)"

C:\WINDOWS\Temp\arduino_modified_sketch_204365\sketch_jun10a.ino: In function 'void setup()':

sketch_jun10a:45: error: 'class Adafruit_BME280' has no member named 'init'

   dps.init(MODE_ULTRA_HIGHRES, 3200, true); 

sketch_jun10a:45: error: 'MODE_ULTRA_HIGHRES' was not declared in this scope

   dps.init(MODE_ULTRA_HIGHRES, 3200, true); 

exit status 1
'class Adafruit_BME280' has no member named 'init'

Вот как-то так. Забыл добавить, что датчик влажности в ВМР отсутствует (в коде ничего менять не нужно в связи с этим?)

Петрович
Offline
Зарегистрирован: 17.03.2016

Mifos в сообщении 27, часть кода до 103 строки включительно, скомпилировалась и работает. Но есть один "косячок". В строке, выводящей показания температуры, отображается: Т=22.00/2.30. Т.е. не помещаются показания. Сейчас сам попробую убрать показания с DHT и оставить только с температуру с BMP. Если не получится - отпишусь и попрошу еще помощи...

А пока огромное спасибо за проделанную работу!

Вот часть кода, которую изменил. Убрал показания DHT, оставил температуру с барометра, но все-равно отображается Т=2.30

 myGLCD.print("T=", LEFT, 20); //отображаем температуру
  //myGLCD.printNumF(t, 2, 13, 20);  //Это температура с DHT22
  //myGLCD.print("/", 45, 20);
  myGLCD.printNumF(temp3 * 0.1, 2, 14, 20); //Это температура с барометра
 
Как это исправить? Температура с BMP нужна до десятой доли градуса... Ведь при проверке ВМР через монитор порта, он показывает до сотых. Давление показывает правильно 733.28 мм.
Mifos
Offline
Зарегистрирован: 07.06.2016

myGLCD.printNumF(temp3 * 0.1, 2, 53, 20); //Это температура с барометра

Temp3 умножается на 0,1 перед тем как выводится на экран (зачем не понятно).

цифра "2" - скорее всего сколько знаков после запятой.

Попробуй заменить на это:

myGLCD.printNumF(temp3, 1, 53, 20);

Mifos
Offline
Зарегистрирован: 07.06.2016

Здесь - dps.init(MODE_ULTRA_HIGHRES, 3200, true);

закоментирование убирать не надо было

Петрович
Offline
Зарегистрирован: 17.03.2016

Все правильно, 2 - это сколько знаков полсе запятой. Изменил на 1, стало 23.0, но по-прежнему "0" - это "мертвый" знак. При изменении температуры он не изменяется.

По второму сообщению - закомментированную строку оставил в таком виде, без изменений, т.е. коммент не стал убирать. С раскомментированной строкой не компилируется.

Mifos
Offline
Зарегистрирован: 07.06.2016

Попробуй вставить
temp3=temp3*10;
после стоки
temp3 = dps.readTemperature();
А в строке где убрали умножение на 0,1 - вернуть умножение на 0,1

Mifos
Offline
Зарегистрирован: 07.06.2016

Можно еще так попробовать
myGLCD.printNumF(100*temp3 * 0.01, 2, 53, 20);
- должно до сотых выводить.
Не знаю зачем так, надеюсь, что поможет. Тут в библиотеке зарыто что-то.

Петрович
Offline
Зарегистрирован: 17.03.2016

Нет, не получается. По первому предложению, после вставки строки temp3=temp3*10;, показания на LCD Т=240.00. После добавления второй строки - показания возвращаются к Т=24.00. Вернул все взад.

По второму, предложенному варианту, показания так и остаются Т=24.00

Mifos
Offline
Зарегистрирован: 07.06.2016

Значит плучается с датчика сразу в целых выдает. Дисплей получется не причем. Можно еще библиотеку BMP 280

другую попробовать. 

Mifos
Offline
Зарегистрирован: 07.06.2016

Петрович пишет:

 

 
Как это исправить? Температура с BMP нужна до десятой доли градуса... Ведь при проверке ВМР через монитор порта, он показывает до сотых. Давление показывает правильно 733.28 мм.

Как ты выводишь данные на монитор порта? Код можешь показать?

 

Mifos
Offline
Зарегистрирован: 07.06.2016

А ну тут все проще - тут дело в переменной. 

 

Петрович
Offline
Зарегистрирован: 17.03.2016

Стандартный пример из библиотеки \ Arduino \ библиотеки \ Adafruit_BMP280_Library \ bmp280test

[код]
/ ************************************************* **************************
  Это библиотека для влажности, температуры и давления датчика BMP280

  Разработанный специально для работы с Adafruit BMEP280 Breakout 
  ----> 

  Эти датчики используют I2C или SPI для связи, 2 или 4 контакта требуется 
  интерфейс.

  Adafruit инвестирует время и ресурсы, обеспечивая этот открытый исходный код,
  пожалуйста, поддержку Adafruit andopen-аппаратного источника путем приобретения продуктов
  от Adafruit!

  Автор Limor Fried & Kevin Townsend для Adafruit Industries.  
  лицензия BSD, весь текст выше, должны быть включены в любое перераспределение
 ************************************************** ************************* /

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>

#define BMP_SCK 13
#define BMP_MISO 12
#define BMP_MOSI 11 
#define BMP_CS 10

Adafruit_BMP280 BME; // I2C
// Adafruit_BMP280 BME (BMP_CS); // Аппаратного SPI
// Adafruit_BMP280 BME (BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK);
  
недействительными установки () {
  Serial.begin (9600);
  Serial.println (F ( "BMP280 тест"));
  
  если (! bme.begin ()) {  
    Serial.println ( "Не удалось найти правильный датчик BMP280, проверьте проводку!");
    в то время как (1);
  }
}
  
аннулируются петля () {
    Serial.print ( "Temperature =");
    Serial.print (bme.readTemperature ());
    Serial.println ( "* C");
    
    Serial.print ( "Давление =");
    Serial.print (bme.readPressure () / 133,3);
    Serial.println ( "мм");

    Serial.print ( "Приблизительно высота =");
    Serial.print (bme.readAltitude (1013,25)); // Это должно быть отрегулировано на локальном forcase
    Serial.println ( "м");
    
    Serial.println ();
    Задержка (2000);
}
[/код]

 

Mifos
Offline
Зарегистрирован: 07.06.2016

long поменял на float

float temp3 = 0, Pressure = 0, Altitude = 0, Humidity = 0; //добавляем датчик влажности беме280

Ну вот не понятно почему тогда давление выводится как-надо. Впрочем скорее всего давление также не правильно выводится, скорее всего так происходит с давлением: например датчик считвает 100750.34 Па переменная long округляет обрезает после точки и получатся 100750.00. Далее перед выводом на экран функция myGLCD.printNumF(Pressure / 133.3, 2, 31, 40); 100750.00 делит на 133.3 = 755.81  что и выводит. Но для давления т.к. оно в паскалях вводится изначально та часть что после запятой никак на точеость не повлияет.

Mifos
Offline
Зарегистрирован: 07.06.2016

myGLCD.printNumF - выводит номер с точкой, myGLCD.printNumI в целых

Mifos
Offline
Зарегистрирован: 07.06.2016

видимо тому кто скетч делал изначально, ему в десятых градусы не нужны были. long и int - целые числа только///нам необходимо задавать переменные как float или double

 

Петрович
Offline
Зарегистрирован: 17.03.2016

Все, стало показывать температуру с двумя знаками после запятой. С учетом ранее данных рекомендаций, установлю после запятой один знак.

И напоследок еще один вопросик - ничего не нужно менять в скетче, если температура уйдет в отрицательную? Проверить смогу только завтра, засуну датчик на проводах в холодильник. В скетче, в строках вывода на LCD, не вижу где должен родиться знак минус и в связи с этим все показания должны сместитьмя вправо на одно знакоместо. Или нужно сразу это предусмотреть?

А пока огромное спасибо за помощь! Приятно когда есть люди знающие и могущие оказать содействие новичку. Спасибо!

Mifos
Offline
Зарегистрирован: 07.06.2016

 по анологии со стандартным примером можно без объявления переменных обойтись

myGLCD.printNumF(dps.readTemperature(), 2, 53, 20); 

Mifos
Offline
Зарегистрирован: 07.06.2016

Да не стоит благодарить. Я сам не особо разбираюсь...вот самому интересно, что получится. А что проверить в холодильник не обязательно просто воттак запиши   myGLCD.printNumF(-22.9, 1, 53, 20); //Это температура с барометра.

В результате должно -22.9 показывать всегда. такое число просто из головы взял...

Mifos
Offline
Зарегистрирован: 07.06.2016

Да показания должны сместиться на один знак, это надо учитывать, чтобы не прошло наплыва на другие данные или за предел экрана. цифры 53 и 20 что-то типа координат откуда начнется первый символ. Должно все получится. Удачи.

Петрович
Offline
Зарегистрирован: 17.03.2016

Так получается как нужно, со знаком минус и показания сдвигаются вправо. Но вот на самом деле, когда в ВМР родится минус - поймет ли Дуина что показания отрицательные. Да, еще нужно будет сместить на одно знакоместо вправо значок градус С

Mifos
Offline
Зарегистрирован: 07.06.2016

Значок "С" в скетче не нашел )) Самое простое сместить значок сразу с запасом. При смене числа знак перемещаться не будет . Поймет ардуина - куда денется. Хорошо, что до нас многое продумали и придумали библиотеки, которые здорово облегчают жизнь.

Петрович
Offline
Зарегистрирован: 17.03.2016

Да значка "С" пока и небыло, только сейчас подправил и установил его в нужное место.

Вот получилась почти нормальная метеостанция, скетч приведу позже. Хочу еще поковырять его на предмет питания от аккумулятора (с контролем напряжения последнего) и на внедрение кнопки для переключения экранов при нажатии. А то на одном экране все залеплено плотно, а я уже без окуляров не вижу - нужно разделить дату и время на один экран, постоянно, а на второй при нажатии кнопки данные с датчиков.

Genri5
Offline
Зарегистрирован: 31.05.2016

Петрович, довили свою метестанцию до финала или нет?