Сеть на модулях NRF24L01

drzugrik

✩✩✩✩✩✩✩
2 Окт 2019
5
0
Всем привет! Есть у меня некоторое количество устройств на базе Arduino Nano с радиомодулями NRF24L01, все модули одинаковые, но у одного из них есть карта памяти (соответственно переключателем его назначаю функцию Master. Количество модулей может меняться, поэтому так же переключателями назначаю им канал. Все модули оснащены 3 типами датчиков и собирают информацию в собственную память, через заданные промежутки времени Master опрашивает все модули по очереди и они отправляют ему собранные показатели с датчиков и Master записывает их на карту памяти в соответствующий текстовый файл. Прошивку пишу универсальную для всех модулей, т.к. отличие между Master и Slave всего в паре функций, ну и потому что количество модулей может быть большим (проект не мой, я там делаю только железо, так что возможно количество модулей может разростись вплоть до 125 как по даташиту, кто ж знает заранее...).

Собственно вопрос: есть ли у радиомодулей NRF или Arduino Nano (хотя про ардуину сильно сомневаюсь) какой-либо идентификатор, жетско зашитый в чип (что-то вроде MAC-адреса), что бы не задавать всем модулям ID вручную, а использовать собственный жесткий идентификатор. В даташите встречал параметр self.addr но видел так же что он может задаваться вручную... Буду рад любым пинкам в нужную сторону. Спасибо
 

drzugrik

✩✩✩✩✩✩✩
2 Окт 2019
5
0
Понятно, пожалуй лучшим вариантом будет при первом запуске программы генерировать некий ID и записывать его в EEPROM, а потом просто считывать. Тогда задам следующий вопрос.
Есть 6 переключателей которые естественно через подтягивающие резисторы подключены к аналоговым и цифровым портам. Положение выключатей соответствует "1" или "0". Как мне собрать эти переменные типа int в одно двоичное число вида примерно "100101", что бы потом преобразовать его в десятичное (типа int)? Это нужно для определения канала связи, по которому модули будут общаться друг с другом.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,302
Москва
как подключены ? каждый к отдельному пину ? не самый удачный вариант подключения имхо, т.к. занимает много пинов . Но не суть. Есть такая функция - bitSet(x, n) , она устанавливает в переменной х бит под номером n в единицу, противоположная ей функция bitClear(x, n). Но это наверное не самый удачный вариант, хотя вполне будет рабочим.
Можно сделать что то типа a=(digitalRead(1)<<2) + (digitalRead(2)<<1) + (digitalRead(3)); так красивше
 

drzugrik

✩✩✩✩✩✩✩
2 Окт 2019
5
0
как подключены ? каждый к отдельному пину ? не самый удачный вариант подключения имхо, т.к. занимает много пинов . Но не суть. Есть такая функция - bitSet(x, n) , она устанавливает в переменной х бит под номером n в единицу, противоположная ей функция bitClear(x, n). Но это наверное не самый удачный вариант, хотя вполне будет рабочим.
Можно сделать что то типа a=(digitalRead(1)<<2) + (digitalRead(2)<<1) + (digitalRead(3)); так красивше
Спасибо, про bitSet(x, n) не знал, упустил это. Вечером проверю. По поводу неоптимальности подключения к отдельным пинам согласен, но платы уже разведены и запаяны. Какой вариант вы считаете более оптимальным? Микросхема сдвиговых регистров? Возможно попробую реализовать в следующей версии платы.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,302
Москва
Если разъемов хватает, то и фиг с ним . в конце концов можно взять мегу про)
вот статья про подключение нескольких кнопок к одному порту, может поможет чем
 

drzugrik

✩✩✩✩✩✩✩
2 Окт 2019
5
0
Если разъемов хватает, то и фиг с ним . в конце концов можно взять мегу про)
вот статья про подключение нескольких кнопок к одному порту, может поможет чем
У меня стоят Nano. На 3 датчика, комплект переключателей, карту памяти+NRF по SPI, часы по I2C - ног хватает и даже немного остается)
Спасибо за статью, интересная, но в моем случае не применимая.
 

drzugrik

✩✩✩✩✩✩✩
2 Окт 2019
5
0
Конструкция bitSet / bitClear оказалась оптимальной для моего случая, спасибо, этот участок кода отлично работает.