LCD 1602 попирает права датчика BME280

zagzag2003
Offline
Зарегистрирован: 17.02.2019

Уважаемые форумчате, помогите опытом!

Занимаясь творчеством на первой невинной ардуинке наткнулся на какой-то конфликт модулей.

Через I2C подключены часы DS3231, дисплей 1602 и датчик BME280.

В сканере I2C видны все устройства по разным адресам.

Показатели датчика BME280 в мониторе отражаются правильно бесконечно долго до одного события: первого вывода на дислпей 1602. После этого датчик вначале выдает некорректные показатели, потом отваливается напрочь: "Датчик не найден", показатели нулевые. 

Почему так? Почему обращение к одному устройству I2C выключает другое? 

Ошибку выявил большим перебором кода, пока не обнаружил, что причиной является первый lcd.print. Датчик был подключен на следующем этапе сборки. В предыдущих этапах уже работали часы, выводились пользовательским шрифтом на дисплей, управлялись пультом, но всё это застряло из-за подключения датчика BME280.

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

 

Ардуино IDE 1.8.8
Funduino Nano 3,0 Atmega328
IIC/I2C 1602 for arduino 1602 LCD UNO r3 mega2560
DS3231 AT24C32 IIC Module
GY-BME280-3.3, питание от пина 3v3 (не знаю, правильно ли это)
 
Библиотеки:
LiquidCrystal_I2C1602V1-master
SparkFun_BME280_Arduino_Library-master (пробовал и Adafruit_BME280_Library-master, и BME280-Release_Version_2.1.2, все работают)
 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Без схемы и краткого кода - проблема решается только в судебном порядке, если BME сможет подать иск, разумеется.

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

подозреваю, что BME по I2C шине с частотой 400кГц ниработает.  

Но НАДА схему и код

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

zagzag2003 пишет:

LCD 1602 попирает права датчика BME280

К уполномоченному по правам датчиков обращались? Чтоговорит?

sadman41
Offline
Зарегистрирован: 19.10.2016

DetSimen пишет:

подозреваю, что BME по I2C шине с частотой 400кГц ниработает.  

Но НАДА схему и код

А я подозреваю, что BME получает 5V по сигнальным линиям и вырубается. Но свидетелей нет, показаний потерпевшего тоже...

zagzag2003
Offline
Зарегистрирован: 17.02.2019

Потерпевший, высунув язык, крапает улики.

А вот код. В монитор порта выводится всегда, но как только сниму комментарий хотя бы с одной lcd.print, LCD закрывает датчику рот.

#include <Wire.h>

#include <LiquidCrystal_I2C.h> // библиотека дисплея 1602
#include "SparkFunBME280.h" //библиотека датчика BME280

/*Obj*/
LiquidCrystal_I2C lcd(0x27,16,2);
BME280 mySensorB; //Uses I2C address 0x76 (jumper closed)

/*Var*/
unsigned long delayTime;
long cont = 0;
float temperature(NAN);
float pressure(NAN);
float humidity(NAN);

void setup() {
    Serial.begin(9600);
    Serial.println(F("BME280 test"));

  mySensorB.setI2CAddress(0x76); //Connect to a second sensor
  if(mySensorB.beginI2C() == false) Serial.println("Sensor B connect failed");

  lcd.begin();
  lcd.clear();
  lcd.backlight();
}


void loop() { 
  Serial.print("Счетчик: ");
  Serial.println(cont++);

  temperature = mySensorB.readTempC();
  pressure = mySensorB.readFloatPressure();
  humidity = mySensorB.readFloatHumidity();
  delay(800); //вставил паузу между получением и отображением, а вдруг ему надо время?

  showTemperature();
  showPressure();
  showHumidity();
  delay(200);
}

void showTemperature() {
    Serial.print("Temperature = ");
    Serial.print(temperature);
    Serial.println(" *C");
  //lcd.setCursor(0, 0);
  //lcd.print("Tem:" + String(temperature) + " *C");
}
void showPressure() {
    Serial.print("Pressure = ");
    Serial.print(pressure / 100.0F);
    Serial.println(" hPa");
  //lcd.setCursor(0, 1);
  //lcd.print("P");
  //lcd.print(pressure / 100.0F);
  //lcd.print(" hPa");
}
void showHumidity() {
    Serial.print("Humidity = ");
    Serial.print(humidity);
    Serial.println(" %");
  //lcd.setCursor(10, 1);
  //lcd.print("Hum:");
  //lcd.print(humidity);
  //lcd.print(" %");
}


 

zagzag2003
Offline
Зарегистрирован: 17.02.2019

Код, приведенный выше, это уже до минимума обрезанный. Я убрал код, отвечающий и за часы, и за инфракрасный (физически не отключив). Именно так и вышел на узурпатора.

PRC
Offline
Зарегистрирован: 03.02.2019

DetSimen пишет:

подозреваю, что BME по I2C шине с частотой 400кГц ниработает.  

BME по даташиту на 400 заявлен. И у меня от 180 до 280 всегда на ней работали без проблем.

ТС стоит сделать скан адресов всех устройств на шине до вывода на экран и после.

zagzag2003
Offline
Зарегистрирован: 17.02.2019

PRC пишет:

DetSimen пишет:

подозреваю, что BME по I2C шине с частотой 400кГц ниработает.  

BME по даташиту на 400 заявлен. И у меня от 180 до 280 всегда на ней работали без проблем.

ТС стоит сделать скан адресов всех устройств на шине до вывода на экран и после.

Скан адресов даёт 4 адреса: 

Scanning...
I2C device found at address 0x27  ! - дисплей
I2C device found at address 0x57  ! - часы
I2C device found at address 0x68  ! - часы (проверял, оба исчезают, если вынуть)
I2C device found at address 0x76  ! - BME
done
 

Теперь заливаю прошивку, раскомментировав lcd.print

BME280 test
Sensor B connect failed
 
Опять залил прошивку сканера, список устройств не изменился. Раньше, когда был на библиотеке Adafruit_BME280, датчик после сбоя в сканере исчезал. 
 
Чтобы восстановить работу датчика, мне приходится закоментить строки с lcd.print, отключить питание, вытянуть и вставить обратно BME280 - и тогда опять пойдут показатели. 
 
sadman41
Offline
Зарегистрирован: 19.10.2016

А ежели спросить у часов что-нить, но дисплей не трогать? Хотя, по мне так 3.3V BME совать на 5V шину - не лучшая идея.

zagzag2003
Offline
Зарегистрирован: 17.02.2019

sadman41 пишет:

А ежели спросить у часов что-нить, но дисплей не трогать? Хотя, по мне так 3.3V BME совать на 5V шину - не лучшая идея.

Попробовал. Спрашивал и до обращения к BME, и после, датчик с часами уживается. Глюк возникает только при попытке вывести текст на экран дисплея, даже всего лишь один символ.

 

В мониторе порта:

Счетчик: 8
18:47:26
Temperature = 22.58 *C
Pressure = 1006.08 hPa
Humidity = 36.92 %
Счетчик: 9
18:47:27
Temperature = 22.58 *C
Pressure = 1006.08 hPa
Humidity = 36.98 %
Счетчик: 10
18:47:28
Temperature = 22.58 *C
Pressure = 1006.08 hPa
Humidity = 36.88 %
 

Код:

  RTC.read(tm);
  temperature = mySensorB.readTempC();
  pressure = mySensorB.readFloatPressure();
  humidity = mySensorB.readFloatHumidity();

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Непонятная история. У меня на шине все живут, только BME с транслятором уровней.

Можно развести их на разные шины с помощью софтварного wire, конечно, но смогут ли библиотечки с ним работать...

Или питание проваливается.  Дисплей жрет много (допустим), питание проседает... датчик вырубается. Вообще, если нана не от роботдина, то выход 3.3V на ней лучше не видеть вообще.

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

То ТС, а шинные резисторы вы с пары модулей выкинули?

zagzag2003
Offline
Зарегистрирован: 17.02.2019

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

Если вас не затруднит, дайте наводку:

- транслятор уровней нужно делать самому или есть готовые?

- то же самое с запиткой 3.3-вольтовых модулей от 5 вольт ардуины - есть стандартное решение?

- и последнее, - можно и стоит ли запитать экран дополнительным источником? 

Вы только подскажите ключевые слова, а дальше я пойду гуглить. 

zagzag2003
Offline
Зарегистрирован: 17.02.2019

bwn пишет:

То ТС, а шинные резисторы вы с пары модулей выкинули?

Нет, я не трогал ничего, кроме ножек, которые припаивал. Это страшно, я ведь их даже не найду самостоятельно.

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

Попробуйте, для опыта: отключите физически модуль часов, а оставьте LCD и бме-шку.

sadman41
Offline
Зарегистрирован: 19.10.2016

zagzag2003 пишет:

- транслятор уровней нужно делать самому или есть готовые?

- то же самое с запиткой 3.3-вольтовых модулей от 5 вольт ардуины - есть стандартное решение?

В качестве стандартного решения я беру датчики с level-shifter на борту. Как правило - это два дополнительных мелких трёхногих транзистора (или шестиногая сборка) и один трех (или пятиногий) стабилизатор 5V->3.3V

 
На примере BME280:
 
 

zagzag2003 пишет:

- и последнее, - можно и стоит ли запитать экран дополнительным источником? 

Вопрос без однозначного ответа. Всё зависит от 1) тока потребления дисплея; 2) стабилизатора на ардуине.

У меня есть Nano, которая тащит дисплей с датчиками, а есть Mega, которая от одного дисплея уже кипятиться начинает.

In general case, так сказать, всё, что можно пустить мимо питания ардуины, стоит пустить именно мимо.

zagzag2003
Offline
Зарегистрирован: 17.02.2019

bwn пишет:

Попробуйте, для опыта: отключите физически модуль часов, а оставьте LCD и бме-шку.

Сделал, - BME поменял своё поведение. 

Вначале я вывел один символ на экран - датчик не завис, продолжил работу, хотя сказал, что у меня -130 градусов. Я накинул кофту, раскоментил все выводы на экран - и датчик повис. 

Рядом экспериментов удалось установить, что малые выдачи на экран дают малые погрешности, большие выдачи - подвешивают вообще. Вот результат при выдаче на экран одного лишь первого символа температуры:

BME280 test
Счетчик: 0
Temperature = 23.88 *C
Pressure = 1006.36 hPa
Humidity = 39.03 %
Счетчик: 1
Temperature = 23.87 *C
Pressure = 1006.40 hPa
Humidity = 38.54 %
Счетчик: 2
Temperature = 23.85 *C
Pressure = 1006.36 hPa
Humidity = 37.91 %
Счетчик: 3
Temperature = 23.83 *C
Pressure = 1006.41 hPa
Humidity = 37.88 %
Счетчик: 4
Temperature = 23.81 *C
Pressure = 1006.40 hPa
Humidity = 37.61 %
Счетчик: 5
Temperature = 23.80 *C
Pressure = 1006.33 hPa
Humidity = 37.02 %
Счетчик: 6
Temperature = 23.79 *C
Pressure = 1006.42 hPa
Humidity = 37.12 %
Счетчик: 7
Temperature = 23.77 *C
Pressure = 1006.38 hPa
Humidity = 37.01 %
Счетчик: 8
Temperature = -76.55 *C
Pressure = 948.54 hPa
Humidity = 0.00 %
Счетчик: 9
Temperature = -82.97 *C
Pressure = 966.13 hPa
Humidity = 0.00 %
Счетчик: 10
Temperature = -82.97 *C
Pressure = 966.11 hPa
Humidity = 0.00 %
Счетчик: 11
Temperature = -82.97 *C
Pressure = 966.11 hPa
Humidity = 0.00 %
Счетчик: 12
Temperature = -82.97 *C
Pressure = 966.11 hPa
Humidity = 0.00 %
Счетчик: 13
Temperature = -82.97 *C
Pressure = 966.11 hPa
Humidity = 0.00 %
Счетчик: 14
Temperature = -82.97 *C
Pressure = 966.11 hPa
Humidity = 0.00 %
Счетчик: 15
Temperature = -82.97 *C
Pressure = 966.11 hPa
Humidity = 0.00 %
Счетчик: 16
Temperature = -82.97 *C
Pressure = 966.11 hPa
Humidity = 0.00 %
Счетчик: 17
Temperature = -82.97 *C
Pressure = 966.11 hPa
Humidity = 0.00 %
Счетчик: 18
Temperature = -82.97 *C
Pressure = 966.11 hPa
Humidity = 0.00 %
Счетчик: 19
Temperature = -82.97 *C
Pressure = 966.11 hPa
Humidity = 0.00 %
Счетчик: 20
Temperature = -82.97 *C
Pressure = 966.11 hPa
Humidity = 0.00 %
 
 
Врет безбожно (с 8-й секунды всё "уехало"), но работает! 
 
Это и называется "несогласованные уровни"? 
 
Прошу прощения у всех за глупые вопросы, у меня сильно несогласованный уровень радиотехнических знаний. 

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Нехватка питания и несогласованность уровней визуально может проявляться как угодно и нет единого симптома, насколько я знаю. 

Я понимаю, что хочет выяснить bwn, путём отключения модулей - не уменьшается ли подтяжка на шине до безобразных уровней при трёх подключенных модулях. Могу только лишь сказать. что у меня неделю на лонгтесте стоит ардуина с BME280+SHT21+TSL2561, все подключены к одной и той же квадратной шине. Проблем не наблюдаю.

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

Как я там и написал, для опыта. Слона кушают кусочками. Одну возможную причину исключили. Теперь проверить питание, это быстрее и проще.

"Могу только лишь сказать. что у меня неделю на лонгтесте стоит ардуина с BME280+SHT21+TSL2561, все подключены к одной и той же квадратной шине. Проблем не наблюдаю."
Григорий, стандартные 4к7 деленые на три не должны мешать шине. Исходил из китайской парадигмы, а хрен его знает, что они навесили, если ТС их даже найти не может.)))
Теперь, взял бы нормальный БП (преобразователя уровней у ТС, один хрен нет) и запитал от него. У меня один LCD был, тот больше 120мА кушал, хотя это была подсветка, чем init может нагрузить, Х его знает? Но трудозатраты невелики, попробовать и поставить еще один жирный крест.
 

Feofan
Offline
Зарегистрирован: 28.05.2017

sadman41 пишет:
ардуина с BME280+SHT21+TSL2561, все подключены к одной и той же квадратной шине.
Какие резисторы подтяжки или какое общее Rpu? 

sadman41
Offline
Зарегистрирован: 19.10.2016

bwn пишет:

У меня один LCD был, тот больше 120мА кушал, хотя это была подсветка, чем init может нагрузить, Х его знает? Но трудозатраты невелики, попробовать и поставить еще один жирный крест.

Не буду спорить. Даже подтвержу: http://www.melt.com.ru/docs/MT-20S4A.pdf , стр.2 -> "Ток подсветки при напряжении питания подсветки" -> отличается втрое в зависимости от цвета.

инит не нагружает, а вот долгая печать держит на шине напряжение дольше, полагаю. BME от него, возможно, и огребает. Но, опять же - это только предположение. Слишком тонкая это работа - поиск точной причины бага, когда один из элементов точно не из этого ансамбля.

sadman41
Offline
Зарегистрирован: 19.10.2016

Feofan пишет:

sadman41 пишет:
ардуина с BME280+SHT21+TSL2561, все подключены к одной и той же квадратной шине.
Какие резисторы подтяжки или какое общее Rpu? 

4,7кОм, полагаю, на каждом модуле. Не хочу сейчас ежа тревожить, пусть тест завершит, потом его разберу и точно скажу.

zagzag2003
Offline
Зарегистрирован: 17.02.2019

bwn пишет:

ТС их даже найти не может.)))

ТС их найти не может не потому что китайцы их не впаяли, а потому что для него они все на одно лицо. Это когда-то я разбирался, что вот это - транзистор, а это - резистор, а сейчас выпаяю что-то, а окажется, что это матрица LCD :)

 

Подберу БП и буду продолжать пробовать. Впереди еще столько слонов...

 

Очень благодарен всем вам за ответы!

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

zagzag2003 пишет:

Подберу БП и буду продолжать пробовать. Впереди еще столько слонов...

Кстати, вот о симптомах.

То, что у меня сейчас на тесте стоит - это две ардуины на одной макетке. К одной подключен W5100, к другой ENC28J60. Первый жрет меньше. Обе ардуины обвешаны разными датчиками. Прошивки базово-эквивалентны. Включил я, значит, эту хрень, снимаю данные. На третий день - фигак, экземпляр с W5100 не откликается. Лампочками моргает. Ну, думаю, случайность. Ребутнул. Через три дня - повис. Блок питания подозрительный... Поменял. Три дня - опять завис. Да, мать его ети, прошивку же вылизывал месяцы... А тот, который с того же БП, но с ENC28J60 работает как трактор. Хотя, по всему должно быть наоборот - ENC более капризен. Думал, думал, осматривал всё и вспомнил, что когда макетку под тест этой прошивки собирал, то решил провести на сетевушки питание отдельно, а на ардуины - отдельно. И так вышло, что самое удобное место для подсоединения питания был VIn... БП - 5V, соответственно, реальное питание по системе было в районе 4V...3.6V. И в тот прогон, два года назад, он у меня по две недели пахал без зависаний, поэтому я про такое извращение и забыл. А сейчас вот - начал вешаться. Переразвёл питание и всё ОК - 8 дней аптайма уже по обоим экземплярам.

trng
Offline
Зарегистрирован: 27.02.2016

sadman41 пишет:

DetSimen пишет:

подозреваю, что BME по I2C шине с частотой 400кГц ниработает.  

Но НАДА схему и код

А я подозреваю, что BME получает 5V по сигнальным линиям и вырубается. Но свидетелей нет, показаний потерпевшего тоже...

zagzag2003
Offline
Зарегистрирован: 17.02.2019

bwn пишет:

Теперь проверить питание, это быстрее и проще.

Отыскал и подсоединил блок питания на 9В, - результат, к сожалению, не порадовал. Первые показатели похожи на правду (температура около 22 градусов), потом искажаются и застывают в искаженном виде. Дул на датчик - не реагирует. 

Также подводил к дисплею отдельное питание от зарядки телефона, поведение точно такое же. 

Не знаю, нужно ли было, но измерил напряжение на 5В шине, куда подсоединен дисплей. При подключении от чистого ЮСБ там было 4.2-4.5 вольт, после подключения блока питания - 4.94 вольта. 

Уже неудобно продолжать спрашивать, что еще можно сделать. Единственное, что еще посмею, такой вопрос: если датчик BME на 3.3В, то это касается не только питания, но и логической единицы? Она считается за единицу при 3.3В, не при 5?

 

ВН
Offline
Зарегистрирован: 25.02.2016

при 5В единица не менее 0,7, т.е. 3,5в, а желательно не менее 4-х

с напряжениями все верно, с усби идет через диод, т.е. минус 0,5-0,7В, а с +5 идет напрямую на мк + запирает питание от усби, если он подключен.

Кстати, заблокируйте I2C, поставьте 1, и проверьте, какое напряжение на линиях, т.к. если 280 питается от 3,3, то он может сажать все линии до уровня 3,3В

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Сделать можно вот что: на пин +5V подать заниженное напряжение. Через один диод сбросится ~0,6V, через два - ~1.2V, через три - ~1.8V. Ну, или как я учудил - 5V на VIn бахнул и на МК получил 3.6V.

Неисключено, что ваша ардуина продолжит работать на пониженном напряжении. При этом по шине I2C тоже пойдет пониженное напряжение и, вероятно, оно перестанет лупить по BME изо всех сил.

 

ВН
Offline
Зарегистрирован: 25.02.2016

не, не ардуина, я там выше дописал

sadman41
Offline
Зарегистрирован: 19.10.2016

Так у него перестаёт работать 3.3V TTL датчик на 5V TTL шине, а не остальные 5V TTL устройства. Какбэ самоуказывающий случай.

ВН
Offline
Зарегистрирован: 25.02.2016

да, вариант пониженного тоже проходил и как раз в вашем недавнем опыты пользовался,  так что только -за

zagzag2003
Offline
Зарегистрирован: 17.02.2019

sadman41 пишет:

Хотя, по мне так 3.3V BME совать на 5V шину - не лучшая идея.

 

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

Оказывается, на странице товара было два варианта, 5V и 3.3V и я по неопытности заказал BME280 3.3V (присоединяю фото). И так как "у всех работает, а у меня нет", я и занял ваше время глупыми вопросами (за что искренне извиняюсь), а вовсе не из-за того, что пришла блажь пихнуть невпихуемое. 

Хотя это даром не пройдет: я узнал у вас много полезного и поучительного. 

Благодарю за помощь и отзывчивость! 

P.S. Подал на VIN 5 вольт, напряжение упало до 3.6 вольта, но поведение датчика точно такое же: 22 градуса, потом 46, потом замолкает. Так как где-то в пути еще один дисплей другого типа, ради интереса я попробую еще и его и отпишусь - ведь без LCD1602 датчик всё-таки работает. Иду заказывать правильный датчик, заодно и конвертеры уровней, пусть будут. 

Представитель нетрадиционного напряжения, требующий прав от консервативного сообщества:

slider
Offline
Зарегистрирован: 17.06.2014

1. Уберите 4.7к подтяжку в модулях где она на 5в.
Оставьте только в одном модуле где она на 3.3.
2. Бывает "подделка" bmp280 там другие бквы нс микросхеме , там нужен немного другой скетч. Изучите чем отличается bmp280 от bme280 , возможно по ошибке не тот модуль вам прислали.
3. Убедитесь в качественных проводах (иногда бывают плохообжатые) , припаяйте лучше.
4. Проверьте питание и сигналы во время работы скетча, не должно быть выше 3.3в.
5. Ограничтесь общей длиной проводов до 20см , на время теста.

sadman41
Offline
Зарегистрирован: 19.10.2016

BME от BMP отличается только датчиком влажности в первом. По температуре/давлению у них всё одинаковое.