из двух один (ежа с ужом)

a-d@okbnp.ru
Offline
Зарегистрирован: 13.03.2019




/*
BME280 I2C Test.ino

This code shows how to record data from the BME280 environmental sensor
using I2C interface. This file is an example file, part of the Arduino
BME280 library.

GNU General Public License

Written: Dec 30 2015.
Last Updated: Oct 07 2017.

Connecting the BME280 Sensor:
Sensor              ->  Board
-----------------------------
Vin (Voltage In)    ->  3.3V
Gnd (Ground)        ->  Gnd
SDA (Serial Data)   ->  A4 on Uno/Pro-Mini, 20 on Mega2560/Due, 2 Leonardo/Pro-Micro
SCK (Serial Clock)  ->  A5 on Uno/Pro-Mini, 21 on Mega2560/Due, 3 Leonardo/Pro-Micro

 */

#include <BME280I2C.h>
#include <Wire.h>

#define SERIAL_BAUD 115200

BME280I2C bme;    // Default : forced mode, standby time = 1000 ms
                  // Oversampling = pressure ×1, temperature ×1, humidity ×1, filter off,

//////////////////////////////////////////////////////////////////
void setup()
{
  Serial.begin(SERIAL_BAUD);

  while(!Serial) {} // Wait

  Wire.begin();

  while(!bme.begin())
  {
    Serial.println("Could not find BME280 sensor!");
    delay(1000);
  }

  // bme.chipID(); // Deprecated. See chipModel().
  switch(bme.chipModel())
  {
     case BME280::ChipModel_BME280:
       Serial.println("Found BME280 sensor! Success.");
       break;
     case BME280::ChipModel_BMP280:
       Serial.println("Found BMP280 sensor! No Humidity available.");
       break;
     default:
       Serial.println("Found UNKNOWN sensor! Error!");
  }
}

//////////////////////////////////////////////////////////////////
void loop()
{
   printBME280Data(&Serial);
   delay(500);
}

//////////////////////////////////////////////////////////////////
void printBME280Data
(
   Stream* client
)
{
   float temp(NAN), hum(NAN), pres(NAN);

   BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);
   BME280::PresUnit presUnit(BME280::PresUnit_Pa);

   bme.read(pres, temp, hum, tempUnit, presUnit);

   client->print("T: ");
   client->print(temp);
   client->print("°"+ String(tempUnit == BME280::TempUnit_Celsius ? 'C' :'F'));
   client->print("\t\tH: ");
   client->print(hum);
   client->print("% RH");
   client->print("\t\tP ");
   client->print(pres);
   client->println(" Pa");

   delay(1000);
}

 

a-d@okbnp.ru
Offline
Зарегистрирован: 13.03.2019

/*
 Reports values from a K-series sensor back to the computer
 written by Jason Berger
 Co2Meter.com
*/
#include "kSeries.h" //include kSeries Library
kSeries K_30(12,13); //Initialize a kSeries Sensor with pin 12 as Rx and 13 as Tx
#include <OLED_I2C.h>                               // Подключаем библиотеку OLED_I2C для работы со шрифтами и графикой
OLED  myOLED(A4, A5, A4);                           // Определяем пины I2C интерфейса: UNO и NANO -- SDA - пин A4, SCL - пин A5; MEGA -- SDA - пин 20, SCL - пин 21

extern uint8_t MediumNumbers[];                         // Подключаем латинский шрифтом
extern uint8_t SmallFont[];  
void setup()
{
 Serial.begin(9600); //start a serial port to communicate with the computer
 myOLED.begin();                                    // Инициализируем библиотеку OLED_I2C
 
}
void loop()
{
 double co2 = K_30.getCO2('p'); //returns co2 value in ppm ('p') or percent ('%')
 myOLED.clrScr();                                    // Стираем все с экрана
   myOLED.setFont(SmallFont);                        // Инициализируем латинский шрифт
 myOLED.print("Co2 ppm = ",LEFT, 1);
  myOLED.setFont(MediumNumbers);   
 myOLED.print(String (co2),RIGHT,1); //print value
 myOLED.update();                                    // Обновляем информацию на дисплее  
 delay(3000);                                        // Пауза 3 секунды

}

 

a-d@okbnp.ru
Offline
Зарегистрирован: 13.03.2019

Все собрано на Ардуине уно. Скетч с BME  выводит в монитор порта нормально. Скетч с датчиком углекилого газа с kSeries K_30 выводит на экран Олед тоже нормально. Не могу с BME вывести на ОЛЕД вместе с kSeries K_30.  Помогите кому не трудно.

kalapanga
Offline
Зарегистрирован: 23.10.2016

Ну если I2C адреса у BME и у дисплея не одинаковые с какого-нибудь перепугу, то чего бы им вместе и не работать? Адреса проверить можно скетчем "i2c scanner" (гуглится). Если адреса разные, то рассказывайте как всё подключили, показывайте скетч и описывайте - как оно не работает.

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

Так, а Ваш-то объединённый ёжуж где? Чего не показываете?

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

ЕвгенийП пишет:

Так, а Ваш-то объединённый ёжуж где? 

Убеполз, на псевдоподиях.))))

a-d@okbnp.ru
Offline
Зарегистрирован: 13.03.2019
Адреса разные
I2C scanner. Scanning ...
Found address: 60 (0x3C)
Found address: 118 (0x76)
Done.
Found 2 device(s).
Какой  лучше скетч взять за основу?
Пока опасаюсь здесь выкладывать результаты моей селекции, из, извиняюсь, попы, торчат иголки с грибами и сухими листьями
KindMan
Offline
Зарегистрирован: 19.12.2018

a-d@okbnp.ru пишет:

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


Глаза боятся, а руки делают. Пока вы не выложите попытки, помощи не дождетесь.
Я предпологаю ошибки в инициализации wire. Второй раз, библиотекой.

a-d@okbnp.ru
Offline
Зарегистрирован: 13.03.2019


/*
 Reports values from a K-series sensor back to the computer
 written by Jason Berger
 Co2Meter.com
*/
#include "kSeries.h" //include kSeries Library
kSeries K_30(12,13); //Initialize a kSeries Sensor with pin 12 as Rx and 13 as Tx
#include <OLED_I2C.h>                               // Подключаем библиотеку OLED_I2C для работы со шрифтами и графикой

#include <BME280I2C.h>
#include <Wire.h>

#define SERIAL_BAUD 115200

BME280I2C bme;    // Default : forced mode, standby time = 1000 ms
                  // Oversampling = pressure ×1, temperature ×1, humidity ×1, filter off,
OLED  myOLED(A4, A5, A4);                           // Определяем пины I2C интерфейса: UNO и NANO -- SDA - пин A4, SCL - пин A5; MEGA -- SDA - пин 20, SCL - пин 21

extern uint8_t MediumNumbers[];                         // Подключаем латинский шрифтом
extern uint8_t SmallFont[];  
void setup()
{
 Serial.begin(9600); //start a serial port to communicate with the computer
 myOLED.begin();                                    // Инициализируем библиотеку OLED_I2C
 Serial.begin(SERIAL_BAUD);

  while(!Serial) {} // Wait

  Wire.begin();

  while(!bme.begin())  
  {
    Serial.println("Could not find BME280 sensor!");
    delay(1000);
  }
   switch(bme.chipModel())
  {
     case BME280::ChipModel_BME280:
       Serial.println("Found BME280 sensor! Success.");
       break;
     case BME280::ChipModel_BMP280:
       Serial.println("Found BMP280 sensor! No Humidity available.");
       break;
     default:
       Serial.println("Found UNKNOWN sensor! Error!");
  }
}
void loop()
{
 double co2 = K_30.getCO2('p'); //returns co2 value in ppm ('p') or percent ('%')
 myOLED.clrScr();                                    // Стираем все с экрана
   myOLED.setFont(SmallFont);                        // Инициализируем латинский шрифт
 myOLED.print("Co2 ppm = ",LEFT, 1);
  myOLED.setFont(MediumNumbers);   
 myOLED.print(String (co2),RIGHT,1); //print value
 myOLED.update();                                    // Обновляем информацию на дисплее  
 delay(3000);                                        // Пауза 3 секунды
   printBME280Data(&Serial);
   delay(500);

}
void printBME280Data
(
   Stream* client
)
{
   float temp(NAN), hum(NAN), pres(NAN);

   BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);
   BME280::PresUnit presUnit(BME280::PresUnit_Pa);

   bme.read(pres, temp, hum, tempUnit, presUnit);

   client->print("T: ");
   client->print(temp);
   client->print("°"+ String(tempUnit == BME280::TempUnit_Celsius ? 'C' :'F'));
   client->print("\t\tH: ");
   client->print(hum);
   client->print("% RH");
   client->print("\t\tP ");
   client->print(pres);
   client->println(" Pa");

   delay(1000);

 

a-d@okbnp.ru
Offline
Зарегистрирован: 13.03.2019

В таком виде загружается,  на олед выводится только  Co2 ppm =  без данных датчика со2. В мониторе порта данные с датчика BME280 выводится.

Не знаю какие данные вывести myOLED.print ( ??????)

Слишком много print  в скетче с датчиком BME280 )))

kalapanga
Offline
Зарегистрирован: 23.10.2016

Функция printBME... лишняя. Из неё строку 67 в начало перед сетап. 69-70 в сетап, например в case где датчик успешно обнаружен. 72 чтение датчика ставите рядом с чтением со2 например после строки 50. На дисплей выводите temp, hum, pres перед строкой 56. Строку 58-59 выкинуть. Если на время отладки нужен вывод данных bme в сериал, вставите Serial.print там же где будете выводить соответствующие данные на дисплей.

Главное, что данные на дисплей всяко должны выводиться между clrscr и update.

a-d@okbnp.ru
Offline
Зарегистрирован: 13.03.2019

Огромное спасибо!

Только памяти теперь не хватает.

Скетч использует 16752 байт (51%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 1786 байт (87%) динамической памяти, оставляя 262 байт для локальных переменных. Максимум: 2048 байт.
Недостаточно памяти, программа может работать нестабильно.
avrdude: ser_open(): can't set com-state for "\\.\COM4"
Произошла ошибка при загрузке скетча
 
Может что-то кастрировать можно?
a-d@okbnp.ru
Offline
Зарегистрирован: 13.03.2019



/*
 Reports values from a K-series sensor back to the computer
 written by Jason Berger
 Co2Meter.com
*/
#include "kSeries.h" //include kSeries Library
kSeries K_30(12,13); //Initialize a kSeries Sensor with pin 12 as Rx and 13 as Tx
#include <OLED_I2C.h>                               // Подключаем библиотеку OLED_I2C для работы со шрифтами и графикой

#include <BME280I2C.h>
#include <Wire.h>

#define SERIAL_BAUD 115200

BME280I2C bme;    // Default : forced mode, standby time = 1000 ms
                  // Oversampling = pressure ×1, temperature ×1, humidity ×1, filter off,
OLED  myOLED(A4, A5, A4);                           // Определяем пины I2C интерфейса: UNO и NANO -- SDA - пин A4, SCL - пин A5; MEGA -- SDA - пин 20, SCL - пин 21

extern uint8_t MediumNumbers[];                         // Подключаем латинский шрифтом
extern uint8_t SmallFont[];  
float temp(NAN), hum(NAN), pres(NAN);
   BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);
       BME280::PresUnit presUnit(BME280::PresUnit_Pa);
void setup()
{
 Serial.begin(9600); //start a serial port to communicate with the computer
 myOLED.begin();                                    // Инициализируем библиотеку OLED_I2C

  while(!Serial) {} // Wait

  Wire.begin();

  while(!bme.begin())  
  {
    Serial.println("Could not find BME280 sensor!");
    delay(1000);
  }
   switch(bme.chipModel())
  {
     case BME280::ChipModel_BME280:
       Serial.println("Found BME280 sensor! Success.");
       
       break;
    
     case BME280::ChipModel_BMP280:
       Serial.println("Found BMP280 sensor! No Humidity available.");
       break;
     default:
       Serial.println("Found UNKNOWN sensor! Error!");
  }
}
void loop()
{
 double co2 = K_30.getCO2('p'); //returns co2 value in ppm ('p') or percent ('%')
 
 bme.read(pres, temp, hum, tempUnit, presUnit);

  

 myOLED.clrScr();                                    // Стираем все с экрана
   myOLED.setFont(SmallFont);                        // Инициализируем латинский шрифт
 myOLED.print("Co2 ppm = ",LEFT, 1);
  myOLED.setFont(MediumNumbers);   
 myOLED.print(String (co2),RIGHT,1); //print value
  myOLED.print("T: ",LEFT, 1);
  myOLED.print(String (temp),LEFT, 1);
  myOLED.print("°"+ String(tempUnit == BME280::TempUnit_Celsius ? 'C' :'F'),LEFT, 1);
 myOLED.print("\t\tH: ",LEFT, 1);
 myOLED.print(String (hum),LEFT, 1);
 myOLED.print("% RH",LEFT, 1);
  myOLED.print("\t\tP ",LEFT, 1);
  myOLED.print(String (pres),LEFT, 1);
  myOLED.print(" Pa",LEFT, 1);
 myOLED.update();                                    // Обновляем информацию на дисплее  
 delay(3000);                                        // Пауза 3 секунды
 

 

}
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

a-d@okbnp.ru пишет:

Может что-то кастрировать можно?

Может, и можно.

Например, уменьшить количество подключаемых библиотек.

Либо заменить библиотеки на менее ресурсоемкие. Например, использовать библиотеку экрана, не требующую буфера.

a-d@okbnp.ru
Offline
Зарегистрирован: 13.03.2019

Сорри, что-то с портом стало, ребенок макетку уронил, другие скетчи тоже не грузятся

a-d@okbnp.ru
Offline
Зарегистрирован: 13.03.2019

Опыты продолжаютя ,на зверушку уже можно смотреть без слез.

Порт заработал , скетч грузится. но на олед выводитя только текст Co2 ppm = ,Pa, % RH

Вместо данных с датчика какой-то мусор

расположение LEFT, 1 - менял на другие значения без результата.

  Serial.print ниже строчкой выводит  данные с датчиков на монитор порта без проблем

a-d@okbnp.ru
Offline
Зарегистрирован: 13.03.2019


/*
 Reports values from a K-series sensor back to the computer
 written by Jason Berger
 Co2Meter.com
*/
#include "kSeries.h" //include kSeries Library
kSeries K_30(12,13); //Initialize a kSeries Sensor with pin 12 as Rx and 13 as Tx
#include <OLED_I2C.h>                               // Подключаем библиотеку OLED_I2C для работы со шрифтами и графикой

#include <BME280I2C.h>
#include <Wire.h>

#define SERIAL_BAUD 115200

BME280I2C bme;    // Default : forced mode, standby time = 1000 ms
                  // Oversampling = pressure ×1, temperature ×1, humidity ×1, filter off,
OLED  myOLED(A4, A5, A4);                           // Определяем пины I2C интерфейса: UNO и NANO -- SDA - пин A4, SCL - пин A5; MEGA -- SDA - пин 20, SCL - пин 21

extern uint8_t MediumNumbers[];                         // Подключаем латинский шрифтом
extern uint8_t SmallFont[];  
float temp(NAN), hum(NAN), pres(NAN);
   BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);
       BME280::PresUnit presUnit(BME280::PresUnit_Pa);
void setup()
{
 Serial.begin(9600); //start a serial port to communicate with the computer
 myOLED.begin();                                    // Инициализируем библиотеку OLED_I2C

  while(!Serial) {} // Wait

  Wire.begin();

  while(!bme.begin())  
  {
    Serial.println("Could not find BME280 sensor!");
    delay(1000);
  }
   switch(bme.chipModel())
  {
     case BME280::ChipModel_BME280:
       Serial.println("Found BME280 sensor! Success.");
       
       break;
    
     case BME280::ChipModel_BMP280:
       Serial.println("Found BMP280 sensor! No Humidity available.");
       break;
     default:
       Serial.println("Found UNKNOWN sensor! Error!");
  }
}
void loop()
{
 double co2 = K_30.getCO2('p'); //returns co2 value in ppm ('p') or percent ('%')
 
 bme.read(pres, temp, hum, tempUnit, presUnit);

  

 myOLED.clrScr();                                    // Стираем все с экрана
   myOLED.setFont(SmallFont);                        // Инициализируем латинский шрифт
 myOLED.print("Co2 ppm = ",RIGHT,8);
  myOLED.setFont(SmallFont);   
 myOLED.print(String (co2),LEFT,1); //print value
 Serial.print(co2);   
  myOLED.setFont(SmallFont); 
  myOLED.print("T: ",CENTER, 20);
   myOLED.setFont(SmallFont); 
  myOLED.print(String (temp),RIGHT, 30);
   myOLED.setFont(SmallFont); 
  myOLED.print("°"+ String(tempUnit == BME280::TempUnit_Celsius ? 'C' :'F'),LEFT, 1);
 myOLED.print("\t\tH: ",RIGHT, 25);
 Serial.print("\t\tH: ");
 myOLED.print(String (hum),LEFT,66);
 Serial.print(hum);
 myOLED.print("% RH",LEFT, 25);
  myOLED.print("\t\tP ",LEFT, 6);
  myOLED.print(String (pres),LEFT, 7);
  myOLED.print(" Pa",RIGHT, 8);
 myOLED.update();                                    // Обновляем информацию на дисплее  
 delay(3000);                                        // Пауза 3 секунды
 

 

a-d@okbnp.ru
Offline
Зарегистрирован: 13.03.2019


KindMan
Offline
Зарегистрирован: 19.12.2018

Т.е. у вас не работают строки, которые вы выводите таким образом -
? myOLED.print(String (temp),RIGHT, 30);

a-d@okbnp.ru
Offline
Зарегистрирован: 13.03.2019

да, а следом 

Serial.print(temp) - выводит без проблем в монитор порта

a-d@okbnp.ru
Offline
Зарегистрирован: 13.03.2019
 myOLED.print(String(co2),LEFT,1);   в исходящем скетче выводила на олед- сейчас нет
 Serial.print(co2) - сейчас выводит в монитор порта
KindMan
Offline
Зарегистрирован: 19.12.2018

А попробуйте вывести цифры используя printNumF

a-d@okbnp.ru
Offline
Зарегистрирован: 13.03.2019

myOLED.printNumI(6,CENTER,32);  выводит на олед цифру 6 в центр экрана

printNumF тоже

 
KindMan
Offline
Зарегистрирован: 19.12.2018

a-d@okbnp.ru пишет:

myOLED.printNumI(6,CENTER,32);  выводит на олед цифру 6 в центр экрана

printNumF тоже

 

надо у ДедаСемена попросить картинку "чотаржу"

Я имел ввиду, попробуйте выводить показания с датчиков этой функцией.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

держы

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Вот это 

a-d@okbnp.ru пишет:

myOLED.printNumI(6,CENTER,32);  выводит на олед цифру 6 в центр экрана

printNumF тоже

 

Ни на что не наводит? 

a-d@okbnp.ru
Offline
Зарегистрирован: 13.03.2019

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

вечером отпишусь с переменными.

a-d@okbnp.ru
Offline
Зарегистрирован: 13.03.2019

myOLED.printNumF(String(co2),2,0,1); //print value

String не нравится этой функции, как я понял

 

K30_example_good5:66: error: no matching function for call to 'OLED::printNumF(String, int, int, int)'
 
  myOLED.printNumF(String(co2),2,0,1); //print value
 
                                    ^
 
In file included from C:\Program Files (x86)\Arduino\Arduino\K30_example_good5\K30_example_good5.ino:10:0:
 
C:\Program Files (x86)\Arduino\Arduino\libraries\OLED_I2C/OLED_I2C.h:116:8: note: candidate: void OLED::printNumF(double, byte, int, int, char, int, char)
 
   void printNumF(double num, byte dec, int x, int y, char divider='.', int length=0, char filler=' ');
 
        ^
 
C:\Program Files (x86)\Arduino\Arduino\libraries\OLED_I2C/OLED_I2C.h:116:8: note:   no known conversion for argument 1 from 'String' to 'double'
 
exit status 1
no matching function for call to 'OLED::printNumF(String, int, int, int)'
 
KindMan
Offline
Зарегистрирован: 19.12.2018

Простите, вам нужно азы хотя бы подтянуть, что такое строки, числа… просто наугад вставлять куски кода, совсем не понимая как это работает, это не правильно.
printNumF(num, dec, x, y[, divider[, length[, filler]]]);
Распечатать число с плавающей точкой в указанных координатах в буфере экрана.
Можно использовать как литералы LEFT, CENTER и RIGHT, так и числовые координаты, чтобы выровнять строку с числом на экране.
Внимание: Числа с плавающей точкой имеют погрешность при округлении и могут давать неверные результаты при сравнении. Используйте на свой страх и риск.
Параметры:
num: Число для вывода на экран
Dec: количество цифр после запятой (в дробной части) (допустимые значения 1-5). Число 0 не поддерживается, для этого используйте printNumI ()
x: координата верхнего левого угла первой цифры/знака по горизонтали
y: координата верхнего левого угла первой цифры/знака по вертикали
divider: <необязательный параметр> Одиночный символ для использования в качестве десятичной точки. По умолчанию '.'
length: <необязательный параметр> минимальное количество цифр / символов (включая знак) для отображения на экране
filler: <необязательный параметр> Символ для заполнения, чтобы получить минимальную длину.Символ будет вставлен перед номером, но после знака. Умолчанию '' " (пробел).
Пример: myOLED.printNumF(num, 3, CENTER,0); // Печать значения переменной "num" с 3-мя знаками после запятой по центру в верхней части (в буфере экрана)
Примечания: Поддерживаемые диапазон зависит от количества цифр в дробной части.
Диапазон приблизительный +/- 2 * (10 в степени 9) - для десятичной системы.