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

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

Ну, сделал вроде, стоит на балконе тестится. Только в стационарном варианте пока. Индикатор 1602 на шине I2C, ну и остальные датчики. Жду доставку DHT22 взамен 11 (будет мерять влажность на улице, температуру и давление буду брать с ВМР.) Внутри балкона температуру будет мерять датчик в модуле часов DS3231 (точность у него сопоставимая с ВМР). А тот походный вариант, о котором писал вначале, пока в планах, но там наверное поменяю кучу датчиков на один ВМЕ-280. Но это пока в планах...

Если интересует, могу здесь выложить скетч, который получился, там есть одна проблемка, стоит delay в одном месте. Но мне он не мешает, т.к. процессор более ничем не занимается, кроме как приемом данных с датчиков и выводом их на экран.

Вот что получилось:

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

Интересно, конечно. А я сделал стационырный вот от сюда:

http://radiokot.ru/forum/viewtopic.php?f=25&t=112934&sid=3d2750378585feb....

А походный хочу, что-то похожее на Ваше. Тем более что есть BME280.

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

Вот, все здесь и все работает (как видно из фотографий выше).

[code]
/*Скетч выводит на эекран 1602 дату и время. Нажатием кнопки
происходит переключение экранов 1 - Дата, время и день недели;
2 - Давление и влажность; 3 - Температура и влажность на улице;
4 - Температура и влажность в квартире. Все экраны индицируются
тремя светодиодами: - все погашены (дата и время); - красный
(pin 10) - давление и влажность на улице; желтый (pin 11) - 
температура и влажность на улице; - зеленый (pin 12) - температура
и влажность в квартире. Также от уровня освещенности в помещении
автоматически включается подсветка LCD дисплея. Фоторезистор
подключен к аналоговому выводу А0 и на + 5В, а от -5В резистор
на 10 кОм на А0.*/
#include <LiquidCrystal_I2C.h>
//#include <LiquidCrystal.h>
#include "DHT.h" //- убираем если не будем использовать отдельный датчик влажности
#define DHTPIN 2     // 2 pin для датчика DHT22
#define DHTTYPE DHT11 //- убираем если не будем использовать отдельный датчик влажности или меняем цифры на 22 (DHT-22)
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#define SEALEVELPRESSURE_HPA (1013.25) // 1013.25 давление на момент измерений над уровнем моря в гектопаскалях
#include "ds3231.h"

Adafruit_BMP280 bme; // I2C для BME280
DHT dht(DHTPIN, DHTTYPE); // - убираем если не будем использовать отдельный датчик влажности
float temp3 = 0, Pressure = 0, Altitude = 0, Humidity = 0; //добавляем датчик влажности беме280

int regim=1; // объявление переменной "режим"
int flag=0; // объявление переменной ""

uint8_t time[8];
unsigned long prev, interval = 1000;

//LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
LiquidCrystal_I2C lcd(0x3F,16,2); //
 
 void setup()   
 { 
    //lcd.begin(16, 2); // инициализация LCD
    //lcd.clear(); // очистка LCD
    lcd.init(); // инициализация LCD I2C
    lcd.backlight(); // включение подсветки LCD I2C
    Wire.begin(); // инициализация 
    dht.begin(); // инициализация датчика DHT-11 (DHT-22) - убираем если не будем его использовать
    bme.begin(); //запуск BME280
    DS3231_init(DS3231_INTCN); // инициализация модуля часов

    // объявление пинов для светодиодов
    pinMode(10,OUTPUT);    
    pinMode(11,OUTPUT);    
    pinMode(12,OUTPUT);    
 } 

 void loop() 
 { 
  //объявление переменных со всех датчиков
  Pressure = bme.readPressure();
  Altitude = bme.readAltitude(SEALEVELPRESSURE_HPA);
  temp3 = bme.readTemperature();
  float hdht = dht.readHumidity();
  float tdht = dht.readTemperature();
  char tempF[6];
  float temperature;
  delay(1000);
char in;
unsigned long now = millis();
struct ts t;

// show time once in a while
if ((now - prev > interval) && (Serial.available() <= 0)) {
DS3231_get(&t); //Get time
temperature = DS3231_get_treg(); //Get temperature
dtostrf(temperature, 5, 1, tempF);
       
     //ожидание нажатия кнопки
     if(digitalRead(8)==HIGH&&flag==0)//если кнопка нажата   
     // и переменная flag равна 0 , то ... 
     { 
       regim++;   
       flag=1; 
         
        //это нужно для того что бы с каждым нажатием кнопки 
        //происходило только одно действие 
        // плюс защита от "дребезга"  100% 
        lcd.begin(16, 2);// Очистка дисплея при нажатии кнопки
          
        if(regim>4)//ограничим количество режимов 
        { 
          regim=1;//так как мы используем только одну кнопку, 
                    // то переключать режимы будем циклично 
        } 
       
     } 
       
      if(digitalRead(8)==LOW&&flag==1)//если кнопка НЕ нажата 
     //и переменная flag равна - 1 ,то ... 
     { 
          
        flag=0;//обнуляем переменную "knopka" 
     } 
      
    if(regim==1)//первый режим 

{ 
      digitalWrite(10,LOW);
      digitalWrite(11,LOW);//выключаем все светодиоды 
      digitalWrite(12,LOW);
        
      //здесь может быть любое ваше действие 1
      // вывод на экран показаний даты и времени
lcd.setCursor(1,1); // Дата
lcd.print(t.mday);
printMonth(t.mon);
lcd.print((t.year)+100); //+100 - это прибавление 100 лет для корректного
// вывода даты 2016 а не 1916
lcd.setCursor(3,0); // Время
lcd.print(t.hour);
lcd.print(":");
if(t.min<10)
{
lcd.print("0");
}
lcd.print(t.min);
lcd.print(":");
if(t.sec<10)
{
lcd.print("0");
}
lcd.print(t.sec);
lcd.setCursor(12, 0); // установка курсора
printwday(t.wday); //Вывод на экран дня недели
//lcd.setCursor(14, 0); // установка курсора
//lcd.print(t.wday); //Вывод на экран дня недели цифрой

}
    } 
    if(regim==2)//второй режим 
    { 
      digitalWrite(10,HIGH);//включаем красный светодиод 
      digitalWrite(11,LOW);
      digitalWrite(12,LOW); 
        
      //здесь может быть любое ваше действие 2 
      // Вывод на экран атмосферного давления с ВМР280
lcd.setCursor(1, 0);
lcd.write(byte(224)); lcd.print("a"); lcd.write(byte(179)); lcd.write(byte(187)); lcd.print(". ");// Надпись "Давл."
lcd.print(bme.readPressure()/ 133.3, 1);
lcd.print(" mm  ");

    // Вывод на экран влажности воздуха с DHT22
lcd.setCursor(1, 1);
lcd.print("B"); lcd.write(byte(187)); lcd.print("a"); lcd.write(byte(182)); lcd.write(byte(189)); lcd.print(". ");// Надпись "Влажн."
lcd.print(hdht);
lcd.print(" %");
    
} 
      
    if(regim==3)//третий режим 
    { 
        
      digitalWrite(10,LOW); 
      digitalWrite(11,HIGH);//включаем светодиод
      digitalWrite(12,LOW); 
        
        
      //здесь может быть любое ваше действие 3
      // Вывод на экран температуры с ВМР280
lcd.setCursor(0, 0);
lcd.print("B"); lcd.write(byte(189)); lcd.print("e"); lcd.write(byte(193)); lcd.write(byte(189)); lcd.write(byte(199)); lcd.write(byte(199)); lcd.print(" ");// Надпись "Внешняя"
lcd.print(bme.readTemperature(), 1);
lcd.print((char)223);//вывод на экран значка "градус"
lcd.print("C");

      // Вывод на экран влажности воздуха с DHT22
lcd.setCursor(9, 1);
lcd.print(hdht);
lcd.print("%");

     // Вывод на экран атмосферного давления с ВМР280
lcd.setCursor(0, 1);
lcd.print(bme.readPressure()/ 133.3, 1);
lcd.print(" mm");

} 
      
    if(regim==4)//четвертый режим 
    { 
        
      digitalWrite(10,LOW); 
      digitalWrite(11,LOW);
      digitalWrite(12,HIGH);//включаем светодиод 
      
      //здесь может быть любое ваше действие 4
      // вывод не экран температуры с модуля часов
lcd.setCursor(0, 0);
lcd.write(byte(160)); lcd.print("a"); lcd.write(byte(187)); lcd.write(byte(186)); lcd.print("o"); lcd.write(byte(189)); lcd.print(" ");// Надпись "Балкон"
lcd.print(tempF);
lcd.print((char)223);
lcd.print("C");
//prev = now;

      // Вывод на экран влажности воздуха с DHT22
lcd.setCursor(9, 1);
lcd.print(hdht);
lcd.print("%");

     // Вывод на экран атмосферного давления с ВМР280
lcd.setCursor(0, 1);
lcd.print(bme.readPressure()/ 133.3, 1);
lcd.print(" mm");

 }
}
   void printMonth(int month)
     {
      switch(month)
      {
       case 1: lcd.print(" "); lcd.write(byte(177)); lcd.write(byte(189)); lcd.write(byte(179)); lcd.print("a"); lcd.print("p"); lcd.write(byte(196)); lcd.print(" ");break;
       case 2: lcd.print(" "); lcd.write(byte(170));lcd.print("e"); lcd.write(byte(179)); lcd.print("p"); lcd.print("a"); lcd.write(byte(187)); lcd.write(byte(196)); lcd.print(" ");break;
       case 3: lcd.print(" "); lcd.print("Map"); lcd.write(byte(191)); lcd.print(" ");break;
       case 4: lcd.print(" "); lcd.print("A"); lcd.write(byte(190)); lcd.print("p"); lcd.print("e"); lcd.write(byte(187)); lcd.write(byte(196)); lcd.print(" ");break;
       case 5: lcd.print(" "); lcd.print("Ma"); lcd.write(byte(185)); lcd.print(" ");break;
       case 6: lcd.print(" "); lcd.write(byte(165)); lcd.write(byte(198)); lcd.write(byte(189)); lcd.write(byte(196)); lcd.print(" ");break;
       case 7: lcd.print(" "); lcd.write(byte(165)); lcd.write(byte(198)); lcd.write(byte(187)); lcd.write(byte(196)); lcd.print(" ");break;
       case 8: lcd.print(" "); lcd.print("A"); lcd.write(byte(179)); lcd.write(byte(180)); lcd.print("y"); lcd.print("c"); lcd.write(byte(191)); lcd.print(" ");break;
       case 9: lcd.print(" "); lcd.print("C"); lcd.print("e"); lcd.write(byte(189)); lcd.write(byte(191)); lcd.write(byte(199)); lcd.write(byte(178)); lcd.print("p"); lcd.write(byte(196)); lcd.print(" ");break;
       case 10: lcd.print(" "); lcd.print("O"); lcd.write(byte(186)); lcd.write(byte(191)); lcd.write(byte(199)); lcd.write(byte(178)); lcd.print("p"); lcd.write(byte(196)); lcd.print(" ");break;
       case 11: lcd.print(" "); lcd.print("H"); lcd.print("o"); lcd.write(byte(199)); lcd.write(byte(178)); lcd.print("p"); lcd.write(byte(196)); lcd.print(" ");break;
       case 12: lcd.print(" "); lcd.write(byte(224)); lcd.print("e"); lcd.write(byte(186)); lcd.print("a"); lcd.write(byte(178)); lcd.print("p"); lcd.write(byte(196)); lcd.print(" ");break;
       default: lcd.print(" Error ");break;
       
//       case 1: lcd.print(" January ");break;
//       case 2: lcd.print(" February ");break;
//       case 3: lcd.print(" March ");break;
//       case 4: lcd.print(" April ");break;
//       case 5: lcd.print(" May ");break;
//       case 6: lcd.print(" June ");break;
//       case 7: lcd.print(" July ");break;
//       case 8: lcd.print(" August ");break;
//       case 9: lcd.print(" September ");break;
//       case 10: lcd.print(" October ");break;
//       case 11: lcd.print(" November ");break;
//       case 12: lcd.print(" December ");break;
//       default: lcd.print(" Error ");break;
       lcd.clear();
      }
}
   void printwday(int wday)
     {
      switch(wday)
      {
       case 1: lcd.write(byte(168)); lcd.write(byte(189));break;//Пн
       case 2: lcd.print("B"); lcd.write(byte(191));break;//Вт
       case 3: lcd.print("Cp");break;//Ср
       case 4: lcd.write(byte(171)); lcd.write(byte(191));break;//Чт
       case 5: lcd.write(byte(168)); lcd.write(byte(191));break;//Пт
       case 6: lcd.print("C"); lcd.write(byte(178));break;//Сб
       case 7: lcd.print("Bc");break;//Вс
       default: lcd.print("Error");break;
         
//       case 1: lcd.print("Mon");break;
//       case 2: lcd.print("Tue");break;
//       case 3: lcd.print("Wed");break;
//       case 4: lcd.print("Thu");break;
//       case 5: lcd.print("Fri");break;
//       case 6: lcd.print("Sat");break;
//       case 7: lcd.print("Sun");break;
//       default: lcd.print("Error");break;
       lcd.clear();
      }
} 

// команда на выключение подсветки экрана lcd.noBacklight();
[/code]

Только почему-то длинные строки вывода названия месяца здесь разбило в несколько строк. В таком виде не скомпилируется. И еще с парой строк такая же проблема, чуть выше...

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

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

Вот у меня Arduino IDE 1.6.10 все, что связано с библиотеками Adafruit не хочет кампилироваться и библиотеки не становятся. Надо разбираться.

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

Я делал так: Вырезал все библиотеки которые были у меня и сохранил из в другой папке, на всякий пожарный). Потом запустил в IDE менеджер библиотек и установил все необходимое мне через него. Так я был уверен, что библиотеки еще не "перепаханные" пользователями и 100% рабочие. После этого все стало видиться и компилироваться. (Моя версия IDE тоже 1.6.10).

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

Как я понял, Вы, с этого скетча переделывали под свои требования. Потому, что на фото русские буквы. 

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

А, я не прав, русские буквы пишутся отдельными кодами. 

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

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

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

Дело в том что у меня другой дисплей и такой вывод кирилицы не подойдет, проще выводить английские буквы.

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

Как я сказал выше - там все осталось для аглицкого. Только закомментировать или удалить ненужное и снять коммент с нужного. Только в тех строках, где написано "Внешняя" "Балкон" Давление" и "Влажность" нужно поставить свои надписи типа "IN", "OUT", Pres" и "Hum"

Вот нашел свою тему, в которой есть ссылка на видео по написанию кирилицы: http://arduino.ru/forum/programmirovanie/arduino-ide-1610-i-biblioteka-liquidcrystali2c

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

Приветствую, Петрович, вот наваял рабочий скетч для портативного барометра c часами - BME280+ds3231+lcd3310:

  







[code]
    #include <PCD8544.h>
    #include <Wire.h>
    #include "ds3231.h"
    #include "SparkFunBME280.h"
    BME280 mySensor;
    
    uint8_t time[8];
    unsigned int recv_size = 0;
    unsigned long prev,
    interval = 1000;
    static PCD8544 lcd;
  void setup()
{
    lcd.begin(84, 48);
    Wire.begin();
    DS3231_init(DS3231_INTCN);
    mySensor.settings.I2CAddress = 0x76; // инициализация BME280
    mySensor.settings.runMode = 3;
    mySensor.settings.tStandby = 0;
    mySensor.settings.filter = 0;
    mySensor.settings.tempOverSample = 1;
    mySensor.settings.pressOverSample = 1;
    mySensor.settings.humidOverSample = 1;
{
    lcd.print(mySensor.begin(),HEX);
    delay(10); 
}
}
  void loop()
{
   // char tempF[6];
   // float temperature;
   // delay(1000);
      struct ts t;
      //unsigned long now = millis();
      //if ((now - prev > interval) && (Serial.available() <= 0))
{
      DS3231_get(&t); //Get time
   // temperature = DS3231_get_treg(); //Get temperature
   // dtostrf(temperature, 5, 1, tempF);
    
    lcd.setCursor(0, 0);
    lcd.print(t.mday);
    printMonth(t.mon);
    lcd.print((t.year)+100); 
  
    lcd.setCursor(0, 2);
    printwday(t.wday);
    lcd.print(t.hour);
    lcd.print(":");
    if(t.min<10)
{
    lcd.print("0");
}
    lcd.print(t.min);
    lcd.print(":");
    if(t.sec<10)
{
    lcd.print("0");
}
    lcd.print(t.sec);
 // вывод данных с BME280
    lcd.setCursor(0, 4);
    lcd.print("P: ");
    lcd.print((uint32_t)mySensor.readFloatPressure()/133.3);
    lcd.print(" mmHg ");
    lcd.setCursor(0,5);
    lcd.print("H:");
    lcd.print((uint8_t)mySensor.readFloatHumidity());
    lcd.print(" % T:");
    lcd.print(mySensor.readTempC(),1);
    lcd.print("C");
    //prev = now;
     
}
}
    void printMonth(int month)
{
    switch(month)
{
      case 1: lcd.print(" January ");break;
       case 2: lcd.print(" February ");break;
       case 3: lcd.print(" March ");break;
       case 4: lcd.print(" April ");break;
       case 5: lcd.print(" May ");break;
       case 6: lcd.print(" June ");break;
       case 7: lcd.print(" July ");break;
       case 8: lcd.print(" August ");break;
       case 9: lcd.print(" September ");break;
       case 10: lcd.print(" October ");break;
       case 11: lcd.print(" November ");break;
       case 12: lcd.print(" December ");break;
       default: lcd.print(" Error ");break;
       lcd.clear();
}
}
       void printwday(int wday)
  

{
      switch(wday)
{
      case 1: lcd.print("Mon ");break;
      case 2: lcd.print("Tue ");break;
      case 3: lcd.print("Wed ");break;
      case 4: lcd.print("Thu ");break;
      case 5: lcd.print("Fri ");break;
      case 6: lcd.print("Sat ");break;
      case 7: lcd.print("Sun ");break;
      default: lcd.print("Error");break;
      lcd.clear();
}
} 


[/code]

 

tugarin
Offline
Зарегистрирован: 29.07.2016

А можете помочь сделать данный скетч для цветного tft дисплея + dht 11 + bmp280 + rtc? для uno r3

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

Genri5, спасибо за скетч! Пока не занимался своим устроийством, нежданно на голову "свалился ремонт" в ванной комнате, так что пока все лежит на макетке. Тем более - заказал и жду доставку BME-280. Когда придет, буду уже заниматься дальше и воспользуюсь данным скетчем.

Кстати, параллельно занимался еще одним проектом на Тиньке13, хочу спросить - "есть ли опыт с данным процессором в плане составления программ?" Если есть - спишемся в личку объясню что нужно...

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

 

Как не странно, но у меня тоже ремонт в ванной комнате с туалетом. Делал теплый пол, выравнивание стен, кафель.  Пока стяжка выстаивалась сварганил  портативный баометр с часами. Уже с керилицей. Получилось достаточно компактно. Нет сам на тиньке ничего не програмировал.

DmitriiX
Offline
Зарегистрирован: 01.08.2016

А почему никто не пишет, что BMP280 врёт по страшной силе? По температуре погрешность вполне может дойти до 2 градусов, проверенно.  С давлением чуть по сложнее, но тоже можно быть уверенным, что погрешность есть, поскольку температура учитывается при его расчёте. Это с таким-то зверскими АЦП. Заводская калибровка ни к чёрту. Может кто дружит с кем-то из бошевцев, и выведает, как корректировать корректировочные коэффициенты, чтоб можно было самостоятельно загнать погрешность в норму?

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

Похоже этот автор статьи с Вами не согласен: http://www.avislab.com/blog/bmp280/.

 Не знаю как BMP280, но BME280 я очень доволен.

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

Согласен, есть небольшие несовпадения в температуре с ВМР280 и DS3231 (как раз в полтора градуса), но кто брешет не знаю. В принципе, точность меня устраивает. А когда придет ВМЕ280 - проверю и его, может он будет точнее...

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

Петрович, а Вы выпаяли светодид с модуля DS3231? Если нет - то советую выпаять. Увидите разницу. И еще я заметил что когда написал скетч  для BME280 без применения библиотек, он стал показывать точнее и скетч стал меньше по объему.

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

Светодиод пока не выдрал, но удалю позже.

Насчет скетча не понял, как без библиотеки на ВМЕ280? А как же он работает?

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


Вот пример моего скетча:

[code]
      #include <Adafruit_GFX.h>
      #include <Adafruit_PCD8544.h>
      #include "ds3231.h"
      #include <Wire.h>
      #define BME280_ADDRESS 0x76
      
      Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 6, 7);
               
      uint8_t time[8];
      unsigned int recv_size = 0;
      unsigned long prev,
      interval = 1000;
       
      unsigned long int hum_raw,temp_raw,pres_raw;
      signed long int t_fine;

      uint16_t dig_T1;
      int16_t dig_T2;
      int16_t dig_T3;
      uint16_t dig_P1;
      int16_t dig_P2;
      int16_t dig_P3;
      int16_t dig_P4;
      int16_t dig_P5;
      int16_t dig_P6;
      int16_t dig_P7;
      int16_t dig_P8;
      int16_t dig_P9;
      int8_t  dig_H1;
      int16_t dig_H2;
      int8_t  dig_H3;
      int16_t dig_H4;
      int16_t dig_H5;
      int8_t  dig_H6;

   void setup()
{
      display.begin();
      display.cp437(true);
      display.setContrast(60);
      display.clearDisplay();
      Wire.begin();
      
      uint8_t osrs_t = 1;             //Temperature oversampling x 1
      uint8_t osrs_p = 1;             //Pressure oversampling x 1
      uint8_t osrs_h = 1;             //Humidity oversampling x 1
      uint8_t mode = 3;               //Normal mode
      uint8_t t_sb = 5;               //Tstandby 1000ms
      uint8_t filter = 0;             //Filter off 
      uint8_t spi3w_en = 0;           //3-wire SPI Disable
    
      uint8_t ctrl_meas_reg = (osrs_t << 5) | (osrs_p << 2) | mode;
      uint8_t config_reg    = (t_sb << 5) | (filter << 2) | spi3w_en;
      uint8_t ctrl_hum_reg  = osrs_h;
      
      DS3231_init(DS3231_INTCN);
               
      writeReg(0xF2,ctrl_hum_reg);
      writeReg(0xF4,ctrl_meas_reg);
      writeReg(0xF5,config_reg);
      readTrim();                   
}


  void loop()
{
      struct ts t;                          //структура вывода даты
{
      DS3231_get(&t);                       //получаем время
      
      
      display.setCursor(0,0);
      display.print(t.mday);               //печать числа
      printMonth(t.mon);                   //печать месяца
      display.print((t.year)+100);         //печать года
      display.setCursor(22,9);
      display.print(t.hour);               //печать часов
      display.print(":");
      if(t.min<10)
{
      display.print("0");
}
      display.print(t.min);               //печать минут
      display.print(":");
      if(t.sec<10)
{
      display.print("0");
}                
      display.print(t.sec);              //печать секунд

}
      display.setCursor(12,16); 
      printwday(t.wday);                //печать дня недели  

      double temp_act = 0.0, press_act = 0.0,hum_act=0.0;  //задаем тип данных температуры, давления и влажности
      signed long int temp_cal;
      unsigned long int press_cal,hum_cal;
    
      readData();
    
      temp_cal = calibration_T(temp_raw);
      press_cal = calibration_P(pres_raw);
      hum_cal = calibration_H(hum_raw);
      temp_act = (double)temp_cal / 100.0;
      press_act = (double)press_cal / 133.3;
      hum_act = (double)hum_cal / 1024.0;
    
      display.setCursor(30,24);
      display.print(press_act);
      display.print(utf8rus(" мм"));
      display.setCursor(42,32);
      display.print(hum_act);
      display.print(" %");
      display.setCursor(42,40);
      display.print(temp_act);
      display.print((char)9);
      display.print("C");
      set_text(0,24,utf8rus("Давл:"),BLACK);
      set_text(0,32,utf8rus("Влажн: "),BLACK);
      set_text(0,40,utf8rus("Темпер:"),BLACK);
      display.clearDisplay();
      delay(1000);
}
  void set_text(int x,int y,String text,int color)
{
      display.setTextColor(color);
      display.setCursor(x,y);
      display.println(text);
      display.display();
}
  void readTrim()
{
      uint8_t data[32],i=0;                     
      Wire.beginTransmission(BME280_ADDRESS);
      Wire.write(0x88);
      Wire.endTransmission();
      Wire.requestFrom(BME280_ADDRESS,24);     
      while(Wire.available()){
      data[i] = Wire.read();
      i++;
}
    
      Wire.beginTransmission(BME280_ADDRESS);     
      Wire.write(0xA1);                          
      Wire.endTransmission();                   
      Wire.requestFrom(BME280_ADDRESS,1);       
      data[i] = Wire.read();                  
      i++;                                     
    
      Wire.beginTransmission(BME280_ADDRESS);
      Wire.write(0xE1);
      Wire.endTransmission();
      Wire.requestFrom(BME280_ADDRESS,7);       
      while(Wire.available()){
      data[i] = Wire.read();
      i++;    
}
      dig_T1 = (data[1] << 8) | data[0];
      dig_T2 = (data[3] << 8) | data[2];
      dig_T3 = (data[5] << 8) | data[4];
      dig_P1 = (data[7] << 8) | data[6];
      dig_P2 = (data[9] << 8) | data[8];
      dig_P3 = (data[11]<< 8) | data[10];
      dig_P4 = (data[13]<< 8) | data[12];
      dig_P5 = (data[15]<< 8) | data[14];
      dig_P6 = (data[17]<< 8) | data[16];
      dig_P7 = (data[19]<< 8) | data[18];
      dig_P8 = (data[21]<< 8) | data[20];
      dig_P9 = (data[23]<< 8) | data[22];
      dig_H1 = data[24];
      dig_H2 = (data[26]<< 8) | data[25];
      dig_H3 = data[27];
      dig_H4 = (data[28]<< 4) | (0x0F & data[29]);
      dig_H5 = (data[30] << 4) | ((data[29] >> 4) & 0x0F); 
      dig_H6 = data[31];                                   
}
  void writeReg(uint8_t reg_address, uint8_t data)
{
      Wire.beginTransmission(BME280_ADDRESS);
      Wire.write(reg_address);
      Wire.write(data);
      Wire.endTransmission();    
}


  void readData()
{
      int i = 0;
      uint32_t data[8];
      Wire.beginTransmission(BME280_ADDRESS);
      Wire.write(0xF7);
      Wire.endTransmission();
      Wire.requestFrom(BME280_ADDRESS,8);
      while(Wire.available()){
      data[i] = Wire.read();
      i++;
}
      pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4);
      temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4);
      hum_raw  = (data[6] << 8) | data[7];
}


      signed long int calibration_T(signed long int adc_T)
{
    
      signed long int var1, var2, T;
      var1 = ((((adc_T >> 3) - ((signed long int)dig_T1<<1))) * ((signed long int)dig_T2)) >> 11;
      var2 = (((((adc_T >> 4) - ((signed long int)dig_T1)) * ((adc_T>>4) - ((signed long int)dig_T1))) >> 12) * ((signed long int)dig_T3)) >> 14;
    
      t_fine = var1 + var2;
      T = (t_fine * 5 + 128) >> 8;
      return T; 
}

      unsigned long int calibration_P(signed long int adc_P)
{
      signed long int var1, var2;
      unsigned long int P;
      var1 = (((signed long int)t_fine)>>1) - (signed long int)64000;
      var2 = (((var1>>2) * (var1>>2)) >> 11) * ((signed long int)dig_P6);
      var2 = var2 + ((var1*((signed long int)dig_P5))<<1);
      var2 = (var2>>2)+(((signed long int)dig_P4)<<16);
      var1 = (((dig_P3 * (((var1>>2)*(var1>>2)) >> 13)) >>3) + ((((signed long int)dig_P2) * var1)>>1))>>18;
      var1 = ((((32768+var1))*((signed long int)dig_P1))>>15);
      if (var1 == 0)
{
      return 0;
}    
      P = (((unsigned long int)(((signed long int)1048576)-adc_P)-(var2>>12)))*3125;
      if(P<0x80000000)
{
      P = (P << 1) / ((unsigned long int) var1);   
}
      else
{
      P = (P / (unsigned long int)var1) * 2;    
}
      var1 = (((signed long int)dig_P9) * ((signed long int)(((P>>3) * (P>>3))>>13)))>>12;
      var2 = (((signed long int)(P>>2)) * ((signed long int)dig_P8))>>13;
      P = (unsigned long int)((signed long int)P + ((var1 + var2 + dig_P7) >> 4));
      return P;
}

      unsigned long int calibration_H(signed long int adc_H)
{
      signed long int v_x1;
    
      v_x1 = (t_fine - ((signed long int)76800));
      v_x1 = (((((adc_H << 14) -(((signed long int)dig_H4) << 20) - (((signed long int)dig_H5) * v_x1)) + 
      ((signed long int)16384)) >> 15) * (((((((v_x1 * ((signed long int)dig_H6)) >> 10) * 
      (((v_x1 * ((signed long int)dig_H3)) >> 11) + ((signed long int) 32768))) >> 10) + (( signed long int)2097152)) * 
      ((signed long int) dig_H2) + 8192) >> 14));
      v_x1 = (v_x1 - (((((v_x1 >> 15) * (v_x1 >> 15)) >> 7) * ((signed long int)dig_H1)) >> 4));
      v_x1 = (v_x1 < 0 ? 0 : v_x1);
      v_x1 = (v_x1 > 419430400 ? 419430400 : v_x1);
      return (unsigned long int)(v_x1 >> 12);   
}
     
  void printMonth(int month)
{
      switch(month)
{
      case 1: display.print(utf8rus(" Января "));break;
      case 2: display.print(utf8rus(" Февраля "));break;
      case 3: display.print(utf8rus(" Марта "));break;
      case 4: display.print(utf8rus(" Апреля "));break;
      case 5: display.print(utf8rus(" Мая "));break;
      case 6: display.print(utf8rus(" Июня "));break;
      case 7: display.print(utf8rus(" Июля "));break;
      case 8: display.print(utf8rus(" Августа "));break;
      case 9: display.print(utf8rus("Сентября"));break;
      case 10:display.print(utf8rus(" Октября "));break;
      case 11:display.print(utf8rus(" Ноября "));break;
      case 12:display.print(utf8rus(" Декабря "));break;
      default:display.print(" Error ");break;
     
}
}
  void printwday(int wday)
 
{
      switch(wday)
{
      case 1: display.print(utf8rus("Понедельник"));break;
      case 2: display.print(utf8rus("Вторник"));break;
      case 3: display.print(utf8rus("Среда"));break;
      case 4: display.print(utf8rus("Четверг"));break;
      case 5: display.print(utf8rus("Пятница"));break;
      case 6: display.print(utf8rus("Суббота"));break;
      case 7: display.print(utf8rus("Воскресенье"));break;
      default:display.print("Error");break;
      
 
}
}
      String utf8rus(String source)
{
      int i,k;
      String target;
      unsigned char n;
      char m[2] = { '0', '\0' };
      k = source.length(); i = 0;
      while (i < k) {
      n = source[i]; i++;
      if (n >= 0xC0) {
      switch (n) {
      case 0xD0: {
      n = source[i]; i++;
      if (n == 0x81) { n = 0xA8; break; }
      if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
      break;
}
      case 0xD1: {
      n = source[i]; i++;
      if (n == 0x91) { n = 0xB8; break; }
      if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
      break;
}
}
}
      m[0] = n; target = target + String(m);
}
  return target;
}
[/code]

 











    
     
      
     
    


   
      
       
      

 

DmitriiX
Offline
Зарегистрирован: 01.08.2016

Интересно, за счет чего этот код выдаёт более точные результаты? На сколько можно видеть, те фрагменты, которые отвечают за вычисления показаний с BMP-шки, просто вставлены из ходовой библиотеки от Adafruit. Может раньше у Вас был какой-то самопальный, «оптимизированный» алгоритм расчёта?

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

 На всякий случай отмечу, что датчик у меня так и не увидился с Adafruit библиотекой, хотя и менял в  Adafruit_BME280.h  адрес 0х77 на 0х76. Не стал выяснять почему, на просторах интернета много других с которыми он увидился - cactus_io_BME280_I2C, SparkFun_BME280_Arduino_Library-master, BME280-master. Но показания датчика, в частности температуры, уж как-то разсходились с лабараторным термометром. Но когда я написал с кетч с как Вы выразились "те фрагментами, которые отвечают за вычисления показаний", то результат меня приятно удивил.  И скетч стал меньшим по объему. Скетч не идеален, но результат меня устраивает. 

 

 

DmitriiX
Offline
Зарегистрирован: 01.08.2016

Спасибо за cactus библиотеку. Раньше она мне не попадалась. Очень компактная и простая. Сделана для датчиков BME280, но очень легко приспосабливается и для BMP. Просто надо подправить REGISTER_CHIPID. Для BME он согласно документации равен 0x60, а для BMP 0x58. Проблем с погрешностью она конечно не решает, хотя имеется функция setTempCal(), которая, судя по всему предназначена для ручной подгонки температуры. Библиотека свободна от кода, предназначенного для работы с SPI, благодаря чему легко читается и будет понятна даже новичкам.

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

Обновил ИДЕ до 10 версии еше раз подправил Adafruit библиотеку - заработала. Самую последнюю я скачивал это Grove_BME280-master.

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

А что правил в библиотеке, что там не так?

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

Да все тоже адрес - 0х77 на 0х76.

DmitriiX
Offline
Зарегистрирован: 01.08.2016

begin(0x76).

В Adafruit_BMP280, так можно. Чтоб не лазить в библиотеку.

 

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

Genri5 попробовал загрузить скетч из поста 61, все работает, но думаю стоит его немного подправить в плане размещения данных по экрану.  В частности температура, если она примет отрицательные значения - показания не поместятся. Буду пробовать все параметры вывести на отдельной строке, благо есть две свободные на экране... Также не поместится на экране дата вместе с названием следующего месяца (September) год уползет на строку с днем недели и временем. Нужно названия месяцев писать сокращенно, тогда будет нормально.

А в общем спасибо за скетч, Ваша работа избавила меня от нескольких часов самостоятельного написания...

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

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

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

Genri5 попробовал загрузить скетч из поста 61, все работает, но думаю стоит его немного подправить в плане размещения данных по экрану.  В частности температура, если она примет отрицательные значения - показания не поместятся. Буду пробовать все параметры вывести на отдельной строке, благо есть две свободные на экране... Также не поместится на экране дата вместе с названием следующего месяца (September) год уползет на строку с днем недели и временем. Нужно названия месяцев писать сокращенно, тогда будет нормально.

А в общем спасибо за скетч, Ваша работа избавила меня от нескольких часов самостоятельного написания...

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

 

 Петрович, в связи с этим я перешел на другой дисплейчик – от Нокиа 3410.

В нем и разрешение повыше и дополнительные столбики есть. Перешел на другую библиотеку - U8Glib, для нее нашел много шрифтов с кириллицей. Так, что скетч на сегодняшний день имеет несколько другой вид.

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

Понятно. А дисплей точно от 3410? Поиском посмотрел, на картинках - там столько же строк и знакомест как в 3310 (6 строк, 14 столбцов). Да и это пока не столь важно. Под данный проект не собираюсь покупать новый дисплей т.к. в наличии есть 2 от 3310, поэтому нужно использовать их. 

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

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

Кстати, как предлагалось выше, не стал переделывать Дуину под трехвольтовое питание, подал 3,3 сразу на ногу VCC. DS3231 и BME280 тоже запитал от 3,3 - в итоге все работает без проблем 

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

Ничего подобного у 3410 6 строк и 16 столбцов. Это вот пока без корпуса. Уменя Nano_V3 поэтому есть 3.3 В. А у BME280 на плате есть стабилизатор на 3.3 В и согласующие уровни, полевики.

 

 

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

Действительно больше места на этом. Значит мне картинки попались не с него...  А так - отлично, знатная штуковина получится, когда корпус будет.

Только на фото снова, в последней строке, если появится минус, сдвинется все вправо. Просто нужно сделать один знак после запятой во всех параметрах.

Измерения по току не делались. сколько потребляет готовый девайс?

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

Да это не проблема. Можно поколдавть над сокращениями надписей, можно сделать по одной цифре после запятой, это кому как нравится.

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

Сейчас пытаюсь прикрутить к скетчу измерение напряжения батареи

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

Я тоже над этим задумывался, но пока не определился. По-моему я видел контроллер зарядки аккумулятора с индикацией рарядки.

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

Вот, именно с того скетча и выдергиваю процесс измерения.

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

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

 Измерения по току не делались. сколько потребляет готовый девайс?

У меня получилось 18 мА . Если еще убрать светодиод питания с платы Ардуины, то будет на 1.5 -2.0 мА меньше.

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

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

 

Только на фото снова, в последней строке, если появится минус, сдвинется все вправо. Просто нужно сделать один знак после запятой во всех параметрах.

 

Петрович,  вот подправил, подумал одного знака после запятой действительно достаточно:

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

Я нашел несколько полезных статей по измерению напряжения Ардуиной, если интересно - вот одна из них с наиболее точным методом измерения: http://blog.unlimite.net/?p=25

Пробовал из скетча измерителя емкости аккумуляторов, но там опорное напряжение взято 3,3 В, а в реальности оно постоянно падает (аккум разржается) и большая погрешность. Лучше сразу делать как описано в статье, от опорного внутреннего источника.

Да-а-а, вид конечно у этого экранчика получше, вернее изображение на нем...

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

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

 Да-а-а, вид конечно у этого экранчика получше, вернее изображение на нем...

 

Да в том, то и дело, что когда я его прикрутил, понял, что назад дороги нет. Но пришлось освоить другую библиотеку для вывода на печать(U8Glib). Но и библиотека мне понравилась больше.

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

А что входит в понимание "освоить"? Я, как говорил ранее, начинаю только познавать Дуину, пользуюсь готовыми проектами, немного перерабатываю под себя или беру стандартные примеры с библиотеками и подпиливаю. Но чтобы самому что-то перелопатить и освоить - это для меня "темный лес". Я так понимаю - библиотека это набор готовых инструкций для какого-либо устройства, который заставляет это устройство взаимодействовать с МК. Как можно там что-то дописать или убрать лишнее?

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

Я имею в виду, изучить ее функционал и возможности. Какими командами выводить на печать данные, а какими просто буквы и цыфры, как сформировать символы и логотипы, как добавить кириллицу, и т. д. .

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

Петрович, поигрался с шрифтами и вот сейчас вот такой вид :

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

Отлично получилось! Я тоже сейчас пытаюсь нахаляву найти такой дисплейчик. Попадался незадорого от 3510, но почитал в Нете, к нему библиотеки не подходят, да и размер у него такой-же как у 3310. Если не найду такой, то придется делать из того что есть в наличии. Так что пока все приостановилось в стадии макета, а сам занимаюсь профилактикой автомобиля, так сказать, подготовкой  к осенне-зимнему сезону.

Кстати пробовал одновременно сравнить показания ВМР-280 и ВМЕ-280 - почти идентичны. Рсвхождение в пару десятых и по температуре и по давлению. Правда не знаю кто из них показывает с погрешностью.

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

Вы поищите у ремонтников мобилок, особенно у частных. У них много остается хлама. Я нашел через olx, повезло, что продавец оказался из моего города.

 

yucan
Offline
Зарегистрирован: 20.04.2015

Здравствуйте! Нужно вместо BMP180 подключить BMP280 (по шине I2С). Если пишут, что  бибилиотеки подходят, то выходит можно? Например в проекте с часами на MAX7219? Или какая то доработка нужна?

Сегодня попробовал подключить BMP280 по SPI-шине по этой схеме.

Работает.

ra6fnq
ra6fnq аватар
Offline
Зарегистрирован: 26.10.2011
#include <LiquidCrystal.h>  
#define interval 330 // обновление дисплея мс 

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);// подправьте под свою схему
long previousMillis = 0; 
#include "DHT.h"
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>

#define DHTPIN 9     // 9 pin для датчика DHT22
#define DHTTYPE DHT22

#define BMP_CS 10   // hardware SPI
#define SEALEVELPRESSURE_HPA (1013.25) // 

Adafruit_BMP280 bme(BMP_CS); // работаем по шине  hardware SPI

DHT dht(DHTPIN, DHTTYPE);

long temp3 = 0, Pressure = 0, Altitude = 0;

void setup() {

  lcd.begin(16, 2);
  lcd.print(" Meteo v01_1602H"); // приветствие
  lcd.setCursor(0,1);
  lcd.print(" RA6FNQ 2016 11"); // версия 0.3
  delay(3000);
  lcd.clear();

  Wire.begin(); 
  
  dht.begin();
  bme.begin(); //запуск BME280
  delay(2000);
}

void loop() 
{
  Pressure = bme.readPressure();
  Altitude = bme.readAltitude(SEALEVELPRESSURE_HPA);
  temp3 = bme.readTemperature();

  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  float t = dht.readTemperature(); // Read temperature as Celsius
  delay(1000);
  
lcd.clear(); // очистим лсд дисплей
lcd.setCursor(0, 0);
lcd.print("T");//задаем температуру снаружи, DHT22
lcd.setCursor(2, 0);
lcd.print(t, 1);
lcd.setCursor(8, 0);
lcd.print("t");//задаем температуру
lcd.setCursor(10, 0);
lcd.print(bme.readTemperature(), 1); //Это температура с барометра);
lcd.setCursor(14, 0);
lcd.print("*C");


  delay (1000); // Задержка 1 с

}

первая колонка DHT22, вторая BMP280. Внизу поверенный "Метеоскоп"

 

Viacon
Offline
Зарегистрирован: 28.11.2016

Genri5 пишет:

Обновил ИДЕ до 10 версии еше раз подправил Adafruit библиотеку - заработала. Самую последнюю я скачивал это Grove_BME280-master.

BMP280, китайский, практически не удается запустить. Запускаю по I2C, получилось в 2-х случаях:

1. С библиотекой Grove_BME280-master файл примера, результат:

Device error!
Temp: 0.00C
Pressure: 0.00Pa
Altitude: 44330.76m
Humidity: 0%
 
2. из этой ветки, пост №11, без библиотеки, результат:
 
TEMP: 25.11 *C
PRESS: 1009.22 hPa
PRESS: 756.92 mmHg
HUM: 0.00 %
правда ситуация при прошивке в этом случае странная - из файла тхт копирую в Arduino и прошиваю NANO, если затем прошить другой прошивкой, а затем попробовать прошить опять этой, выскакивает ошибка:
 
Arduino: 1.6.12 (Windows 7), Плата:"Arduino Nano, ATmega328"
 
D:\Умный дом (дача)\_Метеостанция\BMP280_Serial\_1\_1.ino: In function 'void setup()':
 
_1:46: error: 'writeReg' was not declared in this scope
 
_1:49: error: 'readTrim' was not declared in this scope
 
D:\Умный дом (дача)\_Метеостанция\BMP280_Serial\_1\_1.ino: In function 'void loop()':
 
_1:59: error: 'readData' was not declared in this scope
 
_1:61: error: 'calibration_T' was not declared in this scope
 
_1:62: error: 'calibration_P' was not declared in this scope
 
_1:63: error: 'calibration_H' was not declared in this scope
 
exit status 1
'writeReg' was not declared in this scope
подскажите, как можно подключить через библиотеку? лучше с "Grove_BME280-master"
 
PS: наткнулся на это: тут пост №2 - получил это:
 
Temperature: 26.34 degrees C
Temperature: 79.41 degrees F
Pressure: 100858.00 Pa
Altitude: 40.28m
Altitude: 132.15ft
%RH: 0.00 %
 
Всем спасибо :)

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ra6fnq пишет:

#include <LiquidCrystal.h>&nbsp; 
#define interval 330 // обновление дисплея мс 

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);// подправьте под свою схему
long previousMillis = 0; 
#include "DHT.h"
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>

#define DHTPIN 9&nbsp;&nbsp;&nbsp;&nbsp; // 9 pin для датчика DHT22
#define DHTTYPE DHT22

#define BMP_CS 10&nbsp;&nbsp; // hardware SPI
#define SEALEVELPRESSURE_HPA (1013.25) // 

Adafruit_BMP280 bme(BMP_CS); // работаем по шине&nbsp; hardware SPI

DHT dht(DHTPIN, DHTTYPE);

long temp3 = 0, Pressure = 0, Altitude = 0;

void setup() {

&nbsp; lcd.begin(16, 2);
&nbsp; lcd.print(" Meteo v01_1602H"); // приветствие
&nbsp; lcd.setCursor(0,1);
&nbsp; lcd.print(" RA6FNQ 2016 11"); // версия 0.3
&nbsp; delay(3000);
&nbsp; lcd.clear();

&nbsp; Wire.begin(); 
&nbsp; 
&nbsp; dht.begin();
&nbsp; bme.begin(); //запуск BME280
&nbsp; delay(2000);
}

void loop() 
{
&nbsp; Pressure = bme.readPressure();
&nbsp; Altitude = bme.readAltitude(SEALEVELPRESSURE_HPA);
&nbsp; temp3 = bme.readTemperature();

&nbsp; // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
&nbsp; float h = dht.readHumidity();
&nbsp; float t = dht.readTemperature(); // Read temperature as Celsius
&nbsp; delay(1000);
&nbsp; 
lcd.clear(); // очистим лсд дисплей
lcd.setCursor(0, 0);
lcd.print("T");//задаем температуру снаружи, DHT22
lcd.setCursor(2, 0);
lcd.print(t, 1);
lcd.setCursor(8, 0);
lcd.print("t");//задаем температуру
lcd.setCursor(10, 0);
lcd.print(bme.readTemperature(), 1); //Это температура с барометра);
lcd.setCursor(14, 0);
lcd.print("*C");


&nbsp; delay (1000); // Задержка 1 с

}

первая колонка DHT22, вторая BMP280. Внизу поверенный "Метеоскоп"

 

Евгений! А переделать на дисплей под I2C c выбором используемых датчиков?

ra6fnq
ra6fnq аватар
Offline
Зарегистрирован: 26.10.2011

У меня пока только DHT22, BMP-280 и DS18B20 + купил DS3231, так что проверять особо не на чем. На 1604 IIC + DS3231 переделал. Жду 128х64, хочу делать на нём + WiFi сбор архива на комп и попробовать подключить на сайт narodmon.ru