помогите "подружить" ESP и arduino

bod.petr
Offline
Зарегистрирован: 12.01.2017

Здравствуйте, вопрос следующий. ESP соединена с arduino по RX-TX. На ESP команды приходят через mqtt сервер с телефона, все прекрасно работает, но мне не хватает его мощности, решил подключить к ардуино, так вот, команды на ардуино, вроде как приходят, в порту они отображаются, но почему то он их не исполняет, мб чего не так делаю? спасибо

P.S на скрине монитор с ардуины выведен, то есть на нее команда приходит.

P.S.S -127.00 на скрине это показания температуры(датчик не подключен.

вот скетч esp:


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

#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
const char *ssid = "TP-LINK_39EE"; // Имя вайфай точки доступа
const char *pass = ""; // Пароль от точки доступа

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


#define BUFFER_SIZE 100

bool LedState = false;
int tm=300;
float temp=0;

// Функция получения данных от сервера

void callback(const MQTT::Publish& pub)
{
Serial.print(pub.topic()); // выводим в сериал порт название топика
Serial.print(" => ");
Serial.print(pub.payload_string()); // выводим в сериал порт значение полученных данных

String payload = pub.payload_string();

if(String(pub.topic()) == "test/led") // проверяем из нужного ли нам топика пришли данные 
{
int stled = payload.toInt(); // преобразуем полученные данные в тип integer
digitalWrite(0,stled); // включаем или выключаем светодиод в зависимоти от полученных значений данных
}
}

WiFiClient wclient; 
PubSubClient client(wclient, mqtt_server, mqtt_port);

void setup() {

sensors.begin();
Serial.begin(115200);
delay(10);
Serial.println();
Serial.println();
pinMode(0, OUTPUT);
}

void loop() {
// подключаемся к wi-fi
if (WiFi.status() != WL_CONNECTED) {
Serial.print("Connecting to ");
Serial.print(ssid);
Serial.println("...");
WiFi.begin(ssid, pass);

if (WiFi.waitForConnectResult() != WL_CONNECTED)
return;
Serial.println("WiFi connected");
}

// подключаемся к MQTT серверу
if (WiFi.status() == WL_CONNECTED) {
if (!client.connected()) {
Serial.println("Connecting to MQTT server");
if (client.connect(MQTT::Connect("arduinoClient2")
.set_auth(mqtt_user, mqtt_pass))) {
Serial.println("Connected to MQTT server");
client.set_callback(callback);
client.subscribe("test/led"); // подписывааемся по топик с данными для светодиода
} else {
Serial.println("Could not connect to MQTT server"); 
}
}

if (client.connected()){
client.loop();

}

}
} // конец основного цикла

// Функция отправки показаний с термодатчика

вот скетч ардуино:

int led1 = 13;
int led2 = 8;
char val; 
                
void setup()
{
  Serial.begin(115200);            
  pinMode(led1, OUTPUT);    
  pinMode(led2, OUTPUT);
 
}
 
void loop()
{
  if (Serial.available()) {
 
      val = Serial.read();
      Serial.print(val);       
    if (val == test/led => 1) {              
      digitalWrite(led1, HIGH);
    }
    if(val == '-127.00'){
      digitalWrite(led2, HIGH);
    }
    if (val == 'r') {              
      digitalWrite(led2, LOW);    
    }
    if (val == 'test/led => 0') {              
      digitalWrite(led1, LOW);
    }
  }
 
}

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

А нельзя ли вывод тоже печатать нормально? Ну, не видно ж ни хрена на картинках.

Кто у Вас чего не исполняет? ESP шлёт ардуине команды, а она их не исполняет? Или как?

bod.petr
Offline
Зарегистрирован: 12.01.2017

За картинку извиняюсь, если это принципиально, вечером попробую сделать картинку больше. Есп шлёт команду на ардуину,она ее вроде как принимает и даже в сериал монитор выводит, но не исполняет

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

Да не надо картинку больше, просто текст и монитора копипастите сюда обычным текстом.

А по сути. У Вас val - описан как символ. И читаете Вы его в строке 17 как одиночный символ. А с чем Вы его сравниваете в строках  19, 22, 28?

Если Вы хотите сравнивать со строкой, так сначала вычитывайте строку, а потом сравнивайте. А то Вы прочитали один символ, сравнили со строкой, прочитали второй опять сравнили и т.д.

Кстати, в строках 22 и 28 у Вас одинарные кавычки. Так записывается одиночный символ, а Вы пытаетесь так записать строку. Я понимаю, что когда были двойные - у Вас компилятор ругался, но Вы не исправили ошибку, а только заткнули ему рот. Там двойные, разумеется, должны быть.

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

наверное надо как строку смотреть?

if (val == "test/led => 1") {             
	      digitalWrite(led1, HIGH);
	    }
	

 

   

 

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

ua6em пишет:

наверное надо как строку смотреть?

if (val == "test/led => 1") {             
	      digitalWrite(led1, HIGH);
	    }

А заодно и сравнивать не так. Да и val - это char. Там много всего :)

bod.petr
Offline
Зарегистрирован: 12.01.2017

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

bod.petr
Offline
Зарегистрирован: 12.01.2017

По поводу кавычек, я и те и те ставил, не меняет сути дела

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

bod.petr пишет:
По поводу кавычек, я и те и те ставил, не меняет сути дела

Меняет, просто это не единственная ошибка, потому проблемы не решило. Строки пишутся в двойных кавычках, а одиночные символы в одинарных. Напишите строки правильно и больше не дёргайте это. Одной ошибкой меньше будет.

Писать за Вас не буду, но направление дам.

1. Вы читаете в 17 строке один символ, а Вам надо вычитать все символы строки, прежде, чем сравнивать.

2. Даже если Вы вычитали строку, так просто операцией == строки не сравниваются. Сравнивать их надо функцией strcmp.

Про работу со строками много примеров у Кернигана и Ритчи.

bod.petr
Offline
Зарегистрирован: 12.01.2017

Спасибо большое, вечером буду пробовать)

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

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

Это к Евгению Петровичу, мне знакомы общие принципы, а ему все частности )))

 

bod.petr
Offline
Зарегистрирован: 12.01.2017

))))

MihaNN52
Offline
Зарегистрирован: 22.01.2017

//// удалил

AlexeySh
Offline
Зарегистрирован: 16.01.2017

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

bod.petr пишет:
По поводу кавычек, я и те и те ставил, не меняет сути дела

Меняет, просто это не единственная ошибка, потому проблемы не решило. Строки пишутся в двойных кавычках, а одиночные символы в одинарных. Напишите строки правильно и больше не дёргайте это. Одной ошибкой меньше будет.

Писать за Вас не буду, но направление дам.

1. Вы читаете в 17 строке один символ, а Вам надо вычитать все символы строки, прежде, чем сравнивать.

2. Даже если Вы вычитали строку, так просто операцией == строки не сравниваются. Сравнивать их надо функцией strcmp.

Про работу со строками много примеров у Кернигана и Ритчи.

Почему строки не сравниваются операцией ==? Сколько скетчей писал со сравнением строк проблем не было. Все работает. Прошу пояснить. Очень уж любопытно стало.

bod.petr
Offline
Зарегистрирован: 12.01.2017

Тогда, мб вы подскажете, почему не сравниваются они в моем случае?

AlexeySh
Offline
Зарегистрирован: 16.01.2017

bod.petr пишет:
Тогда, мб вы подскажете, почему не сравниваются они в моем случае?

Это в какой строке программы?

bod.petr
Offline
Зарегистрирован: 12.01.2017

Скетч для ардуино, 19 стр, например (за исключением того, что там кавычки быть должны) там сравнение у меня, но ничего не происходит

AlexeySh
Offline
Зарегистрирован: 16.01.2017
if (val == test/led => 1) { 

Если вы про эту строку, то тут ничего и не произойдет. Потому что тут вообще полная чушь написана. И кто вам сказал что переменная типа char - это строка?

А вот так например все прекрасно работает:

string comm;

if (comm == "stop")