Нано, mqtt, геркон

yden
Offline
Зарегистрирован: 30.01.2016

Здравствуйте.

Подскажите пожалуйста по коду. Ардуино нано, mqtt, геркон. При срабатывании геркона в mqtt летит сначала 0, потом сразу же 1.

Для антидребезга использую библиотеку. Геркон замыкает на землю, внутренняя подтяжка включена.

Где ошибка?

#include <Bounce2.h>
#include <PubSubClient.h>

const byte inButton3 = 16; 

Bounce debouncer3 = Bounce();

boolean flag_kalitka = false; //флаг калитка
boolean flag_button3 = false;

// =======================================================================
void setup()
{
  
  pinMode(inButton3, INPUT_PULLUP);
  
  debouncer3.attach(inButton3);
  debouncer3.interval(15);
 
}

// =======================================================================
void loop()
{
  
  //--------------------------------------------------------------------------------------
  //проверка состояния геркона 
  if (debouncer4.update())
  {
    //факт нажатия
    if (debouncer4.fell())
    {
      flag_button4 = true;
      itoa(flag_button4, buff, 10);
      client.publish("ihouse/gadget/kalitka", buff);
    }

    //факт отпускания
    if (debouncer4.rose())
    {
      flag_button4 = false;
      itoa(flag_button4, buff, 10);
      client.publish("ihouse/gadget/kalitka", buff);
    }
  }
  
  client.loop();
}

Благодарю

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

опять дичь какая-то.

в сетапе debouncer3, в лупе debouncer4,

нано и inButton3 = 16.

yden
Offline
Зарегистрирован: 30.01.2016

xDriver пишет:

опять дичь какая-то.

в сетапе debouncer3, в лупе debouncer4,

нано и inButton3 = 16.

этот код выхолощенный с основного. конечно debouncer4.

к пину а2 подключен. 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

yden пишет:

xDriver пишет:

опять дичь какая-то.

в сетапе debouncer3, в лупе debouncer4,

нано и inButton3 = 16.

этот код выхолощенный с основного. конечно debouncer4.

к пину а2 подключен. 

и геркон к ардуино синей изолентой подключен, так ?

вот как вам помогать.

yden
Offline
Зарегистрирован: 30.01.2016

xDriver пишет:

yden пишет:

xDriver пишет:

опять дичь какая-то.

в сетапе debouncer3, в лупе debouncer4,

нано и inButton3 = 16.

этот код выхолощенный с основного. конечно debouncer4.

к пину а2 подключен. 

и геркон к ардуино синей изолентой подключен, так ?

вот как вам помогать.

Нет, беленькой :)

Суть: геркон стоит на столбе, на калитке магнит. Ардуинка в доме. Расстояние 5 метров, витая пара.

b707
Offline
Зарегистрирован: 26.05.2017

yden пишет:

Суть: геркон стоит на столбе, на калитке магнит. Ардуинка в доме. Расстояние 5 метров, витая пара.

 

Если вы сделали столько бестолковых ошибок, когда выкладывали код в форум - наверняка и в рабочем коде ошибок не меньше. Сядьте спокойно и напишите нормальный код. чтобы в нем все сходилось - и номера дебонсеров и правильные пины. Вполне возможно, что после этого код и без помощи форума заработает. Если нет - выкладывайте код сюда.

а флаги и строчки itoa() - можно выкинуть, они в этом коде лишние

kalapanga
Offline
Зарегистрирован: 23.10.2016

yden пишет:

При срабатывании геркона в mqtt летит сначала 0, потом сразу же 1.

Два значения - это чудно как-то. Это что-же получается, геркон в неправильном состоянии остался? При всех дребезгах он к 0 устаканиться должен

yden
Offline
Зарегистрирован: 30.01.2016

b707 пишет:

yden пишет:

Суть: геркон стоит на столбе, на калитке магнит. Ардуинка в доме. Расстояние 5 метров, витая пара.

 

Если вы сделали столько бестолковых ошибок, когда выкладывали код в форум - наверняка и в рабочем коде ошибок не меньше. Сядьте спокойно и напишите нормальный код. чтобы в нем все сходилось - и номера дебонсеров и правильные пины. Вполне возможно, что после этого код и без помощи форума заработает. Если нет - выкладывайте код сюда.

а флаги и строчки itoa() - можно выкинуть, они в этом коде лишние

#include <Bounce2.h>
#include <UIPEthernet.h>
#include <PubSubClient.h>

// =======================================================================
// Конфигурация устройства MQTT:
uint8_t mac[6] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xD6 };
uint8_t myIP[4] = {192, 168, 1, 80};
uint8_t myDNS[4] = {192, 168, 1, 1};
uint8_t myGW[4] = {192, 168, 1, 1};
uint8_t myMASK[4] = {255, 255, 255, 0};

const char *mqtt_server = "192.168.1.70"; // Имя сервера MQTT
const int mqtt_port = 1883; // Порт для подключения к серверу MQTT
const char *mqtt_user = "*****"; // Логи от сервер
const char *mqtt_pass = "******"; // Пароль от сервера

EthernetClient ethClient;
PubSubClient client(ethClient);

// =======================================================================
const byte outPin1 = 9; // тв
const byte outPin2 = 8; // боковой
const byte outPin3 = 7; // свет калитка
const byte outPin4 = 6; // участок

//кнопки
const byte inButton1 = 5; 
const byte inButton2 = 4; 
const byte inButton3 = 16; 
const byte inButton4 = 15; 

//создаем объект класса Bounce. Указываем пин, к которому подключена кнопка, и время дребезга в мс.
Bounce debouncer1 = Bounce();
Bounce debouncer2 = Bounce();
Bounce debouncer3 = Bounce();
Bounce debouncer4 = Bounce();

boolean flag_zal_tv = false; //флаг кнопка 1
boolean flag_zal_up = false; //флаг кнопка 1
boolean flag_zabor = false; //флаг участок
boolean flag_kalitka = false; //флаг калитка
boolean flag_button1 = false;
boolean flag_button2 = false;
boolean flag_button3 = false;
boolean flag_button4 = false;

char buff[15];

//mqtt broker
uint32_t previousMillis_mqtt_connect = 0;  // храним время последнего подключения
uint32_t interval_mqtt_connect = 60000;     //интервал
uint32_t currentMillis_mqtt_connect = 0;

// =======================================================================
// Функция получения данных от сервера
void callback(char* topic, byte* payload, unsigned int length)
{
  //--------------------------------------------------------------------------------------
  //свет зал тв
  if (String(topic) == "ihouse/svet/zal/tv")
  {
    if ((char)payload[0] == '1') flag_zal_tv = true;
    if ((char)payload[0] == '0') flag_zal_tv = false;

    digitalWrite(outPin1, flag_zal_tv);
  }

  //свет зал верх
  if (String(topic) == "ihouse/svet/zal/up")
  {
    if ((char)payload[0] == '1') flag_zal_up = true;
    if ((char)payload[0] == '0') flag_zal_up = false;

    digitalWrite(outPin2, flag_zal_up);
  }

  //свет участок
  if (String(topic) == "ihouse/svet/zabor")
  {
    if ((char)payload[0] == '1') flag_zabor = true;
    if ((char)payload[0] == '0') flag_zabor = false;

    digitalWrite(outPin4, flag_zabor);
  }

  //свет калитка
  if (String(topic) == "ihouse/svet/kalitka")
  {
    if ((char)payload[0] == '1') flag_kalitka = true;
    if ((char)payload[0] == '0') flag_kalitka = false;

    digitalWrite(outPin3, flag_kalitka);
  }
}

// =======================================================================
void mqtt_reconnect()
{
  currentMillis_mqtt_connect = millis();

  // подключаемся к MQTT серверу
  if (currentMillis_mqtt_connect - previousMillis_mqtt_connect > interval_mqtt_connect)
  {
    String clientId = "nanosvetzal-";
    clientId += String(random(0xffff), HEX);
    if (client.connect(clientId.c_str(), mqtt_user, mqtt_pass))
    {
      //подписываемся по топики
      client.subscribe("ihouse/svet/zal/tv");
      client.loop();
      client.subscribe("ihouse/svet/zal/up");
      client.loop();
      client.subscribe("ihouse/svet/zabor");
      client.loop();
      client.subscribe("ihouse/svet/kalitka");
      client.loop();
    }
    previousMillis_mqtt_connect = currentMillis_mqtt_connect;
  }
}
// =======================================================================
void setup()
{
  Ethernet.begin(mac,myIP,myDNS,myGW,myMASK);
  delay(10);

  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);
  delay(10);

  pinMode(inButton1, INPUT_PULLUP);
  pinMode(inButton2, INPUT_PULLUP);
  pinMode(inButton3, INPUT_PULLUP);
  pinMode(inButton4, INPUT_PULLUP);

  pinMode(outPin1, OUTPUT);
  digitalWrite(outPin1, LOW);

  pinMode(outPin2, OUTPUT);
  digitalWrite(outPin2, LOW);

  pinMode(outPin3, OUTPUT);
  digitalWrite(outPin3, LOW);

  pinMode(outPin4, OUTPUT);
  digitalWrite(outPin4, LOW);

  debouncer1.attach(inButton1);
  debouncer1.interval(15);
  debouncer2.attach(inButton2);
  debouncer2.interval(15);
  debouncer3.attach(inButton3);
  debouncer3.interval(100);
  debouncer4.attach(inButton4);
  debouncer4.interval(100);
}

// =======================================================================
void loop()
{
  //--------------------------------------------------------------------------------------
  if (!client.connected())
  {
    mqtt_reconnect();
  }

  //--------------------------------------------------------------------------------------
  //проверка состояния кнопки1 - холл
  if (debouncer1.update())
  {
    //факт нажатия
    if (debouncer1.fell())
    {
      flag_zal_tv = !flag_zal_tv;
      digitalWrite(outPin1, flag_zal_tv);

      itoa(flag_zal_tv, buff, 10);
      client.publish("ihouse/svet/zal/tv", buff);
      client.publish("ihouse/svet/zal/buttonTv", "1");
    }
  }

  //--------------------------------------------------------------------------------------
  //проверка состояния кнопки2 - санузел
  if (debouncer2.update())
  {
    //факт нажатия
    if (debouncer2.fell())
    {
      flag_zal_up = !flag_zal_up;
      digitalWrite(outPin2, flag_zal_up);

      itoa(flag_zal_up, buff, 10);
      client.publish("ihouse/svet/zal/up", buff);
      client.publish("ihouse/svet/zal/buttonUp", "1");
    }
  }

  //--------------------------------------------------------------------------------------
  //проверка состояния геркона ворот
  if (debouncer3.update())
  {
    //факт нажатия
    if (debouncer3.fell())
    {
      flag_button3 = true;
      itoa(flag_button3, buff, 10);
      client.publish("ihouse/gadget/vorota", buff);
    }

    //факт отпускания
    if (debouncer3.rose())
    {
      flag_button3 = false;
      itoa(flag_button3, buff, 10);
      client.publish("ihouse/gadget/vorota", buff);
    }
  }

  //--------------------------------------------------------------------------------------
  //проверка состояния геркона калитки
  if (debouncer4.update())
  {
    //факт нажатия
    if (debouncer4.fell())
    {
      flag_button4 = true;
      itoa(flag_button4, buff, 10);
      client.publish("ihouse/gadget/kalitka", buff);
    }

    //факт отпускания
    if (debouncer4.rose())
    {
      flag_button4 = false;
      itoa(flag_button4, buff, 10);
      client.publish("ihouse/gadget/kalitka", buff);
    }
  }
  
  client.loop();
}


debouncer4.interval(100);

5 делал, 15 делал, 100 делал. все одно.