Подтверждение получения сообщения от nRF24L01
- Войдите на сайт для отправки комментариев
Господа, помогите, пожалуйста в решении следующего вопроса.
Есть четыре ардуинки с модулями nRF24L01+ настроенные на одни каналы, кому отправлено сообщение указывается в первом байте отсылаемого пакета и программно ардуинка понимает кому пакет. Периодически ардуинки общаются между собой. Например, первая говорит второй «включи насос», вторая должна принять сообщение и подтвердить получение. Если получение не подтверждено, то первая должна повторно отправить сообщение и так раз пять.
Сейчас это реализовано путем остановки программы и ожидания ответа определенное время, т. е. в это время остальной скетч не выполняется. Хотелось бы, чтобы скетч выполнялся во время ожидания ответа. Как это можно реализовать?
byte k = 0; while (status_otveta == false && k < 5) { currentTime = millis(); if(currentTime >= (time_oprosa + 10000)) // Передачу запроса проводим не чаще раз в 10 секунд { msg_out[0] = dom; msg_out[1] = schitok; msg_out[2] = opros; radio.stopListening(); radio.write(msg_out, 32); //Serial.println("Radio zapros opros doma otpravlen"); radio.startListening(); //delay(10); time_oprosa = currentTime; k++; } if (radio.available()) { bool done = false; while (!done) { done = radio.read(msg_in, 32); if (msg_in[0] == schitok && msg_in[1] == dom && msg_in[2] == otvet) // Ждем пакет для schitok от dom { temp_in_1 = msg_in[3]; vlazhnost_in_1 = msg_in[4]; auto_temp = msg_in[5]; //Serial.println("Polucheno radio ot dom"); //Serial.print("Temp v dome "); //Serial.println(temp_in_1); //Serial.print("Vlazhnost v dome-"); //Serial.println(vlazhnost_in_1); //Serial.print("Auto_temp-"); //Serial.println(auto_temp); status_otveta = true; } //delay(10); } } }
23 строка лучше писать так:
24 так:
это как минимум
По 23-ей понятно, а в чем смысл изменений в 24-ой?
Нужно отделять отдельные условия и визуально более понятнее.
На счет же самой задачи, сегодня-завтра буду писать свою реализацию подобного процесса, будем думать вместе ;)
зы/ а что должен делать клиент в случае ошибки передачи после 5 попытки?
зы/ а что должен делать клиент в случае ошибки передачи после 5 попытки?
Если ответ не получен, то посылаю пять раз команду на отмену операции(вдруг просто сигнал ответа не проходит), включаю аварийную сигнализацию (светодиод и зуммер) и отправляю смс об ошибке.
Если контроллер на ответственном месте (например отопление или насос в скважине) и я не на даче, то тупо отрубаю линию питания.
> вдруг просто сигнал ответа не проходит
Это как вдруг?
nRF24 умеет сам подтверждать получение сообщения. Если write возвращает не true, то посыл никто не услышал за указанное число попытаок отправки.
void setRetries(uint8_t delay, uint8_t count);
void setAutoAck(bool enable);
void setAutoAck( uint8_t pipe, bool enable ) ;
А через какое время после write мы сможем узнать посылка доставленна или нет? Врядли сразу после команды, сегодня буду тестить.
Просто прекрасно!
А через какое время после write мы сможем узнать посылка доставленна или нет? Врядли сразу после команды, сегодня буду тестить.
10 ms, проверено на практике
> Если write возвращает не true, то посыл никто не услышал за указанное число попытаок отправки.
или ни одна подтверждающая приём квитанция не получена отправителем основного сообщения!!!
Именно. Стандартная функция дает один и тот же ответ приема и исчерпания попыток. :( Поэтому она не годится.
Если ответ не получен, то посылаю пять раз команду на отмену операции(вдруг просто сигнал ответа не проходит), включаю аварийную сигнализацию (светодиод и зуммер) и отправляю смс об ошибке.
можно просто добавить на ответственный участок еще один GSM-модуль, и , если не проходит передача по через nRF, то отсылать смс-кой на другой модуль.
а вообще, проект полезный. я тоже как раз собираюсь что-то подобное делать. зимой труба из водозаборной скважины перемерзает, приделал к ней пару термокабелей с датчиками температуры, нужно мониторить температуру, уровень воды в баке и т.д
предлагаю обменяться
скальпамискайпами )))Мне проще с ардуинки в щитке отключить линию питания дома и включить заново. Этим перезагрузятся остальные ардуинки и можно заново попробывать отправить радио.
За первый год эксплуатации, основная ардуинка пару раз зависала и не реагировала на команды, но потом я нашел способ её перезагрузки с GSM модуля и вопрос снялся. Осталась теоретическая проблема зависания GSM модуля, но за два года он не зависал.
а вообще, проект полезный. я тоже как раз собираюсь что-то подобное делать. зимой труба из водозаборной скважины перемерзает, приделал к ней пару термокабелей с датчиками температуры, нужно мониторить температуру, уровень воды в баке и т.д
предлагаю обменяться
скальпамискайпами )))Т. к. у меня всё в процессе строительства, то многое сделано по временной схеме. Труба от скважины идет по воздуху под наклоном до емкости в доме(правда и потом не больно изменится, просто труба будет под землей). После отключения насоса вся вода из трубы сливается обратно в скважину и замерзать нечему. Насос можно просто включить тумблером на контроллере в доме или включить автоматический режим. Тумблером ни разу за год не воспользовались, всегда в авто режиме. Уровень контроллируется ультразвуковым датчиком и обычным китайским поплавком на всякий случай. Естественно есть труба перелива в канализацию.
Пока не решена одна проблема, это переключение потока воды с емкости в доме на емкость на улице, т. к. нужно два электровентиль на 32-ую трубу(или на три направления), а он даже китайский от 60 баксов...
Скайп.... сто лет не пользовался... почта моя еvрl@рамблер,ру
За первый год эксплуатации, основная ардуинка пару раз зависала и не реагировала на команды, но потом я нашел способ её перезагрузки с GSM модуля и вопрос снялся.
а watchdag-таймерами не ползьзуетесь ?
. После отключения насоса вся вода из трубы сливается обратно в скважину и замерзать нечему.
дык она намерзает постепенно. в трубе же влажность всегда есть - вот оно и замерзает. потом на этот слой намерзает следующий. и так, если в трубе меньше нуля, за неделю примерзнет. у меня тоже труба почти на воздухе -плохо прикопана. решений всего два- или изолировать трубу полноценно, или греть. в идеале -и то и другое.
Скайп.... сто лет не пользовался...
мессенджер есть какой-нибуд ь?
а watchdag-таймерами не ползьзуетесь ?
Пробовал в самом начале. Не получилось. Надо перепрошивать загрузчики. Хотя... наверно надо заняться...
дык она намерзает постепенно. в трубе же влажность всегда есть - вот оно и замерзает. потом на этот слой намерзает следующий. и так, если в трубе меньше нуля, за неделю примерзнет. у меня тоже труба почти на воздухе -плохо прикопана. решений всего два- или изолировать трубу полноценно, или греть. в идеале -и то и другое.
Не, не замерзает. У меня ПНД 32 мм.
мессенджер есть какой-нибуд ь?
На почту отправь тестовое письмо, скину номер вайбера.