Температура не обновляется на OLED-экране — компоненты Grove

Я использую 2 компонента рощи для отображения температуры. Я использую температурный датчик высокой точности I2C — MCP9808 и OLED-экран с помощью этого скрипта:

#include <U8g2lib.h>
#include <SPI.h>
#include <Wire.h>
#include "Seeed_MCP9808.h"

MCP9808 sensor;
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/SCL, /* data=*/SDA, /* reset=*/U8X8_PIN_NONE);  //Программное обеспечение I2C

char strTemp\[16\];
float temp;

void setup() {
  u8g2.begin();
  Serial.begin(115200);
  
  if (sensor.init()) {
    Serial.println("sensor init failed!!");
  }   
  sensor.set_config(SET_CONFIG_ADDR, 0x0008);
  Serial.println("sensor init!!");
}

void loop() {
  sensor.get_temp(&temp);
  Serial.print("temperature value is: ");
  Serial.println(temp);
  delay(1000);

  dtostrf(temp, 7, 2, strTemp);

  u8g2.clearBuffer();                   // очищаем внутреннюю память
  u8g2.setFont(u8g2_font_luBIS08_tf);   // выбираем подходящий шрифт
  u8g2.drawStr(0, 10, "Hello Seeed!");  // пишем что-то во внутреннюю память
  u8g2.drawStr(0, 30, "Temp. value:");  // пишем что-то во внутреннюю память
  u8g2.drawStr(0, 50, strTemp);         // пишем что-то во внутреннюю память
  u8g2.sendBuffer();                    // передаем внутреннюю память на дисплей
}

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

Я запускаю сканер I2C и думаю, что адрес OLED — 0x3C, а временный. датчик 0x18. Как правильно их назначить. Я никогда не делал ничего подобного, поэтому любая помощь приветствуется.

Большое спасибо.

, 👍0

Обсуждение

Упростите проблему. Попробуйте сделать копию своего программного обеспечения без кода OLED и просто распечатайте температуру на последовательном мониторе, который уже является частью IDE. Если это работает, то это может быть адресация I2C. Если это не так, то, вероятно, как вы замеряете датчик температуры., @st2000

Спасибо за ответ и рекомендацию. Без кода OLED он выводит температуру на серийный монитор. Есть идеи, как действовать дальше?, @AsiJapan

делает "Hello Seeed!" показать на дисплее?, @jsotola

@jsotola: Да, это отображается на дисплее, @AsiJapan

... о, я вижу, ты уже распечатываешь температуру. Я бы по-прежнему закомментировал все строки u8g2 и, возможно, даже удалил бы аппаратное обеспечение OLED и посмотрел бы, появляются ли новые данные о температуре каждую секунду., @st2000

«... Без кода OLED он выводит температуру на последовательный монитор ...», да, но выводит ли он новую температуру каждую секунду? Если это так, я предполагаю, что библиотеки плохо работают друг с другом. Вероятно, они пытаются использовать то же аппаратное обеспечение процессора I2C и тормозят его для другой библиотеки., @st2000

@ st2000: При удалении всех строк u8g2 я вижу в последовательном мониторе файл temp. Когда в коде есть строки u8g2, даже последовательный монитор не работает, @AsiJapan

st2000: Я также подозреваю, что есть помехи I2C. Любая идея, как изменить один или оба из них?, @AsiJapan

Вы можете посмотреть код [MPC9808](https://github.com/Seeed-Studio/Grove_Temperature_sensor_MCP9808) и [U8G2](https://github.com/olikraus/u8g2/wiki) на github (не уверен, что Я получил правильную веб-страницу U8G2) и попытался разработать версию кода, совместимую друг с другом. Но сначала я бы поискал другие с похожими проблемами. Насколько нам известно, возможно, в библиотеке U8G2 есть возможность пропустить уже встроенную инициализацию I2C., @st2000

Или вы можете проверить, есть ли на вашей конкретной платформе Arduino второй порт I2C, и использовать его для дисплея U8G2. Или вы можете купить Arduino с двумя или более портами I2C (но убедитесь, что библиотеки, которые вы используете, совместимы с новым Arduino)., @st2000


1 ответ


Лучший ответ:

1

Вы смешиваете программный I2C с аппаратным I2C на контактах аппаратного I2C.

Чтобы использовать аппаратный I2C с дисплеем, используйте конструктор U8G2_SSD1306_128X64_NONAME_F_HW_I2C.

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE);

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

,