Зависание Arduino uno R3
- Войдите на сайт для отправки комментариев
Всем привет. Собирал мини проект, на скорую руку. Мини метеостаниция. И наткнулся на две проблеммы. Надеюсь вы не будете судить строго, ну и поможете мне умным ответом или где посмотреть.
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(); }
1. ... Получается нельзя подключить сразу несколько элементов с SCL и SDA?
Можно. Ибо это шина I2C. Почитайте про нее. В гугле про неё много. Если останутся вопросы - приходите.
Спасибо, а про зависание можете что нибдь сказать? или это все относится к интерфейсу I2C, и разобравшись с ним разбирусь и с двумя проблеммами одновременно?
Первое что говорят в вопросах о "хаотичных" зависаниях/перезагрузках - проверяйте питание. Более конкретно сейчас сказать невозможно, слишком много факторов влияют, начните все таки со стабильного питания.
... со стабильного питания.
Спасибо, но это я первое что сделал. организовал для каждого датчика стабильное питание. Полностью избавился от подпитки от платы, тоже думал что дело в этом. Мне просто кажется что пины (Прошу извенение что сразу не указал), датчика BMP280 подключенные к 13,12,11 порту которые соответствуют MOSI-11, MISO-12, SCK-13. У меня подозрения что эти порты враждуют между собой если к ним подключить два устройства которые работают по I2C интерфейсу. Просто BMP280 можно подключить как A4, A5 так и к 13, 12, 11, и четвертый любой.
1. ... Получается нельзя подключить сразу несколько элементов с SCL и SDA?
Ибо это шина I2C.
Спасибо за совет))).
...пины (Прошу извенение что сразу не указал), датчика 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к, нужно будет выпаять резисторы из части плат.
Для проверки корректности подключения I2C устройств, используйте I2C сканер, сразу видно количество подключенных устройств и их адреса + удобно для устройств с изменяемыми адресами (типа LCD на I2C). Если кол-во адресов меньше подключенных устройств, значит где то ошибка в подключении.
Ну и BMP подключайте либо к I2C, либо к SPI, к обоим сразу не надо.
Спасибо)))
Большое спасибо за развернутый ответ.