проблемы с инициализацией двух модулей в void setup
- Войдите на сайт для отправки комментариев
всем привет.
есть anarduino+MW RF96(LoRa) http://www.anarduino.com/miniwireless/#
к ней подключены пара термосенсоров DS18B20.
стандартный пример Multiple от OneWire+DallasTemperatule работает отлично:
Dallas Temperature IC Control Library Demo
Locating devices...Found 2 devices.
Parasite power is: ON
Device ts5 Address: 28BE9EEA05000078
Device ts6 Address: 28C2F8EA05000010
Device ts5 Resolution: 9
Device ts6 Resolution: 9
Requesting temperatures...DONE
Device Address: 28BE9EEA05000078 Temp C: 24.00 Temp F: 75.20
Device Address: 28C2F8EA05000010 Temp C: 24.50 Temp F: 76.10
Requesting temperatures...DONE
Device Address: 28BE9EEA05000078 Temp C: 24.00 Temp F: 75.20
Device Address: 28C2F8EA05000010 Temp C: 24.50 Temp F: 76.10
Requesting temperatures...DONE
но мне нужно передавать инфу о температуре через MW модуль.
для этого использую стандарный пример rf95_reliable_datagram_server от единственной библиотеки LoRa для Arduino - RadioHead http://www.airspayce.com/mikem/arduino/RadioHead/index.html
сам пример работает нормально (в связке с вторым девайсом на котором работает ответная часть - rf95_reliable_datagram_client)
но вот когда я пытаюсь добавить в него код определения температуры - происходит странное.
в каждом коде (Multiple и rf95_reliable_datagram_server) есть часть void setup, в которой происходит инициализация переменных и модулей.
все вместе выглядит так :
void setup()
{
Serial.begin(9600);
// ИНИЦИАЛИЗАЦИЯ ДЛЯ РАДИО-МОДУЛЯ
if (!manager.init())
Serial.println(">>>>>init failed");
// Defaults after init are 434.0MHz, 13dBm, Bw = 125 kHz, Cr = 4/5, Sf = 128chips/symbol, CRC on
else Serial.println(">>>>>init server ok");
// ИНИЦИАЛИЗАЦИЯ ДЛЯ ТЕРМОСЕНСОРОВ
//sensors >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Serial.println("Dallas Temperature IC Control Library Demo");
// Start up the library
sensors.begin();
// locate devices on the bus
Serial.print("Locating devices...");
Serial.print("Found ");
Serial.print(sensors.getDeviceCount(), DEC);
Serial.println(" devices.");
// report parasite power requirements
Serial.print("Parasite power is: ");
if (sensors.isParasitePowerMode()) Serial.println("ON");
else Serial.println("OFF");
// show the addresses we found on the bus
Serial.print("Device ts5 Address: ");
printAddress(ts5);
Serial.println();
Serial.print("Device ts6 Address: ");
printAddress(ts6);
Serial.println();
// set the resolution to 9 bit
sensors.setResolution(ts5, TEMPERATURE_PRECISION);
sensors.setResolution(ts6, TEMPERATURE_PRECISION);
Serial.print("Device ts5 Resolution: ");
Serial.print(sensors.getResolution(ts5), DEC);
Serial.println();
Serial.print("Device ts6 Resolution: ");
Serial.print(sensors.getResolution(ts6), DEC);
Serial.println();
//sensors <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
}
так вот в этом случае НЕ работает определение термосенсоров. на вывод приходит вот такое:
>>>>>init server ok
Dallas Temperature IC Control Library Demo
Locating devices...Found 0 devices.
Parasite power is: OFF
Device ts5 Address: 28BE9EEA05000078
Device ts6 Address: 28C2F8EA05000010
Device ts5 Resolution: 0
Device ts6 Resolution: 0
Requesting temperatures...DONE
Device Address: 28BE9EEA05000078 Temp C: -127.00 Temp F: -196.60
Device Address: 28C2F8EA05000010 Temp C: -127.00 Temp F: -196.60
Requesting temperatures...DONE
Device Address: 28BE9EEA05000078 Temp C: -127.00 Temp F: -196.60
Device Address: 28C2F8EA05000010 Temp C: -127.00 Temp F: -196.60
не находит термосенсоров - Locating devices...Found 0 devices.
хотя если закоментировать код для инициалиации радио-модуля, то сенсоры определяются и нормально отображается температура с них.
но без инициализации радио-модуля я не смогу дальше работать с кодом для передачи данных..
короче - вопрос такой - почему "ломается" все таким вот образом? может нельзя в void setup инициализировать два разных модуля?
может это какие-то проблемы с памятью и она перезаписывается или просто не хватает ее..
на сайте девайса указано:
MiniWireless Features:
- Designed & Built in the USA **
- ATmega328, 16Mhz
- LDO Voltage Regulator
- 128 Mbit flash memory
- Real Time Clock (RTC)
- 64B RTC Static Ram
я так и не понял сколько у меня доступно памяти по сравнению с обычной ардуиной.
Нужен совет как быть в этой ситуации - нужно снимать температуру и передавать ее..
кажетcя проблема была в том, что data pin OneWire шины был на 10 пине Anarduino
поменял на 9 - все заработало.
Используйте просто OneWire, результат тот же, а 1,5К сэкономите. И можно ликвидировать задержку программы на 750мС.
да хз как на одном OneWire много датчиков обрабатывать..
может и можно, но я пока не знаю как.
Наберите здесь в поиске "Dimax DS18B20", там что то вроде "Поправил пример ......". Он много лишнего повыкидывал, а библиотека Dall...Temp.... полностью работает на основе OneWire. Лично мне нравится намного больше, а главное ликвидация этой задержки.
нашел, спасибо!
http://arduino.ru/forum/programmirovanie/pochistil-sketch-primera-raboty...
Попробуйте включить без паразитного питания и посмотреть, сохранится тенденция или нет. Я обычно по трех проводной всегда включаю, мало что могу в данном случае посоветовать.
без паразитного работает..
беда в том что надо именно с ним - другие датчики, которые надо подключить к девайсу были отрезаны от таких цифровых термометров
http://www.aholod.ru/item/4905/
https://scontent.xx.fbcdn.net/hphotos-xfp1/v/t34.0-12/12179806_959784874...
и они там двухпроводные.
Вариант подпитки из даташита, но на макетке и так должно работать. Может действительно датчик глючный?????
ну вот он "глючит" именно тким образом - если он не первый при проверке.
не могу понять, что за подпитка. даташит смотрю, четото не понимаю - там схема есть?
а еще такой вопрос - вот пример Dimax работает через прерывания, то есть постоянно практически, даже когда и не нужно.
а мне вот еще хочется добавить в программу возможность засыпания ардуины, чтобы батарею экономить.
и получается такой вот способ опроса датчиков будет мешать этому сну?
то есть в идеале, мне нужно это в виде функции, которая будет "недорогой" в смысле памяти и производительности, и главное - стабильной, не приводящей к зависаниям.
потом результаты этой функции я смогу передавать по воздуху в цикле loop..
По порядку:
В той ссылке которую дал, на 6 странице. И посмотрите по сайту, вроде где то и схему рабочую выкладывали и пояснения (может не здесь).
Dimax делал как пример, уберите собаку и оставьте себе только работу с датчиками. Получится две функции: 1 - Подача команды на преобразование. 2- Получение и обработка данных. Между ними организовываете задержку на 750мС или сколько надо от установленного разрешения. Вызываете последовательно, когда требуется.
у меня получилось сделать в виде одной функции:
//sensors >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> void getTemp(){ static boolean n=0; // флаг работы: запрос температуры или её чтение n=!n; if (n) {ds.reset(); // сброс шины ds.write(0xCC);//обращение ко всем датчикам ds.write(0x44,1);// with parasite power on at the end } else { ds.reset(); ds.select(addr0); ds.write(0xBE); // Read Scratchpad (чтение регистров) temp0 = ds.read() | (ds.read()<<8); //прочитаны 2 байта ds.reset(); ds.select(addr1); ds.write(0xBE); // Read Scratchpad (чтение регистров) temp1 = ds.read() | (ds.read()<<8); //прочитаны 2 байта ds.reset(); ds.select(addr2); ds.write(0xBE); // Read Scratchpad (чтение регистров) temp2 = ds.read() | (ds.read()<<8); //прочитаны 2 байта ds.reset(); ds.select(addr3); ds.write(0xBE); // Read Scratchpad (чтение регистров) temp3 = ds.read() | (ds.read()<<8); //прочитаны 2 байта ds.reset(); ds.select(addr4); ds.write(0xBE); // Read Scratchpad (чтение регистров) temp4 = ds.read() | (ds.read()<<8); //прочитаны 2 байта ds.reset(); ds.select(addr5); ds.write(0xBE); // Read Scratchpad (чтение регистров) temp5 = ds.read() | (ds.read()<<8); //прочитаны 2 байта ds.reset(); ds.select(addr6); ds.write(0xBE); // Read Scratchpad (чтение регистров) temp6 = ds.read() | (ds.read()<<8); //прочитаны 2 байта } } //sensors <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<вызываю ее в лупе:
Если радиоканал, боюсь постоянно включенный приемник скушает всю экономию от сна. Быстрее уж отсылать через определенные промежутки времени, а в остальное спать всем устройствам кроме будильника.
ну да.. этот вариант просто есть частный случай.
действительно незачем все время слушать эфир. достаточно делать это периодически.
но вот вопрос - насколько часто, чтобы это было и экономно и удобно с точки зрения пользователя?
раз в минуту просыпаться и слушать эфир? или раз в полминуты?
достустим раз в минуту - это 60 раз в час, 1440 раз в сутки.
если допустим что при этом девайс будет потреблять 20mA в обычном режиме и 0.05 в sleep.
допустим он питается от аккума 2000 mA/ч
в обычном режиме батарея умрет за 2000/20 == 100 часов. это примерно 4 дня.
а как подсчитать насколько хватит батареи с учетом того, что девайс будет засыпать и раз в минуту, около 5 секунд будет кушать 20mA а все остальное время 0.05mA ?
значит в 1 минуту девайс будет в течении 5 сек. потреблять 20mA.
в 1 час это будет уже 300 сек == 5 минут такого потребления и 1.7mA потребления.
значит в течении часа работы в таком режиме девайс будет потреблять около 2mA в обычном режиме + оставшее время будет спать, потребляя при этом 0.045mA
Итого в час выйдет ну максимум 3mA.
2000/3 = 667 часов == 27 дней.
я верно подсчитал?
Здесь я пас)))). У меня все прикладное на 220, поэтому таких вопросов не возникает. Может другие что подскажут.
Используйте просто OneWire, результат тот же, а 1,5К сэкономите. И можно ликвидировать задержку программы на 750мС.
setWaitForConversion(false);
Только датчик от этого моментально измерять не начнет.
У каждого свой вкус. Только не нашел я в ней ничего, что оправдает 1,5К использованной памяти. ИМХО