Ви не увійшли.
Ура, я решил, только не понял почему так было, может кто то объяснит, так на будующее для понимания.
В общем https://prnt.sc/amrId5Zi1KEd я закоментировал пару строк вывода в Serial, и все заработало как часики
#define SDA_PIN 4
#define SCL_PIN 5
const int16_t I2C_MASTER = 0x42;
Wire.begin(SDA_PIN, SCL_PIN, I2C_MASTER);
По ходу нашел зацепку
https://prnt.sc/sYOaHVdaC3Z7
Это может быть связано с частотой i2c интерфейса
Но как менять или управлять им пока не нашел
Там слишком много всего, сейчас постараюсь кусками выложить, что б не путать.
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);
Покажите схему подключения и код.
Если все правильно подключили, то проблем не должно быть.
Может кто то объяснить почему не всегда срабатвает digitalWrite()?
Или как проверить, загорелся тот светодиод или нет?
Уточнение: работаю с микросхемой mcp23017 и библиотекой Adafruit_MCP23X17
mcp.pinMode(0, OUTPUT) - установил.
В основном срабатывает, но не всегда.