arduino виснет при опросе bmp180
- Войдите на сайт для отправки комментариев
Пт, 01/06/2018 - 03:18
Ардуино 3 клон ch340. Подключил бмп180 и используя библу modbusrtu вывел на комп через модбас opc-сервер. Работает минут 5-10 потом ардуина перегружается и опрос прекращается. Не помогает ни ресет ни даже перетык usb. перезаливка скетча помогает, но через несколько минут ситуация повторяется. Поменял бмп-шку - то же самое. Поменял ардуинку - тоже самое. От безысходности припаял подтяжки sda|scl по 7K и вроде вот уже как сутки работает. На плате bmp резисторы присутствуют 4.6К хотя по докам на I2C вроде должны быть 10K. Братья и сестры, кто-нибудь сталкивался с такой ситуацией?
Ви таки сперва свою бмп-шку покрутите на обычном примере без всяких модбасов. Тогда можно будет решить, что и...т моск.
И таки да, без скетча и схемы ваш вопрос превращается в указы о повышении благосостояния, продолжительности и качества жизни.(((((
Честно, не от лени. Схему приводить смысла нет, она везде одна и та же sda-A4|sdl-A5. Без модбаса пробовал конечно, ну вот скетч х..ли там все просто:
#include <DHT.h> #include <ModbusRtu.h> #include <Adafruit_BMP085.h> //dht22 #define ID 1 #define DHTPIN 3 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); struct Pair; Pair Foo(float f); //bmp180 Adafruit_BMP085 bmp; //modbus Modbus slave(ID, 0, 0); int8_t state = 0; uint16_t au16data[15]; void setup() { dht.begin(); slave.begin(9600); if (!bmp.begin()) { while (1) {} } } void loop() { state = slave.poll(au16data, 15); io_poll(); delay(500); } struct Pair { uint16_t n1; uint16_t n2; }; Pair Foo(float f) { Pair p; char float_bytes[sizeof(float)]; memcpy(float_bytes, &f, sizeof(float)); p.n1 = float_bytes[1] | (float_bytes[0] << 8); p.n2 = float_bytes[3] | (float_bytes[2] << 8); return p; } void io_poll() { //bmp180 sensors float T = bmp.readTemperature(); au16data[0] = Foo(T).n1; au16data[1] = Foo(T).n2; float P = bmp.readPressure() * 0.00750062; au16data[2] = Foo(P).n1; au16data[3] = Foo(P).n2; float A = bmp.readAltitude(101325); au16data[4] = Foo(A).n1; au16data[5] = Foo(A).n2; float As = bmp.readSealevelPressure()* 0.00750062; au16data[6] = Foo(As).n1; au16data[7] = Foo(As).n2; //dht22 sensors float H = dht.readHumidity(); au16data[8] = Foo(H).n1; au16data[9] = Foo(H).n2; float T_dth = dht.readTemperature(); au16data[10] = Foo(T_dth).n1; au16data[11] = Foo(T_dth).n2; //serviceInfo au16data[12] = slave.getInCnt(); au16data[13] = slave.getOutCnt(); au16data[14] = slave.getErrCnt(); }Такого, чтобы reset и отрубание питания не помогал - не было. Избавьтесь от delay() (см. "blink без delay"). А если засунете в код моргалку светодиодом, то будете точно знать - помогает или нет reset.
Схему приводить смысла нет
Тогда и тратить на Вас время смысла нет.
Тем более, что она у Вас какая-то уникальная
sda-A4|sdl-A5.
т.к. я, например, никогда там не видел никакого sdl
Кстати, что за хрень в строке 25? Она означает, "если с первого раза не проинициализировалась, то повиснуть намертво и больше не рыпаться никогда"
sadman41, спасибо! Делэй конечно надо убирать. Вообще собираюсь переделать опрос датчика на событие по модбасу. loop в принципе не самое удачное размещение.
ЕвгенийП, sdl опечатка scl этож так не очевидно. Не надо Вам время на меня тратить. Ищите опечатки, продолжайте хамить, повышайте чсв.
Не надо Вам время на меня тратить
А никто и не собирался.