Кто может помочь?не могу дать ума PCF8575
- Войдите на сайт для отправки комментариев
Втр, 26/09/2017 - 14:12
Здраствуте. проблема такая подключаю кнопки надо подключить больше 30 выходов выходов кнопки находятся на растонии поэтому использую расширитель контактов PCF8575 чтоы упровлять по I2C на вход получилось запрограмировать, а на выход не получается, не хватает опыта и знаний так как это всего вторая программа которую пишу помогите советом или дело ))) буду блогадарен
Первая ссылка в гугле на библиотеку, пробовали? https://github.com/skywodd/pcf8574_arduino_library
Там можно посмотреть детали, если что неясно вдруг.
Что-то у меня нечего не получилось не работает(((, модет я совсем не правильно скетч написал, если его скину можете поправить или подсказать в каком напрвлении двигаться?
выкладывай конечно, только по правилам форума..
Расстояние какое? I2C далеко не умеют.
растояние из одной двери машины в другое где-то длина проводов до 2 метров. этого хватит ?
#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); }растояние из одной двери машины в другое где-то длина проводов до 2 метров. этого хватит ?
I2C - протокол связи устройств на ОДНОЙ плате. Баюс, 2 метра он не осилит.
вобщем один расширитель будет стоять в одной двери другой расширитель в другой двери машины ардуина по центру думаю хватит длины два 2 это с запасом
Не будет это по I2C работать, тем более в отомобиле.
Сейчас то работает на растоянии 1 метра из одной двери но работает только на вход в расширитель, не могу настроить выход только в этом сейчас проблема у меня
Сейчас то работает на растоянии 1 метра из одной двери но работает
А заводить пробовали? чтобы не было потом мучительно больно....
Сейчас то работает на растоянии 1 метра из одной двери но работает
А заводить пробовали? чтобы не было потом мучительно больно....
сейчас попробую. уложу провода в машине и посмотрю что будет, а так удлинил провода до 3 метров работает как часы
Сейчас то работает на растоянии 1 метра из одной двери но работает
А заводить пробовали? чтобы не было потом мучительно больно....
провода уложил (3 метра длино взял с запасом) вокруг всех силовых кабелей и больших пучков где больше всего может быть новдки и все работает по I2C проблем нет
Прикупил пять таких модулей:
И возник вопрос, на который ответа найти не смог. Библиотеки разные пробовал, нашёл рабочую. Суть вопроса в том... а какой ток потребляет эта плата на входах Pxx при работе в режиме инпута? В режиме выходов проблем нет, все Pxx от P00 до P17 могут давать выход - всегда на выходе vcc(vdd) и когда программно даём единицу, то выход становится LOW (притягивается к GND).
А вот в режиме входов на Pxx всегда есть около +2V, и чтоб была сработка надо пин Pxx притянуть к GND. Вот тут проблема - ток между GND и Pxx в режиме замыкания аж 20 мА. Если ещё один пин замыкать, то ещё + 20мА. И так каждый входно пин жрут 20мА, а когда три-четыре пина и ток под 80мА - то микруха начинает сильно греться. Если не на прямую а через резистор замыкать, то резистор нужен на 150 и менее Ом. На замыкание резистором 510 Ом не реагирует. Но при этом програмно всё работает, я вижу что на этих пинах "HIGH". Да, через задницу, я притягиваю их к земле, в этот момент прилетает "HIGH".
Все пять платок работают одинаково. Другие библиотеки работают также или не работают.
Что я упустил? Что не так? Купил их для расширения инпутов для WT32-ETH01. Почему такой большой ток? Словно они выход дают, а я их корочу.