проблемы с инициализацией двух модулей в void setup

d00m
Offline
Зарегистрирован: 21.02.2013

всем привет.

есть 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

я так и не понял сколько у меня доступно памяти по сравнению с обычной ардуиной.

Нужен совет как быть в этой ситуации - нужно снимать температуру и передавать ее..

 

 

d00m
Offline
Зарегистрирован: 21.02.2013

кажетcя проблема была в том, что data pin OneWire шины был на 10 пине Anarduino 

поменял на 9 - все заработало.

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

Используйте просто OneWire, результат тот же, а 1,5К сэкономите. И можно ликвидировать задержку программы на 750мС.

d00m
Offline
Зарегистрирован: 21.02.2013

да хз как на одном OneWire много датчиков обрабатывать..

может и можно, но я пока не знаю как.

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

Наберите здесь в поиске "Dimax DS18B20", там что то вроде "Поправил пример ......". Он много лишнего повыкидывал, а библиотека Dall...Temp.... полностью работает на основе OneWire. Лично мне нравится намного больше, а главное ликвидация этой задержки.

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

Попробуйте включить без паразитного питания и посмотреть, сохранится тенденция или нет. Я обычно по трех проводной всегда включаю, мало что могу в данном случае посоветовать.

d00m
Offline
Зарегистрирован: 21.02.2013

без паразитного работает..

беда в том что надо именно с ним - другие датчики, которые надо подключить к девайсу были отрезаны от таких цифровых термометров

http://www.aholod.ru/item/4905/

https://scontent.xx.fbcdn.net/hphotos-xfp1/v/t34.0-12/12179806_959784874...

и они там двухпроводные.

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

Вариант подпитки из даташита, но на макетке и так должно работать. Может действительно датчик глючный?????

d00m
Offline
Зарегистрирован: 21.02.2013

ну вот он "глючит" именно тким образом - если он не первый при проверке.

не могу понять, что за подпитка. даташит смотрю, четото не понимаю - там схема есть? 

d00m
Offline
Зарегистрирован: 21.02.2013

а еще такой вопрос - вот пример Dimax работает через прерывания, то есть постоянно практически, даже когда и не нужно.

а мне вот еще хочется добавить в программу возможность засыпания ардуины, чтобы батарею экономить.

и получается такой вот способ опроса датчиков будет мешать этому сну?

то есть в идеале, мне нужно это в виде функции, которая будет "недорогой" в смысле памяти и производительности, и главное - стабильной, не приводящей к зависаниям.

потом результаты этой функции я смогу передавать по воздуху в цикле  loop.. 

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

По порядку:

В той ссылке которую дал, на 6 странице.  И посмотрите по сайту, вроде где то и схему рабочую выкладывали и пояснения (может не здесь).

Dimax делал как пример, уберите собаку и оставьте себе только работу с датчиками. Получится две функции: 1 - Подача команды на преобразование. 2- Получение и обработка данных. Между ними организовываете задержку на 750мС или сколько надо от установленного разрешения. Вызываете последовательно, когда требуется.

d00m
Offline
Зарегистрирован: 21.02.2013

у меня получилось сделать в виде одной функции:

//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 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

вызываю ее в лупе:

void loop()
{
 
getTemp();
//Serial.print("T0=");
tdata[0]=temp0/16.0;
...
 
в общем с этим разобрался. 
теперь надо научить сервер спать и просыпаться по какойто команде от клиента, которая приходит по радиоканалу.
если это вообще хороший вариант, в контексте экономии батареи.
может быть лучше будет спать и просыпаться раз в какой-то период времени и слушать, нет ли запроса от клиента? если есть - измерять сенсоры и передавать данные клиенту и снова засыпать. если нет - снова уходить в сон..
 
bwn
Offline
Зарегистрирован: 25.08.2014

Если радиоканал, боюсь постоянно включенный приемник скушает всю экономию от сна. Быстрее уж отсылать через определенные промежутки времени, а в остальное спать всем устройствам кроме будильника.

d00m
Offline
Зарегистрирован: 21.02.2013

ну да.. этот вариант просто есть частный случай.

действительно незачем все время слушать эфир. достаточно делать это периодически.

но вот вопрос - насколько часто, чтобы это было и экономно и удобно с точки зрения пользователя?

раз в минуту просыпаться и слушать эфир? или раз в полминуты?

достустим раз в минуту - это 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 дней.

я верно подсчитал?

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

Здесь я пас)))). У меня все прикладное на 220, поэтому таких вопросов не возникает. Может другие что подскажут.

Radjah
Offline
Зарегистрирован: 06.08.2014

bwn пишет:

Используйте просто OneWire, результат тот же, а 1,5К сэкономите. И можно ликвидировать задержку программы на 750мС.

setWaitForConversion(false);

Только датчик от этого моментально измерять не начнет.

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

У каждого свой вкус. Только не нашел я в ней ничего, что оправдает 1,5К использованной памяти. ИМХО