проблемы с инициализацией двух модулей в 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мС или сколько надо от установленного разрешения. Вызываете последовательно, когда требуется.
у меня получилось сделать в виде одной функции:
вызываю ее в лупе:
Если радиоканал, боюсь постоянно включенный приемник скушает всю экономию от сна. Быстрее уж отсылать через определенные промежутки времени, а в остальное спать всем устройствам кроме будильника.
ну да.. этот вариант просто есть частный случай.
действительно незачем все время слушать эфир. достаточно делать это периодически.
но вот вопрос - насколько часто, чтобы это было и экономно и удобно с точки зрения пользователя?
раз в минуту просыпаться и слушать эфир? или раз в полминуты?
достустим раз в минуту - это 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К использованной памяти. ИМХО