Зависание Arduino uno R3

Jomaxplayer
Offline
Зарегистрирован: 30.11.2016

Всем привет. Собирал мини проект, на скорую руку. Мини метеостаниция. И наткнулся на две проблеммы. Надеюсь вы не будете судить строго, ну и поможете мне умным ответом или где посмотреть.

1. Как подключить два элимента которые требуют строго подключения к SCL и SDA. К примеру, возьму более сложный пример, мне нужно подключить Часы реального времени DS1307, датчик интенивности света BH1750, и датчик BMP280, везде на примерах их подключают к пинам A4, A5 на arduino uno. Получается нельзя подключить сразу несколько элементов с SCL и SDA? А если можно то я надеюсь вы мне поможете, и может даже приложете скечь для примера. =)))

 

2. При подключении двух элиментов к arduino uno DS1307 и BMP280, как в примере DS1307 сажаю на пины на плате А4 и А5, а BMP280 нашел как сажают на теже А4 и А5 (это не подходит из проблемы 1.), но и нашел как подключают к пинас с 13 по 10. Подключаю беру простой скетч из примеров к каждому элементу, объеденяю. Заливаю скэтч. И arduino начинает зависать, при том не на какомто определенном шаге, а рандомна, может зависнуть сразу при включении, а может и 15 минут с пустя. По отдельности оба элемента работают, а вот в месте враждуют. Можете пожалуйста разьяснить в чем дело? Как делать правильно? 

#include "Wire.h"
#include "RTClib.h"
#include "Adafruit_Sensor.h"
#include "Adafruit_BMP280.h"

#define BMP_CS A1
RTC_DS1307 rtc;
Adafruit_BMP280 bme(BMP_CS);

unsigned long previousBMP280 = 0;
unsigned long previousRTC = 0;
const short int limBMP280 = 2000;
const short int limRTC = 1000;

void setup ()
{

  rtc.begin();
  if (!bme.begin()) {  
    Serial.println("Could not find a valid BMP280 sensor, check wiring!");
  } else {
    Serial.println("Valid BMP280 sensor running!");
  }
}
void loop () {
  DateTime rtcTime = rtc.now();
  const unsigned long currentMillis1 = millis();
  if (currentMillis1 < previousBMP280) {
    previousBMP280 = 0;
  }
  if (currentMillis1 - previousBMP280 >= limBMP280) {
      previousDHT22 = currentMillis1; 
      informWithBMP280();
  }
  const unsigned long currentMillis2 = millis();
  if (currentMillis2 < previousRTC) {
    previousRTC = 0;
  }
  if (currentMillis2 - previousRTC >= limRTC) {
      previousRTC = currentMillis2; 
      if (!rtc.isrunning()) {
        Serial.println("RTC ERROR");
      } else {
        SerialTimeInf(rtcTime);
      }
  }
}


void informWithBMP280() {
    const float bmp280T = bme.readTemperature();
    const float bmp280P = bme.readPressure();
    const float bmp280A = bme.readAltitude(1013.25);
    Serial.println("Temperature = " + String(bmp280T) + "C, Pressure = " + String(bmp280P) + "Pa, Approx altitude = " + String(bmp280A) + "m.");
}
void SerialTimeInf(DateTime rTime){
  Serial.print("DATA ");
  Serial.print(rTime.year(), DEC);     // выводим данные на экран
  Serial.print("/");
  Serial.print(rTime.month(), DEC);
  Serial.print("/");
  Serial.print(rTime.day(), DEC);
  Serial.print(" ");
  Serial.print(rTime.hour(), DEC);
  Serial.print(":");
  Serial.print(rTime.minute(), DEC);
  Serial.print(":");
  Serial.print(rTime.second(), DEC);
  Serial.println();  
}

 

T.Rook
Offline
Зарегистрирован: 05.03.2016

Jomaxplayer пишет:

1. ... Получается нельзя подключить сразу несколько элементов с SCL и SDA?

Можно. Ибо это шина I2C. Почитайте про нее. В гугле про неё много. Если останутся вопросы - приходите.

Jomaxplayer
Offline
Зарегистрирован: 30.11.2016

Спасибо, а про зависание можете что нибдь сказать? или это все относится к интерфейсу I2C, и разобравшись с ним разбирусь и с двумя проблеммами одновременно?  

T.Rook
Offline
Зарегистрирован: 05.03.2016

Первое что говорят в вопросах о "хаотичных" зависаниях/перезагрузках - проверяйте питание. Более конкретно сейчас сказать невозможно, слишком много факторов влияют,  начните все таки со стабильного  питания.

Jomaxplayer
Offline
Зарегистрирован: 30.11.2016

T.Rook пишет:

... со стабильного  питания.

 

Спасибо, но это я первое что сделал. организовал для каждого датчика стабильное питание. Полностью избавился от подпитки от платы, тоже думал что дело в этом. Мне просто кажется что пины (Прошу извенение что сразу не указал), датчика BMP280 подключенные к 13,12,11 порту которые соответствуют MOSI-11, MISO-12, SCK-13. У меня подозрения что эти порты враждуют между собой если к ним подключить два устройства которые работают по I2C интерфейсу. Просто BMP280 можно подключить как A4, A5 так и к 13, 12, 11, и четвертый любой.

Jomaxplayer
Offline
Зарегистрирован: 30.11.2016

T.Rook пишет:

Jomaxplayer пишет:

1. ... Получается нельзя подключить сразу несколько элементов с SCL и SDA?

Ибо это шина I2C.

Спасибо за совет))).

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

Jomaxplayer пишет:

...пины (Прошу извенение что сразу не указал), датчика BMP280 подключенные к 13,12,11 порту которые соответствуют MOSI-11, MISO-12, SCK-13. У меня подозрения что эти порты враждуют между собой если к ним подключить два устройства которые работают по I2C интерфейсу. Просто BMP280 можно подключить как A4, A5 так и к 13, 12, 11, и четвертый любой.

MOSI-11, MISO-12, SCK-13 - это SPI. Не путайте с I2C. Они по-разному подключаются и по-разному работают.

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

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

- шина требует подтяжки к питанию резисторами 1.8к-47к. Это обязательно. Если Вы используете "голые" микросхемы, не забудьте о резисторах. Если же Вы используете готовые модули (микросхемы с обвязкой, распаянные на платы), здесь другая неприятность: обычно на этих платах резисторы уже распаяны, причем на каждой из используемых плат. Прочитаяте номиналы используемых резисторов, посчитайте сопротивление их параллельного соединения, и если оно окажется меньше 1.8к, нужно будет выпаять резисторы из части плат.

 

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

Для проверки корректности подключения I2C устройств, используйте I2C сканер, сразу видно количество подключенных устройств и их адреса + удобно для устройств с изменяемыми адресами (типа LCD на I2C). Если кол-во адресов меньше подключенных устройств, значит где то ошибка в подключении. 
Ну и BMP подключайте либо к I2C, либо к SPI, к обоим сразу не надо. 

Jomaxplayer
Offline
Зарегистрирован: 30.11.2016

Спасибо)))

Jomaxplayer
Offline
Зарегистрирован: 30.11.2016

Большое спасибо за развернутый ответ.