BME280

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

  Может кому пригодиться. LCD 1602 + Mega 2560+BME280

скетч:

#include <LiquidCrystal.h>
#include <stdint.h>
#include "SparkFunBME280.h"
BME280 mySensor;
LiquidCrystal lcd(12,11,5,4,3,2);
uint8_t time[8];
unsigned int recv_size = 0;
unsigned long prev,
interval = 1000;
int led = 13;
byte smile[8] =
{
B00111,
B00101,
B00111,
B00000,
B00000,
B00000,
B00000,
};

void setup()
{
lcd.begin(16, 2);
lcd.createChar(1, smile);
lcd.clear();
pinMode(led,OUTPUT);
digitalWrite (led, LOW);
mySensor.settings.commInterface = I2C_MODE;
mySensor.settings.I2CAddress = 0x76;
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("Program Started\n");
lcd.print(mySensor.begin(),HEX);
delay(10);

}
}

void loop()
{

mySensor.readTempC();
lcd.setCursor(0,0);
lcd.print("Press:");
lcd.print((uint32_t)mySensor.readFloatPressure()/133.3);
lcd.print("mmHg");
lcd.setCursor(0,1);
lcd.print("Humid:");
lcd.print((uint8_t)mySensor.readFloatHumidity());
lcd.print("% ");
lcd.print(mySensor.readTempC(),1);
lcd.print("\1");
lcd.print("C");
delay(1000);

}

traduin
Offline
Зарегистрирован: 27.05.2016

Мой вариант Arduino Uno + BME280 + OLED LCD 0.96"

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <gfxfont.h>
#include <RTClib.h>
#include <Adafruit_BME280.h>

#define OLED_RESET 4
Adafruit_SSD1306 lcd(OLED_RESET);
Adafruit_BME280 bme; // I2C

int screen = 0;
int screenMax = 1; // screens nums
bool screenChanged = true;
#define VIEW1 0
#define VIEW2 1

unsigned long previousMillis = 0;

void setup() {
  Serial.begin(9600);
  if (!bme.begin()) {
    Serial.println("No BME280 sensor");
    while (1);
  }
  lcd.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  lcd.clearDisplay();
}

void loop() {
    unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval1) {
    previousMillis = currentMillis;
    screen++;
    if (screen > screenMax) screen = 0;
    screenChanged = true;
  }
  if (screenChanged) {
    screenChanged = false;
    switch(screen)
    {
      case VIEW1:
      drawtemp();
      break;
      case VIEW2:
      drawhum();
      break;
    }
  }
}

void lcdclear(void) {
  lcd.clearDisplay();
  lcd.setTextColor(WHITE);
}

void drawtemp(void) {
  lcdclear();
  lcd.setCursor(0, 0);
  lcd.print("Temperature: ");
  lcd.setCursor(0, 10);
  lcd.print(bme.readTemperature());
  lcd.display();
}
void drawhum(void) {
  lcdclear();
  lcd.setCursor(0, 0);
  lcd.print("Humidity: ");
  lcd.setCursor(0, 10);
  lcd.print(bme.readHumidity());
  lcd.display();
  }

 

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

А где же "Pressure". :-)

traduin
Offline
Зарегистрирован: 27.05.2016

Здесь!

Только не забыть добавить новый "VIEW3" в функцию переключения.

//view on screen VIEW3 3 lines
void lcdview3(void) {
  lcd.clearDisplay();
  lcd.setTextColor(WHITE);
  lcd.setCursor(0, 0);
  lcd.print("Atmospheric Pressure");
  lcd.setCursor(0,10);
  lcd.print(bme.readPressure() / 100.0F);
  lcd.print(" hPa");
  lcd.setCursor(0,20);
  lcd.print(bme.readPressure() / 100.0F * 0.7500);
  lcd.print(" mmHg");
  lcd.display();
}

 

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

Здравствуйте! А может кто нибудь оказать помощь со скетчем для такой конфигурации:

TFT SPI ILI9341 240x320 + Pro Mini 328 + BME280 + DS3231?

 

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

Что же, так никто и не поможет :(

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

DeVit пишет:

Что же, так никто и не поможет :(

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

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

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

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

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

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

Еще один скейтч для  LCD 1602 + Mega 2560+BME280 с выводом более точных данных, но меньшим по объему:

    

[code]
#include <Wire.h>
#include <LiquidCrystal.h>
#define BME280_ADDRESS 0x76
unsigned long int hum_raw,temp_raw,pres_raw;
signed long int t_fine;
LiquidCrystal lcd(6,7,8,9,10,11);
int led = 13;
byte gradus[8] =
{
B00111,
B00101,
B00111,
B00000,
B00000,
B00000,
B00000,
};
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()
{
lcd.begin(16, 2);
lcd.createChar(1, gradus);
lcd.clear();
pinMode(led,OUTPUT);
digitalWrite (led, LOW);
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;

Wire.begin();
writeReg(0xF2,ctrl_hum_reg);
writeReg(0xF4,ctrl_meas_reg);
writeReg(0xF5,config_reg);
readTrim();
}

void loop()
{
double temp_act = 0, press_act = 0,hum_act=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;
lcd.setCursor(0,0);
lcd.print("Humidi: ");
lcd.print(hum_act);
lcd.print(" %");
lcd.setCursor(0,1);
lcd.print(press_act);
lcd.print("mm ");
lcd.print(temp_act);
lcd.print("\1");
lcd.print("C");

delay(1000);
}
void readTrim()
{
uint8_t data[32],i=0; // Fix 2014/04/06
Wire.beginTransmission(BME280_ADDRESS);
Wire.write(0x88);
Wire.endTransmission();
Wire.requestFrom(BME280_ADDRESS,24); // Fix 2014/04/06
while(Wire.available()){
data[i] = Wire.read();
i++;
}

Wire.beginTransmission(BME280_ADDRESS); // Add 2014/04/06
Wire.write(0xA1); // Add 2014/04/06
Wire.endTransmission(); // Add 2014/04/06
Wire.requestFrom(BME280_ADDRESS,1); // Add 2014/04/06
data[i] = Wire.read(); // Add 2014/04/06
i++; // Add 2014/04/06

Wire.beginTransmission(BME280_ADDRESS);
Wire.write(0xE1);
Wire.endTransmission();
Wire.requestFrom(BME280_ADDRESS,7); // Fix 2014/04/06
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); // Fix 2014/04/06
dig_H6 = data[31]; // Fix 2014/04/06
}
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);
}

[/code]

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

Нарыл у себя в загажниках дисплейчик от Нокии 3310 и решил собрать портативный вариант барометра с часиками- LCD3310+Nano_V3+BME280+DS3231. Получилось довольно таки неплохо:







[code]
      #include <Adafruit_GFX.h>
      #include <Adafruit_PCD8544.h>
      #include "ds3231.h"
      #include <Wire.h>
      #define BME280_ADDRESS 0x76
      
      Adafruit_PCD8544 lcd = Adafruit_PCD8544(3, 4, 5, 7, 6);
               
       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()
{
      lcd.begin();
      lcd.setContrast(60);
      lcd.clearDisplay();

     
      
      Wire.begin();
      delay(1000); 
      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); //Get time
      
      lcd.setCursor(0, 0);
      lcd.print(t.mday);
      printMonth(t.mon);
      lcd.print((t.year)+100); 
  
      lcd.setCursor(19,9);
     
      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(15,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;
    
      lcd.setCursor(30,24);
      lcd.print(press_act);
      lcd.print(" mm");
      lcd.setCursor(41,32);
      lcd.print(hum_act);
      lcd.print(" %");
      lcd.setCursor(41,40);
      lcd.print(temp_act);
      lcd.print((char)9);
      lcd.print("C");
      set_text(0,24,"Pres:",BLACK);
      set_text(0,32,"Humidi: ",BLACK);
      set_text(0,40,"Temp:",BLACK);
      lcd.clearDisplay();
    
      delay(1000);
}
  void set_text(int x,int y,String text,int color){
      lcd.setTextColor(color);
      lcd.setCursor(x,y);
      lcd.println(text);
      lcd.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: 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;
      
}
}
  void printwday(int wday)
 
{
      switch(wday)
{
      case 1: lcd.print("Monday");break;
      case 2: lcd.print("Tuesday");break;
      case 3: lcd.print("Wednesday");break;
      case 4: lcd.print("Thursday");break;
      case 5: lcd.print("Friday");break;
      case 6: lcd.print("Saturday");break;
      case 7: lcd.print("Sunday");break;
      default: lcd.print("Error");break;
      
 
}
}





[/code]

 

Потом можно добавить и кирилицу.

 

Strannic1924
Offline
Зарегистрирован: 30.08.2016

Здравствуйте!

Пожалуйста помогите. Интересуюсь аппаратной платформой ардуино. (пока в этом деле полный нуль).

Имеется arduino uno (arduino mega 2560) , датчик bme 280, жк LCD 1602 (HD 44780) с конвертером (модулем) IIC/I2C.

Датчик, такой  https://ru.aliexpress.com/item/BME280-Pressure-Temperature-Sensor-Module-with-IIC-I2C-for-Arduino-FZ1639/32398240334.html

Подключил датчик  bme 280 по I2C к ардуино мега, использовал скетч, из документации к датчику https://www.adrive.com/public/9jZ4Wq/FZ1639-GY-BME280.rar 

 #include <Wire.h>

 
#define BME280_ADDRESS 0x76
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()
{
    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;
    
    Serial.begin(9600);
    Wire.begin();
    
    writeReg(0xF2,ctrl_hum_reg);
    writeReg(0xF4,ctrl_meas_reg);
    writeReg(0xF5,config_reg);
    readTrim();                    //
}
 
 
void loop()
{
    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 / 100.0;
    hum_act = (double)hum_cal / 1024.0;
    Serial.print("TEMP : ");
    Serial.print(temp_act);
    Serial.print(" DegC  PRESS : ");
    Serial.print(press_act);
    Serial.print(" hPa  HUM : ");
    Serial.print(hum_act);
    Serial.println(" %");    
    
    delay(1000);
}
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);   
}
 
Ни какой библиотеки для работы датчика ни ложил в папку libraries.
Датчик работает. Отображает в мониторе порта влажность, давление (hPa), температуру.
 
Подскажите пожалуйста, возможно подключить bme 280 и жк LCD 1602 (HD 44780) с конвертером (модулем) IIC/I2C по шине I2C одновременно? И за скетч буду очень благодарен. Спасибо.
Strannic1924
Offline
Зарегистрирован: 30.08.2016

Спасибо. Не нужно. Разобрался сам. Скетч, в моем случае:

 #include <Wire.h>

#include <LiquidCrystal_I2C.h>
#define BME280_ADDRESS 0x76
unsigned long int hum_raw,temp_raw,pres_raw;
signed long int t_fine;
LiquidCrystal_I2C lcd(0x3F,16,2);
int led = 13;
byte gradus[8] =
{
B00111,
B00101,
B00111,
B00000,
B00000,
B00000,
B00000,
};
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()
{
lcd.init();
lcd.backlight();// Включаем подсветку дисплея
lcd.createChar(1, gradus);
lcd.clear();
pinMode(led,OUTPUT);
digitalWrite (led, LOW);
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;
 
Wire.begin();
writeReg(0xF2,ctrl_hum_reg);
writeReg(0xF4,ctrl_meas_reg);
writeReg(0xF5,config_reg);
readTrim();
}
 
void loop()
{
double temp_act = 0, press_act = 0,hum_act=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;
lcd.setCursor(0,0);
lcd.print("Humidi: ");
lcd.print(hum_act);
lcd.print(" %");
lcd.setCursor(0,1);
lcd.print(press_act);
lcd.print("mm ");
lcd.print(temp_act);
lcd.print("\1");
lcd.print("C");
 
delay(1000);
}
void readTrim()
{
uint8_t data[32],i=0; // Fix 2014/04/06
Wire.beginTransmission(BME280_ADDRESS);
Wire.write(0x88);
Wire.endTransmission();
Wire.requestFrom(BME280_ADDRESS,24); // Fix 2014/04/06
while(Wire.available()){
data[i] = Wire.read();
i++;
}
 
Wire.beginTransmission(BME280_ADDRESS); // Add 2014/04/06
Wire.write(0xA1); // Add 2014/04/06
Wire.endTransmission(); // Add 2014/04/06
Wire.requestFrom(BME280_ADDRESS,1); // Add 2014/04/06
data[i] = Wire.read(); // Add 2014/04/06
i++; // Add 2014/04/06
 
Wire.beginTransmission(BME280_ADDRESS);
Wire.write(0xE1);
Wire.endTransmission();
Wire.requestFrom(BME280_ADDRESS,7); // Fix 2014/04/06
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); // Fix 2014/04/06
dig_H6 = data[31]; // Fix 2014/04/06
}
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);
}
Genri5
Offline
Зарегистрирован: 31.05.2016

LCD3310 решил заменить на LCD3410, в связи с тем, что у второго выше разрешение и на два столбика больше: 



[code]
        #include "U8glib.h"
        #include "rus6x12.h"
        #include "ds3231.h"
        #include <Wire.h>
        #include "cactus_io_BME280_I2C.h"
        BME280_I2C bme(0x76);

        U8GLIB_PCF8812 u8g(3, 4, 6, 5, 7);
        const uint8_t gradus[] PROGMEM = 
      {
        0x07,        
        0x05,         
        0x07,          
        0x00,         
        0x00,         
        0x00,        
        0x00,         
        0x00 };        

        #define BUFF_MAX 128

        uint8_t time[8];
        char recv[BUFF_MAX];
        unsigned int recv_size = 0;
        unsigned long prev,
        interval = 1000;
     
    void draw(void)
{
        u8g.setFont(rus6x12);
        char in;
        unsigned long now = millis();
        struct ts t;
        DS3231_get(&t);                       //получаем время
       
        u8g.drawStr( 0, 42, "Давле-е:");      //печатаем показания давления
        u8g.setPrintPos(54, 42);
        u8g.print(bme.getPressure_MB()*0.75,1);
        u8g.drawStr( 85, 42, "мм");
        u8g.drawStr( 0, 52, "Влажн-ть:");      //печатаем показания влажности
        u8g.setPrintPos(60, 52);
        u8g.print(bme.getHumidity(),1);           
        u8g.drawStr( 90, 52, "%");
        u8g.drawStr( 0, 62, "Темпе-ра:");      //печатаем показания температуры
        u8g.setPrintPos(60, 62);                 
        u8g.print(bme.getTemperature_C()-1,1);    
        u8g.drawBitmapP( 81, 54, 1, 8, gradus); // печатаем символ градуса
        u8g.drawStr( 90, 62, "C");
      
        u8g.setPrintPos(16, 32);                //печатаем день недели
        printDay(t.wday);
        u8g.setPrintPos(0, 10);                 //печатаем день месяца
        u8g.print(t.mday);
        printMonth(t.mon);                      //печатаем месяц
        u8g.print((t.year)+100);                //печатаем год
      
        if(t.hour<10)                           // печатаем время
{
        u8g.setPrintPos(27, 22);
        u8g.print(t.hour);
}
        else 
{
        u8g.setPrintPos(27, 22);
        u8g.print(t.hour);
}
      
        u8g.print(":");
        if(t.min<10)
{
        u8g.print("0");
        u8g.print(t.min);
}
        else
{
        u8g.print(t.min);
}
      
        u8g.print(":");
        if(t.sec<10)
{
      
        u8g.print("0");
        u8g.print(t.sec);
}
        else 
{
        u8g.print(t.sec);
        if ((in == 10 || in == 13) && (recv_size > 0)) 
{
        parse_cmd(recv, recv_size);
        recv_size = 0;
        recv[0] = 0;
} 
        else if (in < 48 || in > 122){;        // ignore ~[0-9A-Za-z]
}
        else if (recv_size > BUFF_MAX - 2) {   // drop lines that are too long
           
        recv_size = 0;                         // drop
        recv[0] = 0;
}
        else if (recv_size < BUFF_MAX - 2)
{
        recv[recv_size] = in;
        recv[recv_size + 1] = 0;
        recv_size += 1;
}
}
}
    void setup(void)
{
  
        Wire.begin();
        bme.begin();
       
        DS3231_init(DS3231_INTCN);
     // parse_cmd("T004300631102015",16);
     // flip screen, if required
     // u8g.setRot180();                        // розворот экрана на 180, если нужно
         
        if ( u8g.getMode() == U8G_MODE_R3G3B2 ) // присвоить значение цвета по умолчанию
{
        u8g.setColorIndex(255);                 //белый
}
        else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
{
        u8g.setColorIndex(3);                   // максимальная интенсивность
}
        else if ( u8g.getMode() == U8G_MODE_BW )
{
        u8g.setColorIndex(1);                   // pixel on
}
        else if ( u8g.getMode() == U8G_MODE_HICOLOR )
{
        u8g.setHiColorByRGB(255,255,255);
}
}

    void loop(void)
{
        bme.readSensor(); 
  
     // picture loop
    
        u8g.firstPage();  
        do
{
        draw();
}
        while( u8g.nextPage() );  // восстановить картинку после задержки
        delay(50);  
}

    void parse_cmd(char *cmd, int cmdsize)
{
        uint8_t i;
        uint8_t reg_val;
        char buff[BUFF_MAX];
        struct ts t;
    
        if (cmd[0] == 84 && cmdsize == 16)
{
       
        t.sec = inp2toi(cmd, 1);
        t.min = inp2toi(cmd, 3);
        t.hour = inp2toi(cmd, 5);
        t.wday = inp2toi(cmd, 6);
        t.mday = inp2toi(cmd, 8);
        t.mon = inp2toi(cmd, 10);
        t.year = inp2toi(cmd, 12) * 100 + inp2toi(cmd, 14);
        DS3231_set(t);
        
}       else if (cmd[0] == 49 && cmdsize == 1) {  // "1" get alarm 1
        DS3231_get_a1(&buff[0], 59);
       
}       else if (cmd[0] == 50 && cmdsize == 1) {  // "2" get alarm 1
        DS3231_get_a2(&buff[0], 59);
        
}       else if (cmd[0] == 51 && cmdsize == 1) {  // "3" get aging register
        
}       else if (cmd[0] == 65 && cmdsize == 9) {  // "A" set alarm 1
        DS3231_set_creg(DS3231_INTCN | DS3231_A1IE);
        
        for (i = 0; i < 4; i++) {
        time[i] = (cmd[2 * i + 1] - 48) * 10 + cmd[2 * i + 2] - 48; // ss, mm, hh, dd
}
        byte flags[5] = { 0, 0, 0, 0, 0 };
        DS3231_set_a1(time[0], time[1], time[2], time[3], flags);
        DS3231_get_a1(&buff[0], 59);
        
}       else if (cmd[0] == 66 && cmdsize == 7) {  // "B" Set Alarm 2
        DS3231_set_creg(DS3231_INTCN | DS3231_A2IE);
        
        for (i = 0; i < 4; i++) {
        time[i] = (cmd[2 * i + 1] - 48) * 10 + cmd[2 * i + 2] - 48; // mm, hh, dd
}
        byte flags[5] = { 0, 0, 0, 0 };
        DS3231_set_a2(time[0], time[1], time[2], flags);
        DS3231_get_a2(&buff[0], 59);
         
}       else if (cmd[0] == 67 && cmdsize == 1) {  // "C" - получить регистр температуры
        
}       else if (cmd[0] == 68 && cmdsize == 1) {  // "D" - сброс состояния регистра флага сигнализаци
        reg_val = DS3231_get_sreg();
        reg_val &= B11111100;
        DS3231_set_sreg(reg_val);
}       else if (cmd[0] == 70 && cmdsize == 1) {  // "F" - custom fct
        reg_val = DS3231_get_addr(0x5);
       
} 
        else if (cmd[0] == 71 && cmdsize == 1) {  // "G" - set aging status register
        DS3231_set_aging(0);
} 
        else if (cmd[0] == 83 && cmdsize == 1) {  // "S" - get status register
        
}
        else
{
}
}

    void printDay(int wday)
{
        switch(wday)
{
        case 1: u8g.print("Понедельник");break;
        case 2: u8g.print("Вторник");break;
        case 3: u8g.print("Среда");break;
        case 4: u8g.print("Четверг");break;
        case 5: u8g.print("Пятница");break;
        case 6: u8g.print("Суббота");break;
        case 7: u8g.print("Воскресенье");break;
        default: u8g.print("Error");break;
} 
}

    void printMonth(int month)
{
        switch(month)
{
        case 1: u8g.print(" Января ");break;
        case 2: u8g.print(" Февраля ");break;
        case 3: u8g.print(" Марта ");break;
        case 4: u8g.print(" Апреля ");break;
        case 5: u8g.print(" Мая ");break;
        case 6: u8g.print(" Июня ");break;
        case 7: u8g.print(" Июля ");break;
        case 8: u8g.print(" Августа ");break;
        case 9: u8g.print(" Сентября ");break;
        case 10: u8g.print(" Октября ");break;
        case 11: u8g.print(" Ноября ");break;
        case 12: u8g.print(" Декабря ");break;
        default: u8g.print(" Error ");break;
} 
}
[/code]






 

mitsar
Offline
Зарегистрирован: 25.10.2016

Подскажите пожалуйста новичку.

При компиляции скетча для BMP280 всё время выскакивает ошибка такого примерно вида:

C:\Arduino\Sketch\sketch_8888\sketch_8888.ino:7:29: fatal error: Adafruit_Sensor.h: No such file or directory
 
 #include <Adafruit_Sensor.h>
                             ^
compilation terminated.
 
Почему-то не читаются файлы с расширением (.h). У меня Arduino Nano. Библиотеку "Adafruit_BMP280_Library" подключил, пробовал другие библиотеки и скетчи, но результат один, компиляция останавливается на если иесть файл с расширением (.h).
 
 
James
Offline
Зарегистрирован: 26.02.2016

Adafruit_Sensor.hи Adafruit_BMP280.h разные вещи

mitsar
Offline
Зарегистрирован: 25.10.2016

James пишет:

Adafruit_Sensor.hи Adafruit_BMP280.h разные вещи

Для  Adafruit_BMP280. та же история "Ошибка компиляции для платы Arduino Nano", затык опять на 

Adafruit_Sensor.h

Странно, что другие скетчи спокойно загружаются в Ардуино. Какой-то подвох.

James
Offline
Зарегистрирован: 26.02.2016

Компилятор ругается на отсутвие библиотеки. Попробуйте вручную положить файлы в папку 

Strannic1924
Offline
Зарегистрирован: 30.08.2016

Добрый день!

Собрал несколько мини-погодных станций в распредкоробках. Начинка: arduino uno + bme280 + lcd1602 i2c + батарейка крона 9в + выключатель клавишный(для включения и выключения) + тумблер к контактам подсветки дисплея( для отключения подсветки). Питание подается соответствено на разъемы Vin и GND.

Скетч приведен выше. Ардуино, как по ссылке  https://ru.aliexpress.com/item/UNO-R3-CH340G-ATmega328P-compatible-for-Arduino-UNO-R3/32523366108.html?spm=2114.30010708.3.364.lZwyxx&ws_ab_test=searchweb0_0,searchweb201602_1_116_10065_117_10068_114_115_10069_113_10017_10080_10082_10081_10060_10061_10062_10039_10056_10055_10054_10059_10078_10079_10073_10070_421_420_10052_10053_10050_10051,searchweb201603_1&btsid=904364f4-0a78-4e1f-b492-b7f6094388e8

Все было Ок. Недавно собрал еще один экземпляр столкнулся со странным глюком. При включении загорается экран, загрузчик не стартует, пока не нажмешь reset на плате или выключатель не до конца нажмешь на выключение и отпустишь... При этом от юсб и блока питания все стартует ОК.

Не пойму, что не так?.. Пробовал, ставить конденсатор 100 мкфХ16В на питание от кроны, лучше,но  стартует через раз...

На предыдущих собранных мини погодных станций все стартует от кроны 9В без проблем.

Подскажите чем вылечить данный глюк?..

vvadim
Offline
Зарегистрирован: 23.05.2012

для начала выкинуть крону и никогда её не использовать

пользуйтесь аккумуляторами

Strannic1924
Offline
Зарегистрирован: 30.08.2016

Добрый день! Столкнулся с такой ситуацией, попалось пару датчиков bme280, которые завышают атмосферное давление примерно на 1 мм. рт. ст. (тестировал в помещении, при плюсовой температуре, за эталон - брал значения у местной метеостанции, живу с ней рядом, на одном уровне по высоте). Причем у двух датчиков bme280 показания температуры и влажности почти идентичны, а вот с давлением - разница в 1 мм. рт. ст., что превышает абсолютную погрешность в диапазоне измерений 300-1100 гПа при температуре 0-65 С ,по даташиту: -+ 1 гПа (0,75 мм. рт. ст.)   https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BME280_DS001-11.pdf

Помогите, как отредактировать скетч, чтоб контроллер отнимал 1 гПа (который завышает, в моем случае) от показаний давления.

скетч:

  #include <Wire.h>

#include <LiquidCrystal_I2C.h>
#define BME280_ADDRESS 0x76
unsigned long int hum_raw,temp_raw,pres_raw;
signed long int t_fine;
LiquidCrystal_I2C lcd(0x3F,16,2);
int led = 13;
byte gradus[8] =
{
B00111,
B00101,
B00111,
B00000,
B00000,
B00000,
B00000,
};
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()
{
lcd.init();
lcd.backlight();// Включаем подсветку дисплея
lcd.createChar(1, gradus);
lcd.clear();
pinMode(led,OUTPUT);
digitalWrite (led, LOW);
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;
 
Wire.begin();
writeReg(0xF2,ctrl_hum_reg);
writeReg(0xF4,ctrl_meas_reg);
writeReg(0xF5,config_reg);
readTrim();
}
 
void loop()
{
double temp_act = 0, press_act = 0,hum_act=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;
lcd.setCursor(0,0);
lcd.print("Humidi: ");
lcd.print(hum_act);
lcd.print(" %");
lcd.setCursor(0,1);
lcd.print(press_act);
lcd.print("mm ");
lcd.print(temp_act);
lcd.print("\1");
lcd.print("C");
 
delay(1000);
}
void readTrim()
{
uint8_t data[32],i=0; // Fix 2014/04/06
Wire.beginTransmission(BME280_ADDRESS);
Wire.write(0x88);
Wire.endTransmission();
Wire.requestFrom(BME280_ADDRESS,24); // Fix 2014/04/06
while(Wire.available()){
data[i] = Wire.read();
i++;
}
 
Wire.beginTransmission(BME280_ADDRESS); // Add 2014/04/06
Wire.write(0xA1); // Add 2014/04/06
Wire.endTransmission(); // Add 2014/04/06
Wire.requestFrom(BME280_ADDRESS,1); // Add 2014/04/06
data[i] = Wire.read(); // Add 2014/04/06
i++; // Add 2014/04/06
 
Wire.beginTransmission(BME280_ADDRESS);
Wire.write(0xE1);
Wire.endTransmission();
Wire.requestFrom(BME280_ADDRESS,7); // Fix 2014/04/06
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); // Fix 2014/04/06
dig_H6 = data[31]; // Fix 2014/04/06
}
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);
}
Strannic1924
Offline
Зарегистрирован: 30.08.2016

Спасибо, не надо, разобрался сам. (Строка 097)

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


#include <Wire.h>

#include <LiquidCrystal_I2C.h>
#define BME280_ADDRESS 0x76
unsigned long int hum_raw,temp_raw,pres_raw;
signed long int t_fine;
LiquidCrystal_I2C lcd(0x3F,16,2);
int led = 13;
byte gradus[8] =
{
B00111,
B00101,
B00111,
B00000,
B00000,
B00000,
B00000,
};
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()
{
lcd.init();
lcd.backlight();// Включаем подсветку дисплея
lcd.createChar(1, gradus);
lcd.clear();
lcd.setCursor(0, 0);
  lcd.print("Weather Station");
  lcd.setCursor(0,1);
  lcd.print("Mini arduino");  
  delay(1000);

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("FOR");
  delay(1000);

  lcd.clear();
  lcd.setCursor(0,1);  
  lcd.print("F.I.O.");
  delay(500);
  for (int i=0;i<5;i++){
    delay(200);  
    lcd.scrollDisplayLeft();
  }
  delay(500);
  lcd.clear();  
pinMode(led,OUTPUT);
digitalWrite (led, LOW);
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;
 
Wire.begin();
writeReg(0xF2,ctrl_hum_reg);
writeReg(0xF4,ctrl_meas_reg);
writeReg(0xF5,config_reg);
readTrim();
}
 
void loop()
{
double temp_act = 0, press_act = 0,hum_act=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 - 100) / 133.3;
hum_act = (double)hum_cal / 1024.0;
lcd.setCursor(0,0);
lcd.print("Humidi: ");
lcd.print(hum_act);
lcd.print(" %");
lcd.setCursor(0,1);
lcd.print(press_act);
lcd.print("mm ");
lcd.print(temp_act);
lcd.print("\1");
lcd.print("C");
 
delay(1000);
}
void readTrim()
{
uint8_t data[32],i=0; // Fix 2014/04/06
Wire.beginTransmission(BME280_ADDRESS);
Wire.write(0x88);
Wire.endTransmission();
Wire.requestFrom(BME280_ADDRESS,24); // Fix 2014/04/06
while(Wire.available()){
data[i] = Wire.read();
i++;
}
 
Wire.beginTransmission(BME280_ADDRESS); // Add 2014/04/06
Wire.write(0xA1); // Add 2014/04/06
Wire.endTransmission(); // Add 2014/04/06
Wire.requestFrom(BME280_ADDRESS,1); // Add 2014/04/06
data[i] = Wire.read(); // Add 2014/04/06
i++; // Add 2014/04/06
 
Wire.beginTransmission(BME280_ADDRESS);
Wire.write(0xE1);
Wire.endTransmission();
Wire.requestFrom(BME280_ADDRESS,7); // Fix 2014/04/06
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); // Fix 2014/04/06
dig_H6 = data[31]; // Fix 2014/04/06
}
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);
}
PM007
Offline
Зарегистрирован: 09.05.2016

Здравствуйте,

подскажите где скачать SparkFunBME280.h

А то что то гугл наверное на меня обиделся и не делится где взять...

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

PM007 пишет:

Здравствуйте,

подскажите где скачать SparkFunBME280.h

А то что то гугл наверное на меня обиделся и не делится где взять...

Да хотя бы здесь: https://github.com/sparkfun/SparkFun_BME280_Arduino_Library .

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

PM007 пишет:

подскажите где скачать SparkFunBME280.h

А то что то гугл наверное на меня обиделся и не делится где взять...

У вас какой-то особенный гугл? Сходу первые две ссылки на гитхаб:

AlexRat
Offline
Зарегистрирован: 23.04.2017

Джентельмены, сами мы не местные, подскажите, кто может :)

Собрал погодную станцию на  основе датчика BME280. Запихнул в коробочку, высунул за окно. Рядом висит обычный градусник. Обратил внимание, что температура на BME280 сильно отличается от обычного термометра. Например сейчас на градуснике +2, на BME + 10. 8 градусов разницы!!! Кто-то явно врёт.

Для проверки воткнул рядом с BME280 другой датчик AM2320. Просто он у меня был под рукой, и удобно, что тоже I2C. Так он ещё большую температуру показывает. Сейчас +15.

И вот что мне делать с такими результатами эксперимента? Как понять кто врёт? И почему...

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Возьмите точный термометр и посмотрите настоящую температуру.

AlexRat
Offline
Зарегистрирован: 23.04.2017

А что это за точный термометр? Где такие берут?

bwn
Offline
Зарегистрирован: 25.08.2014

БМЕшку себе под мышку и наступит момент истины)))

bwn
Offline
Зарегистрирован: 25.08.2014

AlexRat пишет:

А что это за точный термометр? Где такие берут?

Наиболее дешевый и доступный - ртутный медицинский термометр.

Strannic1924
Offline
Зарегистрирован: 30.08.2016

AlexRat пишет:

Джентельмены, сами мы не местные, подскажите, кто может :)

Собрал погодную станцию на  основе датчика BME280. Запихнул в коробочку, высунул за окно. Рядом висит обычный градусник. Обратил внимание, что температура на BME280 сильно отличается от обычного термометра. Например сейчас на градуснике +2, на BME + 10. 8 градусов разницы!!! Кто-то явно врёт.

Для проверки воткнул рядом с BME280 другой датчик AM2320. Просто он у меня был под рукой, и удобно, что тоже I2C. Так он ещё большую температуру показывает. Сейчас +15.

И вот что мне делать с такими результатами эксперимента? Как понять кто врёт? И почему...

1. Датчик BME280 необходимо выносить подальше от всяких корпусов, подоконников и др. нагретых предметов

2. Может у Вас термометр в тени, а на датчик BME280 попадают прямые солнечные лучи

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

4. Проверяйте соединения

AlexRat
Offline
Зарегистрирован: 23.04.2017

bwn пишет:

БМЕшку себе под мышку и наступит момент истины)))

Провёл такой эксперимент. Замер производил по 10 минут на датчик. Am2320 показал 36,4, BME280 показал 37,8. То есть теперь он врёт в большую сторону.

AlexRat
Offline
Зарегистрирован: 23.04.2017

Strannic1924 пишет:

1. Датчик BME280 необходимо выносить подальше от всяких корпусов, подоконников и др. нагретых предметов

2. Может у Вас термометр в тени, а на датчик BME280 попадают прямые солнечные лучи

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

4. Проверяйте соединения

Датчик висит рядом с термометром. Условия освещённости одинаковые. Кроме того, датчик висел за коном несколько дней и ночей. А ночью освещённость (в связи с её отсутствием) не должна влиять на показания. Тем не менее, когда термометр показывал минус, BME280 стабильно показывал порядка +2 градусов. А уж остыть он за несколько часов точно должен был.

А что не так может быть с соединениями? Ведь если бы где-то не было контакта, то показания бы просто не передавались?

Strannic1924
Offline
Зарегистрирован: 30.08.2016

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

2. Укажите скетч, схему подключения, ссылку на датчик где покупали, напряжение подаете какое: 3,3V ? (есть платы без преобразователя напряжения, которые нужно питать строго 3,3V , а если стоит преоброзователь напряжения на плате, то можно и 5v подать).

3. Какие провода для соединений используете?(фото в студию). А то вдруг, у вас 

Кабель ВВГнг 4х25... :)

В диапазоне измерений -40...85 С максимальная погрешность 3,65  С (согласно даташиту).

 В диапазоне измерений 0...65 С погрешность 1 С (согласно даташиту)

 

https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BME280_DS001-11.pdf

bwn
Offline
Зарегистрирован: 25.08.2014

AlexRat пишет:

bwn пишет:

БМЕшку себе под мышку и наступит момент истины)))

Провёл такой эксперимент. Замер производил по 10 минут на датчик. Am2320 показал 36,4, BME280 показал 37,8. То есть теперь он врёт в большую сторону.

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

AlexRat
Offline
Зарегистрирован: 23.04.2017

bwn пишет:

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

Ртутный термометр показал 36,7. Просто я не написал об этом. От стены конечно есть ИК-излучение. Но ведь градусник тоже расположен в таких же условиях. Неужели на датчик это ИК так сильно влияет в большую сторону? Оба закреплены на раме окна.

bwn
Offline
Зарегистрирован: 25.08.2014

"переизлучающих пар, поверхность-поверхность, между датчиком и излучением"
Датчик весьма маленький по габаритам и сильнее реагирует на внешние воздействия. Чтобы более - менее понять где роется собака, берем типа обувной коробки, на низ пенопласт или что то малопроводящее температуру, укладываем в эту коробку наши датчики и ставим на стол в середине комнаты (сквозняки постараться все убрать). Через пару часиков смотрим что получилось.
10 градусов это конечно фигня, что то еще влияет.

PM007
Offline
Зарегистрирован: 09.05.2016

Здравствуйте

Извените может я не зню чеог то элементерного но...

Мне теперь это скопитьвать в текстовый файл и назвать его SparkFunBME280.h

James
Offline
Зарегистрирован: 26.02.2016

выходишь в корень 

sparkfun/SparkFun_BME280_Breakout_Board
c
lone or download

и будет тебе счастье в виде архива. потом заходишьв иде и подключаешь архив с библиотекой
профит!

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Цитата:

потом заходишь в иде и подключаешь архив с библиотекой профит!

Через IDE подключить не получится, т.к. гитхаб в названии добавляет "-master" (а дефисы в названии библиотек недопустимы). Нужно вручную распаковать папку из архива, удалить из названия "-master" и закинуть папку в Мои документы\Arduino\libraries\

 

AlexRat
Offline
Зарегистрирован: 23.04.2017

Jeka_M пишет:
Через IDE подключить не получится, т.к. гитхаб в названии добавляет "-master" (а дефисы в названии библиотек недопустимы). Нужно вручную распаковать папку из архива, удалить из названия "-master" и закинуть папку в Мои документы\Arduino\libraries\
Это в какой версии? У меня большинство библиотек с -master на конце и IDE это совершенно не мешает. Что под Windows, что под Ubuntu

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Походу в новых версиях IDE это пофиксили. Проверил на 1.0.5 - не импортирует, ругается на спецсимволы в названии. Также проверил на 1.6.6 - всё получилось. 

Но это не спасёт вопрошающего. Т.к. конкретно в этом архиве с гитхаба находится не только библиотека, но и другие папки и файлы (документация, лицензия и т.д.). IDE ругается на некорректную структуру папки с библиотекой. И такое часто бывает.

 

AlexRat
Offline
Зарегистрирован: 23.04.2017

Почему бы тогда не взять библиотеку от Adafruit? Или библиотека Sparkfun чем-то предпотительней?

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

Sparkfun попроще и ничего лишнего.

James
Offline
Зарегистрирован: 26.02.2016

Ну а в чем проблема удалить все лишнее? 

AlexRat
Offline
Зарегистрирован: 23.04.2017

Jeka_M пишет:

Походу в новых версиях IDE это пофиксили. Проверил на 1.0.5 - не импортирует, ругается на спецсимволы в названии. Также проверил на 1.6.6 - всё получилось.

А в чём смысл использования таких древних версий IDE?

James
Offline
Зарегистрирован: 26.02.2016
James
Offline
Зарегистрирован: 26.02.2016

AlexRat пишет:

 А в чём смысл использования таких древних версий IDE?

у меня две стоит одновременно. есть вещи которые по разному себя ведут в зависимости от версии

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

AlexRat пишет:

А в чём смысл использования таких древних версий IDE?

Ну, Вы знаете, людям свойственно приписывать всему старому самые замечательные свойства :)

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

То же самое, например, на любом форуме. Как только переходят на новый движок, эпоха старого становится легендарной ... "вот тогда типа посты были, а сейчас измельчало всё".

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

Итак, цитата из А. Зиновьева:

«Баллада о неизвестном курсанте» была первый и последний раз опубликована на стенках старого сортира в ИВАШП.  …

В январе старый сортир был разрушен. На его месте соорудили новый с более высоким коэффициентом полезного действия и с более низкой себестоимостью выпускаемой продукции. В Школе после этого стали различать две эпохи: эпоху старого и нового сортира. Первой стали приписывать все наилучшие качества цивилизации, и она стала легендарной.

Стенки нового сортира с поразительной быстротой покрылись рисунками, стихами и афоризмами преимущественно эротического содержания. Однако ничего равного «Балладе» создано не было. И сбылось пророчество Уклониста: время шедевров кончилось, началась эпоха массового производства посредственности. Поскольку «Баллада» в другой форме не была опубликована, а память человеческая недолговечна и ненадежна, то это выдающееся произведение настенного искусства по всей вероятности можно считать безвозвратно потерянным.

... Упомянутые две эпохи резко различаются и с точки зрения эмоционального отношения к Миру. Достаточно, например, сравнить такие строки из «Баллады»:

«Мы селедку получали
И на спирт ее меняли»

с лучшими стихами новосортирной эпохи, допустим -- с такими:

«Я здесь сидел
И горько плакал.
Я мало ел,
Но много какал»

чтобы увидеть переход от жизнелюбивых мотивов в духе запоздалого Ренессанса к мрачному Декадансу. 

Ну, вот, надеюсь, Вы поняли о чём это я :)

James
Offline
Зарегистрирован: 26.02.2016

смысл вот как раз в непонимании старой версии имен библиотек с символами:) мне лень проекты перитаскивать, вот теперь две иде на компе. П.С. я за все "новое", но с офф сайта

AlexRat
Offline
Зарегистрирован: 23.04.2017

Strannic1924 пишет:

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

2. Укажите скетч, схему подключения, ссылку на датчик где покупали, напряжение подаете какое: 3,3V ? (есть платы без преобразователя напряжения, которые нужно питать строго 3,3V , а если стоит преоброзователь напряжения на плате, то можно и 5v подать).

3. Какие провода для соединений используете?(фото в студию). А то вдруг, у вас 

Кабель ВВГнг 4х25... :)

В диапазоне измерений -40...85 С максимальная погрешность 3,65  С (согласно даташиту).

 В диапазоне измерений 0...65 С погрешность 1 С (согласно даташиту)

 

https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BME280_DS001-11.pdf

1. Про защиту от осадков пока вопос открытый пока использую просто пластиковый контейнер с мелкими дырочками для вентиляции. Насекомых думаю не стоит особо опасаться. Особенно на 6-м этаже. У нас их тут в принципе мало.

2. Схему подключения нарисовал. Правда в библиотеке не было моего модуля. Поставил какой был. У меня такой. На нём явно есть стабилизатор. Значит питать можно от 5 вольт. Скетч прилагаю.

3. Провода обычные... Для макетки. Вот фото в сборе.

4. Вообще конечно погрешность грустная. Вряд ли такой модуль подходит для уличного термометра...