Проводная связь Arduino с MCP23008 GPIO pin expander для включения светодиода нажатием кнопки
Я использую Arduino Uno и MCP23008 GPIO pin expander, у меня есть мгновенная кнопка, подключенная к GPIO 2 на MCP23008, и светодиодный индикатор, подключенный к GPIO 1 на MCP23008. Я хочу, чтобы светодиод включался, когда кнопка нажата, и выключался в противном случае. В настоящее время у меня есть такой код:
#include "Wire.h" //import Wire library
byte inVal; //declare byte variable
void setup() {
Serial.begin(9600);
Wire.begin();
Wire.beginTransmission(0x20); //MCP23008 i2c addr
Wire.write(0x00); //MCP23008 внутренний регистр addr для I. O. dir
Wire.write(00000010); //установить все контакты в качестве выхода, за исключением #2 в качестве входа
Wire.endTransmission();
}
void loop() {
Wire.begin();
Wire.beginTransmission(0x20); //MCP23008 i2c addr
Wire.write(0x09); //MCP23008 внутренний регистр addr для доступа GPIO
//Wire.write(0xFF); //установите все выходные контакты на ВЫСОКИЙ уровень, закомментированный на данный момент.
Wire.endTransmission();
Wire.requestFrom(0x20,1); //получить один байт входного сигнала от MCP23008
inVal=Wire.read(); //set pyte as variable
//Serial.println(inVal,BIN); //вывод байта на последовательный монитор, закомментированный на данный момент
Serial.println(bitRead(inVal, 1)); //вывод второго бита из байта(1 или 0, для HIGH или LOW, в зависимости от нажатия мгновенной кнопки.
if((bitRead(inVal, 1)==1)) //если бит от кнопки высокий,
{
Wire.beginTransmission(0x20);
Wire.write(0x09);
Wire.write(0xFF); //затем установите все выходные контакты как ВЫСОКИЕ
Wire.endTransmission();
}
else if((bitRead(inVal, 1)==0)) //если бит от кнопки низкий,
{
Wire.beginTransmission(0x20);
Wire.write(0x09);
Wire.write(0x00); //затем установите все выходные контакты как НИЗКИЕ
Wire.endTransmission();
}
}
Я не знаю так много Arduino, как я знаю Python, и у меня еще меньше опыта с подключениями i2c и библиотекой проводов, но мне кажется, что это должно работать.
Бит, напечатанный на последовательном мониторе, ВЫСОК, пока я не нажму кнопку один раз, затем он останется низким навсегда, пока я не изменю и повторно не загрузлю код в Arduino. Не знаю, что здесь не так. Все, что угодно, помогает, спасибо.
@E. Pence, 👍1
1 ответ
На первый взгляд я вижу одну большую ошибку:
Wire.write(00000010); //установите все контакты в качестве выходных, за исключением #2 в качестве входных
Это не означает, что GPIO 1 (который вы называете номером 2 - подсчет начинается с 0, а не 1) является входом, который задает GPIO 3 (номер 4) в качестве входа. Числа, начинающиеся с 0
, являются восьмеричными, а не двоичными. Для двоичного кода префикс равен 0b
:
Wire.write(0b00000010); //установите все контакты в качестве выходных, за исключением #2 в качестве входных
А затем вы читаете, используя:
bitRead(inVal, 1)
который бы прочитал GPIO 1, который настроен в качестве вывода.
Таким образом, у вас есть переключатель на GPIO 1, который является выходом, который затем вы поднимаете высоко (вызывая внутреннее короткое замыкание, которое может повредить вывод), и в результате вы поднимаете вывод ВЫСОКО внутри. Теперь он всегда высокий, поэтому считывание контакта показывает, насколько высоко вы от него отталкиваетесь. Следовательно, он застревает на 1.
Исправление вашей записи в IODIR должно помочь решить эту проблему.
- Как подключить светодиодную RGB-матрицу 8x8 к Uno?
- Всегда ли установка значения означает установку pin Arduino?
- Использовать простой светодиод без лишних цифровых контактов
- Кастомная функция переключения светодиодов: один из трех светодиодов работает неправильно
- Использовать все контакты как цифровые входы/выходы
- Отправка и получение различных типов данных через I2C в Arduino
- Что такое ICSP pin (разъём)?
- Несколько условий оператора if
Я изменил IODir на двоичный, но он все еще не работает, и таким же образом. (В какой-то момент светодиод начал мигать каждую секунду, я не знаю почему, и я не смог повторить это. Что я хочу, так это получить высокий/низкий вход от вывода 1, если он высокий, установите вывод 0 как высокий, если он низкий, установите вывод 0 как низкий. Я застрял на этом уже несколько недель, и я не понимаю, почему. Что я упускаю? Спасибо., @E. Pence