Кто может помочь?не могу дать ума PCF8575

Serqey
Offline
Зарегистрирован: 22.09.2017

Здраствуте. проблема такая подключаю кнопки надо подключить больше 30 выходов выходов кнопки находятся на растонии поэтому использую расширитель контактов PCF8575 чтоы упровлять по I2C на вход получилось запрограмировать, а на выход не получается, не хватает опыта и знаний так как это всего вторая программа которую пишу помогите советом или дело ))) буду блогадарен

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Первая ссылка в гугле на библиотеку, пробовали? https://github.com/skywodd/pcf8574_arduino_library

Там можно посмотреть детали, если что неясно вдруг.

Serqey
Offline
Зарегистрирован: 22.09.2017

Что-то у меня нечего не получилось не работает(((, модет я совсем не правильно скетч написал, если его скину можете поправить или подсказать в каком напрвлении двигаться?

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

выкладывай конечно, только по правилам форума..

 

nik182
Offline
Зарегистрирован: 04.05.2015

Расстояние какое? I2C далеко не умеют.

Serqey
Offline
Зарегистрирован: 22.09.2017

растояние из одной двери машины в другое где-то длина проводов до 2 метров. этого хватит ?

 

Serqey
Offline
Зарегистрирован: 22.09.2017
#include <I2cDiscreteIoExpander.h>

#include <Wire.h>
#include <I2cDiscreteIoExpander.h>


I2cDiscreteIoExpander device;

const int ledPin1 =  13;
const int ledPin2 =  12;
const int ledPin3 =  11;
const int ledPin4 =  10;
const int ledPin5 =  9;
const int ledPin6 =  8;
const int ledPin7 =  3;

int buttonState = 0;
int pin2 = 0;
int pin3 = 0;
int pin4 = 0;
int pin5 = 0;
int pin6 = 0;
int pin7 = 0;
int pin8 = 0;
int c;
int val;

void setup()
{

  Wire.begin();


  Serial.begin(19200);

  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  pinMode(ledPin5, OUTPUT);
  pinMode(ledPin6, OUTPUT);
  pinMode(ledPin7, OUTPUT);

}

void loop()
{
  uint8_t status, i;
  /*
     //  static uint16_t i;


       Serial.print("Loop ");
       Serial.print(++i, DEC);
       Serial.print(", address ");
       Serial.print(device.getAddress(), DEC);
  */

  status = device.digitalRead();
  if (TWI_SUCCESS == status)
  {
    buttonState = device.getPorts();
    pin2 = device.getPorts();
    pin3 = device.getPorts();
    pin4 = device.getPorts();
    pin5 = device.getPorts();
    pin6 = device.getPorts();

    Serial.print("read 0x");
    Serial.print(buttonState, HEX);
    Serial.println(".");
  }
  else
  {

    Serial.print("read error ");
    Serial.print(status, DEC);
    Serial.println(".");
  }
  if (buttonState == 0x2080) {
    digitalWrite(ledPin1, HIGH);
  } else {
    digitalWrite(ledPin1, LOW);
  }
  if (pin2 == 0x4080) {
    digitalWrite(ledPin2, HIGH);
  } else {
    digitalWrite(ledPin2, LOW);
  }

  if (pin3 == 0xFFFF8080) {
    digitalWrite(ledPin3, HIGH);
  } else {
    digitalWrite(ledPin3, LOW);
  }
  if (pin5 == 0x1080) {
  digitalWrite(ledPin5, HIGH);
} else {
  digitalWrite(ledPin5, LOW);
}
if (pin6 == 0x880) {
  digitalWrite(ledPin6, HIGH);
} else {
  digitalWrite(ledPin6, LOW);
}
/*
  uint8_t status1 = device.digitalWrite(0x82);
  if (TWI_SUCCESS == status1)
  {
    pin7 = device.getPorts();
    pin8 = device.getPorts();

    Serial.print("read 0x");
    Serial.print(buttonState, HEX);
    Serial.println(".");
  }
  else
  {

    Serial.print("read error ");
    Serial.print(status, DEC);
    Serial.println(".");
  }
  if (ledPin4 == HIGH) {
    digitalWrite((pin7 == 0x82), HIGH);
  } else {
    digitalWrite((pin7 == 0x82), LOW);
  }

}
*/
if ((pin4 == 0x480) == HIGH && c == 0) // нажали кнопку
{
  c = 1;
}
if ((pin4 == 0x480) == LOW && c == 1) // отпустили кнопку
{
  val = ++val;
  if (val == 3)
  {
    val = 0;
  }
  c = 0;

}


if (val == 0) // выключаем светодиоды
{
  digitalWrite(ledPin4, LOW);
  digitalWrite(ledPin7, LOW);


}
if (val == 1) // Если мы кнопку 1 раз нажали и отпустили
{
  digitalWrite(ledPin4, HIGH);
  digitalWrite(ledPin7, LOW);

}
if (val == 2) // Если мы кнопку 2 раз нажали и отпустили
{
  digitalWrite(ledPin4, LOW);
  digitalWrite(ledPin7, HIGH);
}
delay(10);


delay(50);
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Serqey пишет:

растояние из одной двери машины в другое где-то длина проводов до 2 метров. этого хватит ?

 

I2C - протокол связи устройств на ОДНОЙ плате.  Баюс, 2 метра он не осилит. 

Serqey
Offline
Зарегистрирован: 22.09.2017

вобщем один расширитель будет стоять в одной двери другой расширитель в другой двери машины ардуина по центру думаю хватит длины два 2 это с запасом

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Не будет это по I2C работать, тем более в отомобиле. 

Serqey
Offline
Зарегистрирован: 22.09.2017

Сейчас то работает на растоянии 1 метра из одной двери но работает только на вход в расширитель, не могу настроить выход только в этом сейчас проблема у меня 

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Serqey пишет:

Сейчас то работает на растоянии 1 метра из одной двери но работает 

А заводить пробовали?  чтобы не было потом мучительно больно....

Serqey
Offline
Зарегистрирован: 22.09.2017

DetSimen пишет:

Serqey пишет:

Сейчас то работает на растоянии 1 метра из одной двери но работает 

А заводить пробовали?  чтобы не было потом мучительно больно....

сейчас попробую. уложу провода в машине и посмотрю что будет, а так удлинил провода до 3 метров работает как часы 

Serqey
Offline
Зарегистрирован: 22.09.2017

DetSimen пишет:

Serqey пишет:

Сейчас то работает на растоянии 1 метра из одной двери но работает 

А заводить пробовали?  чтобы не было потом мучительно больно....

провода уложил (3 метра длино взял с запасом)  вокруг всех силовых кабелей и больших пучков где больше всего  может быть новдки и все работает по I2C проблем нет 

Sirocco
Offline
Зарегистрирован: 28.09.2013

Прикупил пять таких модулей:

И возник вопрос, на который ответа найти не смог. Библиотеки разные пробовал, нашёл рабочую. Суть вопроса в том... а какой ток потребляет эта плата на входах Pxx при работе в режиме инпута? В режиме выходов проблем нет, все Pxx от P00 до P17 могут давать выход - всегда на выходе vcc(vdd) и когда программно даём единицу, то выход становится LOW (притягивается к GND).

А вот в режиме входов на Pxx всегда есть около +2V, и чтоб была сработка надо пин Pxx притянуть к GND. Вот тут проблема - ток между GND и Pxx в режиме замыкания аж 20 мА. Если ещё один пин замыкать, то ещё + 20мА. И так каждый входно пин жрут 20мА, а когда три-четыре пина и ток под 80мА - то микруха начинает сильно греться. Если не на прямую а через резистор замыкать, то резистор нужен на 150 и менее Ом. На замыкание резистором 510 Ом не реагирует. Но при этом програмно всё работает, я вижу что на этих пинах "HIGH". Да, через задницу, я притягиваю их к земле, в этот момент прилетает "HIGH". 

Все пять платок работают одинаково. Другие библиотеки работают также или не работают.

Что я упустил? Что не так? Купил их для расширения инпутов для WT32-ETH01. Почему такой большой ток? Словно они выход дают, а я их корочу. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016