Помогите начинающему!

Silverzab
Offline
Зарегистрирован: 11.12.2016

Есть скетч. При компиляции выдает ошибку: 'callback' was not declared in this scope

Помогите!!!

inspiritus
Offline
Зарегистрирован: 17.12.2012

Афигительно информативный заголовок топика.

Текст программы необходимо постить в топик с соблюдением правил.

За подобное предлагаю данный топик игнорировать, как противоречащий правилам форума.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Silverzab пишет:

Есть скетч

Если есть, то выкладывайте сюда. А вместе с ним и полный текст сообщения. Пока же присоединяюсь к коллеге inspiritus.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char* ssid = "Rostelecom_Inactivated"; //Название сети
const char* password = "29974978";           //пароль
const char* mqtt_server = "192.168.1.2";    //ip брокера mqtt

#define RELAY_1 5                            //Выход на реле или светодиод
#define BUTTON_1 12                           //Кнопка
#define relays_topic1 "ESP04/relay_1"         //публикуемый топик
#define RELAY_2 4                            //Выход на реле или светодиод
#define BUTTON_2 14                           //Кнопка
#define relays_topic2 "ESP04/relay_2"         //публикуемый топик
#define RELAY_3 15                            //Выход на реле или светодиод
#define BUTTON_3 16                           //Кнопка
#define relays_topic3 "ESP04/relay_3"         //публикуемый топик
#define svet_topic "ESP04/svet"
#define pir_topic "ESP04/pir"

WiFiClient espClient;                        //инициализация WiFi клиента
PubSubClient client(espClient);              //инициализация MQTT клиента

long last_mls = millis();                    //функция времени в милисекундах
long last_mls2 = millis();                   //функция времени для датчика движения
long last_mls3 = millis();                   //функция времени для отправки топиков
long last_mls4 = millis();                   //функция времени для датчика света

boolean Status1 = true;                       //объявляем статус реле в 0
boolean btnPress1 = false;                    //объявляем что кнопка не нажата 0
boolean lastbtnStat1 = false;                 //временная переменная для хранения статуса

boolean Status2 = false;                       //объявляем статус реле в 0
boolean btnPress2 = false;                    //объявляем что кнопка не нажата 0
boolean lastbtnStat2 = false;

boolean Status3 = false;                       //объявляем статус реле в 0
boolean btnPress3 = false;                    //объявляем что кнопка не нажата 0
boolean lastbtnStat3 = false;

int regim1 = 0;                               //режим по умолчанию при включении
int regim2 = 0;                               //режим по умолчанию при включении
int regim3 = 0;                               //режим по умолчанию при включении

int calibrationTime = 30;                     //Время калибровки датчика
long unsigned int lowIn;                      //Время, в которое был принят сигнал отсутствия движения(LOW)
long unsigned int pause = 60000;              //Пауза, после которой движение считается оконченным
boolean lockLow = true;                       //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
boolean takeLowTime;                          //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения

int ligtsvet = 0;                             //переменная для светло или темно 1 или 0
int pirPin = 13;                              //контакт для подключения датчика
int val = 0;                                  //переменная для хранения состояния датчика
int ligt;                                     //переменная освещенности

void setup()                                 //Выполняется при запуске 1 раз
{
  pinMode(pirPin, INPUT);
  pinMode(RELAY_1, OUTPUT);                  //Выход на реле или светодиод
  pinMode(BUTTON_1, INPUT);                  //Кнопка
  digitalWrite(RELAY_1, Status1);             //устанавливаем на выходе статус реле

  pinMode(RELAY_2, OUTPUT);                  //Выход на реле или светодиод
  pinMode(BUTTON_2, INPUT);                  //Кнопка
  digitalWrite(RELAY_2, Status2);             //устанавливаем на выходе статус реле

  pinMode(RELAY_3, OUTPUT);                  //Выход на реле или светодиод
  pinMode(BUTTON_3, INPUT);                  //Кнопка
  digitalWrite(RELAY_3, Status3);             //устанавливаем на выходе статус реле

  Serial.begin(115200);                      //инициализация монитора порта
  client.setServer(mqtt_server, 1883);       //подключаемся к MQTT
  client.set.Callback(clientCallback);              //функция получения топиков с брокера
  delay(100);                                //ждем 100 милисекунд

  WiFi.begin(ssid, password);                //подключаемся к WiFi
  delay(5000);                               //ждем 5 секунд

  client.connect("ESP04Client");             //конектимся с брокером как клиент
  client.subscribe(relays_topic1);            //подписываемся на топик
  client.subscribe(relays_topic2);            //подписываемся на топик
  client.subscribe(relays_topic3);            //подписываемся на топик
  //client.subscribe("ESP04/#");

}

void pir() {
  if (digitalRead(pirPin) == HIGH) {
    //if (lockLow) {
    Serial.println("Motion1");
    lockLow = false;
    if (regim1 == 2 && ligtsvet == 0) {
      Status1 = false;
      digitalWrite(RELAY_1, Status1);
    }
    if (regim2 == 2 && ligtsvet == 0) {
      Status2 = true;
      digitalWrite(RELAY_2, Status2);
    }
    if (regim3 == 2 && ligtsvet == 0) {
      Status3 = true;
      digitalWrite(RELAY_3, Status3);
      Serial.println("Motion3");
    }
    takeLowTime = true;
  }
  if (digitalRead(pirPin) == LOW) {
    if (takeLowTime) {
      Serial.println("no Motion1");
      lowIn = millis();          //Сохраним время окончания движения
      takeLowTime = false;       //Изменим значения флага, чтобы больше не брать время, пока не будет нового движения
    }
    if (!lockLow && millis() - lowIn > pause) {
      lockLow = true;
      if (regim1 == 2) {
        Status1 = true;
        digitalWrite(RELAY_1, Status1);
      }
      if (regim2 == 2) {
        Status2 = false;
        digitalWrite(RELAY_2, Status2);
      }
      if (regim3 == 2) {
        Status3 = false;
        digitalWrite(RELAY_3, Status3);
      }
    }
  }
}


void svet()                             //функция чтения с датчика света
{
  ligt = analogRead(A0);
  Serial.println(ligt);
  if (ligt < 120)                 //если свет меньше указанного
  {
    ligtsvet = 0;                     //то ligtsvet 0
  } else                                     //если нет то 1
  {
    ligtsvet = 1;
  }
}

void callback(char* topic, byte* payload, unsigned int length) //читаем топики
{
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("  ");
  String strTopic = String(topic);
  String strPayload = String((char*)payload);
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
  if (strTopic == "ESP04/relay_1") {
    if ((char)payload[0] == '0') {
      Status1 = true;
      regim1 = 0;
    }
    else if ((char)payload[0] == '1') {
      Status1 = false;
      regim1 = 1;
    } else {
      regim1 = 2;
    }
  }
  if (strTopic == "ESP04/relay_2") {
    if ((char)payload[0] == '0') {
      Status2 = false;
      regim2 = 0;
    }
    else if ((char)payload[0] == '1') {
      Status2 = true;
      regim2 = 1;
    } else {
      regim2 = 2;
    }
  }
  if (strTopic == "ESP04/relay_3") {
    if ((char)payload[0] == '0') {
      Status3 = false;
      regim3 = 0;
    }
    else if ((char)payload[0] == '1') {
      Status3 = true;
      regim3 = 1;
    } else {
      regim3 = 2;
    }
  }
}


void button1() {
  btnPress1 = digitalRead(BUTTON_1);
  Status1 = digitalRead(RELAY_1);
  if (btnPress1 == LOW && lastbtnStat1 == false) {
    delay(30); // защита от дребезга
    regim1++;
    lastbtnStat1 = true;
    if (regim1 > 2) {
      regim1 = 0;
    }
  }
  if (btnPress1 == HIGH && lastbtnStat1 == true) {
    lastbtnStat1 = false;
  }

  if (regim1 == 0) {
    Status1 = true;
    digitalWrite(RELAY_1, Status1);
  }
  if (regim1 == 1) {
    Status1 = false;
    digitalWrite(RELAY_1, Status1);
  }
  if (regim1 == 2) {
    //pir();
  }
}


void button2() {
  btnPress2 = digitalRead(BUTTON_2);
  Status2 = digitalRead(RELAY_2);
  if (btnPress2 == LOW && lastbtnStat2 == false) {
    delay(30); // защита от дребезга
    regim2++;
    lastbtnStat2 = true;
    if (regim2 > 2) {
      regim2 = 0;
    }
  }
  if (btnPress2 == HIGH && lastbtnStat2 == true) {
    lastbtnStat2 = false;
  }

  if (regim2 == 0) {
    Status2 = false;
    digitalWrite(RELAY_2, Status2);
  }
  if (regim2 == 1) {
    Status2 = true;
    digitalWrite(RELAY_2, Status2);
  }
  if (regim2 == 2) {
    //pir();
  }
}
void button3() {
  btnPress3 = digitalRead(BUTTON_3);
  Status3 = digitalRead(RELAY_3);
  if (btnPress3 == LOW && lastbtnStat3 == false) {
    delay(30); // защита от дребезга
    regim3++;
    lastbtnStat3 = true;
    if (regim3 > 2) {
      regim3 = 0;
    }
  }
  if (btnPress3 == HIGH && lastbtnStat3 == true) {
    lastbtnStat3 = false;
  }
  if (regim3 == 0) {
    Status3 = false;
    digitalWrite(RELAY_3, Status3);
  }
  if (regim3 == 1) {
    Status3 = true;
    digitalWrite(RELAY_3, Status3);
  }
  if (regim3 == 2) {
    //pir();
  }
}

void reconnect_server()                      //функция проверки подключения
{
  if (WiFi.status() != WL_CONNECTED)         //если нет подключения с сети
  {
    WiFi.begin(ssid, password);
    Serial.println("");
    Serial.println("WiFi connect...");       //выводим в монитор порта что пытаемся подключиться
  } else {
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
  }
  if (!client.connected() && WiFi.status() == WL_CONNECTED) { //если к сети подключились но к MQTT нет
    client.connect("ESP03Client");    //из за нее не работает кнопка
    client.subscribe(relays_topic1);            //подписываемся на топик
    client.subscribe(relays_topic2);            //подписываемся на топик
    client.subscribe(relays_topic3);            //подписываемся на топик
    Serial.println("Mosquitto connect..."); //выводим в монитор порта что пытаемся подключиться
  }
}

void MQTT()                                   //публикуем топик с состоянием режима
{
  if (millis() - last_mls3 > 2000)            //периодичность публикации топика
  { val = digitalRead(pirPin);
    last_mls3 = millis();
    client.publish(relays_topic1, String(regim1).c_str());
    client.publish(relays_topic2, String(regim2).c_str());
    client.publish(relays_topic3, String(regim3).c_str());
    client.publish(svet_topic, String(ligt).c_str());
    client.publish(pir_topic, String(val).c_str());
    Serial.println("WiFinnected");
  }
}

void loop()
{
  client.loop();
  pir();
  MQTT();
  button1();
  button2();
  button3();
  //delay(200);
  if (millis() - last_mls > 60000)     //проверка подключений раз в 60 сек
  {
    last_mls = millis();
    reconnect_server();
  }
  if (millis() - last_mls4 > 2000)     //проверка уровня освещенности
  {
    last_mls4 = millis();
    svet();
  }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em, штрейкбрехер?

inspiritus
Offline
Зарегистрирован: 17.12.2012

Причем нарушающий правила . Такие тексты надо сворачивать

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

ua6em, штрейкбрехер?

нет, просто интересно
не свернул - каюсь, жалко, что после публикации и ответа нельза поправить, уж правку вывода кода можно было оставить

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

жалко, что после публикации и ответа нельза поправить, уж правку вывода кода можно было оставить

Почему нельзя? Заходите в "Изменить", ставите курсор в любое место кода и давите на иконку "code". Ваш код появляется в редакторе кода и правьте его на здоровье, в т.ч. и сворачивание добавляйте.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

ua6em пишет:

жалко, что после публикации и ответа нельза поправить, уж правку вывода кода можно было оставить

Почему нельзя? Заходите в "Изменить", ставите курсор в любое место кода и давите на иконку "code". Ваш код появляется в редакторе кода и правьте его на здоровье, в т.ч. и сворачивание добавляйте.

Мне сие главврач запретил видимо?

А вот пока на мой пост не ответили, изменить можно

Silverzab
Offline
Зарегистрирован: 11.12.2016

Всем спасибо, офегительная помощь, благодарю судари

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

inspiritus пишет:

Причем нарушающий правила . Такие тексты надо сворачивать

да, кстати, по нарушениям...некоторые тут в пешее эротическое отправляют, точнее в колыбель человечества... и ничего )))
 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Silverzab пишет:

Всем спасибо, офегительная помощь, благодарю судари

У вас не объявлена переменная  - clientCallback

Закомментируйте строку 72 - скомпилируется, но будет ли работать, вопрос )))
Я такой же как и вы начинающий

PS слово офИгительный пишется через И )))  ..(Фига, Фиговый листок - проверочные слова, 4-й класс начальной школы)

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Silverzab пишет:

Всем спасибо, офегительная помощь, благодарю судари

Не стоит благодарности. Вам по-русски сказали, выкладывайте код и сообщение об ошибке. Вы не выложили ни того, ни другого. Значит, Вам помощь не нужна. Это Ваш выбор, и мы его уважаем.

phoenixoid
Offline
Зарегистрирован: 14.07.2015

ua6em пишет:

 колыбель человечества...  )))

Вы так говорите, как будто это что-то плохое)))))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

phoenixoid пишет:

ua6em пишет:

 колыбель человечества...  )))

Вы так говорите, как будто это что-то плохое)))))

Я не знаю, кто сделал это слово нецензурным )))
а главное зачем?