arduino виснет при опросе bmp180

u
Offline
Зарегистрирован: 01.06.2018

Ардуино 3 клон ch340. Подключил бмп180 и используя библу modbusrtu вывел на комп через модбас opc-сервер. Работает минут 5-10 потом ардуина перегружается и опрос прекращается. Не помогает ни ресет ни даже перетык usb. перезаливка скетча помогает, но через несколько минут ситуация повторяется. Поменял бмп-шку - то же самое. Поменял ардуинку - тоже самое. От безысходности припаял подтяжки sda|scl по 7K и вроде вот уже как сутки работает. На плате bmp резисторы присутствуют 4.6К хотя по докам на I2C вроде должны быть 10K. Братья и сестры, кто-нибудь сталкивался с такой ситуацией?

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

Ви таки сперва свою бмп-шку покрутите на обычном примере без всяких модбасов. Тогда можно будет решить, что и...т моск.
И таки да, без скетча и схемы ваш вопрос превращается в указы о повышении благосостояния, продолжительности и качества жизни.(((((

u
Offline
Зарегистрирован: 01.06.2018

Честно, не от лени. Схему приводить смысла нет, она везде одна и та же 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();
}

 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Такого, чтобы reset и отрубание питания не помогал - не было. Избавьтесь от delay() (см. "blink без delay"). А если засунете в код моргалку светодиодом, то будете точно знать - помогает или нет reset.

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

u пишет:

Схему приводить смысла нет

Тогда и тратить на Вас время смысла нет.

Тем более, что она у Вас какая-то уникальная

u пишет:

sda-A4|sdl-A5.

т.к. я, например, никогда там не видел никакого sdl

Кстати, что за хрень в строке 25? Она означает, "если с первого раза не проинициализировалась, то повиснуть намертво и больше не рыпаться никогда"

u
Offline
Зарегистрирован: 01.06.2018

sadman41, спасибо! Делэй конечно надо убирать. Вообще собираюсь переделать опрос датчика на событие по модбасу. loop в принципе не самое удачное размещение.

ЕвгенийП, sdl опечатка scl этож так не очевидно. Не надо Вам время на меня тратить. Ищите опечатки, продолжайте хамить, повышайте чсв.

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

u пишет:

Не надо Вам время на меня тратить

А никто и не собирался.