Arduino Pro Mini
Модератор: immortal
Re: Arduino Pro Mini
dmw
Слушай а может фото есть устройства в работе, а лучше маленькое видео, демонстрация??? вообще шикарно будет!!!
Слушай а может фото есть устройства в работе, а лучше маленькое видео, демонстрация??? вообще шикарно будет!!!
Re: Arduino Pro Mini
а можно адрес каждой принимающей записать в нее изначально?
Мы поэтому и просим рабочие примеры, что с ними разбираться проще.
Вот есть действующий пример связки - одна мега, два мини? Чтобы мини отчитывались, а мега принимала и иногда отправляла команды? В примере ардуины - связка из двух, и как добавить третью?
Поверьте, эти вопросы только вам кажутся тупыми, а для нас пока нет
В качестве примера, вон в соседней ветке спрашивают как команду с MJD отправить на девайс. Я сейчас точно знаю - $cmdUrl = "ip. "/command?100," . $t
getURL($cmdUrl,0);
Но чтобы это узнать я неделю наверное убил. Зачем же всем морочиться?
Я, например, попробовал NRF - с наскоку не получилось, я отложил. А так бы уже сегменты работали
Мы поэтому и просим рабочие примеры, что с ними разбираться проще.
Вот есть действующий пример связки - одна мега, два мини? Чтобы мини отчитывались, а мега принимала и иногда отправляла команды? В примере ардуины - связка из двух, и как добавить третью?
Поверьте, эти вопросы только вам кажутся тупыми, а для нас пока нет
В качестве примера, вон в соседней ветке спрашивают как команду с MJD отправить на девайс. Я сейчас точно знаю - $cmdUrl = "ip. "/command?100," . $t
getURL($cmdUrl,0);
Но чтобы это узнать я неделю наверное убил. Зачем же всем морочиться?
Я, например, попробовал NRF - с наскоку не получилось, я отложил. А так бы уже сегменты работали
Re: Arduino Pro Mini
Немного упростил пример от 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
Завис... мозг. Разбираюсь
Спасибо.
Я правильно понимаю, что тип Т - это в моем случае передача данных - температура, там и проч? А N - это просто обновление таблицы активных узлов?
Я правильно понимаю, что тип Т - это в моем случае передача данных - температура, там и проч? А N - это просто обновление таблицы активных узлов?
Re: Arduino Pro Mini
Ничего это не означает, это просто буква. Хоть "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 - команда не известная или ошибка
и т.д и т.п. много еще всяких других
Так просто удобнее различать на приемном конце что же это за сообщение.
В данном примере "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
Все, въехал, пошел переписывать под себя. Спасибо
Re: Arduino Pro Mini
А вот тут можно поподробнее?dmw писал(а): бывает периодически (последний раз пару месяцев назад) какой нибудь узел виснет...
Это из за чего и как проявляется? Бежать и перезагружать?
Сторожевой таймер не спасает?
Re: Arduino Pro Mini
Ктобы знал.
Ватчдог только на базе активирован, надо везде включить. Кстати только база и не висла ниразу, ттт.
Спасибо что напомнили.
Ватчдог только на базе активирован, надо везде включить. Кстати только база и не висла ниразу, ттт.
Спасибо что напомнили.
Re: Arduino Pro Mini
у меня все глюки - если есть перепады по току на порядок и больше.
спит мк, просыпается, включает че-нить (реле, передатчик) - стопудово рано или поздно глюк будет.
Можно конечно из пушки по воробьям (бп до супер-пупер доводить), но проще дога взвести...
спит мк, просыпается, включает че-нить (реле, передатчик) - стопудово рано или поздно глюк будет.
Можно конечно из пушки по воробьям (бп до супер-пупер доводить), но проще дога взвести...
Re: Arduino Pro Mini
Подвисали ноды, после того как припаял 10мФ между контактами 3.3v и GND на nrf24l01+, зависания прекратились.
azh122, а можете пример скетча с реализацией вотчдога. Он у вас в цикл перезагрузки не уходит при зависании мк?
Только копаю эту тему, но везде как-то расплывчато и пессимистично описан процесс взвода и контроля вотчдога на Pro Mini 5V...
azh122, а можете пример скетча с реализацией вотчдога. Он у вас в цикл перезагрузки не уходит при зависании мк?
Только копаю эту тему, но везде как-то расплывчато и пессимистично описан процесс взвода и контроля вотчдога на Pro Mini 5V...