Подключение по I2C почему зависает?

Kochevnick
Offline
Зарегистрирован: 26.10.2021

Подключил к Arduino NANO BMP280, RTS_DS3231 и Oled SD1306.

Проверил, всё по отдельности - работает. Скомпоновал код на все 3 модуля, Ардуино виснет на процедуре Setup при инициализации 3 модуля. 

Пробовал различные комбинации кода для работы по парно, т.е. часы с экраном, экран с BMP, BMP с часами. Попарно тоже все работает, а все вместе зависает на инициализации любого 3-го модуля. 

Толи питания не хватает, толи нужно ставить какие-то подтягивающие резисторы?

Это мои первые шаги в освоении ардуино, так что не судите строго. 

Схема подключения:

Вот код: 

//----------------------------BMP280
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>

Adafruit_BMP280 bmp; // I2C

//--------------------------------------RTC_DS3231
#include <iarduino_RTC.h>

iarduino_RTC time(RTC_DS3231);

//#define OledOn
#ifdef OledOn
// библиотеки для работы с OLED экраном Arduino IDE
//#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Adafruit_SSD1306 display(128, 64, &Wire, 4); // указываем размер экрана в пикселях
#endif


void setup() {
  Serial.begin(9600);
  Serial.println("Begin");
  //-------------------------------------------------------------------------------BMP280 Setup
  Serial.println(F("BMP280 test"));
  if (!bmp.begin(BMP280_ADDRESS_ALT, BMP280_CHIPID)) {
    //if (!bmp.begin(0x76)) {
    Serial.println("Could not find a valid BMP280 sensor, check wiring or "
                   "try a different address!");
    //while (1) delay(10);
  }
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,
                  Adafruit_BMP280::SAMPLING_X2,
                  Adafruit_BMP280::SAMPLING_X16,
                  Adafruit_BMP280::FILTER_X16,
                  Adafruit_BMP280::STANDBY_MS_500);

  //-------------------------------------------------------------------------------RTC_DS3231_Setup
  delay(300);
  time.begin();
  time.settime(0, 30, 18, 12, 6, 20, 5); // 0  сек, 30 мин, 18 часов, 12, июня, 2020, четверг
  time.period(1);
  Serial.println(F("TimeOK"));
  //-------------------------------------------------------------------------------------------RTC_DS3231_Setup_END

  //-------------------------------------------------------------------------------OLED SSD1306 Setup
#ifdef OledOn
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // указываем адрес устройства на шине
  Serial.println(F("errorDis"));
  display.clearDisplay();
  display.setTextSize(1, 2); // указываем размер шрифта
  display.setCursor(30, 10);
  display.println("ARDUINO");
  display.display();
  delay(3000);
  display.clearDisplay(); // очищаем экран
  display.setTextSize(1); // указываем размер шрифта

#endif

  //-------------------------------------------------------------------------------OLED SSD1306 SetupEND
}

void loop() {

  if (millis() % 1000 == 0)
  {
    float t = bmp.readTemperature();
    float p = bmp.readPressure();
    String timeT = time.gettime("d-m-Y, H:i:s");
    p = p * 0.00750062; // Преобразуем Паскали в мм.рт.ст.

#ifdef OledOn

    display.clearDisplay();
    display.setCursor(0, 20);
    display.println(timeT);
    //-------------------------------Температура
    display.setCursor(0, 30);
    if (t > 0) display.print("+");
    display.print(t, 1);
    display.print("oC  ");
    //--------------------------------Давление
    display.print(p, 0); display.println("mmGh");
    display.display();

#endif

    Serial.println(timeT);
    if (t > 0) Serial.print("+");
    Serial.print(t, 1);
    Serial.print("oC  ");
    Serial.print(p, 0); Serial.println("mmGh");

  }
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

в каких то девайсах мне приходилось инициализацию дисплея вынести вперед

Kochevnick
Offline
Зарегистрирован: 26.10.2021

ua6em пишет:

в каких то девайсах мне приходилось инициализацию дисплея вынести вперед

Неа, не помогает. Кстати, зависает именно на модуле экрана.

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

Памяти нехватат

-NMi-
Offline
Зарегистрирован: 20.08.2018

Резисторы подтяжки проверь.

Kochevnick
Offline
Зарегистрирован: 26.10.2021

-NMi- пишет:
Резисторы подтяжки проверь.

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

Какие номиналом и самое главное понять почему?

Kochevnick
Offline
Зарегистрирован: 26.10.2021

DetSimen пишет:

Памяти нехватат

Да вроде хватает. Компилятор выдает:

Скетч использует 27848 байт (90%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 924 байт (45%) динамической памяти, оставляя 1124 байт для локальных переменных. Максимум: 2048 байт.

Кстати, отсюда, попутно, еще один вопрос - это, что так мало памяти?! я еще планировал в этот проект подключить УЗ датчик, модуль SD карты и GSM модуль, а уже 90% памяти занято 

nik182
Offline
Зарегистрирован: 04.05.2015

Это называется проектированием. Рисуем схему с модулями. Пишем сколько кому надо тока, памяти и прочих ресурсов. Суммируем. Выбираем МК, который справится с задачей. С Вашей задачей нана не справится. Нужен контроллер мощнее. Или урезать хотелки. Например взять экран не так сильно жрущий память.

Kochevnick
Offline
Зарегистрирован: 26.10.2021

nik182 пишет:

Это называется проектированием. Рисуем схему с модулями. Пишем сколько кому надо тока, памяти и прочих ресурсов. Суммируем. Выбираем МК, который справится с задачей.

Блин, ну понятно, что проектировать надо. Это первые шаги.

По току то можно прикинуть:

BMP280 - 2,7мкА, RTS_DS3231 -250мкА, Oled SSD1306 - 16мА. Арпдуино нано выдает 40мА, должно хватать. По ходу прикрутки остальных модулей, проблему можно решить с внешним питанием. 

А вот как быть с расчетом памяти заранее, не понимаю?  Просветите.

nik182 пишет:
С Вашей задачей нана не справится. Нужен контроллер мощнее. Или урезать хотелки. Например взять экран не так сильно жрущий память.

 Да я понимаю, но принять не могу. Ну, не мегу же ставить! Или придется 2-3 нано использовать? 

Может я ошибаюсь, но в сравнении с BMP280 и часиками, экран памяти хавает, не так уж и сильно. Без него 58% памяти, т.е. 32% а 58% другие два датчика! Я в шоке конечно пребываю, и все это можно сказать только примеры использование. А когда начнешь еще и свой код ваять, там вообще ничего не остается.  Вроде всякие проекты в интернете видел, как они все это умещают в памяти?

nik182
Offline
Зарегистрирован: 04.05.2015

Используют только то что необходимо программе, а не сыпят всё в подряд что есть в библиотеках. Компилятор конечно помогает что то лишнее выкинуть но много и остается. Это тоже к проектированию относится - составить необходимый минимум подпрограмм. Проще конечно взять библиотеку и не думая впихнуть. Оно заработает. Однако на форуме много тем типа считываем данные без библиотеки и т.п. Есть тема про  13 тиньку там памяти мало и нужно как то впихивать программы. Страниц в теме много, но если бегло почитать, то можно найти много советов как уменьшить размер программы. 

P.S. Компилировал - Скетч использует 17254 байт (56%) памяти устройства. Всего доступно 30720 байт.

Глобальные переменные используют 761 байт (37%) динамической памяти, оставляя 1287 байт для локальных переменных. Максимум: 2048 байт.
 
И это после всех библиотек. Дальнейшие добавления будут очень мало увеличивать размер программы. Все тяжёлые подпрограммы уже лежат в памяти. Проблемы возникнут с CD.  Нужно много памяти на буферы чтения секторов. Задача явно не для наны.
 
Kochevnick
Offline
Зарегистрирован: 26.10.2021

nik182 пишет:

Используют только то что необходимо программе, а не сыпят всё в подряд что есть в библиотеках. Компилятор конечно помогает что то лишнее выкинуть но много и остается. Это тоже к проектированию относится - составить необходимый минимум подпрограмм. Проще конечно взять библиотеку и не думая впихнуть. Оно заработает. Однако на форуме много тем типа считываем данные без библиотеки и т.п. Есть тема про  13 тиньку там памяти мало и нужно как то впихивать программы. Страниц в теме много, но если бегло почитать, то можно найти много советов как уменьшить размер программы. 

Благодарю за ссылку, да, есть, что там по изучать

Все таки хотелось вернуться к главному вопросу, почему не работает 3 модуля вместе и как это исправить?

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

Чем спорить, можете принять или не можете, лучше поставьте резисторы как Вам сказали (два штуки по 4,7к от пинов A4 и A5 ардуины на питание)

и вставьте после строки №24

delay(500);

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

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

float, Serial, шрифты для OLED - основные загрязнители. От первого не избавитесь в ближайшем будущем, от второго - легко, для экрана взять u2glib - такие рекомендации можно дать.

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

Kochevnick пишет:

-NMi- пишет:
Резисторы подтяжки проверь.

Я не ставил ни одного резистора. Все как на схеме.

На схеме они уже есть. Причем, по два экземпляра каждого, потому что они имеются в каждом из модулей (в этом и есть опасность сборки схему из готовых модулей, а не из деталей россыпью). Вам нужно проверить, что при параллельном включении итоговое сопротивление не окажется меньше 2 кОм.

Kochevnick пишет:

А вот как быть с расчетом памяти заранее, не понимаю?  Просветите.

Что значит "заранее"?

Переменная типа char занимает 1 байт, типа int - два байта, типа long или flot - 4 байта. Если массив на 100 элементов - в 100 раз больше. А дальше - просто сложение. Арифметику в школе изучали?

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

Kochevnick пишет:

 почему не работает 3 модуля вместе и как это исправить?

На это может быть 1001 причина.

Как исправить - зависит от причины.

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

Диагностику следует начинать с поверки, что разные библиотеки на "дерутся" за одни и те же ресурсы. В качестве ресурсов следует рассматривать оперативную и постоянную память, пины контроллера, таймеры и прерывания. Ну и еще - время: в программе, которая работает с несколькими разными устройствами, как правило, не должно быть задержек типа delay().

Kochevnick
Offline
Зарегистрирован: 26.10.2021

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

Чем спорить, можете принять или не можете, лучше поставьте резисторы как Вам сказали (два штуки по 4,7к от пинов A4 и A5 ардуины на питание)

и вставьте после строки №24

delay(500);

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

Отписываюсь. Кошмар какой то. Ардуино - это какой то бред недоделанный. Я думал все гораздо проще будет. Подключил модуль, подключил библиотеку и работай. А тут такое мракобесие. Как уже только не переделывал и схему и код, но толи лыжи не едут, толи китайцы враги русского народа. 

Подключил в эту схему подтягивающие резисторы, как и советовал на 4,7кОм
, добавил делей на 24 строчке кода.  Запустил, не работает.

Ну ладно, думаю. начнем все сначала, как будет работать все по отдельности с этими резюками. Начал с датчика температуры. Оп, не работает. Колдовал и так и сяк, убрал резюки. Не работает.  Пересобрал всю схему. Подключил только BMP. Танцы с бубном, все заработал. Подтянул SDA и SDL резисторами. Работает, изменений нет. Добавляю модуль Oled. Работает.

Добавляю часы. Програмно отключаю дисплей. Все работает. 

Отключаю БМП, подключаю дисплей и часы. Работает, но перестал работать *.print ни в сом порт, ни в экран, причем как то выборочно, как это возможно.

Хрен с этими датчиками, там да ну может конфликтовать библиотеки, какие ни будь помехи, но когда один код глючит, я всю голову сломал. Почему один  Serial.print("get_time"); работает, а следом за ним   Serial.print(timeT); не работает

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

Kochevnick пишет:

Подключил в эту схему ...  добавил делей на 24 

Вы принципиально или беспринципно проигнорировали мои слова:

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

с обязательным выкладыванием актуальной схемы и актуального скетча.

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

Макетка, похоже, с разрывом шин питания.

Или это так и задумано?

Если да, то я бы не стал трехвольтовый BMP подключать к 5-вольтовому контроллеру.

Kochevnick
Offline
Зарегистрирован: 26.10.2021

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

Вы принципиально или беспринципно проигнорировали мои слова:

Да, нет братан, не специально. Просто уже голову сломал и мозг зациклил уже.  Схему же надо отдельно рисовать. 

Вот последняя схема подключения (а их уже всяких вариаций было):

 

#define OledOn
#define BMP_On
#define RTS_On
#ifdef OledOn
// библиотеки для работы с OLED экраном Arduino IDE
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Adafruit_SSD1306 display(128, 64, &Wire, 4); // указываем размер экрана в пикселях
#endif

//----------------------------BMP280
#ifdef BMP_On
#include <Wire.h>
//#include <SPI.h>
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp; // I2C
#endif   //---------------endif(BMP_On)

//--------------------------------------RTC_DS3231
#include <iarduino_RTC.h>

iarduino_RTC time(RTC_DS3231);

void setup() {
  delay(500);
  //-------------------------------------------------------------------------------OLED SSD1306 Setup
  Serial.begin(9600);
  Serial.println("Begin");
  delay(500);
#ifdef OledOn
  Serial.println("DS_begin");
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);// указываем адрес устройства на шине
  display.clearDisplay();
  display.setTextSize(1); // указываем размер шрифта
  display.setTextColor(SSD1306_WHITE); // указываем цвет надписи
  display.setCursor(40, 10);
  Serial.println("DS_Print");
  delay(500);
  display.println("ARDUINO");
  Serial.println("DS_PrintOK");
  delay(500);
  display.display();
  Serial.println("DisplayOK");
  delay(500);
  display.clearDisplay(); // очищаем экран
  display.setTextSize(1); // указываем размер шрифта
  //display.setTextColor(SSD1306_WHITE); // указываем цвет надписи
#endif

  //-------------------------------------------------------------------------------OLED SSD1306 SetupEND


  //-------------------------------------------------------------------------------BMP280 Setup

#ifdef BMP_On
  Serial.println("BMP280_Begin");
  //if (!bmp.begin(BMP280_ADDRESS_ALT, BMP280_CHIPID)) {
    if (!bmp.begin(0x76)) {
      Serial.println("Could not find a valid BMP280 sensor, check wiring or "
                     "try a different address!");
    } 
    else {
      bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,
                      Adafruit_BMP280::SAMPLING_X2,
                      Adafruit_BMP280::SAMPLING_X16,
                      Adafruit_BMP280::FILTER_X16,
                      Adafruit_BMP280::STANDBY_MS_500);
     Serial.println("BMP280_Ok");}
#endif

#ifdef RTS_On
    //-------------------------------------------------------------------------------RTC_DS3231_Setup
    Serial.println("TimeBegin");
    delay(300);
    time.begin();
    time.settime(0, 30, 18, 12, 6, 20, 5); // 0  сек, 30 мин, 18 часов, 12, июня, 2020, четверг
    time.period(1);
    Serial.println("TimeOK");
    //-------------------------------------------------------------------------------------------RTC_DS3231_Setup_END
#endif
  }

  void loop() {
float t = 0;
float p =0;
String timeT ="No_Time_Module";

    if (millis() % 1000 == 0)
    {
      
      #ifdef BMP_On 
        {
          t = bmp.readTemperature();
          p = bmp.readPressure();
          p = p * 0.00750062; // Преобразуем Паскали в мм.рт.ст.
        }
      #endif
      
      #ifdef RTS_On 
         {Serial.print("get_time");
          timeT = time.gettime("d-m-Y, H:i:s");
          Serial.print(timeT);
        
          }
      #endif

      #ifdef OledOn
      {
        display.clearDisplay();
        display.setCursor(0, 20);
        display.println(timeT);
        //-------------------------------Температура
        display.setCursor(0, 30);
        if (t > 0) 
          display.print("+");
        display.print(t, 1);
        display.print("oC  ");
        //--------------------------------Давление
        display.print(p, 0); display.println("mmGh");
        display.display();
      }
      #endif

       Serial.println(timeT);
       if (t > 0) Serial.print("+");
       Serial.print(t, 1);
       Serial.print("oC  ");
       Serial.print(p, 0); Serial.println("mmGh");

    }
  }

Я уже всяко перепробовал. В 3 модуля, виснет на методе display.println() 41 строка. Ну как виснет, доходит до 41 строки и заново запускается  setup(), Вычислил принтами на компорт.

В два модуля работает, в различных комбинациях, не меняя схемы и не отключая физически модули, а только програмно, через директивы, но  только вылез косяк -  отказ печатать в порт - Serial.print(timeT) 104 и 126 строка. 

Kochevnick
Offline
Зарегистрирован: 26.10.2021

sadman41 пишет:
Макетка, похоже, с разрывом шин питания. Или это так и задумано? Если да, то я бы не стал трехвольтовый BMP подключать к 5-вольтовому контроллеру.

Да работает он и так и так. В даташите китайцы указывают питание от 1,8 до 5в. 

Подключал и к 3,3 и к 5в разницы не заметил. Последняя версия подключена  на 3,3в.

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

https://www.bosch-sensortec.com/products/environmental-sensors/pressure-...

Supply voltage VDDIO. 1.2 ... 3.6 V. <<<<<<<
Supply voltage VDD 1.71 ... 3.6 V

SAB
Offline
Зарегистрирован: 27.12.2016

Может на одном из девайсов адрес поменять

nik182
Offline
Зарегистрирован: 04.05.2015

Ну если такой затык, то сообщаю. Часики отлично работают на софтовом I2C Влада. Вешаете часики на две любые свободные ноги, кроме D0 D1, запускаете софт I2C и обращаетесь к часам через него.  

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

Еще хотелось бы видеть диагностику после компиляции. Ибо то, что размещено в сообщении №6, не вызывает доверия: для дисплея, насколько я понимаю, используется экранный буфер, а потому общий расход памяти никак не может составлять 924 байта.

Kochevnick
Offline
Зарегистрирован: 26.10.2021

andriano пишет:

На схеме они уже есть. Причем, по два экземпляра каждого, потому что они имеются в каждом из модулей (в этом и есть опасность сборки схему из готовых модулей, а не из деталей россыпью). Вам нужно проверить, что при параллельном включении итоговое сопротивление не окажется меньше 2 кОм.

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

Так как попарно модули работают в любой конфигурации, склоняюсь к вашему мнению про итоговое сопротивление. Скажи как его измерить? В смысле на каких контактах мерить?

 

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

Kochevnick пишет:
В смысле на каких контактах мерить?
SDA - Vcc и SCL-Vcc

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

Kochevnick пишет:

Правильно ли я понимаю, что в модулях уже есть свои резисторы 

А почему Вы меня об этом спрашиваете? 

У кого модули перед глазами, у меня или у Вас?

Цитата:

... итоговое сопротивление. Скажи как его измерить? В смысле на каких контактах мерить?

Проще всего - прочитать маркировку. 

Но если хочется именно измерить, то на соответствующих резисторах. Впрочем, можно и на контактах разъема, с которыми они соединены накоротко.

Kochevnick
Offline
Зарегистрирован: 26.10.2021

andriano пишет:

Еще хотелось бы видеть диагностику после компиляции. Ибо то, что размещено в сообщении №6, не вызывает доверия: для дисплея, насколько я понимаю, используется экранный буфер, а потому общий расход памяти никак не может составлять 924 байта.

У меня после компиляции выдается только это. Как включить диагностику? 

Kochevnick
Offline
Зарегистрирован: 26.10.2021

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

Kochevnick пишет:
В смысле на каких контактах мерить?
SDA - Vcc и SCL-Vcc

Замерил сопротивление SDA - Vcc - 6,13кОм, SCL-Vcc - 6,10кОм.  SDA-SCL - 4.79кОм.

Схема подключения как в первом посте, без подтягивающих резисторов.

Что это значит и куда дальше копать?

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

Software Wire

Kochevnick
Offline
Зарегистрирован: 26.10.2021

sadman41 пишет:
Software Wire
Не мог ли ты дать более развернутый ответ, пожалуйста.

Kochevnick
Offline
Зарегистрирован: 26.10.2021

nik182 пишет:

Ну если такой затык, то сообщаю. Часики отлично работают на софтовом I2C Влада. Вешаете часики на две любые свободные ноги, кроме D0 D1, запускаете софт I2C и обращаетесь к часам через него.  

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

sadman41
Offline
Зарегистрирован: 19.10.2016
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015
Kochevnick пишет:
У меня после компиляции выдается только это. Как включить диагностику?
 
Диагностика включается в файл->настройки, но речь не о том.
Библиотека Adafruit, как и все графические библиотеки для этого экрана, работает с экранным буфером объемом 1024 байта. Сам я пользуюсь исключительно собственными библиотеками, поэтому подробностей работы со стандартными не знаю, но давайте рассуждать логически: раз диагностируемый расход памяти меньше 1024 (а он у Вас 924 байта), значит, выделение памяти под буфер происходит динамически в процессе выполнения. Скорее всего, это происходит в строке 20 Вашей программы. Т.е. после выполнения этой строки у Вас остается уже не 1124 байта "для локальных переменных", а только 100 байт. Это само по себе очень мало, а, учитывая, что Вы при работе используете переменные типа String, вывод однозначен: программе не хватает памяти. И внешние проявления вполне этому соответствуют. Об этом, кстати, Вам уже писали в сообщении №3.
Так что для начала Ваша задача - добиться, чтобы при компиляции выдавалось сообщение "Глобальные переменные используют 512 байт (25%) динамической памяти" или меньше.
Kochevnick
Offline
Зарегистрирован: 26.10.2021

andriano пишет:

Еще хотелось бы видеть диагностику после компиляции. Ибо то, что размещено в сообщении №6, не вызывает доверия: для дисплея, насколько я понимаю, используется экранный буфер, а потому общий расход памяти никак не может составлять 924 байта.

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

Вот, что выдал компилятор:

In file included from D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src/iarduino_RTC.h:33:0,
                 from D:\Ардуино\ArduinoProject\Экспирименты\bmp280test_SSD1306_Time\bmp280test_SSD1306_Time.ino:24:
D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src/iarduino_RTC_DS1302.h: In member function 'bool iarduino_RTC_DS1302::funcWriteReg(uint8_t, uint8_t)':
D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src/iarduino_RTC_DS1302.h:59:3: warning: no return statement in function returning non-void [-Wreturn-type]
   }                      //
   ^
D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src/iarduino_RTC_DS1302.h: In member function 'void iarduino_RTC_DS1302::funcWriteByte(uint8_t)':
D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src/iarduino_RTC_DS1302.h:62:202: warning: comparison is always true due to limited range of data type [-Wtype-limits]
   void funcWriteByte (uint8_t j)              /* Передача  одного байта  (байт для передачи)         */ {uint8_t i=0, n=500/busRate+1; pinMode(pinDAT, OUTPUT); while(i>=0 && i<8){digitalWrite(pinDAT, (j & _BV(i))); delayMicroseconds(n); digitalWrite(pinCLK, 1); delayMicroseconds(n); digitalWrite(pinCLK, 0); i++;} pinMode(pinDAT, INPUT);}
                                                                                                                                                                                                         ~^~~
D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src/iarduino_RTC_DS1302.h: In member function 'uint8_t iarduino_RTC_DS1302::funcReadByte(bool)':
D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src/iarduino_RTC_DS1302.h:63:301: warning: comparison is always true due to limited range of data type [-Wtype-limits]
   uint8_t funcReadByte (bool j)              /* Получение одного байта  (флаг чтения предустановленного бита с линии DAT) */ {uint8_t i=0, k=0, n=500/busRate+1; pinMode(pinDAT, INPUT); if(j){if(digitalRead(pinDAT)){k |= _BV(i);} i++;} while(i>=0 && i<8){digitalWrite(pinCLK, 1); delayMicroseconds(n); digitalWrite(pinCLK, 0); delayMicroseconds(n); if(digitalRead(pinDAT)){k |= _BV(i);} i++;} return k;}
                                                                                                                                                                                                                                                                                                            ~^~~
In file included from D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src/iarduino_RTC_DS1307.h:4:0,
                 from D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src/iarduino_RTC.h:34,
                 from D:\Ардуино\ArduinoProject\Экспирименты\bmp280test_SSD1306_Time\bmp280test_SSD1306_Time.ino:24:
D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src/iarduino_RTC_I2C.h: In member function 'virtual bool iarduino_I2C::sendID(uint8_t, bool)':
D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src/iarduino_RTC_I2C.h:322:23: warning: unused parameter 'adr' [-Wunused-parameter]
   bool sendID(uint8_t adr, bool rw){          // Аргументы: ID-адрес модуля, бит RW (0-запись, 1-чтение)
                       ^~~
D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src/iarduino_RTC_I2C.h:322:33: warning: unused parameter 'rw' [-Wunused-parameter]
   bool sendID(uint8_t adr, bool rw){          // Аргументы: ID-адрес модуля, бит RW (0-запись, 1-чтение)
                                 ^~
D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src/iarduino_RTC_I2C.h: In member function 'virtual bool iarduino_I2C::setByte(uint8_t)':
D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src/iarduino_RTC_I2C.h:360:24: warning: unused parameter 'data' [-Wunused-parameter]
   bool setByte(uint8_t data){            // Аргумент: байт для передачи.
                        ^~~~
D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src/iarduino_RTC_I2C.h: In member function 'virtual uint8_t iarduino_I2C::getByte(bool)':
D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src/iarduino_RTC_I2C.h:394:24: warning: unused parameter 'ack' [-Wunused-parameter]
   uint8_t getByte(bool ack){             // Аргумент: бит подтверждения ACK/NACK
                        ^~~
In file included from D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src\iarduino_RTC.h:33:0,
                 from D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src\iarduino_RTC.cpp:1:
D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src\iarduino_RTC_DS1302.h: In member function 'bool iarduino_RTC_DS1302::funcWriteReg(uint8_t, uint8_t)':
D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src\iarduino_RTC_DS1302.h:59:3: warning: no return statement in function returning non-void [-Wreturn-type]
   }                      //
   ^
D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src\iarduino_RTC_DS1302.h: In member function 'void iarduino_RTC_DS1302::funcWriteByte(uint8_t)':
D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src\iarduino_RTC_DS1302.h:62:202: warning: comparison is always true due to limited range of data type [-Wtype-limits]
   void funcWriteByte (uint8_t j)              /* Передача  одного байта  (байт для передачи)         */ {uint8_t i=0, n=500/busRate+1; pinMode(pinDAT, OUTPUT); while(i>=0 && i<8){digitalWrite(pinDAT, (j & _BV(i))); delayMicroseconds(n); digitalWrite(pinCLK, 1); delayMicroseconds(n); digitalWrite(pinCLK, 0); i++;} pinMode(pinDAT, INPUT);}
                                                                                                                                                                                                         ~^~~
D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src\iarduino_RTC_DS1302.h: In member function 'uint8_t iarduino_RTC_DS1302::funcReadByte(bool)':
D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src\iarduino_RTC_DS1302.h:63:301: warning: comparison is always true due to limited range of data type [-Wtype-limits]
   uint8_t funcReadByte (bool j)              /* Получение одного байта  (флаг чтения предустановленного бита с линии DAT) */ {uint8_t i=0, k=0, n=500/busRate+1; pinMode(pinDAT, INPUT); if(j){if(digitalRead(pinDAT)){k |= _BV(i);} i++;} while(i>=0 && i<8){digitalWrite(pinCLK, 1); delayMicroseconds(n); digitalWrite(pinCLK, 0); delayMicroseconds(n); if(digitalRead(pinDAT)){k |= _BV(i);} i++;} return k;}
                                                                                                                                                                                                                                                                                                            ~^~~
In file included from D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src\iarduino_RTC_DS1307.h:4:0,
                 from D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src\iarduino_RTC.h:34,
                 from D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src\iarduino_RTC.cpp:1:
D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src\iarduino_RTC_I2C.h: In member function 'virtual bool iarduino_I2C::readBytes(uint8_t, uint8_t, uint8_t*, uint8_t)':
D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src\iarduino_RTC_I2C.h:145:29: warning: suggest parentheses around comparison in operand of '&' [-Wparentheses]
      if (sum) { if(TWSR&0xF8!=0x50) {  i=0;}}    // Если после чтения очередного байта пакета значение регистра состояния шины I2C Arduino TWSR с маской 0xF8 не равно 0x50 значит произошла ошибка при чтении
                         ~~~~^~~~~~
D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src\iarduino_RTC_I2C.h:146:26: warning: suggest parentheses around comparison in operand of '&' [-Wparentheses]
      else  { if(TWSR&0xF8!=0x58) {  i=0;}}    // Если после чтения последного байта пакета значение регистра состояния шины I2C Arduino TWSR с маской 0xF8 не равно 0x58 значит произошла ошибка при чтении
                      ~~~~^~~~~~
D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src\iarduino_RTC_I2C.h: In member function 'virtual bool iarduino_I2C::readBytes(uint8_t, uint8_t*, uint8_t)':
D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src\iarduino_RTC_I2C.h:168:29: warning: suggest parentheses around comparison in operand of '&' [-Wparentheses]
      if (sum) { if(TWSR&0xF8!=0x50) {  i=0;}}    // Если после чтения очередного байта пакета значение регистра состояния шины I2C Arduino TWSR с маской 0xF8 не равно 0x50 значит произошла ошибка при чтении
                         ~~~~^~~~~~
D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src\iarduino_RTC_I2C.h:169:26: warning: suggest parentheses around comparison in operand of '&' [-Wparentheses]
      else  { if(TWSR&0xF8!=0x58) {  i=0;}}    // Если после чтения последного байта пакета значение регистра состояния шины I2C Arduino TWSR с маской 0xF8 не равно 0x58 значит произошла ошибка при чтении
                      ~~~~^~~~~~
D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src\iarduino_RTC.cpp: In member function 'char* iarduino_RTC::gettime(const char*)':
D:\��������� Alex\Arduino\libraries\iarduino_RTC-1.3.4\src\iarduino_RTC.cpp:6:26: warning: unused variable 'f' [-Wunused-variable]
    uint8_t j, k, n; bool f;                  // Объявляем локальные переменные
                          ^
Скетч использует 22668 байт (73%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 827 байт (40%) динамической памяти, оставляя 1221 байт для локальных переменных. Максимум: 2048 байт.

Код, последний вариант:

#include "Wire.h"
#include "Adafruit_GFX.h"
#include "Adafruit_SSD1306.h"
Adafruit_SSD1306 display(128, 64, &Wire, 4); // указываем размер экрана в пикселях

#include <iarduino_RTC.h>
iarduino_RTC time(RTC_DS3231);

#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp; // I2C


void setup() {

  Serial.begin(9600);
  //-------------------------------------------------------------------------------------------RTC_DS3231_Setup
  delay(300);
  time.begin();
  //time.settime(0, 56, 00, 25, 10, 21, 2); // 0  сек, 30 мин, 18 часов, 12, июня, 2020, четверг
  time.period(1);
  //-------------------------------------------------------------------------------------------RTC_DS3231_Setup_END

  //-------------------------------------------------------------------------------OLED SSD1306 Setup
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // указываем адрес устройства на шине
  display.clearDisplay();
  display.setTextSize(1, 2);                         // указываем размер шрифта
  display.setTextColor(SSD1306_WHITE);               // указываем цвет надписи
  display.setCursor(30, 10);
  display.println("ARDUINO");
  display.display();
  delay(3000);
  display.clearDisplay(); // очищаем экран
  //-------------------------------------------------------------------------------OLED SSD1306 SetupEND

 Serial.println(F("BMP280 test"));
 if (!bmp.begin(0x76)) {
    Serial.println(F("Could not find a valid BMP280 sensor!"));
    while (1) delay(10);
    }
  // Default settings from datasheet.
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     // Operating Mode. 
                  Adafruit_BMP280::SAMPLING_X2,     // Temp. oversampling 
                  Adafruit_BMP280::SAMPLING_X16,    // Pressure oversampling
                  Adafruit_BMP280::FILTER_X16,      // Filtering.
                  Adafruit_BMP280::STANDBY_MS_500); // Standby time. 
 //-------------------------------------------------------------------------------BMP280 SetupEND
}

void loop() {

  if (millis() % 1000 == 0)
  {
    display.setTextSize(1);                         // указываем размер шрифта
    display.setTextColor(SSD1306_WHITE);            // указываем цвет надписи
    display.clearDisplay();
    display.setCursor(0, 20);
    display.print(time.gettime("d.m.y H:i:s"));
    display.setCursor(0, 30);
    float t = bmp.readTemperature();
    if (t>0) {display.print("+");} display.print(t,1); display.print("oC  ");
    float p = bmp.readPressure();
    p = p * 0.00750062; // Преобразуем Паскали в мм.рт.ст.
    display.print(p,0); display.println("mmGh");
    delay(1);
    display.display();
  }

  



}

 

Kochevnick
Offline
Зарегистрирован: 26.10.2021

 

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

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

Kochevnick пишет:

 

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

До тех пор, пока Вы не дойдете до сложных случаев, Вам следует считать, что Ардуино - всегда мастер, а все остальные - всегда слейв.