Arduino Pro Mini

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Аватара пользователя
ser009
Сообщения: 595
Зарегистрирован: Сб окт 13, 2012 9:55 am

Re: Arduino Pro Mini

Сообщение ser009 »

dmw
Слушай а может фото есть устройства в работе, а лучше маленькое видео, демонстрация??? вообще шикарно будет!!!
PAV
Сообщения: 970
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва

Re: Arduino Pro Mini

Сообщение PAV »

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

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

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

Re: Arduino Pro Mini

Сообщение 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);
  }
} 
PAV
Сообщения: 970
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва

Re: Arduino Pro Mini

Сообщение PAV »

Завис... мозг. Разбираюсь ;) Спасибо.

Я правильно понимаю, что тип Т - это в моем случае передача данных - температура, там и проч? А N - это просто обновление таблицы активных узлов?
dmw
Сообщения: 469
Зарегистрирован: Вт мар 12, 2013 1:22 am

Re: Arduino Pro Mini

Сообщение 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 - команда не известная или ошибка
и т.д и т.п. много еще всяких других
PAV
Сообщения: 970
Зарегистрирован: Пт дек 06, 2013 11:30 am
Откуда: Москва

Re: Arduino Pro Mini

Сообщение PAV »

Все, въехал, пошел переписывать под себя. Спасибо
azh122
Сообщения: 113
Зарегистрирован: Вт янв 28, 2014 5:33 pm

Re: Arduino Pro Mini

Сообщение azh122 »

dmw писал(а): бывает периодически (последний раз пару месяцев назад) какой нибудь узел виснет...
А вот тут можно поподробнее?
Это из за чего и как проявляется? Бежать и перезагружать?
Сторожевой таймер не спасает?
dmw
Сообщения: 469
Зарегистрирован: Вт мар 12, 2013 1:22 am

Re: Arduino Pro Mini

Сообщение dmw »

Ктобы знал.
Ватчдог только на базе активирован, надо везде включить. Кстати только база и не висла ниразу, ттт.
Спасибо что напомнили.
azh122
Сообщения: 113
Зарегистрирован: Вт янв 28, 2014 5:33 pm

Re: Arduino Pro Mini

Сообщение azh122 »

у меня все глюки - если есть перепады по току на порядок и больше.
спит мк, просыпается, включает че-нить (реле, передатчик) - стопудово рано или поздно глюк будет.
Можно конечно из пушки по воробьям (бп до супер-пупер доводить), но проще дога взвести...
Vip
Сообщения: 86
Зарегистрирован: Вт авг 28, 2012 5:36 pm
Откуда: Kiev, Ukraine

Re: Arduino Pro Mini

Сообщение Vip »

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