Страница 3 из 4

Re: Arduino Pro Mini

Добавлено: Ср апр 16, 2014 6:34 pm
ser009
dmw
Слушай а может фото есть устройства в работе, а лучше маленькое видео, демонстрация??? вообще шикарно будет!!!

Re: Arduino Pro Mini

Добавлено: Чт апр 17, 2014 6:39 am
PAV
а можно адрес каждой принимающей записать в нее изначально?
Мы поэтому и просим рабочие примеры, что с ними разбираться проще.

Вот есть действующий пример связки - одна мега, два мини? Чтобы мини отчитывались, а мега принимала и иногда отправляла команды? В примере ардуины - связка из двух, и как добавить третью?
Поверьте, эти вопросы только вам кажутся тупыми, а для нас пока нет ;)

В качестве примера, вон в соседней ветке спрашивают как команду с MJD отправить на девайс. Я сейчас точно знаю - $cmdUrl = "ip. "/command?100," . $t
getURL($cmdUrl,0);
Но чтобы это узнать я неделю наверное убил. Зачем же всем морочиться?
Я, например, попробовал NRF - с наскоку не получилось, я отложил. А так бы уже сегменты работали ;)

Re: Arduino Pro Mini

Добавлено: Чт апр 17, 2014 7:50 am
dmw
Немного упростил пример от maniac и перевел коментарии. Попробуйте, ато у меня все дуины заняты.
Вроде компилируется без ошибок:

Код: Выделить всё

#include <RF24Network.h>   // отсюда: https://github.com/maniacbug/RF24Network
#include <RF24.h>          // отсюда: https://github.com/maniacbug/RF24
#include <SPI.h>

// Конфигурация модуля nRF24L01(+). Назначаем пины CE и CSP,
// по умолчанию используются 9,10 но они заняты ethernet-шилдом,
// если он установлен то для RF24 выбираем другие
RF24 radio(/*cepin*/ 6, /*cspin*/ 7);
RF24Network network(radio);

// Адрес нашего узла
uint16_t this_node = 01;

// Устанавливаем периуд задержки между посылками ping
const unsigned long interval = 2000; // мс
unsigned long last_time_sent;

// Массив с известными нам узлами
const short max_active_nodes = 10;
uint16_t active_nodes[max_active_nodes];
short num_active_nodes = 0;
short next_ping_node_index = 0;

// Описание функций отправки и обработки пакетов
bool send_T(uint16_t to);
bool send_N(uint16_t to);
void handle_T(RF24NetworkHeader& header);
void handle_N(RF24NetworkHeader& header);
void add_node(uint16_t node);

void setup(void)
{
  Serial.begin(57600);  
  // Инициализируем беспроводной модуль
  SPI.begin();
  radio.begin();
  network.begin(/*канал*/ 100, /*адрес этого узла*/ this_node );
}

void loop(void)
{
  network.update();    // Регулярно вызываем обработчик пакетов в сети. Это обязательно!
  while (network.available())   // Есть в эфире что нибудь для нас?
  {
    // Если есть, то посмотрим что там пришло
    RF24NetworkHeader header;
    network.peek(header);
    // Передаем сообщение нужному обработчику, в зависимости от заголовка в пакете.
    switch (header.type)
    {
    case 'T':
      handle_T(header);
      break;
    case 'N':
      handle_N(header);
      break;
    default:
      printf_P(PSTR("*** WARNING *** Unknown message type %c\n\r"),header.type);
      network.read(header,0,0);
      break;
    };
  }

  // Отправляем ping активным узлам каждые 'interval' мс
  unsigned long now = millis();
  if ( now - last_time_sent >= interval )  {
    last_time_sent = now;

    // Кому мы должны отправить?
    uint16_t to = 00;                                   // По умолчанию отправим на базу
    if (num_active_nodes) {                             // Или если у нас есть активные узлы,
      to = active_nodes[next_ping_node_index++];        // отправим на след. активный узел
      if ( next_ping_node_index > num_active_nodes ) {  // Если перебор узлов закончен
        next_ping_node_index = 0;                       // то в следующий раз начнем с начала
        to = 00;                                        // а сейчас отправим на узел 00.
      }
    }
    bool ok;

    // Если этот узел является обычным, то отприм пакет типа 'T' (ping)
    if ( this_node > 00 || to == 00 )
      ok = send_T(to);
    // Елси он базовый, то будем отправлять список всех активных узлов всем
    else
      ok = send_N(to);

    // Сообщаем о результатах
    if (ok) {
      printf_P(PSTR("%lu: APP Send ok\n\r"),millis());}
    else    {
      printf_P(PSTR("%lu: APP Send failed\n\r"),millis());
      last_time_sent -= 100; // В следующий раз попробуем отправить на 100мс раньше
    }
  }
}

//__________________________________отправка сообщений___________________________________________
// Отправка пинга. Тут будем отправлять пакет с меткой 'T', это просто переменная ulong, содержащая время millis()
bool send_T(uint16_t to) {
  RF24NetworkHeader header(/*Кому*/ to, /*Тип*/ 'T' /*Time*/);
  unsigned long message = millis();
  printf_P(PSTR("---------------------------------\n\r"));
  printf_P(PSTR("%lu: APP Sending %lu to 0%o...\n\r"),millis(),message,to);
  return network.write(header,&message,sizeof(unsigned long));
}

//Отправка пакета с типом метки 'N', это список активных узлов (таблица)
bool send_N(uint16_t to) {
  RF24NetworkHeader header(/*Кому*/ to, /*Тип*/ 'N' /*Nodes*/);
  printf_P(PSTR("---------------------------------\n\r"));
  printf_P(PSTR("%lu: APP Sending active nodes to 0%o...\n\r"),millis(),to);
  return network.write(header,active_nodes,sizeof(active_nodes));
}

//__________________________________функции обработки приенятых сообщений____________________________
// Обработчик полученных сообщений с заголовком типа 'T'. Просто добавляем узел в список активных узлов
void handle_T(RF24NetworkHeader& header) {
  unsigned long message;
  network.read(header,&message,sizeof(unsigned long));
  printf_P(PSTR("%lu: APP Received %lu from 0%o\n\r"),millis(),message, header.from_node);
  // Если сообщение пришло от самих себя или от базы, то не будем добавлять узел в список активных
  if ( header.from_node != this_node || header.from_node > 00 )
    add_node(header.from_node);
}

// Обработчик сообщений с заголовком типа 'N' - список активных узлов. Обновляем свой список узлов.
void handle_N(RF24NetworkHeader& header) {
  static uint16_t incoming_nodes[max_active_nodes];
  network.read(header,&incoming_nodes,sizeof(incoming_nodes));
  printf_P(PSTR("%lu: APP Received nodes from 0%o\n\r"),millis(),header.from_node);
  int i = 0;
  while ( i < max_active_nodes && incoming_nodes[i] > 00 )
    add_node(incoming_nodes[i++]);
}

//__________________________________работа со списком активных узлов____________________________
// Добавим конкретный узел в список активных
void add_node(uint16_t node) {
  // Мы уже знаем этот узел?
  short i = num_active_nodes;
  while (i--) {
    if (active_nodes[i] == node)
      break;
  }
  // если нет, то добавляем его в таблицу
  if (i == -1 && num_active_nodes < max_active_nodes) {
    active_nodes[num_active_nodes++] = node;
    printf_P(PSTR("%lu: APP Added 0%o to list of active nodes.\n\r"),millis(),node);
  }
} 

Re: Arduino Pro Mini

Добавлено: Пт апр 18, 2014 9:57 am
PAV
Завис... мозг. Разбираюсь ;) Спасибо.

Я правильно понимаю, что тип Т - это в моем случае передача данных - температура, там и проч? А N - это просто обновление таблицы активных узлов?

Re: Arduino Pro Mini

Добавлено: Пт апр 18, 2014 10:43 am
dmw
Ничего это не означает, это просто буква. Хоть "Z" назовите.
Так просто удобнее различать на приемном конце что же это за сообщение.
В данном примере "T" (time) - сообщение содержит метку времени, "N" (nodes) - в сообщении список узлов.
Можно для себя определиться и назначить как удобно самостоятельно, главное чтоб был unsigned char (или число 0-127: http://arduino.ru/Reference/ASCIIchart).
У меня так:
‘a’ - запрос на состояние аналогового пина (в самом сообщении номер пина).
‘d’ - запрос на состояние цифрового пина (в самом сообщении номер пина).
‘D’ - установить на цифровом пине (в самом сообщении номер пина и какое должно быть значение 0/1).
‘t’ - запрос температуры и влажности с датчика DHT (в самом сообщении порядковый номером датчика если их несколько)
‘B’ - Включить/выключить зуммер (в сообщении 0 - включить, 1 - выключить)
‘I’ - Послать управляющий ИК сигнал (в сообщении кодовая последовательность кнопки пульта)
0 - если команда выполнена и в сообщении ответ
9 - команда не известная или ошибка
и т.д и т.п. много еще всяких других

Re: Arduino Pro Mini

Добавлено: Пт апр 18, 2014 11:53 am
PAV
Все, въехал, пошел переписывать под себя. Спасибо

Re: Arduino Pro Mini

Добавлено: Пт апр 18, 2014 2:03 pm
azh122
dmw писал(а): бывает периодически (последний раз пару месяцев назад) какой нибудь узел виснет...
А вот тут можно поподробнее?
Это из за чего и как проявляется? Бежать и перезагружать?
Сторожевой таймер не спасает?

Re: Arduino Pro Mini

Добавлено: Пт апр 18, 2014 3:04 pm
dmw
Ктобы знал.
Ватчдог только на базе активирован, надо везде включить. Кстати только база и не висла ниразу, ттт.
Спасибо что напомнили.

Re: Arduino Pro Mini

Добавлено: Пт апр 18, 2014 8:44 pm
azh122
у меня все глюки - если есть перепады по току на порядок и больше.
спит мк, просыпается, включает че-нить (реле, передатчик) - стопудово рано или поздно глюк будет.
Можно конечно из пушки по воробьям (бп до супер-пупер доводить), но проще дога взвести...

Re: Arduino Pro Mini

Добавлено: Ср июн 04, 2014 8:53 pm
Vip
Подвисали ноды, после того как припаял 10мФ между контактами 3.3v и GND на nrf24l01+, зависания прекратились.
azh122, а можете пример скетча с реализацией вотчдога. Он у вас в цикл перезагрузки не уходит при зависании мк?
Только копаю эту тему, но везде как-то расплывчато и пессимистично описан процесс взвода и контроля вотчдога на Pro Mini 5V...