из двух один (ежа с ужом)
- Войдите на сайт для отправки комментариев
Чт, 14/03/2019 - 15:52
1 |
1 |
01 | /* |
02 | BME280 I2C Test.ino |
03 |
04 | This code shows how to record data from the BME280 environmental sensor |
05 | using I2C interface. This file is an example file, part of the Arduino |
06 | BME280 library. |
07 |
08 | GNU General Public License |
09 |
10 | Written: Dec 30 2015. |
11 | Last Updated: Oct 07 2017. |
12 |
13 | Connecting the BME280 Sensor: |
14 | Sensor -> Board |
15 | ----------------------------- |
16 | Vin (Voltage In) -> 3.3V |
17 | Gnd (Ground) -> Gnd |
18 | SDA (Serial Data) -> A4 on Uno/Pro-Mini, 20 on Mega2560/Due, 2 Leonardo/Pro-Micro |
19 | SCK (Serial Clock) -> A5 on Uno/Pro-Mini, 21 on Mega2560/Due, 3 Leonardo/Pro-Micro |
20 |
21 | */ |
22 |
23 | #include <BME280I2C.h> |
24 | #include <Wire.h> |
25 |
26 | #define SERIAL_BAUD 115200 |
27 |
28 | BME280I2C bme; // Default : forced mode, standby time = 1000 ms |
29 | // Oversampling = pressure ×1, temperature ×1, humidity ×1, filter off, |
30 |
31 | ////////////////////////////////////////////////////////////////// |
32 | void setup () |
33 | { |
34 | Serial .begin(SERIAL_BAUD); |
35 |
36 | while (! Serial ) {} // Wait |
37 |
38 | Wire.begin(); |
39 |
40 | while (!bme.begin()) |
41 | { |
42 | Serial .println( "Could not find BME280 sensor!" ); |
43 | delay(1000); |
44 | } |
45 |
46 | // bme.chipID(); // Deprecated. See chipModel(). |
47 | switch (bme.chipModel()) |
48 | { |
49 | case BME280::ChipModel_BME280: |
50 | Serial .println( "Found BME280 sensor! Success." ); |
51 | break ; |
52 | case BME280::ChipModel_BMP280: |
53 | Serial .println( "Found BMP280 sensor! No Humidity available." ); |
54 | break ; |
55 | default : |
56 | Serial .println( "Found UNKNOWN sensor! Error!" ); |
57 | } |
58 | } |
59 |
60 | ////////////////////////////////////////////////////////////////// |
61 | void loop () |
62 | { |
63 | printBME280Data(& Serial ); |
64 | delay(500); |
65 | } |
66 |
67 | ////////////////////////////////////////////////////////////////// |
68 | void printBME280Data |
69 | ( |
70 | Stream* client |
71 | ) |
72 | { |
73 | float temp(NAN), hum(NAN), pres(NAN); |
74 |
75 | BME280::TempUnit tempUnit(BME280::TempUnit_Celsius); |
76 | BME280::PresUnit presUnit(BME280::PresUnit_Pa); |
77 |
78 | bme.read(pres, temp, hum, tempUnit, presUnit); |
79 |
80 | client->print( "T: " ); |
81 | client->print(temp); |
82 | client->print( "°" + String(tempUnit == BME280::TempUnit_Celsius ? 'C' : 'F' )); |
83 | client->print( "\t\tH: " ); |
84 | client->print(hum); |
85 | client->print( "% RH" ); |
86 | client->print( "\t\tP " ); |
87 | client->print(pres); |
88 | client->println( " Pa" ); |
89 |
90 | delay(1000); |
91 | } |
01
/*
02
Reports values from a K-series sensor back to the computer
03
written by Jason Berger
04
Co2Meter.com
05
*/
06
#include "kSeries.h" //include kSeries Library
07
kSeries K_30(12,13);
//Initialize a kSeries Sensor with pin 12 as Rx and 13 as Tx
08
#include <OLED_I2C.h> // Подключаем библиотеку OLED_I2C для работы со шрифтами и графикой
09
OLED myOLED(A4, A5, A4);
// Определяем пины I2C интерфейса: UNO и NANO -- SDA - пин A4, SCL - пин A5; MEGA -- SDA - пин 20, SCL - пин 21
10
11
extern
uint8_t MediumNumbers[];
// Подключаем латинский шрифтом
12
extern
uint8_t SmallFont[];
13
void
setup
()
14
{
15
Serial
.begin(9600);
//start a serial port to communicate with the computer
16
myOLED.begin();
// Инициализируем библиотеку OLED_I2C
17
18
}
19
void
loop
()
20
{
21
double
co2 = K_30.getCO2(
'p'
);
//returns co2 value in ppm ('p') or percent ('%')
22
myOLED.clrScr();
// Стираем все с экрана
23
myOLED.setFont(SmallFont);
// Инициализируем латинский шрифт
24
myOLED.print(
"Co2 ppm = "
,LEFT, 1);
25
myOLED.setFont(MediumNumbers);
26
myOLED.print(String (co2),RIGHT,1);
//print value
27
myOLED.update();
// Обновляем информацию на дисплее
28
delay(3000);
// Пауза 3 секунды
29
30
}
Все собрано на Ардуине уно. Скетч с BME выводит в монитор порта нормально. Скетч с датчиком углекилого газа с kSeries K_30 выводит на экран Олед тоже нормально. Не могу с BME вывести на ОЛЕД вместе с kSeries K_30. Помогите кому не трудно.
Ну если I2C адреса у BME и у дисплея не одинаковые с какого-нибудь перепугу, то чего бы им вместе и не работать? Адреса проверить можно скетчем "i2c scanner" (гуглится). Если адреса разные, то рассказывайте как всё подключили, показывайте скетч и описывайте - как оно не работает.
Так, а Ваш-то объединённый ёжуж где? Чего не показываете?
Так, а Ваш-то объединённый ёжуж где?
Убеполз, на псевдоподиях.))))
Глаза боятся, а руки делают. Пока вы не выложите попытки, помощи не дождетесь.
Я предпологаю ошибки в инициализации wire. Второй раз, библиотекой.
01
/*
02
Reports values from a K-series sensor back to the computer
03
written by Jason Berger
04
Co2Meter.com
05
*/
06
#include "kSeries.h" //include kSeries Library
07
kSeries K_30(12,13);
//Initialize a kSeries Sensor with pin 12 as Rx and 13 as Tx
08
#include <OLED_I2C.h> // Подключаем библиотеку OLED_I2C для работы со шрифтами и графикой
09
10
#include <BME280I2C.h>
11
#include <Wire.h>
12
13
#define SERIAL_BAUD 115200
14
15
BME280I2C bme;
// Default : forced mode, standby time = 1000 ms
16
// Oversampling = pressure ×1, temperature ×1, humidity ×1, filter off,
17
OLED myOLED(A4, A5, A4);
// Определяем пины I2C интерфейса: UNO и NANO -- SDA - пин A4, SCL - пин A5; MEGA -- SDA - пин 20, SCL - пин 21
18
19
extern
uint8_t MediumNumbers[];
// Подключаем латинский шрифтом
20
extern
uint8_t SmallFont[];
21
void
setup
()
22
{
23
Serial
.begin(9600);
//start a serial port to communicate with the computer
24
myOLED.begin();
// Инициализируем библиотеку OLED_I2C
25
Serial
.begin(SERIAL_BAUD);
26
27
while
(!
Serial
) {}
// Wait
28
29
Wire.begin();
30
31
while
(!bme.begin())
32
{
33
Serial
.println(
"Could not find BME280 sensor!"
);
34
delay(1000);
35
}
36
switch
(bme.chipModel())
37
{
38
case
BME280::ChipModel_BME280:
39
Serial
.println(
"Found BME280 sensor! Success."
);
40
break
;
41
case
BME280::ChipModel_BMP280:
42
Serial
.println(
"Found BMP280 sensor! No Humidity available."
);
43
break
;
44
default
:
45
Serial
.println(
"Found UNKNOWN sensor! Error!"
);
46
}
47
}
48
void
loop
()
49
{
50
double
co2 = K_30.getCO2(
'p'
);
//returns co2 value in ppm ('p') or percent ('%')
51
myOLED.clrScr();
// Стираем все с экрана
52
myOLED.setFont(SmallFont);
// Инициализируем латинский шрифт
53
myOLED.print(
"Co2 ppm = "
,LEFT, 1);
54
myOLED.setFont(MediumNumbers);
55
myOLED.print(String (co2),RIGHT,1);
//print value
56
myOLED.update();
// Обновляем информацию на дисплее
57
delay(3000);
// Пауза 3 секунды
58
printBME280Data(&
Serial
);
59
delay(500);
60
61
}
62
void
printBME280Data
63
(
64
Stream* client
65
)
66
{
67
float
temp(NAN), hum(NAN), pres(NAN);
68
69
BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);
70
BME280::PresUnit presUnit(BME280::PresUnit_Pa);
71
72
bme.read(pres, temp, hum, tempUnit, presUnit);
73
74
client->print(
"T: "
);
75
client->print(temp);
76
client->print(
"°"
+ String(tempUnit == BME280::TempUnit_Celsius ?
'C'
:
'F'
));
77
client->print(
"\t\tH: "
);
78
client->print(hum);
79
client->print(
"% RH"
);
80
client->print(
"\t\tP "
);
81
client->print(pres);
82
client->println(
" Pa"
);
83
84
delay(1000);
В таком виде загружается, на олед выводится только Co2 ppm = без данных датчика со2. В мониторе порта данные с датчика BME280 выводится.
Не знаю какие данные вывести myOLED.print ( ??????)
Слишком много print в скетче с датчиком BME280 )))
Функция printBME... лишняя. Из неё строку 67 в начало перед сетап. 69-70 в сетап, например в case где датчик успешно обнаружен. 72 чтение датчика ставите рядом с чтением со2 например после строки 50. На дисплей выводите temp, hum, pres перед строкой 56. Строку 58-59 выкинуть. Если на время отладки нужен вывод данных bme в сериал, вставите Serial.print там же где будете выводить соответствующие данные на дисплей.
Главное, что данные на дисплей всяко должны выводиться между clrscr и update.
Огромное спасибо!
Только памяти теперь не хватает.
01
/*
02
Reports values from a K-series sensor back to the computer
03
written by Jason Berger
04
Co2Meter.com
05
*/
06
#include "kSeries.h" //include kSeries Library
07
kSeries K_30(12,13);
//Initialize a kSeries Sensor with pin 12 as Rx and 13 as Tx
08
#include <OLED_I2C.h> // Подключаем библиотеку OLED_I2C для работы со шрифтами и графикой
09
10
#include <BME280I2C.h>
11
#include <Wire.h>
12
13
#define SERIAL_BAUD 115200
14
15
BME280I2C bme;
// Default : forced mode, standby time = 1000 ms
16
// Oversampling = pressure ×1, temperature ×1, humidity ×1, filter off,
17
OLED myOLED(A4, A5, A4);
// Определяем пины I2C интерфейса: UNO и NANO -- SDA - пин A4, SCL - пин A5; MEGA -- SDA - пин 20, SCL - пин 21
18
19
extern
uint8_t MediumNumbers[];
// Подключаем латинский шрифтом
20
extern
uint8_t SmallFont[];
21
float
temp(NAN), hum(NAN), pres(NAN);
22
BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);
23
BME280::PresUnit presUnit(BME280::PresUnit_Pa);
24
void
setup
()
25
{
26
Serial
.begin(9600);
//start a serial port to communicate with the computer
27
myOLED.begin();
// Инициализируем библиотеку OLED_I2C
28
29
while
(!
Serial
) {}
// Wait
30
31
Wire.begin();
32
33
while
(!bme.begin())
34
{
35
Serial
.println(
"Could not find BME280 sensor!"
);
36
delay(1000);
37
}
38
switch
(bme.chipModel())
39
{
40
case
BME280::ChipModel_BME280:
41
Serial
.println(
"Found BME280 sensor! Success."
);
42
43
break
;
44
45
case
BME280::ChipModel_BMP280:
46
Serial
.println(
"Found BMP280 sensor! No Humidity available."
);
47
break
;
48
default
:
49
Serial
.println(
"Found UNKNOWN sensor! Error!"
);
50
}
51
}
52
void
loop
()
53
{
54
double
co2 = K_30.getCO2(
'p'
);
//returns co2 value in ppm ('p') or percent ('%')
55
56
bme.read(pres, temp, hum, tempUnit, presUnit);
57
58
59
60
myOLED.clrScr();
// Стираем все с экрана
61
myOLED.setFont(SmallFont);
// Инициализируем латинский шрифт
62
myOLED.print(
"Co2 ppm = "
,LEFT, 1);
63
myOLED.setFont(MediumNumbers);
64
myOLED.print(String (co2),RIGHT,1);
//print value
65
myOLED.print(
"T: "
,LEFT, 1);
66
myOLED.print(String (temp),LEFT, 1);
67
myOLED.print(
"°"
+ String(tempUnit == BME280::TempUnit_Celsius ?
'C'
:
'F'
),LEFT, 1);
68
myOLED.print(
"\t\tH: "
,LEFT, 1);
69
myOLED.print(String (hum),LEFT, 1);
70
myOLED.print(
"% RH"
,LEFT, 1);
71
myOLED.print(
"\t\tP "
,LEFT, 1);
72
myOLED.print(String (pres),LEFT, 1);
73
myOLED.print(
" Pa"
,LEFT, 1);
74
myOLED.update();
// Обновляем информацию на дисплее
75
delay(3000);
// Пауза 3 секунды
76
77
78
79
80
}
Может что-то кастрировать можно?
Например, уменьшить количество подключаемых библиотек.
Либо заменить библиотеки на менее ресурсоемкие. Например, использовать библиотеку экрана, не требующую буфера.
Сорри, что-то с портом стало, ребенок макетку уронил, другие скетчи тоже не грузятся
Опыты продолжаютя ,на зверушку уже можно смотреть без слез.
Порт заработал , скетч грузится. но на олед выводитя только текст
Co2 ppm = ,
Pa,
% RH
Вместо данных с датчика какой-то мусор
расположение LEFT, 1 - менял на другие значения без результата.
Serial
.print ниже строчкой выводит данные с датчиков на монитор порта без проблем
01
/*
02
Reports values from a K-series sensor back to the computer
03
written by Jason Berger
04
Co2Meter.com
05
*/
06
#include "kSeries.h" //include kSeries Library
07
kSeries K_30(12,13);
//Initialize a kSeries Sensor with pin 12 as Rx and 13 as Tx
08
#include <OLED_I2C.h> // Подключаем библиотеку OLED_I2C для работы со шрифтами и графикой
09
10
#include <BME280I2C.h>
11
#include <Wire.h>
12
13
#define SERIAL_BAUD 115200
14
15
BME280I2C bme;
// Default : forced mode, standby time = 1000 ms
16
// Oversampling = pressure ×1, temperature ×1, humidity ×1, filter off,
17
OLED myOLED(A4, A5, A4);
// Определяем пины I2C интерфейса: UNO и NANO -- SDA - пин A4, SCL - пин A5; MEGA -- SDA - пин 20, SCL - пин 21
18
19
extern
uint8_t MediumNumbers[];
// Подключаем латинский шрифтом
20
extern
uint8_t SmallFont[];
21
float
temp(NAN), hum(NAN), pres(NAN);
22
BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);
23
BME280::PresUnit presUnit(BME280::PresUnit_Pa);
24
void
setup
()
25
{
26
Serial
.begin(9600);
//start a serial port to communicate with the computer
27
myOLED.begin();
// Инициализируем библиотеку OLED_I2C
28
29
while
(!
Serial
) {}
// Wait
30
31
Wire.begin();
32
33
while
(!bme.begin())
34
{
35
Serial
.println(
"Could not find BME280 sensor!"
);
36
delay(1000);
37
}
38
switch
(bme.chipModel())
39
{
40
case
BME280::ChipModel_BME280:
41
Serial
.println(
"Found BME280 sensor! Success."
);
42
43
break
;
44
45
case
BME280::ChipModel_BMP280:
46
Serial
.println(
"Found BMP280 sensor! No Humidity available."
);
47
break
;
48
default
:
49
Serial
.println(
"Found UNKNOWN sensor! Error!"
);
50
}
51
}
52
void
loop
()
53
{
54
double
co2 = K_30.getCO2(
'p'
);
//returns co2 value in ppm ('p') or percent ('%')
55
56
bme.read(pres, temp, hum, tempUnit, presUnit);
57
58
59
60
myOLED.clrScr();
// Стираем все с экрана
61
myOLED.setFont(SmallFont);
// Инициализируем латинский шрифт
62
myOLED.print(
"Co2 ppm = "
,RIGHT,8);
63
myOLED.setFont(SmallFont);
64
myOLED.print(String (co2),LEFT,1);
//print value
65
Serial
.print(co2);
66
myOLED.setFont(SmallFont);
67
myOLED.print(
"T: "
,CENTER, 20);
68
myOLED.setFont(SmallFont);
69
myOLED.print(String (temp),RIGHT, 30);
70
myOLED.setFont(SmallFont);
71
myOLED.print(
"°"
+ String(tempUnit == BME280::TempUnit_Celsius ?
'C'
:
'F'
),LEFT, 1);
72
myOLED.print(
"\t\tH: "
,RIGHT, 25);
73
Serial
.print(
"\t\tH: "
);
74
myOLED.print(String (hum),LEFT,66);
75
Serial
.print(hum);
76
myOLED.print(
"% RH"
,LEFT, 25);
77
myOLED.print(
"\t\tP "
,LEFT, 6);
78
myOLED.print(String (pres),LEFT, 7);
79
myOLED.print(
" Pa"
,RIGHT, 8);
80
myOLED.update();
// Обновляем информацию на дисплее
81
delay(3000);
// Пауза 3 секунды
1
Т.е. у вас не работают строки, которые вы выводите таким образом -
? myOLED.print(String (temp),RIGHT, 30);
да, а следом
Serial.print(temp) - выводит без проблем в монитор порта
А попробуйте вывести цифры используя printNumF
myOLED.printNumI(6,CENTER,32); выводит на олед цифру 6 в центр экрана
printNumF тоже
myOLED.printNumI(6,CENTER,32); выводит на олед цифру 6 в центр экрана
printNumF тоже
надо у ДедаСемена попросить картинку "чотаржу"
Я имел ввиду, попробуйте выводить показания с датчиков этой функцией.
держы
Вот это
myOLED.printNumI(6,CENTER,32); выводит на олед цифру 6 в центр экрана
printNumF тоже
Ни на что не наводит?
Написали попробуй цифры, я и подумал что сейчас на экране цифр не было, только буквы и символы.
вечером отпишусь с переменными.
myOLED.printNumF(String(co2),2,0,1); //print value
String не нравится этой функции, как я понял
Простите, вам нужно азы хотя бы подтянуть, что такое строки, числа… просто наугад вставлять куски кода, совсем не понимая как это работает, это не правильно.
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) - для десятичной системы.