Как получить данные из цикла?
Привет, я написал код (на самом деле я изменил его, пожалуйста, простите меня, я в беспорядке, пожалуйста, помогите мне, если можете) для моего 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);
}
//////////////////////////////////////////
@Dharani Sharma, 👍-1
Обсуждение1 ответ
Итак, вы хотите, чтобы ваша программа реагировала как на 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 и последовательный парсер. Но я предполагаю, что это может быть слишком продвинутый для вашего текущего уровня программирования, так что, возможно, просто придерживайтесь простое, хотя и многословное решение.
- Вызов метода в основном скетче из библиотеки.
- ошибка: espcomm_upload_mem failed при загрузке скетча
- Esp8266 Vin контакт
- Могу ли я использовать выход 3,3 В Arduino напрямую к esp8266?
- Отправка данных из ESP8266 в PHP
- Как я могу прервать задержку() при нажатии кнопки?
- Скетч мигания ESP8266 не мигает светодиодом
- Варианты протокола для обмена данными между Arduino и ESP8266
Итак, какой у вас вопрос?, @jsotola
как это сделать, я пробовал, но он не работает, он берет данные только из mqtt, но не из состояния переключателя, @Dharani Sharma
Пожалуйста, уточните, чего вы хотите достичь. И покажи свой код! Вы написали «_Я написал код для своего esp8266_», но код, который вы показываете, явно не написан вами. Вы также написали, что хотите «_код, где он не будет публиковаться_»: если он не будет публиковаться, то какое взаимодействие он должен иметь с сервером MQTT? Должен ли он вообще использовать MQTT? Если нет, то почему вы показываете скетч, посвященный MQTT?, @Edgar Bonet
извините, я изменил этот код *исправление*, я хочу, чтобы он контролировал переключатели и выключал устройства с mqtt и без mqtt. я хочу, чтобы он управлял реле, даже когда сеть выключена., @Dharani Sharma
в вашем посте все еще написано, что вы написали код, @jsotola