Как получить данные из цикла?

Привет, я написал код (на самом деле я изменил его, пожалуйста, простите меня, я в беспорядке, пожалуйста, помогите мне, если можете) для моего esp8266 для последовательной связи с крошечным 85, он будет отслеживать состояние переключателя и публиковать соответственно. теперь я хочу написать код, в котором он не будет публиковаться, но всякий раз, когда серийный номер доступен, я хочу, чтобы он напрямую брал его и записывал в цифровой форме в обратном вызове void.

//ItKindaWorks — Creative Commons 2016
//github.com/ItKindaWorks
//
//Требуется PubSubClient, который можно найти здесь: https://github.com/knolleary/pubsubclient
//
//ESP8266 Простой контроллер света MQTT


#include <PubSubClient.h>
#include <ESP8266WiFi.h>

int LED3 = 12;
int LED4 = 14;
int LED2 = 13;
int LED1 = 15;

bool switch1;
bool switch2;
bool switch3;
bool switch4;
char data ;
// номер вывода кнопки

// ИЗМЕНИТЕ ЭТИ СТРОКИ, ЧТОБЫ СООТВЕТСТВОВАТЬ ВАШИМ НАСТРОЙКАМ

#define MQTT_SERVER "192.168.0.223"
const char* ssid = "TACHYON_HOME";
const char* password = "qwertyui";

//светодиод на ESP8266 GPIO2

char* lightTopic = "/test/light1";
char* lightTopic1 = "/test/light2";
char* lightTopic2 = "/test/light3";
char* lightTopic3 = "/test/light4";


WiFiClient wifiClient;
void callback(char* topic, byte* payload, unsigned int length);
PubSubClient client(MQTT_SERVER, 1883, callback, wifiClient);

void setup() {
  //инициализируем свет как выход и устанавливаем на НИЗКИЙ уровень (выключен)
  Serial.begin(9600);
  pinMode(LED3 , OUTPUT);
  pinMode(LED4 , OUTPUT);
  pinMode(LED1 , OUTPUT);
  pinMode(LED2 , OUTPUT);
 
    delay(100);

    // Начнем с подключения к сети WiFi

    Serial.println();
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);

    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }

 
   
    Serial.println("");
    Serial.println("WiFi connected.");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
   
}



void loop(){
  // переподключаемся, если соединение потеряно
  if (!client.connected() && WiFi.status() == 3) {reconnect();}

  //поддерживаем соединение MQTT
  client.loop();

  // ДОЛЖНА задержаться, чтобы разрешить выполнение функций ESP8266 WIFI
  delay(10);
   if (Serial.available()>0) /* If data available at serial port, enter if loop */
  {
    data = Serial.read(); /* Read data present at serial port */
    /* Print string with \r\n */
    Serial.print(data); /* Print data received */
    if (data == 'q') {
      client.publish(lightTopic,"1");
   
    }
else  if (data == 'w') {
      client.publish(lightTopic,"0");
    }
 else  if (data == 'e') {
      client.publish(lightTopic1,"1");
    }
    else if (data == 'r') {
      client.publish(lightTopic1,"0");
   
    }
     else if (data == 't') {
      client.publish(lightTopic2,"1");
   
    }
     else if  (data == 'y') {
      client.publish(lightTopic2,"0");
   
    }
     else if (data == 'u') {
      client.publish(lightTopic3,"1");
   
    }
     else if  (data == 'i') {
      client.publish(lightTopic3,"0");
   
    }
   
       
     
  }
}


void callback(char* topic, byte* payload, unsigned int length)
{
  //преобразование темы в строку, чтобы с ней было проще работать
  String topicStr = topic;

  //Выводим некоторую отладочную информацию
  Serial.println("Callback update.");
  Serial.print("Topic: ");
  Serial.println(topicStr);

 

 if(topicStr.equals(lightTopic)){

   if(payload[0] == '1'){
      digitalWrite(LED1 , HIGH);
    }

    else if (payload[0] == '0'){
      digitalWrite(LED1 , LOW);
    }
 }
 if(topicStr.equals(lightTopic1)){

   if(payload[0] == '1'){
      digitalWrite(LED2 , HIGH);
    }

    else if (payload[0] == '0'){
      digitalWrite(LED2 , LOW);
    }
 }
 if(topicStr.equals(lightTopic2)){

   if(payload[0] == '1'){
      digitalWrite(LED3 , HIGH);
    }

    else if (payload[0] == '0'){
      digitalWrite(LED3 , LOW);
    }
 }
  if(topicStr.equals(lightTopic3)){

   if(payload[0] == '1'){
      digitalWrite(LED4 , HIGH);
    }

    else if (payload[0] == '0'){
      digitalWrite(LED4 , LOW);
    }
  }
 
}






void reconnect() {

  //попытка подключиться к Wi-Fi, если соединение потеряно
  if(WiFi.status() != WL_CONNECTED){
    // отладочная печать
    Serial.print("Connecting to ");
    Serial.println(ssid);

    // цикл, пока мы ждем подключения
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }

    // распечатать еще немного отладки после подключения
    Serial.println("");
    Serial.println("WiFi connected"); 
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
  }

  //убедитесь, что мы подключены к WIFI перед попыткой повторного подключения к MQTT
  if(WiFi.status() == WL_CONNECTED){
  // Цикл, пока мы не подключимся к серверу MQTT
    while (!client.connected()) {
      Serial.print("Attempting MQTT connection...");

      // Генерируем имя клиента на основе MAC-адреса и последних 8 бит счетчика микросекунд
      String clientName;
      clientName += "esp8266-";
      uint8_t mac[6];
      WiFi.macAddress(mac);
      clientName += macToStr(mac);

      // если подключено, подпишитесь на темы, о которых мы хотим получать уведомления
      if (client.connect((char*) clientName.c_str())) {
        Serial.print("\tMTQQ Connected");
        client.subscribe(lightTopic);
        client.subscribe(lightTopic1);
        client.subscribe(lightTopic2);
        client.subscribe(lightTopic3);
   
       
      }

      //иначе печать не удалась для отладки
      else{Serial.println("\tFailed."); abort();}
    }
  }
}

// генерируем уникальное имя из MAC-адреса
String macToStr(const uint8_t* mac){

  String result;

  for (int i = 0; i < 6; ++i) {
    result += String(mac[i], 16);

    if (i < 5){
      result += ':';
    }
  }

  return result;
}


//////////////////я хочу написать что-то вроде ////////////////////////// ///////////////
/////////////////////////////////
if(topicStr.equals(lightTopic1)||Serial.available()>0){

   if(payload[0] == '1'|| data =q){
      digitalWrite(LED2 , HIGH);
    }

    else if (payload[0] == '0'|| data = w){
      digitalWrite(LED2 , LOW);
    }
//////////////////////////////////////////

, 👍-1

Обсуждение

Итак, какой у вас вопрос?, @jsotola

как это сделать, я пробовал, но он не работает, он берет данные только из mqtt, но не из состояния переключателя, @Dharani Sharma

Пожалуйста, уточните, чего вы хотите достичь. И покажи свой код! Вы написали «_Я написал код для своего esp8266_», но код, который вы показываете, явно не написан вами. Вы также написали, что хотите «_код, где он не будет публиковаться_»: если он не будет публиковаться, то какое взаимодействие он должен иметь с сервером MQTT? Должен ли он вообще использовать MQTT? Если нет, то почему вы показываете скетч, посвященный MQTT?, @Edgar Bonet

извините, я изменил этот код *исправление*, я хочу, чтобы он контролировал переключатели и выключал устройства с mqtt и без mqtt. я хочу, чтобы он управлял реле, даже когда сеть выключена., @Dharani Sharma

в вашем посте все еще написано, что вы написали код, @jsotola


1 ответ


0

Итак, вы хотите, чтобы ваша программа реагировала как на MQTT, так и на серийные сообщения. Ты написал этот фрагмент:

if (topicStr.equals(lightTopic1) || Serial.available() > 0) {
    if (payload[0] == '1' || data = q) {
        digitalWrite(LED2, HIGH);
    }
    else if (payload[0] == '0' || data = w) {
        digitalWrite(LED2 , LOW);
    }
    // ...
}

Не считая пары синтаксических проблем (вы имеете в виду data == 'q', а не data = q), логика не подходит. Это потому что:

  • Проверка payload[0] == '1' имеет смысл только в контексте разбор сообщения MQTT, иначе полезная нагрузка не может быть осмысленно определено.
  • По той же причине тест data == 'q' имеет смысл только в контекст разбора последовательной команды.

Поскольку MQTT и последовательный порт используют совершенно разные команды, у вас будет справиться с ними самостоятельно. Вы можете оставить обратный вызов MQTT как есть и реализовать парсер для последовательных команд. Может быть, что-то вроде:

if (Serial.available()) {
    char command = Serial.read();
    Serial.print(command);  // echo to the serial port
    switch (command) {
        case 'q':
            digitalWrite(LED1, HIGH);
            break;
        case 'w':
            digitalWrite(LED1, LOW);
            break;
        // ...
    }
}

В качестве альтернативы используйте цепочку if ... else if ..., если вы не удобно использовать синтаксис switch.

Лично я бы предпочел хранить названия тем, контакты светодиодов и серийные номера. команды в массиве структур и перебирают массив как в Обратный вызов MQTT и последовательный парсер. Но я предполагаю, что это может быть слишком продвинутый для вашего текущего уровня программирования, так что, возможно, просто придерживайтесь простое, хотя и многословное решение.

,