Конфликт I2C и SPI устройств

Тема в разделе "Arduino & Shields", создана пользователем Akel, 21 май 2015.

  1. Akel

    Akel Нуб

    Всем привет. Недавно начал работать с ардуино, всех тонкостей конечно не знаю. На форуме по поиску ничего не нашел, может быть потому что моя проблема и не проблема вовсе)
    Итак у меня есть:
    1. Arduino UNO R3 (Китай BETEMCU))
    2. Шилд Data logging shield V1.0 (кардридер и часы на DS1307)
    3. OLED дисплей 0,96 дюйма работающий по протоколу I2C

    Мое устройство должно при определенном событии записывать его на карту памяти с регистрацией времени и одновременно с этим выводить некоторую информацию на экран. Написав код я удачно его скомпилировал, однако после того, как залил его в чип - ничего не произошло. После долгих попыток разобраться в чем дело я выяснил следующее:
    1. Дисплей, работающий через библиотеку OLED_I2C.h и подключенный к пинам А0, А1, ладит с часами (DS1307.h, пины А4, А5). Данные о времени выводятся на дисплей без нареканий, Serial порт тоже в этот момент работает и передает данные
    2. Часы ладят с SD картой (SD.h, пин 10). Записывать данные на карту я не пробовал, но думаю это получится без проблем - карта инициализируется, основной код выполняется, Serial порт работает
    3. При подключении всех библиотек разом дисплей уходит в осадок, отображая рэндомные пиксели (или вовсе не отображая их). Иногда выводит часть данных. Часы при этом не отвечают вовсе. Сериал порт либо молчит, либо выводит рэндомные данные.
    4. Если в коде удалить все, что касается дисплея, кроме строчки # include <OLED_I2C.h>, то все работает прекрасно (естественно за исключением самого дисплея). Как только я добавляю следующую строку инициализации OLED myOLED(A1, A0, 8); - все перестает работать.
    Я пробовал отключать дисплей физически и менять пины - не помогло. Так же я пробовал менять очередной подключения библиотек - бестолку. Дисплей никак не хочет дружить с SD картой.
    Вот скетч

    #include <DS1307.h>
    DS1307 rtc(A4, A5); //Подключение библиотеки часов

    #include <SD.h>
    Sd2Card card;
    const int chipSelect = 10; // Подключение библиотеки SD карты


    #include <OLED_I2C.h> // Подключение библиотеки дисплея
    //OLED myOLED(A1, A0, 8); // Если убрать комментарий с этой строки - все перестает работать

    String time; //Переменная для хранения текущего времени

    void setup()

    {
    Serial.begin(9600);

    rtc.halt(false);

    pinMode(10, OUTPUT);

    if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    time = rtc.getTimeStr();
    Serial.print(time+" - ");
    Serial.println("Card bad");

    return;
    } else

    {
    time = rtc.getTimeStr();
    Serial.print(time+" - ");
    Serial.println("Card ok");
    }

    }

    void loop()
    {}
     
  2. Akel

    Akel Нуб

    Сейчас запустил этот код на "голой" ардуине. В результате я получил на мониторе порта:
    00:00:85 - Card bad
    При нажатии Reset на монитор приходит тоже самое
    Удалил комментарий со строки - на мониторе тишина. Резет - все равно тишина.
    Думаю это конфликт именно программный
     
  3. vvr

    vvr Инженерище

    у вас и часы и дисплей должны сидеть на одних пинах - (i2c) вот и конфликт
     
  4. Akel

    Akel Нуб

    Пересадил часы на пины А4, А5 ( подправил строку OLED myOLED(SDA, SCL, 8);), отключил библиотеку часов, добавил в код вывод информации на дисплей - работает.
    Подключаю библиотеку часов - работает. Запрашиваю время - зависает
     
  5. Akel

    Akel Нуб

    Сейчас попытался вывести время на дисплей (и часы и экран на одних пинах), при отключенной библиотеке SD карты - выдало время 27:85:85. На сериал порте то же самое. Подключаю SD - в сериал порте кошмар из набора символов. Отключаю и SD и дисплей - на порте все впорядке
     
  6. ANV

    ANV Гуру

    Попробуйте другие библиотеки для индикатора и RTC
    Правильными будут те, которые используют wire.h
     
  7. vvr

    vvr Инженерище

    разобраться с адресами