Рассчитайте уникальный адрес датчика с помощью 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;
}

, 👍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


2 ответа


Лучший ответ:

1

Как заметил @jsotola, решение было простым:

int DipSwitchI2C::read()
{
    unsigned int address = 1;

    Wire.requestFrom(_address, 1);
    if (Wire.available())
    {
        address = Wire.read();
    }
    Wire.endTransmission();

    return address;
 }
,

0

Предполагается, что ваши переключатели находятся на контактах 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