MCP23017s y problemas arduino

2

No soy hablante nativo de inglés, así que perdona mis males.

Ok. Aquí está el trato.

En mi Arduino UNO necesito más salidas y entradas. Compré 3 MCP23017s. Uno de ellos para recibir estados desde 8 microinterruptores y otro para controlar 32 LEDs. Los estados de los LED dependen de qué microinterruptor se presiona realmente (solo uno de ellos se pudo empujar a tiempo). Por ejemplo: Cuando presiono el botón B (0x20 mcp23017s) en 0 pin, todo lo que quiero hacer es enviar 10101010 a 0x21s bloque A. Y funciona solo para un botón. Cuando conecto el segundo botón, quiero enviar 10101010 a 0x21s bloque B. Y hay problema. No funciona Para un botón todo está bien, pero para más de uno no lo está. No importa si presiono el primer o segundo botón, siempre envía 10101010 a 0x21s A block. Solo envía el bloque 10101010 a 0x21s B, cuando presiono 2 botones al mismo tiempo, pero también envía bytes al bloque A ...

El hardware está bien, porque lo revisé en busca de un botón y todo funcionaba bien, por lo que el problema debe estar oculto en el software.

Sé que no puedes obtener lo que quiero decir, así que aquí está el código:

enlace

#include "Wire.h"

byte buttons = B00000000;

void setup()
{
  Wire.begin();

  Wire.beginTransmission(0x21);
  Wire.write(0x00);
  Wire.write(0x00);
  Wire.endTransmission();

  Wire.beginTransmission(0x21);
  Wire.write(0x01);
  Wire.write(0x00);
  Wire.endTransmission();
// To set all of 0x21 pins as outputs

  Wire.beginTransmission(0x20);
  Wire.write(0x00);
  Wire.write(0xFF);
  Wire.endTransmission();

  Wire.beginTransmission(0x20);
  Wire.write(0x01);
  Wire.write(0x00);
  Wire.endTransmission();

// To set all of 0x20 pins as button inputs
}

void loop()
{
  buttons = B00000000;
  Wire.beginTransmission(0x20);
  Wire.write(0x13);
  Wire.endTransmission();
  Wire.requestFrom(0x20, 1);
  buttons = Wire.read();

  switch(buttons)
  {
    case B00000001:
    // A block
      Wire.beginTransmission(0x21);
      Wire.write(0x12);
      Wire.write(B01010101);
      Wire.endTransmission();
      break;
    case B00000010:
    // B block
      Wire.beginTransmission(0x21);
      Wire.write(0x13);
      Wire.write(B01010101);
      Wire.endTransmission();
      break;
    default:
      // A block
      Wire.beginTransmission(0x21);
      Wire.write(0x12);
      Wire.write(B10101010);
      Wire.endTransmission();

      // B block
      Wire.beginTransmission(0x21);
      Wire.write(0x13);
      Wire.write(B10101010);
      Wire.endTransmission();
      break;
  }
  delay(20);
}

Necesito esto en mi proyecto, que es muy importante para mí, así que ayúdame. ¡Gracias!

    
pregunta Grzegorz

0 respuestas

Lea otras preguntas en las etiquetas