Заполнение массива данных pinState состоянием пинов Ардуино

colt_25
Offline
Зарегистрирован: 24.01.2019

Возникла необходимость опрашивать состояние пинов D2-D8 c DIP-переключателем на 7 разрядов, который замыкает каждый подтянутый к + пин на массу. С помощью комбинации 1/0 на этих 7-и пинах есть необходимость оперативного выбора одного из 128-и каналов для радиомодема nRF24L01 когда под рукой нет ПК.
Вопрос: как правильно реализовать опрос пинов Ардуино чтобы а зависимости от логического уровня на каждом из них получить конкретный номер канала в диапазоне 0-127 (2^7). Вот мой скетч но он работает не так как надо:

#include <Arduino.h>

#define LOW_PIN 2 // pin D2 - старший бит
#define HIGH_PIN 10 // pin D10 - младший бит
void setup() {
bool pinState[] = {0};

Serial.begin(9600);
Serial.println("Arduino pin's state:");
Serial.print("[ "); // печатаем открывающуюся скобку с пробелом после
for (byte n = LOW_PIN; n < HIGH_PIN; n++) { // перебираем номера пинов от lowPin до highPin
pinMode(n, INPUT_PULLUP); // устанавливаем каждый n-ый пин как вход с подтяжкой к +
pinState[n - LOW_PIN] == digitalRead(n); // записываем считанное состояние каждого n-го пина в n-LOW_PIN массив pinState
Serial.print(pinState[n - LOW_PIN]); // печатаем n-й элемент массива pinState
Serial.print(' '); // печатаем пробел
}
Serial.println(']'); // печатаем закрывающуюся скобку ]
Serial.print("Size of array: "); // печатам фразу ""
Serial.print(sizeof(pinState)); // печатаем размер массимва pinState в байтах
Serial.println(" bytes"); // печатаем фразу ""
Serial.println("======================"); // печатаем строку
}

void loop() {}
 

 

colt_25
Offline
Зарегистрирован: 24.01.2019

Исправленый код:

#include <Arduino.h>

#define LOW_BIT 2 // pin D2 - младший бит переключателя
#define HIGH_BIT 8 // pin D8 - старший бит переключателя

void setup() {
bool pinState[] = {0};

Serial.begin(9600);
Serial.println("Arduino pin's state:");
Serial.print("[ "); // печатаем открывающуюся скобку с пробелом после
for (byte n = LOW_BIT; n <= HIGH_BIT; n++) { // перебираем номера пинов от lowPin до highPin
pinMode(n, INPUT_PULLUP); // устанавливаем каждый n-ый пин как вход с подтяжкой к +
pinState[n - LOW_BIT] == digitalRead(n); // записываем считанное состояние каждого n-го пина в n-LOW_PIN массив pinState
Serial.print(pinState[n - LOW_BIT]); // печатаем n-й элемент массива pinState
Serial.print(' '); // печатаем пробел
}
Serial.println(']'); // печатаем закрывающуюся скобку ]
Serial.print("Size of array: "); // печатам фразу ""
Serial.print(sizeof(pinState)); // печатаем размер массимва pinState в байтах
Serial.println(" bytes"); // печатаем фразу ""
Serial.println("======================"); // печатаем строку
}

void loop() {}
 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Типа этого, полагаю: 

uint8_t addressPins[8] = {2,3, .. ,8};
uint8_t address = 0x00;

for (uint8_t n = 0; n < sizeof(addressPins); n++) {
    bitWrite(address, n, digitalRead(addressPins[i]));
}
Serial.print("Address: "); Serial.println(address, BIN);

 

bwn
Offline
Зарегистрирован: 25.08.2014

sadman41 пишет:

Типа этого, полагаю: 

Не жалеете глаза свои.(((

colt_25
Offline
Зарегистрирован: 24.01.2019

Спасибо за помощь, скетч зарботал как следует только с инверсией т.к. цифровые входы Ардуины я притянул к + для четкого определения лог.1 на них при снятом джампере. Вот рабочий вариант

#include <Arduino.h>

void setup() {
uint8_t dPins[] = {2,3,4,5,6,7,8}; // объявляем массив dPins с номерами цифровых пинов для выбора адреса канала
uint8_t chAddr = 0x00; // объявляем переменную для хранения адреса канала

Serial.begin(9600); // инициализируем последовательное соединение на скорости 9600 бод
for (uint8_t n = 0; n < sizeof(dPins); n++) { // перебираем n-элементы массива dPins с номерами пинов от 0 до числа равного размеру массива (7+1)
pinMode(dPins[n], INPUT_PULLUP); // устанавливаем каждый n-ый пин из массива Pins как вход с подтяжкой к +
bitWrite(chAddr, n, digitalRead(dPins[n])); // заполняем побитово массив dPins состоящий из n-элементов и записывваем результат в переменную chAddr
}
Serial.print("Channel address, BIN: "); Serial.println(chAddr, BIN); // печатаем адрес канала в двоичном виде (BIN)
Serial.print("Channel address, HEX: "); Serial.println(chAddr, HEX); // печатаем адрес канала в шестнадцатиричном виде (HEX)
Serial.print("Channel address, DEC: "); Serial.println(chAddr, DEC); // печатаем адрес канала в десятичном виде (DEC)
Serial.println("============================="); // печатаем пустую строку
}

void loop() {}
 

 

bwn
Offline
Зарегистрирован: 25.08.2014

colt_25 пишет:

Спасибо за помощь, скетч зарботал как следует только с инверсией т.к. цифровые входы Ардуины я притянул к + для четкого определения лог.1 на них при снятом джампере. Вот рабочий вариант

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

colt_25
Offline
Зарегистрирован: 24.01.2019

Вопрос №2
Как лучше организовать опрос аналоговых входов A6 и A7 чтобы к ним подключить пару джамперов для выбора выходной мощности передатчика nRF24L01:

                A6 A7

Tx_OFF:  0    0
Tx_MIN:   0    1
Tx_MED: 1    0
Tx_HIGH: 1    1

Тут вариант с digitalRead(pin) уже не прокатит т.к. аналоговые входы можно использовать только как цифровые ВХОДЫ D20, D21

Пины D0/D1 - UART (для отладки)
Пины D2-D8 - джампера для выбора адреса (номера) канала
Пины D9-D13 - 2 сигнала управления nRF24L01 + 3 сигнала для SPI

Пины А0-А3 - входы для аналоговые датчиков или выходы для подключения 4-х реле (или дешифратора на 16 выходов, например 155ИД3)
Пины A4/A5 - I2C (для подключения различных датчиков и дисплеев)
Пины A6/A7 - джампера для вкл/выкл nRF24L01 и ручного выбора выходной мощности

sadman41
Offline
Зарегистрирован: 19.10.2016

colt_25 пишет:

Спасибо за помощь, скетч зарботал как следует только с инверсией т.к. цифровые входы Ардуины я притянул к + для четкого определения лог.1 на них при снятом джампере. 

Ну, инвертируйте результат digitalRead() через оператор отрицания: http://arduino.ru/Reference/Boolean

И прислушайтесь к bwn, пока он не избанил вас за нарушения, а меня за пособничество.

sadman41
Offline
Зарегистрирован: 19.10.2016

"аналоговое" значение можно привести к дижитальному через сравнение результата чтения с пина с определенными значениями (положим N и K): менее N  -> 0, более K -> 1.

colt_25
Offline
Зарегистрирован: 24.01.2019

Что-то типо:

int val_0 = analogRead(A7);
int val_1 = analogRead(A6);

if ((val_0 > 255) || (val_1 > 255)) {
1-е условие
} else if  ((val_0 > 255) && (val_1 > 255)) {
4-е условие
}
 и т.д.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Типо. Только входы надо резистором притянуть куда-нить.