#1 2022-05-26 21:54:10

imden10
Учасник
Зареєстрований: 2022-05-02
Повідомлень: 42

Не всегда срабатывает digitalWrite()

Может кто то объяснить почему не всегда срабатвает digitalWrite()?
Или как проверить, загорелся тот светодиод или нет?

Уточнение: работаю с микросхемой mcp23017 и библиотекой Adafruit_MCP23X17
mcp.pinMode(0, OUTPUT) - установил.

В основном срабатывает, но не всегда.

Неактивний

#2 2022-05-27 14:13:54

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 878

Re: Не всегда срабатывает digitalWrite()

Покажите схему подключения и код.
Если все правильно подключили, то проблем не должно быть.

Неактивний

#3 2022-05-27 14:43:53

imden10
Учасник
Зареєстрований: 2022-05-02
Повідомлень: 42

Re: Не всегда срабатывает digitalWrite()

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

Adafruit_MCP23X17 mcp1;  // mcp23017 разширение GPIO 
Adafruit_MCP23X17 mcp2;  // mcp23017 разширение GPIO

// Структура кнопок и ламп
struct ButtonLamp {
  Adafruit_MCP23X17 mcp; // Микросхема светодиода
  int lamp_pin; // Контакт n для подключения светодиода
  McpButton btn; // Кнопка
  int lamp_on; // Текущее состояние светодиода (включен/выключен) 
  boolean is_main_btn; // главная ли кнопка 
  int showin_pin; // Отображаемый пин на корпусе устройства
};

ButtonLamp buttonLamps[BUTTON_LAMP_AMOUNT] = { 
{mcp1, 10, BtnLamp1, 0, true, 1},
{mcp1, 11, BtnLamp2, 0, false, 2},
{mcp1, 12, BtnLamp3, 0, false, 3},
{mcp1, 13, BtnLamp4, 0, false, 4},
{mcp1, 14, BtnLamp5, 0, false, 5},
{mcp1, 15, BtnLamp6, 0, false, 6},
{mcp2, 0, BtnLamp7, 0, false, 7},
{mcp2, 1, BtnLamp8, 0, false, 8},
{mcp2, 2, BtnLamp9, 0, false, 9},
{mcp2, 3, BtnLamp10, 0, false, 10}
};

void setup() {
  mcp1.begin_I2C(0x20);
  mcp2.begin_I2C(0x21);

// конфигурация кнопок
  buttonLamps[0].mcp = mcp1;
  buttonLamps[1].mcp = mcp1;
  buttonLamps[2].mcp = mcp1;
  buttonLamps[3].mcp = mcp1;
  buttonLamps[4].mcp = mcp1;
  buttonLamps[5].mcp = mcp1;
  buttonLamps[6].mcp = mcp2;
  buttonLamps[7].mcp = mcp2;
  buttonLamps[8].mcp = mcp2;
  buttonLamps[9].mcp = mcp2;

  // Сконфигурировать контакт лампы как выход
  for(int i = 0; i < BUTTON_LAMP_AMOUNT; i++){
    buttonLamps[i].btn.init(buttonLamps[i].mcp,i);
    buttonLamps[i].mcp.pinMode(buttonLamps[i].lamp_pin, OUTPUT);
    buttonLamps[i].mcp.digitalWrite(buttonLamps[i].lamp_pin, buttonLamps[i].lamp_on); // изменить статус состояния светодиода
  }
  
   client.begin("xxxxxxxxxxxx.cloud.shiftr.io", net);
  // set the callback function for receiving
  client.onMessage(messageReceived);

}

void loop() {
  MQTT_control_run();

  buttonLamps[0].btn.tick();
  if (buttonLamps[0].btn.isClick()) {
    buttonLamps[0].lamp_on = !buttonLamps[0].lamp_on; // инвертировать значение состояния светодиода
    buttonLamps[0].mcp.digitalWrite(buttonLamps[0].lamp_pin, buttonLamps[0].lamp_on); // изменить статус состояния светодиода
    setStatusLampToSever(buttonLamps[0].showin_pin, buttonLamps[0].lamp_on);   
  }
  if (buttonLamps[0].btn.isHolded() && buttonLamps[0].is_main_btn) {
      allLampOff();
  }

  //...
}

void messageReceived(String &topic, String &payload) {
  if (topic.indexOf(MQTTTopicGetLampPin) != -1){ 
    String pin = topic.substring((topic.lastIndexOf("/")+1));
    int keyPin = pin.toInt() - 1;
    buttonLamps[keyPin].lamp_on = payload.toInt(); 
    buttonLamps[keyPin].mcp.digitalWrite(buttonLamps[keyPin].lamp_pin, buttonLamps[keyPin].lamp_on); // изменить статус состояния светодиода 

    setStatusLampToSever(buttonLamps[keyPin].showin_pin,buttonLamps[keyPin].lamp_on);
}

По кнопке на устройтсве срабатывает нормально

messageReceived - слушает топик с сервера и должен устанавливать значение и в принципе устанавливает и работает нормально.

Данные с сервера приходят, выводил.
В buttonLamps[keyPin].lamp_on значение устанавливает
Но вот НЕ ВСЕГДА срабатывает buttonLamps[keyPin].mcp.digitalWrite(buttonLamps[keyPin].lamp_pin, buttonLamps[keyPin].lamp_on);

Неактивний

#4 2022-05-30 18:53:58

imden10
Учасник
Зареєстрований: 2022-05-02
Повідомлень: 42

Re: Не всегда срабатывает digitalWrite()

По ходу нашел зацепку
https://prnt.sc/sYOaHVdaC3Z7

Это может быть связано с частотой i2c интерфейса

Но как менять или управлять им пока не нашел

Остання редакція imden10 (2022-05-30 18:56:05)

Неактивний

#5 2022-06-02 21:22:46

zzz
Гість

Re: Не всегда срабатывает digitalWrite()

#define SDA_PIN 4
#define SCL_PIN 5
const int16_t I2C_MASTER = 0x42;
  Wire.begin(SDA_PIN, SCL_PIN, I2C_MASTER);

#6 2022-06-10 16:24:08

imden10
Учасник
Зареєстрований: 2022-05-02
Повідомлень: 42

Re: Не всегда срабатывает digitalWrite()

Ура, я решил, только не понял почему так было, может кто то объяснит, так на будующее для понимания.
В общем https://prnt.sc/amrId5Zi1KEd я закоментировал пару строк вывода в Serial, и все заработало как часики

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму