Проводная связь 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. Не знаю, что здесь не так. Все, что угодно, помогает, спасибо.

, 👍1


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 должно помочь решить эту проблему.

,

Я изменил IODir на двоичный, но он все еще не работает, и таким же образом. (В какой-то момент светодиод начал мигать каждую секунду, я не знаю почему, и я не смог повторить это. Что я хочу, так это получить высокий/низкий вход от вывода 1, если он высокий, установите вывод 0 как высокий, если он низкий, установите вывод 0 как низкий. Я застрял на этом уже несколько недель, и я не понимаю, почему. Что я упускаю? Спасибо., @E. Pence