Рассчитайте уникальный адрес датчика с помощью 8-позиционного DIP-переключателя
У меня есть большое количество плат датчиков, которые мне нужно настроить, задавая уникальные адреса. Каждый датчик подключен к своему собственному arduino, я использую 8-позиционный DIP-переключатель для настройки адреса.
Я пробовал разные подходы. Когда я включаю и выключаю, я получаю случайные значения. Я понимал, что смогу получить до 255 возможных позиций, но без возможности получить правильные байтовые данные мне пришлось бы вручную кодировать каждую возможность, что кажется неправильным.
Схема:
Код
#include "DipSwitchI2C.h"
DipSwitchI2C::DipSwitchI2C(int address)
{
_address = address;
}
void DipSwitchI2C::begin()
{
Wire.begin();
}
int DipSwitchI2C::read()
{
unsigned int address = 0;
unsigned int value = 0;
Wire.requestFrom(_address, 1);
if (Wire.available())
{
value = Wire.read();
}
Wire.endTransmission();
for (int i = 0; i < 8; i++)
{
address += (value & (1<<i)) > 0;
}
return address;
}
@Marc, 👍2
Обсуждение2 ответа
Лучший ответ:
Как заметил @jsotola, решение было простым:
int DipSwitchI2C::read()
{
unsigned int address = 1;
Wire.requestFrom(_address, 1);
if (Wire.available())
{
address = Wire.read();
}
Wire.endTransmission();
return address;
}
Предполагается, что ваши переключатели находятся на контактах 2-9 на UNO. Измените контакты так, чтобы они соответствовали тому, что у вас есть на самом деле.
byte addressVal = 0;
for(int i = 2: i<10; i++){
addressVal <<= 1;
addressVal += digitalRead(i);
}
Это проверит каждый переключатель и добавит 1 в конец байта. На каждой итерации он сдвигает содержимое этого байта на 1 позицию влево. После того, как он прочитает все контакты, у вас будет байт со значением от 0 до 255 в зависимости от состояния контактов.
Переключатели подключены к Arduino через мультиплексор PCF8574, а не напрямую к контактам., @Marc
Тогда замените команду digitalRead любой командой, которую вы используете для считывания вывода с мультиплексора., @Delta_G
- Как использовать этот 3-контактный ползунковый переключатель?
- Кнопка с таймером переключения и функцией сброса времени + светодиод обратной связи
- digitalRead не читает входной контакт ESP8266-01
- Как подключить трехконтактный переключатель включения-выключения для считывания входных данных?
- Как переключить 12 В с помощью esp32?
- Использование транзистора NPN в качестве переключателя для включения/выключения двигателя постоянного тока
- Нужна помощь в принципиальной схеме матрицы герконового выключателя 8*8
- Двигатель постоянного тока Arduino с 2 кнопками
DIP-переключатель на 8 позиций может иметь 256 позиций. И вы просто вычисляете сумму битов., @gre_gor
Прежде всего, вы должны быть уверены, что _address имеет правильный адрес i2c pcf8574, затем вы можете сделать Wire.requestFrom(_address,1) и return(Wire.read()). Это все, две строки, ничего больше., @Jot
непонятно, что это значит... «без возможности получить правильные байтовые данные», @jsotola
Если на любой плате Arduino есть только одна плата датчика, зачем вам нужен уникальный адрес на плате датчика?, @jsotola
определите, каково значение
Wire.read()
в этой строкеvalue = Wire.read();
.... вы можете быть удивлены, @jsotola@jsotola У меня есть сеть датчиков, подключенных через rs485. Мне нужно иметь возможность запросить показания датчика для каждого arduino у мастера, @Marc